@directive-run/ai 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/dist/anthropic.cjs +3 -0
- package/dist/anthropic.cjs.map +1 -0
- package/dist/anthropic.d.cts +103 -0
- package/dist/anthropic.d.ts +103 -0
- package/dist/anthropic.js +3 -0
- package/dist/anthropic.js.map +1 -0
- package/dist/index.cjs +78 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4663 -0
- package/dist/index.d.ts +4663 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/ollama.cjs +3 -0
- package/dist/ollama.cjs.map +1 -0
- package/dist/ollama.d.cts +47 -0
- package/dist/ollama.d.ts +47 -0
- package/dist/ollama.js +3 -0
- package/dist/ollama.js.map +1 -0
- package/dist/openai.cjs +3 -0
- package/dist/openai.cjs.map +1 -0
- package/dist/openai.d.cts +127 -0
- package/dist/openai.d.ts +127 -0
- package/dist/openai.js +3 -0
- package/dist/openai.js.map +1 -0
- package/dist/testing.cjs +14 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +345 -0
- package/dist/testing.d.ts +345 -0
- package/dist/testing.js +14 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-BKCdgKC-.d.cts +300 -0
- package/dist/types-BKCdgKC-.d.ts +300 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/builtin-guardrails.ts","../src/helpers.ts","../src/constraint-helpers.ts","../src/memory.ts","../src/streaming.ts","../src/multi.ts","../src/communication.ts","../src/guardrails/pii-enhanced.ts","../src/plugins/audit.ts","../src/guardrails/prompt-injection.ts","../src/plugins/compliance.ts","../src/guardrails/semantic-cache.ts","../src/guardrails/ann-index.ts","../src/stream-channel.ts","../src/retry.ts","../src/fallback.ts","../src/budget.ts","../src/model-selector.ts","../src/structured-output.ts","../src/stack.ts","../src/bridge.ts","../src/rag.ts","../src/sse-transport.ts","../src/batch.ts","../src/provider-routing.ts","../src/mcp.ts","../src/index.ts"],"names":["GuardrailError","options","isGuardrailError","error","AGENT_KEY","APPROVAL_KEY","CONVERSATION_KEY","TOOL_CALLS_KEY","orchestratorBridgeSchema","t","MAX_STRINGIFY_LENGTH","safeStringify","value","seen","json","_key","val","createPIIGuardrail","patterns","redact","redactReplacement","data","text","hasPII","pattern","createModerationGuardrail","checkFn","message","flagged","createRateLimitGuardrail","maxTokensPerMinute","maxRequestsPerMinute","maxEntries","tokenTimestamps","requestTimestamps","windowMs","findCutoffIndex","arr","cutoffTime","low","high","mid","guardrail","_data","context","now","tokenCutoff","requestCutoff","tokenUsage","recentTokens","recentRequests","createToolGuardrail","allowlist","denylist","caseSensitive","normalizedAllowlist","normalizedDenylist","toolName","createOutputSchemaGuardrail","validate","errorPrefix","result","createOutputTypeGuardrail","type","requiredFields","minLength","maxLength","minStringLength","maxStringLength","output","field","createLengthGuardrail","maxCharacters","maxTokens","estimateTokens","tokens","createContentFilterGuardrail","blockedPatterns","compiledPatterns","p","escaped","isAgentRunning","state","hasPendingApprovals","estimateCost","ratePerMillionTokens","ALLOWED_PROTOCOLS","validateBaseURL","baseURL","url","err","createRunner","fetchFn","buildRequest","parseResponse","parseOutput","hooks","parse","agent","input","runOptions","startTime","messages","init","fetchInit","response","errBody","parsed","assistantMessage","allMessages","durationMs","constraint","condition","req","when","tokenizer","content","estimateTotalTokens","sum","msg","createSlidingWindowStrategy","defaultConfig","configOverride","config","maxMessages","preserveRecentCount","recentMessages","olderMessages","olderToKeep","keptOlder","toSummarize","keep","createTokenBasedStrategy","countSystemMessages","currentTokens","i","msgTokens","createHybridStrategy","slidingWindow","tokenBased","windowResult","tokenResult","createAgentMemory","strategy","summarizer","strategyConfig","autoManage","onMemoryManaged","onManageError","maxContextTokens","isManaging","manage","messagesBefore","estimatedTokensBefore","summary","manageResult","triggerAutoManage","s","contextMessages","summaryContent","totalTokens","importedState","createTruncationSummarizer","m","createKeyPointsSummarizer","keyPoints","questions","q","createLLMSummarizer","llmCall","maxSummaryLength","preserveKeyFacts","conversationText","prompt","StreamBuffer","maxSize","item","pullWaiter","resolve","pushWaiter","waiter","createStreamingRunner","baseRunner","streamingGuardrails","signal","backpressure","bufferSize","guardrailCheckInterval","stopOnGuardrail","buffer","abortController","partialOutput","tokenCount","stopped","abortHandler","cleanup","checkGuardrails","shouldStop","chunk","resultPromise","token","tool","id","args","duration","droppedTokens","errorChunk","createToxicityStreamingGuardrail","threshold","stopOnFail","score","createLengthStreamingGuardrail","warnAt","warnedStreams","_partialOutput","streamKey","firstKey","createPatternStreamingGuardrail","regex","name","combineStreamingGuardrails","guardrails","stopOnFirstFail","adaptOutputGuardrail","minTokens","collectTokens","stream","tapStream","fn","filterStream","types","typeSet","mapStream","Semaphore","max","reject","releaseFn","next","pending","createMultiAgentOrchestrator","runner","agents","onHandoff","onHandoffComplete","maxHandoffHistory","registeredAgentIds","missingAgents","patternId","agentsToCheck","agentId","details","semaphores","agentStates","maxConcurrent","pendingHandoffs","handoffCounter","acquireSlot","semaphore","addHandoffResult","runSingleAgent","opts","registration","release","controller","timeoutId","runParallelPattern","_input","promises","successResults","r","runSequentialPattern","initialInput","currentInput","lastResult","runSupervisorPattern","workerResults","maxRounds","supervisorResult","round","action","workerResult","orchestrator","agentIds","inputs","merge","inputArray","results","fromAgent","toAgent","request","handoffResult","index","existing","parallel","sequential","supervisor","supervisorAgent","workers","selectAgent","priority","runAgentRequirement","concatResults","separator","pickBestResult","best","current","collectOutputs","aggregateTokens","generateId","createMessageBus","maxHistory","defaultTtlMs","maxPendingPerAgent","persistence","onDelivery","onDeliveryError","subscriptions","messageHistory","messageIndex","pendingMessages","matchesFilter","filter","topic","isExpired","getRecipients","deliverMessage","recipients","deliveredTo","deliveryPromises","recipientId","recipientSubs","sub","partial","removed","handler","subId","subscription","subs","limit","createAgentNetwork","bus","initialAgents","defaultTimeout","onAgentOnline","onAgentOffline","responseWaiters","info","handleResponse","correlationId","wasOffline","capability","from","to","sender","payload","timeout","timer","task","question","createResponder","network","handlers","createDelegator","delegationHandler","delegation","start","createPubSub","topicHandlers","update","topics","wrappedHandlers","wrappedHandler","idx","PII_PATTERNS","match","digits","isEven","char","digit","num","detectAddresses","streetTypes","addressPattern","NAME_PREFIXES","detectNames","prefixPattern","nameRegex","prefix","MAX_PII_INPUT_LENGTH","regexDetector","redactPII","items","style","sorted","b","replacement","fnv1aHash","str","hash","DEFAULT_PII_TYPES","createEnhancedPIIGuardrail","detector","redactionStyle","minConfidence","onDetected","minItemsToBlock","detectorTimeout","detectorInstance","allowSet","v","detectWithTimeout","piiTypes","_","filtered","typeCounts","count","createOutputPIIGuardrail","inputGuardrail","detectPII","DEFAULT_MAX_ENTRIES","DEFAULT_RETENTION_MS","DEFAULT_EXPORT_INTERVAL","GENESIS_PREVIOUS_HASH","stringToBytes","bytesToHex","bytes","sha256","hashBuffer","createHashContent","entry","timestamp","eventType","previousHash","actorId","sessionId","deepClone","obj","maskPayload","masked","processValue","itemsToRedact","processed","k","key","createAuditTrail","retentionMs","exportInterval","exporter","piiMasking","signing","events","entries","lastExportIndex","entriesPruned","entriesExported","chainVerified","exportTimer","getLastHash","addEntry","overrides","hashContent","fullEntry","toExport","e","expectedHash","prevEntry","since","cutoff","initialLength","pruned","byEventType","prev","changes","c","byResolver","resolver","createAgentAuditHandlers","audit","agentName","cost","toolCallId","reason","DEFAULT_INJECTION_PATTERNS","STRICT_INJECTION_PATTERNS","MAX_INJECTION_INPUT_LENGTH","detectPromptInjection","matches","severity","category","severityScores","totalScore","riskScore","sanitizeInjection","sanitized","allPatterns","hasGlobal","hasIgnoreCase","hasMultiline","flags","combinedRegex","createPromptInjectionGuardrail","additionalPatterns","replacePatterns","strictMode","blockThreshold","sanitize","onBlocked","ignoreCategories","ignoredSet","topPatterns","a","order","markUntrustedContent","source","createUntrustedContentGuardrail","baseGuardrail","untrustedMarkerRegex","fullResult","strictResult","toCSV","keys","record","headers","lines","values","createInMemoryComplianceStorage","consents","certificates","subjectId","categories","subjectMap","records","olderThan","categoryData","ids","idSet","purpose","certificate","createCompliance","storage","retention","exportExpirationMs","consent","subjectData","allRecords","auditEntries","checksum","recordsAffected","categoriesAffected","certificateContent","totalDeleted","expired","deleted","_subjectId","cosineSimilarity","dotProduct","normA","normB","ai","bi","findSimilar","queryEmbedding","bestMatch","similarity","createInMemoryStorage","getNamespace","namespace","ns","updates","createSemanticCache","embedder","similarityThreshold","maxCacheSize","ttlMs","onHit","onMiss","onError","perAgent","stats","totalSimilaritySum","updateStats","times","evictExpiredAndExcess","remainingEntries","toRemove","query","metadata","predicate","allEntries","createSemanticCacheGuardrail","cache","createTestEmbedder","dimensions","embedding","charCode","norm","createBatchedEmbedder","batchSize","embedBatch","maxWaitMs","pendingBatch","batchTimer","isDisposed","flushBatch","batch","texts","embeddings","createBruteForceIndex","vectors","expectedDimension","validateDimension","cosineDistance","buildVPTree","random","vpIdx","vp","rest","distances","medianIdx","mu","leftItems","rightItems","searchVPTree","node","maxDist","dist","createVPTreeIndex","vpConfig","root","needsRebuild","itemArray","createStreamChannel","streamError","consumerWaiter","producerWaiter","hasConsumer","resolveConsumer","endConsumer","errorConsumer","resolveProducer","createBidirectionalStream","channelAtoB","channelBtoA","pipeThrough","destination","transform","transformed","mergeStreams","sources","doneCount","errorState","hasWarnedDrop","sourceIterators","notifyWaiter","w","iter","RetryExhaustedError","retryCount","lastError","NON_RETRYABLE_STATUSES","parseHttpStatus","errObj","status","parseRetryAfter","seconds","calculateBackoffDelay","attempt","baseDelayMs","maxDelayMs","exponential","jitter","delay","getRetryDelay","retryAfter","isStatusRetryable","withRetry","maxRetries","isRetryable","onRetry","delayMs","onAbort","AllProvidersFailedError","errors","withFallback","runners","shouldFallback","onFallback","BudgetExceededError","CostLedger","total","pruneIndex","WINDOW_MS","estimateInputTokens","charsPerToken","calculateCost","usage","pricing","estimateCallCost","inputTokens","outputMultiplier","estimatedOutputTokens","withBudget","maxCostPerCall","budgets","estimatedOutputMultiplier","onBudgetExceeded","budget","windowLedgers","baseLedger","budgetRunner","estimated","spent","remaining","ledger","actualCost","getSpent","window","byInputLength","model","_agent","byAgentName","byPattern","withModelSelection","configOrRules","rules","onModelSelected","selectedModel","rule","effectiveAgent","extractJsonFromOutput","trimmed","objectStart","arrayStart","openChar","closeChar","depth","inString","jsonStr","formatValidationError","issue","withStructuredOutput","schema","extractJson","schemaDescription","schemaPrompt","structuredAgent","effectiveInput","outputStr","extracted","StructuredOutputError","isPreBuiltMemory","expandMemory","cfg","isPreBuiltCircuitBreaker","expandCircuitBreaker","castCfg","createCB","isPreBuiltObs","expandObservability","createObs","isPreBuiltCache","expandCache","isPreBuiltBus","expandBus","TokenStreamImpl","channel","abort","createAgentStack","streamingConfig","agentRegistry","maxTokenBudget","debug","costRatePerMillion","memory","circuitBreaker","obsInstance","cacheInstance","busInstance","metrics","createAgentMetrics","rateLimitGuardrail","rateLimitTimestamps","rateLimitStartIdx","maxPerMinute","timestamps","windowStart","inputGuardrails","createAgentOrchestrator","multi","streamingAgentRunner","otlpExporter","otlpInterval","createOTLPExporter","otlpOnError","intervalMs","resolveAgent","reg","available","run","skipCache","cached","span","callOpts","latencyMs","serialized","runStructured","retries","runOpts","attemptOpts","validation","runPattern","guard","guardResult","statesBefore","tokensBefore","statesAfter","tokensAfter","patternTokens","chunkStream","streamAbort","pipePromise","trackedResult","streamChunks","aborted","getState","rateLimitRemaining","active","reset","disposed","dispose","requestId","createAISyncer","syncFn","defaultFormatChunk","_similarity","title","section","defaultFormatContext","formattedChunks","_query","clamp","min","createRAGEnricher","defaultTopK","rawMinSimilarity","formatChunk","formatContext","minSimilarity","retrieve","topK","scored","enrich","history","contextBlock","parts","historyBlock","createJSONFileStore","filePath","mapEntry","cachedAt","load","raw","DEFAULT_ERROR_MESSAGE","createSSETransport","maxResponseChars","truncationMessage","heartbeatIntervalMs","errorMessages","extraHeaders","resolveErrorMessage","code","buildStream","stack","encoder","frame","event","heartbeatTimer","tokenStream","totalChars","sentDone","sseHeaders","createBatchQueue","maxBatchSize","concurrency","queue","flushTimer","flushPromise","scheduleFlush","flushInternal","cancelTimer","executeBatch","runNext","call","createEmptyStats","createConstraintRouter","providers","defaultProvider","constraints","onProviderSelected","errorCooldownMs","preferCheapest","providerMap","provider","facts","totalLatencyMs","sortedConstraints","selectProvider","availableProviders","aCost","bCost","recordCall","providerName","statsTotal","routerRunner","clonedProviders","createStubClient","connected","tools","resources","log","uri","checkRateLimit","rateLimiters","limiter","createMCPAdapter","servers","toolConstraints","resourceMappings","autoConnect","autoReconnect","clientFactory","serverConfig","approvalTimeoutMs","approvalCounter","approvalWaiters","rejectionReasons","waitForApproval","resolveApproval","approved","reconnectState","connectServer","serverState","client","rState","disconnectServer","callToolWithConstraints","server","constraintKey","resetAt","argSize","approvalRequest","plugin","syncResources","mapping","serverName","resource","matchGlob","globCache","MAX_GLOB_CACHE_SIZE","regexPattern","convertToolsForLLM","serverTools","mcpCallTool","mcpReadResource","mcpGetPrompt","mcpSyncResources","getAgentState","getBridgeFact","setAgentState","setBridgeFact","getApprovalState","setApprovalState","getConversation","setConversation","getToolCalls","setToolCalls","toolCalls","getOrchestratorState","convertOrchestratorConstraints","combinedFacts","convertOrchestratorResolvers","resolvers","runAgentWithGuardrails","getSystemFacts","ctx","orchestratorCtx","getCombinedFactsFromSystem","normalizeGuardrail","calculateRetryDelay","backoff","executeGuardrailWithRetry","retry","maxAttempts","calculateAgentRetryDelay","executeAgentWithRetry","retryConfig","factsSchema","onApprovalRequest","autoApproveToolCalls","plugins","agentRetry","combinedSchema","runAgentWithGuardrailsFn","system","directiveConstraints","directiveResolvers","currentFacts","requirementGuard","_req","currentAgent","callbackPlugin","createCallbackPlugin","orchestratorModule","createModule","createSystem","_currentFacts","callOptions","runAgentWithGuardrailsInner","contextStr","effectiveInputGuardrails","effectiveOutputGuardrails","inputGuardrailsList","g","guardStartTime","currentConversation","toolCall","toolCallGuardrails","approvalId","currentApproval","currentToolCalls","outputGuardrailsList","unsubscribe","approval","rejectedRequest","errorMsg","timeoutSeconds","getCombinedFacts","chunks","waiters","closed","accumulatedOutput","pushChunk","closeStream","processedInput","newTokens","outputGuardrails","MAX_APPROVAL_HISTORY","MAX_REJECTION_HISTORY","rejected","createOrchestratorBuilder","memoryInstance","circuitBreakerInstance","builder","nameOrGuardrail","mem","cb","enabled"],"mappings":"8JA4VO,IAAMA,CAAAA,CAAN,cAA6B,KAAM,CAC/B,IAAA,CACA,aAAA,CACA,cACA,WAAA,CAEA,SAAA,CAGT,WAAA,CAAYC,CAAAA,CAUT,CACD,KAAA,CAAMA,CAAAA,CAAQ,OAAA,CAAS,CAAE,KAAA,CAAOA,CAAAA,CAAQ,KAAM,CAAC,CAAA,CAC/C,IAAA,CAAK,IAAA,CAAO,iBACZ,IAAA,CAAK,IAAA,CAAOA,CAAAA,CAAQ,IAAA,CACpB,IAAA,CAAK,aAAA,CAAgBA,CAAAA,CAAQ,aAAA,CAC7B,IAAA,CAAK,aAAA,CAAgBA,CAAAA,CAAQ,aAAA,CAC7B,IAAA,CAAK,WAAA,CAAcA,CAAAA,CAAQ,WAAA,EAAeA,EAAQ,OAAA,CAClD,IAAA,CAAK,SAAA,CAAYA,CAAAA,CAAQ,SAAA,CAEzB,MAAA,CAAO,cAAA,CAAe,IAAA,CAAM,OAAA,CAAS,CACnC,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CACf,UAAA,CAAY,KAAA,CACZ,QAAA,CAAU,KAAA,CACV,YAAA,CAAc,KAChB,CAAC,CAAA,CACD,MAAA,CAAO,cAAA,CAAe,IAAA,CAAM,MAAA,CAAQ,CAClC,KAAA,CAAOA,CAAAA,CAAQ,IAAA,CACf,UAAA,CAAY,KAAA,CACZ,QAAA,CAAU,MACV,YAAA,CAAc,KAChB,CAAC,EACH,CAEA,MAAA,EAAkC,CAChC,OAAO,CACL,IAAA,CAAM,IAAA,CAAK,IAAA,CACX,IAAA,CAAM,IAAA,CAAK,IAAA,CACX,OAAA,CAAS,KAAK,OAAA,CACd,aAAA,CAAe,IAAA,CAAK,aAAA,CACpB,aAAA,CAAe,IAAA,CAAK,aAAA,CACpB,WAAA,CAAa,IAAA,CAAK,WAAA,CAClB,SAAA,CAAW,IAAA,CAAK,SAClB,CACF,CACF,EAGO,SAASC,EAAAA,CAAiBC,CAAAA,CAAyC,CACxE,OAAOA,CAAAA,YAAiBH,CAC1B,CAqBO,IAAMI,EAAAA,CAAY,SAAA,CACZC,EAAAA,CAAe,YAAA,CACfC,EAAAA,CAAmB,gBAAA,CACnBC,EAAAA,CAAiB,aAAA,CAGjBC,EAAAA,CAA2B,CACtC,KAAA,CAAO,CACL,CAACJ,EAAS,EAAGK,MAAAA,CAAE,GAAA,EAAgB,CAC/B,CAACJ,EAAY,EAAGI,MAAAA,CAAE,GAAA,EAAmB,CACrC,CAACH,EAAgB,EAAGG,MAAAA,CAAE,GAAA,EAAe,CACrC,CAACF,EAAc,EAAGE,MAAAA,CAAE,GAAA,EACtB,CAIF,CAAA,CCzaA,IAAMC,EAAAA,CAAuB,GAAA,CAG7B,SAASC,EAAAA,CAAcC,CAAAA,CAAwB,CAC7C,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,OAAOA,CAAAA,CACtC,GAAI,CACF,IAAMC,CAAAA,CAAO,IAAI,OAAA,CACXC,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAUF,CAAAA,CAAO,CAACG,CAAAA,CAAMC,CAAAA,GAAQ,CAChD,GAAI,OAAOA,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,GAAQ,IAAA,CAAM,CAC3C,GAAIH,CAAAA,CAAK,GAAA,CAAIG,CAAG,CAAA,CAAG,OAAO,YAAA,CAC1BH,CAAAA,CAAK,GAAA,CAAIG,CAAG,EACd,CACA,OAAOA,CACT,CAAC,CAAA,CACD,OAAOF,CAAAA,CAAK,MAAA,CAASJ,EAAAA,CACjBI,CAAAA,CAAK,KAAA,CAAM,CAAA,CAAGJ,EAAoB,CAAA,CAAI,gBAAA,CACtCI,CACN,CAAA,KAAQ,CACN,OAAO,MAAA,CAAOF,CAAK,CACrB,CACF,CAoBO,SAASK,EAAAA,CAAmBhB,CAAAA,CAIC,CAClC,GAAM,CACJ,QAAA,CAAAiB,CAAAA,CAAW,CACT,wBAAA,CACA,cACA,6CACF,CAAA,CACA,MAAA,CAAAC,CAAAA,CAAS,KAAA,CACT,iBAAA,CAAAC,CAAAA,CAAoB,YACtB,CAAA,CAAInB,CAAAA,CAEJ,OAAQoB,CAAAA,EAAS,CACf,IAAIC,CAAAA,CAAOD,CAAAA,CAAK,KAAA,CACZE,CAAAA,CAAS,KAAA,CAEb,IAAA,IAAWC,CAAAA,IAAWN,CAAAA,CACpBM,CAAAA,CAAQ,SAAA,CAAY,CAAA,CAChBA,CAAAA,CAAQ,IAAA,CAAKF,CAAI,CAAA,GACnBC,CAAAA,CAAS,IAAA,CACLJ,CAAAA,GACFK,EAAQ,SAAA,CAAY,CAAA,CACpBF,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQE,CAAAA,CAASJ,CAAiB,CAAA,CAAA,CAAA,CAKpD,OAAIG,CAAAA,EAAU,CAACJ,CAAAA,CACN,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,oBAAqB,CAAA,CAGhD,CAAE,MAAA,CAAQ,IAAA,CAAM,WAAA,CAAaA,CAAAA,EAAUI,CAAAA,CAASD,CAAAA,CAAO,MAAU,CAC1E,CACF,CAmBO,SAASG,EAAAA,CAA0BxB,CAAAA,CAGgB,CACxD,GAAM,CAAE,OAAA,CAAAyB,CAAAA,CAAS,OAAA,CAAAC,CAAAA,CAAU,+BAAgC,CAAA,CAAI1B,CAAAA,CAE/D,OAAO,MAAOoB,CAAAA,EAAS,CACrB,IAAMC,CAAAA,CACJ,QAAA,GAAYD,CAAAA,CACR,OAAOA,CAAAA,CAAK,MAAA,EAAW,QAAA,CACrBA,CAAAA,CAAK,MAAA,CACL,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAK,MAAM,CAAA,CAC5BA,CAAAA,CAAK,KAAA,CAELO,CAAAA,CAAU,MAAMF,CAAAA,CAAQJ,CAAI,EAElC,OAAO,CAAE,MAAA,CAAQ,CAACM,CAAAA,CAAS,MAAA,CAAQA,CAAAA,CAAUD,CAAAA,CAAU,MAAU,CACnE,CACF,CAeO,SAASE,EAAAA,CAAyB5B,CAAAA,CAGlB,CACrB,GAAM,CAAE,kBAAA,CAAA6B,CAAAA,CAAqB,GAAA,CAAQ,oBAAA,CAAAC,CAAAA,CAAuB,EAAG,CAAA,CAAI9B,CAAAA,CAE7D+B,CAAAA,CAAa,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAsB,GAAI,CAAA,CAClDE,CAAAA,CAA4B,EAAC,CAC7BC,CAAAA,CAA8B,EAAC,CAC7BC,CAAAA,CAAW,GAAA,CAEjB,SAASC,CAAAA,CAAgBC,CAAAA,CAAeC,CAAAA,CAA4B,CAClE,IAAIC,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAAOH,CAAAA,CAAI,MAAA,CACf,KAAOE,CAAAA,CAAMC,CAAAA,EAAM,CACjB,IAAMC,CAAAA,CAAOF,CAAAA,CAAMC,CAAAA,GAAU,CAAA,CAAA,CACxBH,CAAAA,CAAII,CAAG,CAAA,EAAK,CAAA,EAAKH,CAAAA,CACpBC,CAAAA,CAAME,EAAM,CAAA,CAEZD,CAAAA,CAAOC,EAEX,CACA,OAAOF,CACT,CAEA,IAAMG,CAAAA,CAAgC,CAACC,CAAAA,CAAOC,CAAAA,GAAY,CACxD,IAAMC,CAAAA,CAAM,IAAA,CAAK,KAAI,CACfP,CAAAA,CAAaO,CAAAA,CAAMV,CAAAA,CAEnBW,CAAAA,CAAcV,CAAAA,CAAgBH,CAAAA,CAAiBK,CAAU,CAAA,CAC3DQ,CAAAA,CAAc,CAAA,GAChBb,CAAAA,CAAkBA,CAAAA,CAAgB,KAAA,CAAMa,CAAW,CAAA,CAAA,CAGrD,IAAMC,CAAAA,CAAgBX,CAAAA,CAAgBF,CAAAA,CAAmBI,CAAU,CAAA,CAC/DS,CAAAA,CAAgB,CAAA,GAClBb,CAAAA,CAAoBA,CAAAA,CAAkB,KAAA,CAAMa,CAAa,CAAA,CAAA,CAK3D,IAAMC,CAAAA,CAFWJ,CAAAA,CAAQ,KAAA,CACGxC,EAAS,CAAA,EACN,UAAA,EAAc,CAAA,CACvC6C,CAAAA,CAAehB,CAAAA,CAAgB,MAAA,CAC/BiB,CAAAA,CAAiBhB,CAAAA,CAAkB,MAAA,CAEzC,OAAIe,CAAAA,CAAeD,CAAAA,CAAalB,CAAAA,CACvB,CAAE,MAAA,CAAQ,KAAA,CAAO,OAAQ,2BAA4B,CAAA,CAG1DoB,CAAAA,EAAkBnB,CAAAA,CACb,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,6BAA8B,CAAA,EAG5DG,CAAAA,CAAkB,MAAA,CAASF,CAAAA,EAC7BE,CAAAA,CAAkB,IAAA,CAAKW,CAAG,EAExBZ,CAAAA,CAAgB,MAAA,CAASD,CAAAA,EAC3BC,CAAAA,CAAgB,IAAA,CAAKY,CAAG,CAAA,CAGnB,CAAE,MAAA,CAAQ,IAAK,CAAA,CACxB,CAAA,CAEA,OAAAH,CAAAA,CAAU,KAAA,CAAQ,IAAM,CACtBT,CAAAA,CAAkB,EAAC,CACnBC,CAAAA,CAAoB,GACtB,CAAA,CAEOQ,CACT,CASO,SAASS,EAAAA,CAAoBlD,CAAAA,CAKG,CACrC,GAAM,CAAE,SAAA,CAAAmD,CAAAA,CAAW,QAAA,CAAAC,CAAAA,CAAU,aAAA,CAAAC,CAAAA,CAAgB,KAAM,CAAA,CAAIrD,CAAAA,CAEjDsD,CAAAA,CAAsBH,CAAAA,EAAW,GAAA,CAAK3C,CAAAA,EAAM6C,CAAAA,CAAgB7C,CAAAA,CAAIA,CAAAA,CAAE,WAAA,EAAa,CAAA,CAC/E+C,CAAAA,CAAqBH,CAAAA,EAAU,GAAA,CAAK5C,CAAAA,EAAM6C,CAAAA,CAAgB7C,CAAAA,CAAIA,CAAAA,CAAE,WAAA,EAAa,CAAA,CAEnF,OAAQY,CAAAA,EAAS,CACf,IAAMoC,CAAAA,CAAWH,EAAgBjC,CAAAA,CAAK,QAAA,CAAS,IAAA,CAAOA,CAAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,EAAY,CAErF,OAAIkC,CAAAA,EAAuB,CAACA,CAAAA,CAAoB,QAAA,CAASE,CAAQ,CAAA,CACxD,CAAE,OAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,MAAA,EAASpC,CAAAA,CAAK,QAAA,CAAS,IAAI,CAAA,kBAAA,CAAqB,CAAA,CAG9EmC,CAAAA,EAAsBA,CAAAA,CAAmB,QAAA,CAASC,CAAQ,CAAA,CACrD,CAAE,MAAA,CAAQ,KAAA,CAAO,OAAQ,CAAA,MAAA,EAASpC,CAAAA,CAAK,QAAA,CAAS,IAAI,CAAA,YAAA,CAAe,CAAA,CAGrE,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CASO,SAASqC,EAAAA,CAAyCzD,CAAAA,CAGpB,CACnC,GAAM,CAAE,QAAA,CAAA0D,CAAAA,CAAU,WAAA,CAAAC,CAAAA,CAAc,iCAAkC,CAAA,CAAI3D,CAAAA,CAEtE,OAAQoB,CAAAA,EAAS,CACf,IAAMwC,CAAAA,CAASF,CAAAA,CAAStC,CAAAA,CAAK,MAAM,EAEnC,OAAI,OAAOwC,CAAAA,EAAW,SAAA,CACb,CACL,MAAA,CAAQA,CAAAA,CACR,MAAA,CAAQA,CAAAA,CAAS,MAAA,CAAYD,CAC/B,CAAA,CAGEC,CAAAA,CAAO,KAAA,CACF,CAAE,MAAA,CAAQ,IAAK,CAAA,CAOjB,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAJHA,CAAAA,CAAO,MAAA,EAAQ,MAAA,CAChC,CAAA,EAAGD,CAAW,CAAA,EAAA,EAAKC,CAAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAC3CD,CAEyC,CAC/C,CACF,CASO,SAASE,EAAAA,CAA0B7D,CAAAA,CAOL,CACnC,GAAM,CACJ,IAAA,CAAA8D,CAAAA,CACA,cAAA,CAAAC,CAAAA,CAAiB,GACjB,SAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CACF,CAAA,CAAInE,CAAAA,CAEJ,OAAQoB,CAAAA,EAAS,CACf,IAAMgD,CAAAA,CAAShD,CAAAA,CAAK,OAEpB,OAAQ0C,CAAAA,EACN,KAAK,QAAA,CACH,OAAI,OAAOM,CAAAA,EAAW,QAAA,CACb,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,qBAAA,EAAwB,OAAOA,CAAM,EAAG,CAAA,CAEtEF,CAAAA,GAAoB,MAAA,EAAaE,CAAAA,CAAO,MAAA,CAASF,CAAAA,CAC5C,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,kBAAA,EAAqBE,CAAAA,CAAO,MAAM,CAAA,GAAA,EAAMF,CAAe,CAAA,CAAG,EAExFC,CAAAA,GAAoB,MAAA,EAAaC,CAAAA,CAAO,MAAA,CAASD,CAAAA,CAC5C,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,iBAAA,EAAoBC,CAAAA,CAAO,MAAM,CAAA,GAAA,EAAMD,CAAe,CAAA,CAAG,CAAA,CAEpF,CAAE,MAAA,CAAQ,IAAK,CAAA,CAExB,KAAK,QAAA,CACH,OAAI,OAAOC,CAAAA,EAAW,QAAA,EAAY,MAAA,CAAO,KAAA,CAAMA,CAAM,CAAA,CAC5C,CAAE,MAAA,CAAQ,KAAA,CAAO,OAAQ,CAAA,qBAAA,EAAwB,OAAOA,CAAM,CAAA,CAAG,CAAA,CAEnE,CAAE,MAAA,CAAQ,IAAK,CAAA,CAExB,KAAK,SAAA,CACH,OAAI,OAAOA,CAAAA,EAAW,SAAA,CACb,CAAE,OAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,sBAAA,EAAyB,OAAOA,CAAM,CAAA,CAAG,CAAA,CAEpE,CAAE,MAAA,CAAQ,IAAK,CAAA,CAExB,KAAK,QAAA,CACH,GAAI,OAAOA,CAAAA,EAAW,QAAA,EAAYA,CAAAA,GAAW,IAAA,EAAQ,KAAA,CAAM,OAAA,CAAQA,CAAM,CAAA,CACvE,OAAO,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,qBAAA,EAAwB,KAAA,CAAM,OAAA,CAAQA,CAAM,EAAI,OAAA,CAAU,OAAOA,CAAM,CAAA,CAAG,CAAA,CAE5G,IAAA,IAAWC,CAAAA,IAASN,CAAAA,CAClB,GAAI,EAAEM,CAAAA,IAASD,CAAAA,CAAAA,CACb,OAAO,CAAE,MAAA,CAAQ,KAAA,CAAO,OAAQ,CAAA,wBAAA,EAA2BC,CAAK,CAAA,CAAG,CAAA,CAGvE,OAAO,CAAE,MAAA,CAAQ,IAAK,CAAA,CAExB,KAAK,OAAA,CACH,OAAK,KAAA,CAAM,OAAA,CAAQD,CAAM,CAAA,CAGrBJ,IAAc,MAAA,EAAaI,CAAAA,CAAO,MAAA,CAASJ,CAAAA,CACtC,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,iBAAA,EAAoBI,CAAAA,CAAO,MAAM,CAAA,GAAA,EAAMJ,CAAS,CAAA,CAAG,CAAA,CAEjFC,CAAAA,GAAc,QAAaG,CAAAA,CAAO,MAAA,CAASH,CAAAA,CACtC,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,gBAAA,EAAmBG,CAAAA,CAAO,MAAM,CAAA,GAAA,EAAMH,CAAS,CAAA,CAAG,CAAA,CAE7E,CAAE,MAAA,CAAQ,IAAK,CAAA,CARb,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,CAAA,oBAAA,EAAuB,OAAOG,CAAM,CAAA,CAAG,CAAA,CAU3E,QACE,OAAO,CAAE,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,iBAAiBN,CAAI,CAAA,CAAG,CAC5D,CACF,CACF,CAgBO,SAASQ,EAAAA,CAAsBtE,CAAAA,CAOD,CACnC,GAAM,CACJ,aAAA,CAAAuE,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,eAAAC,CAAAA,CAAkBpD,CAAAA,EAAiB,IAAA,CAAK,IAAA,CAAKA,CAAAA,CAAK,MAAA,CAAS,CAAC,CAC9D,CAAA,CAAIrB,CAAAA,CAEJ,OAAQoB,CAAAA,EAAS,CACf,IAAMC,CAAAA,CAAOX,EAAAA,CAAcU,CAAAA,CAAK,MAAM,CAAA,CAEtC,GAAImD,CAAAA,GAAkB,MAAA,EAAalD,CAAAA,CAAK,MAAA,CAASkD,CAAAA,CAC/C,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,CAAA,iBAAA,EAAoBlD,CAAAA,CAAK,MAAM,CAAA,kBAAA,EAAqBkD,CAAa,CAAA,CAAA,CAC3E,CAAA,CAGF,GAAIC,CAAAA,GAAc,MAAA,CAAW,CAC3B,IAAME,CAAAA,CAASD,CAAAA,CAAepD,CAAI,CAAA,CAClC,GAAIqD,CAAAA,CAASF,CAAAA,CACX,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,CAAA,kBAAA,EAAqBE,CAAM,CAAA,cAAA,EAAiBF,CAAS,CAAA,CAAA,CAC/D,CAEJ,CAEA,OAAO,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CAoBO,SAASG,EAAAA,CAA6B3E,CAAAA,CAKR,CACnC,GAAM,CAAE,eAAA,CAAA4E,CAAAA,CAAiB,aAAA,CAAAvB,CAAAA,CAAgB,KAAM,CAAA,CAAIrD,CAAAA,CAE/C4E,CAAAA,CAAgB,MAAA,GAAW,GAC7B,OAAA,CAAQ,IAAA,CAAK,uGAAkG,CAAA,CAGjH,IAAMC,CAAAA,CAAmBD,CAAAA,CAAgB,GAAA,CAAKE,CAAAA,EAAM,CAClD,GAAIA,CAAAA,YAAa,MAAA,CAAQ,OAAOA,CAAAA,CAChC,IAAMC,EAAUD,CAAAA,CAAE,OAAA,CAAQ,qBAAA,CAAuB,MAAM,CAAA,CACvD,OAAO,IAAI,MAAA,CAAOC,CAAAA,CAAS1B,CAAAA,CAAgB,GAAA,CAAM,IAAI,CACvD,CAAC,CAAA,CAED,OAAQjC,GAAS,CACf,IAAMC,CAAAA,CAAOX,EAAAA,CAAcU,CAAAA,CAAK,MAAM,CAAA,CAEtC,IAAA,IAAWG,CAAAA,IAAWsD,CAAAA,CAEpB,GADAtD,CAAAA,CAAQ,SAAA,CAAY,CAAA,CAChBA,CAAAA,CAAQ,IAAA,CAAKF,CAAI,CAAA,CACnB,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,CAAA,0CAAA,EAA6CE,CAAAA,CAAQ,MAAM,CAAA,CACrE,CAAA,CAIJ,OAAO,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CChcO,SAASyD,EAAAA,CAAeC,CAAAA,CAA4B,CACzD,OAAOA,CAAAA,CAAM,MAAA,GAAW,SAC1B,CAGO,SAASC,EAAAA,CAAoBD,CAAAA,CAA+B,CACjE,OAAOA,EAAM,OAAA,CAAQ,MAAA,CAAS,CAChC,CAaO,SAASE,EAAAA,CACdpC,CAAAA,CACAqC,CAAAA,CACQ,CACR,OAAQrC,CAAAA,CAAa,GAAA,CAAaqC,CACpC,CAMA,IAAMC,EAAAA,CAAoB,IAAI,GAAA,CAAI,CAAC,OAAA,CAAS,QAAQ,CAAC,CAAA,CAM9C,SAASC,EAAAA,CAAgBC,CAAAA,CAAuB,CACrD,GAAI,CACF,IAAMC,CAAAA,CAAM,IAAI,GAAA,CAAID,CAAO,CAAA,CAC3B,GAAI,CAACF,EAAAA,CAAkB,GAAA,CAAIG,CAAAA,CAAI,QAAQ,CAAA,CACrC,MAAM,IAAI,KAAA,CACR,CAAA,sCAAA,EAAyCA,CAAAA,CAAI,QAAQ,CAAA,0CAAA,CACvD,CAEJ,OAASC,CAAAA,CAAK,CACZ,MAAIA,CAAAA,YAAe,KAAA,EAASA,CAAAA,CAAI,OAAA,CAAQ,UAAA,CAAW,aAAa,CAAA,CACxDA,CAAAA,CAGF,IAAI,KAAA,CACR,CAAA,6BAAA,EAAgCF,CAAO,CAAA,+DAAA,CACzC,CACF,CACF,CA4EO,SAASG,EAAAA,CAAa1F,CAAAA,CAA2C,CACtE,GAAM,CACJ,KAAA,CAAO2F,CAAAA,CAAU,UAAA,CAAW,KAAA,CAC5B,YAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,YAAAC,CAAAA,CACA,KAAA,CAAAC,CACF,CAAA,CAAI/F,CAAAA,CAUEgG,CAAAA,CAAQF,CAAAA,GARiBzE,CAAAA,EAAoB,CACjD,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAI,CACxB,MAAQ,CACN,OAAOA,CACT,CACF,CAAA,CAAA,CAIA,OAAO,MACL4E,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GAC0B,CAC1B,IAAMC,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAC3BL,CAAAA,EAAO,YAAA,GAAe,CAAE,KAAA,CAAAE,CAAAA,CAAO,KAAA,CAAAC,CAAAA,CAAO,SAAA,CAAWE,CAAU,CAAC,CAAA,CAE5D,IAAMC,CAAAA,CAAsB,CAAC,CAAE,IAAA,CAAM,OAAQ,OAAA,CAASH,CAAM,CAAC,CAAA,CAE7D,GAAI,CACF,GAAM,CAAE,GAAA,CAAAV,CAAAA,CAAK,IAAA,CAAAc,CAAK,CAAA,CAAIV,CAAAA,CAAaK,CAAAA,CAAOC,CAAAA,CAAOG,CAAQ,CAAA,CAEnDE,CAAAA,CAAyBJ,CAAAA,EAAY,MAAA,CACvC,CAAE,GAAGG,CAAAA,CAAM,MAAA,CAAQH,CAAAA,CAAW,MAAO,CAAA,CACrCG,CAAAA,CAEEE,CAAAA,CAAW,MAAMb,CAAAA,CAAQH,CAAAA,CAAKe,CAAS,CAAA,CAE7C,GAAI,CAACC,CAAAA,CAAS,EAAA,CAAI,CAChB,IAAMC,CAAAA,CAAU,MAAMD,CAAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,IAAM,EAAE,CAAA,CAEpD,MAAM,IAAI,KAAA,CACR,CAAA,wCAAA,EAA2CA,CAAAA,CAAS,MAAM,CAAA,CAAA,EAAIA,CAAAA,CAAS,UAAU,CAAA,EAAGC,CAAAA,CAAU,CAAA,QAAA,EAAMA,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,GAAG,CAAC,GAAK,EAAE,CAAA,CAClI,CACF,CAEA,IAAMC,CAAAA,CAAS,MAAMb,CAAAA,CAAcW,CAAAA,CAAUH,CAAQ,CAAA,CAC/CtD,CAAAA,CAAyB,CAC7B,WAAA,CAAa2D,CAAAA,CAAO,WAAA,EAAe,EACnC,YAAA,CAAcA,CAAAA,CAAO,YAAA,EAAgB,CACvC,CAAA,CAEMC,CAAAA,CAA4B,CAAE,IAAA,CAAM,WAAA,CAAa,OAAA,CAASD,CAAAA,CAAO,IAAK,CAAA,CACtEE,CAAAA,CAAyB,CAAC,GAAGP,EAAUM,CAAgB,CAAA,CAE7DR,CAAAA,EAAY,SAAA,GAAYQ,CAAgB,CAAA,CAExC,IAAME,CAAAA,CAAa,IAAA,CAAK,GAAA,EAAI,CAAIT,CAAAA,CAChC,OAAAL,CAAAA,EAAO,WAAA,GAAc,CACnB,KAAA,CAAAE,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,MAAA,CAAQQ,CAAAA,CAAO,IAAA,CACf,WAAA,CAAaA,CAAAA,CAAO,WAAA,CACpB,UAAA,CAAA3D,CAAAA,CACA,UAAA,CAAA8D,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,KAClB,CAAC,CAAA,CAEM,CACL,MAAA,CAAQb,CAAAA,CAASU,CAAAA,CAAO,IAAI,CAAA,CAC5B,QAAA,CAAUE,CAAAA,CACV,SAAA,CAAW,EAAC,CACZ,WAAA,CAAaF,CAAAA,CAAO,YACpB,UAAA,CAAA3D,CACF,CACF,CAAA,MAAS0C,CAAAA,CAAK,CACZ,IAAMoB,CAAAA,CAAa,IAAA,CAAK,GAAA,EAAI,CAAIT,CAAAA,CAChC,MAAIX,CAAAA,YAAe,KAAA,EACjBM,CAAAA,EAAO,UAAU,CACf,KAAA,CAAAE,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,KAAA,CAAOT,CAAAA,CACP,UAAA,CAAAoB,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,GAAA,EAClB,CAAC,CAAA,CAGGpB,CACR,CACF,CACF,CCvLO,SAASqB,EAAAA,EAEU,CACzB,OAAO,CACN,IAAA,CAAKC,CAAAA,CAAW,CACf,OAAO,CACN,OAAA,CAAQC,CAAAA,CAAK,CACZ,IAAIlC,EAAI,CAAA,CACFlB,CAAAA,CAA0C,CAC/C,QAAA,CAAS7C,CAAAA,CAAK,CACb,OAAA+D,CAAAA,CAAI/D,CAAAA,CACG6C,CACR,CAAA,CACA,KAAA,EAAmC,CAClC,OAAO,CAAE,IAAA,CAAMmD,EAAW,OAAA,CAASC,CAAAA,CAAK,QAAA,CAAUlC,CAAE,CACrD,CACD,CAAA,CACA,OAAOlB,CACR,CACD,CACD,CACD,CACD,CAsCO,SAASqD,EAAAA,CAGfF,EACgB,CAChB,OAAO,CACN,OAAA,CAAQC,CAAAA,CAAK,CACZ,OAAO,CACN,IAAA,CAAMD,CAAAA,CACN,OAAA,CAASC,CAAAA,CACT,QAAA,CAAU,CAAA,CACV,YAAA,CAAalC,CAAAA,CAAsC,CAClD,OAAO,CAAE,IAAA,CAAMiC,CAAAA,CAAW,OAAA,CAASC,CAAAA,CAAK,QAAA,CAAUlC,CAAE,CACrD,CACD,CACD,CACD,CACD,CCwCO,SAASL,GACd/C,CAAAA,CACAwF,CAAAA,CACQ,CACR,IAAMC,CAAAA,CACJ,OAAOzF,CAAAA,CAAQ,OAAA,EAAY,QAAA,CACvBA,CAAAA,CAAQ,OAAA,CACR,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAQ,OAAO,CAAA,CAEpC,OAIO,IAAA,CAAK,IAAA,CAAKyF,CAAAA,CAAQ,MAAA,CAAS,CAAsB,CAC1D,CAKO,SAASC,EAAAA,CACdf,CAAAA,CACAa,CAAAA,CACQ,CACR,OAAOb,CAAAA,CAAS,MAAA,CAAO,CAACgB,CAAAA,CAAKC,CAAAA,GAAQD,CAAAA,CAAM5C,EAAAA,CAAe6C,CAAc,CAAA,CAAG,CAAC,CAC9E,CAmBO,SAASC,EAAAA,CACdC,CAAAA,CAAsC,EAAC,CACvB,CAChB,OAAO,CAACnB,CAAAA,CAAqBoB,CAAAA,CAAuC,EAAC,GAAM,CACzE,IAAMC,CAAAA,CAAS,CAAE,GAAGF,CAAAA,CAAe,GAAGC,CAAe,EAC/CE,CAAAA,CAAcD,CAAAA,CAAO,WAAA,EAAe,GAAA,CACpCE,CAAAA,CAAsBF,CAAAA,CAAO,mBAAA,EAAuB,CAAA,CAE1D,GAAIrB,CAAAA,CAAS,MAAA,EAAUsB,CAAAA,CACrB,OAAO,CACL,IAAA,CAAM,CAAC,GAAGtB,CAAQ,CAAA,CAClB,WAAA,CAAa,EAAC,CACd,eAAA,CAAiBe,EAAAA,CAAoBf,CAAQ,CAC/C,CAAA,CAIF,IAAMwB,CAAAA,CAAiBxB,CAAAA,CAAS,KAAA,CAAM,CAACuB,CAAmB,EACpDE,CAAAA,CAAgBzB,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAG,CAACuB,CAAmB,CAAA,CAGtDG,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGJ,CAAAA,CAAcC,CAAmB,CAAA,CAC3DI,CAAAA,CAAYF,CAAAA,CAAc,KAAA,CAAM,CAACC,CAAW,CAAA,CAC5CE,CAAAA,CAAcH,CAAAA,CAAc,KAAA,CAAM,CAAA,CAAG,CAACC,CAAAA,EAAe,MAAS,CAAA,CAE9DG,CAAAA,CAAO,CAAC,GAAGF,CAAAA,CAAW,GAAGH,CAAc,CAAA,CAE7C,OAAO,CACL,IAAA,CAAAK,CAAAA,CACA,WAAA,CAAaD,CAAAA,CAAY,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAc,EAAC,CACrD,eAAA,CAAiBb,EAAAA,CAAoBc,CAAI,CAC3C,CACF,CACF,CAeO,SAASC,EAAAA,CACdX,CAAAA,CAAsC,EAAC,CACvB,CAChB,OAAO,CAACnB,CAAAA,CAAqBoB,CAAAA,CAAuC,EAAC,GAAM,CACzE,IAAMC,CAAAA,CAAS,CAAE,GAAGF,CAAAA,CAAe,GAAGC,CAAe,CAAA,CAC/CjD,CAAAA,CAAYkD,CAAAA,CAAO,SAAA,EAAa,GAAA,CAChCE,CAAAA,CAAsBF,CAAAA,CAAO,mBAAA,EAAuB,CAAA,CACpDU,CAAAA,CAAsBV,EAAO,mBAAA,EAAuB,IAAA,CAGpDG,CAAAA,CAAiBxB,CAAAA,CAAS,KAAA,CAAM,CAACuB,CAAmB,CAAA,CACpDE,CAAAA,CAAgBzB,CAAAA,CAAS,KAAA,CAAM,CAAA,CAAG,CAACuB,CAAmB,CAAA,CAExD5E,CAAAA,CAAe6E,EAAe,MAAA,CAAO,CAACR,CAAAA,CAAKC,CAAAA,GACzC,CAACc,CAAAA,EAAuBd,CAAAA,CAAI,IAAA,GAAS,QAAA,CAAiBD,CAAAA,CACnDA,CAAAA,CAAM5C,EAAAA,CAAe6C,CAAG,CAAA,CAC9B,CAAC,CAAA,CAGEY,EAAkB,EAAC,CACnBD,CAAAA,CAAyB,EAAC,CAC5BI,CAAAA,CAAgBrF,CAAAA,CAEpB,IAAA,IAASsF,CAAAA,CAAIR,CAAAA,CAAc,MAAA,CAAS,CAAA,CAAGQ,CAAAA,EAAK,CAAA,CAAGA,CAAAA,EAAAA,CAAK,CAClD,IAAMhB,CAAAA,CAAMQ,CAAAA,CAAcQ,CAAC,CAAA,CACrBC,CAAAA,CACJ,CAACH,CAAAA,EAAuBd,CAAAA,CAAI,IAAA,GAAS,QAAA,CAAW,CAAA,CAAI7C,EAAAA,CAAe6C,CAAG,CAAA,CAExE,GAAIe,CAAAA,CAAgBE,CAAAA,EAAa/D,CAAAA,CAC/B0D,CAAAA,CAAK,OAAA,CAAQZ,CAAG,CAAA,CAChBe,CAAAA,EAAiBE,CAAAA,CAAAA,KACZ,CAELN,CAAAA,CAAY,IAAA,CAAK,GAAGH,CAAAA,CAAc,KAAA,CAAM,CAAA,CAAGQ,CAAAA,CAAI,CAAC,CAAC,CAAA,CACjD,KACF,CACF,CAEA,OAAO,CACL,IAAA,CAAM,CAAC,GAAGJ,CAAAA,CAAM,GAAGL,CAAc,CAAA,CACjC,WAAA,CAAAI,CAAAA,CACA,gBAAiBI,CACnB,CACF,CACF,CAcO,SAASG,EAAAA,CACdhB,CAAAA,CAAsC,EAAC,CACvB,CAChB,IAAMiB,CAAAA,CAAgBlB,EAAAA,CAA4BC,CAAa,CAAA,CACzDkB,CAAAA,CAAaP,GAAyBX,CAAa,CAAA,CAEzD,OAAO,CAACnB,CAAAA,CAAqBoB,CAAAA,CAAuC,EAAC,GAAM,CACzE,IAAMC,CAAAA,CAAS,CAAE,GAAGF,CAAAA,CAAe,GAAGC,CAAe,EAG/CkB,CAAAA,CAAeF,CAAAA,CAAcpC,CAAAA,CAAUqB,CAAM,CAAA,CAC7CkB,CAAAA,CAAcF,CAAAA,CAAWrC,CAAAA,CAAUqB,CAAM,CAAA,CAG/C,OAAIiB,CAAAA,CAAa,IAAA,CAAK,MAAA,EAAUC,CAAAA,CAAY,IAAA,CAAK,OACxCD,CAAAA,CAEFC,CACT,CACF,CA2BO,SAASC,EAAAA,CAAkBnB,CAAAA,CAAwC,CACxE,GAAM,CACJ,QAAA,CAAAoB,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,cAAA,CAAAC,CAAAA,CAAiB,EAAC,CAClB,UAAA,CAAAC,CAAAA,CAAa,KAAA,CACb,eAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CACF,CAAA,CAAI1B,CAAAA,CAEAzC,CAAAA,CAAqB,CACvB,QAAA,CAAU,GACV,SAAA,CAAW,EAAC,CACZ,sBAAA,CAAwB,CAAA,CACxB,eAAA,CAAiB,CACnB,CAAA,CAGIoE,CAAAA,CAAa,KAAA,CAEjB,eAAeC,CAAAA,EAAsC,CAEnD,GAAID,CAAAA,CACF,OAAO,CACL,cAAA,CAAgBpE,CAAAA,CAAM,QAAA,CAAS,MAAA,CAC/B,aAAA,CAAeA,CAAAA,CAAM,QAAA,CAAS,MAAA,CAC9B,kBAAA,CAAoB,CAAA,CACpB,qBAAA,CAAuBA,CAAAA,CAAM,eAAA,CAC7B,oBAAA,CAAsBA,CAAAA,CAAM,eAC9B,CAAA,CAGFoE,CAAAA,CAAa,IAAA,CAEb,GAAI,CACF,IAAME,CAAAA,CAAiBtE,CAAAA,CAAM,QAAA,CAAS,MAAA,CAChCuE,CAAAA,CAAwBvE,CAAAA,CAAM,eAAA,CAE9BrB,CAAAA,CAASkF,CAAAA,CAAS7D,CAAAA,CAAM,SAAU+D,CAAc,CAAA,CAEtD,GAAIpF,CAAAA,CAAO,WAAA,CAAY,MAAA,GAAW,CAAA,CAChC,OAAO,CACL,cAAA,CAAA2F,CAAAA,CACA,aAAA,CAAeA,CAAAA,CACf,kBAAA,CAAoB,CAAA,CACpB,qBAAA,CAAAC,EACA,oBAAA,CAAsB5F,CAAAA,CAAO,eAC/B,CAAA,CAGF,IAAI6F,CAAAA,CAEAV,CAAAA,EAAcnF,CAAAA,CAAO,WAAA,CAAY,MAAA,CAAS,CAAA,GAC5C6F,CAAAA,CAAU,MAAMV,CAAAA,CAAWnF,CAAAA,CAAO,WAAW,EAC7CqB,CAAAA,CAAM,SAAA,CAAU,IAAA,CAAK,CACnB,OAAA,CAASwE,CAAAA,CACT,aAAA,CAAe7F,CAAAA,CAAO,WAAA,CAAY,MAAA,CAClC,SAAA,CAAW,IAAA,CAAK,GAAA,EAClB,CAAC,CAAA,CAAA,CAGHqB,EAAM,QAAA,CAAWrB,CAAAA,CAAO,IAAA,CACxBqB,CAAAA,CAAM,eAAA,CAAkBrB,CAAAA,CAAO,eAAA,CAE/B,IAAM8F,CAAAA,CAAmC,CACvC,cAAA,CAAAH,CAAAA,CACA,aAAA,CAAetE,CAAAA,CAAM,QAAA,CAAS,MAAA,CAC9B,mBAAoBrB,CAAAA,CAAO,WAAA,CAAY,MAAA,CACvC,OAAA,CAAA6F,CAAAA,CACA,qBAAA,CAAAD,CAAAA,CACA,oBAAA,CAAsB5F,CAAAA,CAAO,eAC/B,CAAA,CAEA,OAAAsF,CAAAA,GAAkBQ,CAAY,CAAA,CAEvBA,CACT,QAAE,CACAL,CAAAA,CAAa,MACf,CACF,CAGA,SAASM,CAAAA,EAA0B,CACjC,GAAIN,CAAAA,CAAY,OAEFP,CAAAA,CAAS7D,CAAAA,CAAM,QAAA,CAAU+D,CAAc,CAAA,CAC3C,WAAA,CAAY,MAAA,CAAS,CAAA,EAC7BM,CAAAA,EAAO,CAAE,KAAA,CAAOpJ,CAAAA,EAAU,CACxB,IAAMuF,CAAAA,CAAMvF,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CAChEiJ,CAAAA,CACFA,CAAAA,CAAc1D,CAAG,CAAA,CAEjB,OAAA,CAAQ,KAAA,CAAM,uCAAA,CAAyCA,CAAG,EAE9D,CAAC,EAEL,CAEA,OAAO,CACL,UAAW,CACT,OAAO,CAAE,GAAGR,CAAAA,CAAO,QAAA,CAAU,CAAC,GAAGA,CAAAA,CAAM,QAAQ,CAAA,CAAG,SAAA,CAAWA,CAAAA,CAAM,SAAA,CAAU,GAAA,CAAI2E,CAAAA,GAAM,CAAE,GAAGA,CAAE,CAAA,CAAE,CAAE,CACpG,CAAA,CAEA,UAAA,CAAWlI,CAAAA,CAAkB,CAC3BuD,CAAAA,CAAM,QAAA,CAAS,IAAA,CAAKvD,CAAO,CAAA,CAC3BuD,CAAAA,CAAM,sBAAA,EAAA,CACNA,EAAM,eAAA,EAAmBR,EAAAA,CAAe/C,CAAO,CAAA,CAE3CuH,CAAAA,EACFU,CAAAA,GAEJ,CAAA,CAEA,WAAA,CAAYtD,CAAAA,CAAqB,CAC/B,IAAA,IAAW3E,CAAAA,IAAW2E,CAAAA,CACpBpB,CAAAA,CAAM,QAAA,CAAS,KAAKvD,CAAO,CAAA,CAC3BuD,CAAAA,CAAM,sBAAA,EAAA,CACNA,CAAAA,CAAM,eAAA,EAAmBR,EAAAA,CAAe/C,CAAO,CAAA,CAG7CuH,CAAAA,EACFU,CAAAA,GAEJ,CAAA,CAEA,kBAAA,EAAgC,CAC9B,IAAME,EAA6B,EAAC,CAGpC,GAAI5E,CAAAA,CAAM,SAAA,CAAU,MAAA,CAAS,CAAA,CAAG,CAC9B,IAAM6E,CAAAA,CAAiB7E,CAAAA,CAAM,SAAA,CAC1B,GAAA,CAAK2E,CAAAA,EAAMA,CAAAA,CAAE,OAAO,EACpB,IAAA,CAAK;;AAAA;;AAAA,CAAa,EAErBC,CAAAA,CAAgB,IAAA,CAAK,CACnB,IAAA,CAAM,SACN,OAAA,CAAS,CAAA;;AAAA,EAAsCC,CAAc,CAAA,CAC/D,CAAC,EACH,CAMA,GAHAD,CAAAA,CAAgB,IAAA,CAAK,GAAG5E,CAAAA,CAAM,QAAQ,CAAA,CAGlCmE,CAAAA,CAAkB,CACpB,IAAMW,EAAc3C,EAAAA,CAAoByC,CAAe,CAAA,CACnDE,CAAAA,CAAcX,GAChB,OAAA,CAAQ,IAAA,CACN,CAAA,qCAAA,EAAwCW,CAAW,qCAAqCX,CAAgB,CAAA,uDAAA,CAE1G,EAEJ,CAEA,OAAOS,CACT,CAAA,CAEA,OAAAP,CAAAA,CAGA,UAAA,EAAa,CACX,OAAOD,CACT,CAAA,CAEA,KAAA,EAAQ,CACNpE,CAAAA,CAAQ,CACN,QAAA,CAAU,GACV,SAAA,CAAW,EAAC,CACZ,sBAAA,CAAwB,EACxB,eAAA,CAAiB,CACnB,EACF,CAAA,CAEA,QAAS,CACP,OAAO,CACL,GAAGA,EACH,QAAA,CAAU,CAAC,GAAGA,CAAAA,CAAM,QAAQ,CAAA,CAC5B,SAAA,CAAWA,CAAAA,CAAM,SAAA,CAAU,IAAK2E,CAAAA,GAAO,CAAE,GAAGA,CAAE,CAAA,CAAE,CAClD,CACF,CAAA,CAEA,MAAA,CAAOI,CAAAA,CAA4B,CACjC/E,CAAAA,CAAQ,CACN,GAAG+E,CAAAA,CACH,SAAU,CAAC,GAAGA,CAAAA,CAAc,QAAQ,EACpC,SAAA,CAAWA,CAAAA,CAAc,SAAA,CAAU,GAAA,CAAKJ,IAAO,CAAE,GAAGA,CAAE,CAAA,CAAE,CAC1D,EACF,CACF,CACF,CAUO,SAASK,EAAAA,CAA2BhG,CAAAA,CAAY,GAAA,CAAwB,CAC7E,OAAO,MAAOoC,CAAAA,EAAwB,CACpC,IAAMc,CAAAA,CAAUd,EACb,MAAA,CAAQ6D,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,QAAQ,CAAA,CACjC,GAAA,CAAKA,CAAAA,EAAM,CACV,IAAM7I,CAAAA,CACJ,OAAO6I,CAAAA,CAAE,OAAA,EAAY,SACjBA,CAAAA,CAAE,OAAA,CACF,IAAA,CAAK,SAAA,CAAUA,EAAE,OAAO,CAAA,CAC9B,OAAO,CAAA,EAAGA,EAAE,IAAI,CAAA,EAAA,EAAK7I,CAAAA,CAAK,KAAA,CAAM,EAAG,GAAG,CAAC,CAAA,EAAGA,CAAAA,CAAK,OAAS,GAAA,CAAM,KAAA,CAAQ,EAAE,CAAA,CAC1E,CAAC,EACA,IAAA,CAAK;AAAA,CAAI,CAAA,CAEZ,OAAI8F,CAAAA,CAAQ,MAAA,EAAUlD,CAAAA,CACbkD,EAGFA,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAGlD,CAAS,CAAA,CAAI;AAAA,WAAA,CACvC,CACF,CAKO,SAASkG,EAAAA,EAA+C,CAC7D,OAAO,MAAO9D,CAAAA,EAAwB,CACpC,IAAM+D,CAAAA,CAAsB,EAAC,CAE7B,IAAA,IAAW9C,CAAAA,IAAOjB,CAAAA,CAChB,GAAIiB,CAAAA,CAAI,IAAA,GAAS,MAAA,CAAQ,CAMvB,IAAM+C,CAAAA,CAAAA,CAJJ,OAAO/C,CAAAA,CAAI,OAAA,EAAY,QAAA,CACnBA,CAAAA,CAAI,OAAA,CACJ,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAI,OAAO,CAAA,EAEN,KAAA,CAAM,YAAY,CAAA,CACxC+C,CAAAA,EACFD,CAAAA,CAAU,IAAA,CAAK,GAAGC,CAAAA,CAAU,GAAA,CAAKC,CAAAA,EAAM,CAAA,GAAA,EAAMA,CAAAA,CAAE,IAAA,EAAM,CAAA,CAAE,CAAC,EAE5D,CAGF,OAAIF,CAAAA,CAAU,MAAA,GAAW,CAAA,CAChB,CAAA,CAAA,EAAI/D,CAAAA,CAAS,MAAM,CAAA,6CAAA,CAAA,CAGrB,CAAA;AAAA,EAA0B+D,EAAU,IAAA,CAAK;AAAA,CAAI,CAAC,CAAA,CACvD,CACF,CAiBO,SAASG,EAAAA,CACdC,CAAAA,CACAxK,CAAAA,CAGI,EAAC,CACc,CACnB,GAAM,CAAE,gBAAA,CAAAyK,CAAAA,CAAmB,GAAA,CAAK,gBAAA,CAAAC,CAAAA,CAAmB,IAAK,CAAA,CAAI1K,CAAAA,CAE5D,OAAO,MAAOqG,CAAAA,EAAwB,CACpC,IAAMsE,CAAAA,CAAmBtE,CAAAA,CACtB,MAAA,CAAQ6D,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,QAAQ,CAAA,CACjC,GAAA,CAAKA,CAAAA,EAAM,CACV,IAAM/C,CAAAA,CACJ,OAAO+C,CAAAA,CAAE,OAAA,EAAY,QAAA,CACjBA,CAAAA,CAAE,OAAA,CACF,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAE,OAAO,CAAA,CAC9B,OAAO,CAAA,EAAGA,CAAAA,CAAE,IAAA,CAAK,WAAA,EAAa,CAAA,EAAA,EAAK/C,CAAO,CAAA,CAC5C,CAAC,EACA,IAAA,CAAK;;AAAA,CAAM,CAAA,CAERyD,CAAAA,CAAS,CAAA,wCAAA,EAA2CH,CAAgB,CAAA;AAAA,EAC5EC,CAAAA,CAAmB,mDAAqD,EAAE;AAAA;;AAAA;AAAA,EAI1EC,CAAgB;;AAAA,QAAA,CAAA,CAId,OAAOH,CAAAA,CAAQI,CAAM,CACvB,CACF,CCrdA,IAAMC,EAAAA,CAAN,KAAsB,CACZ,OAAc,EAAC,CACf,OAAA,CACA,QAAA,CACA,YAAgD,EAAC,CACjD,WAAA,CAAiC,GACjC,MAAA,CAAS,KAAA,CACT,YAAA,CAAe,CAAA,CAEvB,YAAY/B,CAAAA,CAAiC,QAAA,CAAUgC,CAAAA,CAAU,GAAA,CAAqB,CACpF,IAAA,CAAK,QAAA,CAAWhC,CAAAA,CAChB,IAAA,CAAK,QAAUgC,EACjB,CAEA,MAAM,IAAA,CAAKC,EAA2B,CACpC,GAAI,IAAA,CAAK,MAAA,CAAQ,OAAO,MAAA,CAGxB,IAAMC,CAAAA,CAAa,IAAA,CAAK,YAAY,KAAA,EAAM,CAC1C,GAAIA,CAAAA,CACF,OAAAA,CAAAA,CAAWD,CAAI,CAAA,CACR,IAAA,CAIT,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAU,IAAA,CAAK,QAC7B,OAAQ,IAAA,CAAK,QAAA,EACX,KAAK,MAAA,CACH,OAAA,IAAA,CAAK,eACE,KAAA,CACT,KAAK,QAKH,GAHA,MAAM,IAAI,OAAA,CAAeE,GAAY,CACnC,IAAA,CAAK,WAAA,CAAY,IAAA,CAAKA,CAAO,EAC/B,CAAC,CAAA,CACG,IAAA,CAAK,OAAQ,OAAO,MAAA,CACxB,MAIJ,CAGF,OAAA,IAAA,CAAK,MAAA,CAAO,KAAKF,CAAI,CAAA,CACd,IACT,CAEA,MAAM,IAAA,EAA0B,CAE9B,IAAMG,CAAAA,CAAa,KAAK,WAAA,CAAY,KAAA,EAAM,CAK1C,OAJIA,GACFA,CAAAA,EAAW,CAGT,IAAA,CAAK,MAAA,CAAO,OAAS,CAAA,CAChB,IAAA,CAAK,MAAA,CAAO,KAAA,GAGjB,IAAA,CAAK,MAAA,CACA,IAAA,CAIF,IAAI,QAAmBD,CAAAA,EAAY,CACxC,IAAA,CAAK,WAAA,CAAY,KAAKA,CAAO,EAC/B,CAAC,CACH,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,MAAA,CAAS,KAEd,IAAA,IAAWE,CAAAA,IAAU,IAAA,CAAK,WAAA,CACxBA,EAAO,IAAI,CAAA,CAEb,KAAK,WAAA,CAAc,GAEnB,IAAA,IAAWA,CAAAA,IAAU,IAAA,CAAK,WAAA,CACxBA,GAAO,CAET,IAAA,CAAK,WAAA,CAAc,GACrB,CAEA,eAAA,EAA0B,CACxB,OAAO,KAAK,YACd,CACF,CAAA,CAaO,SAASC,GACdC,CAAAA,CAWArL,CAAAA,CAEI,EAAC,CACS,CACd,GAAM,CAAE,mBAAA,CAAAsL,CAAAA,CAAsB,EAAG,CAAA,CAAItL,CAAAA,CAErC,OAAO,CACLiG,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAA+B,KACL,CAC1B,GAAM,CACJ,MAAA,CAAAoF,EACA,YAAA,CAAAC,CAAAA,CAAe,QAAA,CACf,UAAA,CAAAC,EAAa,GAAA,CACb,sBAAA,CAAAC,CAAAA,CAAyB,EAAA,CACzB,gBAAAC,CAAAA,CAAkB,IACpB,CAAA,CAAIxF,CAAAA,CAGJ,GAAIuF,CAAAA,EAA0B,CAAA,EAAK,CAAC,MAAA,CAAO,SAASA,CAAsB,CAAA,CACxE,MAAM,IAAI,MACR,CAAA,4EAAA,EAA+EA,CAAsB,CAAA,CACvG,CAAA,CAGF,IAAME,CAAAA,CAAS,IAAIf,GAA0BW,CAAAA,CAAcC,CAAU,EAC/DI,CAAAA,CAAkB,IAAI,eAAA,CACxBC,CAAAA,CAAgB,GAChBC,CAAAA,CAAa,CAAA,CACbC,CAAAA,CAAU,KAAA,CACR5F,EAAY,IAAA,CAAK,GAAA,EAAI,CAGvB6F,CAAAA,CACAV,IACFU,CAAAA,CAAe,IAAMJ,CAAAA,CAAgB,KAAA,GACrCN,CAAAA,CAAO,gBAAA,CAAiB,OAAA,CAASU,CAAY,GAI/C,IAAMC,CAAAA,CAAU,IAAM,CAChBD,GAAgBV,CAAAA,EAClBA,CAAAA,CAAO,mBAAA,CAAoB,OAAA,CAASU,CAAY,EAEpD,CAAA,CAGA,eAAeE,CAAAA,EAA2D,CACxE,IAAA,IAAW1J,CAAAA,IAAa6I,CAAAA,CACtB,GAAI,CACF,IAAM1H,CAAAA,CAAS,MAAMnB,CAAAA,CAAU,MAAMqJ,CAAAA,CAAeC,CAAU,CAAA,CAC9D,GAAI,CAACnI,CAAAA,CAAO,MAAA,CAAQ,CAClB,IAAMwI,EAAa3J,CAAAA,CAAU,UAAA,GAAe,CAAA,CAAA,CACtC4J,CAAAA,CAAiC,CACrC,IAAA,CAAM,qBAAA,CACN,aAAA,CAAe5J,CAAAA,CAAU,KACzB,MAAA,CAAQmB,CAAAA,CAAO,MAAA,EAAU,wBAAA,CACzB,cAAAkI,CAAAA,CACA,OAAA,CAASM,CACX,CAAA,CAEA,OAAA,MAAMR,EAAO,IAAA,CAAKS,CAAK,CAAA,CAEnBD,CAAAA,EAAAA,CACa,OAAOT,CAAAA,EAAoB,UAAA,CACtCA,CAAAA,CACA,IAAMA,GACCU,CAAK,CAAA,GACdL,CAAAA,CAAU,CAAA,CAAA,CACVH,EAAgB,KAAA,EAAM,CAAA,CAInBQ,CACT,CACF,OAASnM,CAAAA,CAAO,CAEd,OAAA,CAAQ,KAAA,CAAM,wBAAwBuC,CAAAA,CAAU,IAAI,CAAA,QAAA,CAAA,CAAYvC,CAAK,EACvE,CAEF,OAAO,IACT,CAGA,IAAMoM,CAAAA,CAAAA,CAAiB,SAAmC,CACxD,MAAMV,EAAO,IAAA,CAAK,CAAE,IAAA,CAAM,UAAA,CAAY,MAAO,UAAA,CAAY,OAAA,CAAS,gBAAiB,CAAC,EAEpF,GAAI,CACF,IAAMhI,CAAAA,CAAS,MAAMyH,CAAAA,CAAWpF,CAAAA,CAAOC,CAAAA,CAAO,CAC5C,OAAQ2F,CAAAA,CAAgB,MAAA,CACxB,OAAA,CAAS,MAAOU,GAAU,CACpBP,CAAAA,GAEJD,CAAAA,EAAAA,CACAD,CAAAA,EAAiBS,EAEjB,MAAMX,CAAAA,CAAO,IAAA,CAAK,CAChB,KAAM,OAAA,CACN,IAAA,CAAMW,EACN,UAAA,CAAAR,CACF,CAAC,CAAA,CAGGA,CAAAA,CAAaL,CAAAA,GAA2B,CAAA,EAC1C,MAAMS,CAAAA,EAAgB,EAE1B,CAAA,CACA,WAAA,CAAa,MAAOK,CAAAA,CAAMC,CAAAA,CAAIC,CAAAA,GAAS,CACrC,MAAMd,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAM,WAAY,KAAA,CAAO,cAAA,CAAgB,OAAA,CAAS,CAAA,QAAA,EAAWY,CAAI,CAAA,CAAG,CAAC,CAAA,CACzF,MAAMZ,EAAO,IAAA,CAAK,CAAE,IAAA,CAAM,YAAA,CAAc,KAAAY,CAAAA,CAAM,UAAA,CAAYC,CAAAA,CAAI,SAAA,CAAWC,CAAK,CAAC,EACjF,CAAA,CACA,SAAA,CAAW,MAAOF,CAAAA,CAAMC,CAAAA,CAAI7I,CAAAA,GAAW,CACrC,MAAMgI,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAM,WAAY,IAAA,CAAAY,CAAAA,CAAM,UAAA,CAAYC,CAAAA,CAAI,OAAA7I,CAAO,CAAC,CAAA,CACpE,MAAMgI,EAAO,IAAA,CAAK,CAAE,IAAA,CAAM,UAAA,CAAY,MAAO,YAAA,CAAc,OAAA,CAAS,uBAAwB,CAAC,EAC/F,CAAA,CACA,SAAA,CAAW,MAAOlK,CAAAA,EAAY,CAC5B,MAAMkK,CAAAA,CAAO,IAAA,CAAK,CAAE,IAAA,CAAM,UAAW,OAAA,CAAAlK,CAAQ,CAAC,EAChD,CACF,CAAC,CAAA,CAGD,MAAMyK,CAAAA,GAEN,IAAMQ,CAAAA,CAAW,IAAA,CAAK,GAAA,GAAQvG,CAAAA,CACxBwG,CAAAA,CAAgBhB,CAAAA,CAAO,eAAA,GAC7B,OAAA,MAAMA,CAAAA,CAAO,IAAA,CAAK,CAChB,KAAM,MAAA,CACN,WAAA,CAAahI,CAAAA,CAAO,WAAA,CACpB,SAAA+I,CAAAA,CACA,aAAA,CAAAC,CACF,CAAC,EAEDhB,CAAAA,CAAO,KAAA,EAAM,CACNhI,CACT,OAAS1D,CAAAA,CAAO,CACd,IAAM2M,CAAAA,CAAyB,CAC7B,IAAA,CAAM,OAAA,CACN,KAAA,CAAO3M,CAAAA,YAAiB,MAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CAC/D,aAAA,CAAe4L,CAAAA,EAAiB,MAClC,CAAA,CACA,MAAA,MAAMF,CAAAA,CAAO,IAAA,CAAKiB,CAAU,CAAA,CAC5BjB,CAAAA,CAAO,KAAA,EAAM,CACP1L,CACR,CAAA,OAAE,CAEAgM,IACF,CACF,IAAG,CAiBH,OAAO,CACL,MAAA,CAfyC,CACzC,CAAC,MAAA,CAAO,aAAa,CAAA,EAAgC,CACnD,OAAO,CACL,MAAM,IAAA,EAA6C,CACjD,IAAMG,CAAAA,CAAQ,MAAMT,CAAAA,CAAO,MAAK,CAChC,OAAIS,CAAAA,GAAU,IAAA,CACL,CAAE,IAAA,CAAM,IAAA,CAAM,KAAA,CAAO,MAAU,EAEjC,CAAE,IAAA,CAAM,KAAA,CAAO,KAAA,CAAOA,CAAM,CACrC,CACF,CACF,CACF,EAIE,MAAA,CAAQC,CAAAA,CACR,KAAA,CAAO,IAAMT,EAAgB,KAAA,EAC/B,CACF,CACF,CAiBO,SAASiB,EAAAA,CAAiC9M,CAAAA,CAO1B,CACrB,GAAM,CAAE,OAAA,CAAAyB,CAAAA,CAAS,SAAA,CAAAsL,EAAY,EAAA,CAA4B,UAAA,CAAAC,CAAAA,CAAa,IAAK,EAAIhN,CAAAA,CAE/E,OAAO,CACL,IAAA,CAAM,qBACN,UAAA,CAAAgN,CAAAA,CACA,MAAM,KAAA,CAAMlB,EAAe,CACzB,IAAMmB,EAAQ,MAAMxL,CAAAA,CAAQqK,CAAa,CAAA,CACzC,OAAImB,CAAAA,CAAQF,CAAAA,CACH,CACL,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,CAAA,eAAA,EAAkBE,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,mBAAA,EAAsBF,CAAS,CAAA,CAAA,CACzE,QAAA,CAAU,UACZ,CAAA,CAEK,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CACF,CAaO,SAASG,EAAAA,CAA+BlN,CAAAA,CAOxB,CACrB,GAAM,CAAE,SAAA,CAAAwE,CAAAA,CAAW,OAAA2I,CAAAA,CAAQ,UAAA,CAAAH,CAAAA,CAAa,IAAK,EAAIhN,CAAAA,CAI3CoN,CAAAA,CAAgB,IAAI,GAAA,CAE1B,OAAO,CACL,IAAA,CAAM,kBAAA,CACN,UAAA,CAAAJ,EACA,KAAA,CAAMK,CAAAA,CAAgBtB,CAAAA,CAAY,CAGhC,IAAMuB,CAAAA,CAAY,CAAA,EAAGD,CAAAA,CAAe,MAAM,IAAItB,CAAU,CAAA,CAAA,CAExD,GAAIA,CAAAA,EAAcvH,EAChB,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,OAAQ,CAAA,kCAAA,EAAqCA,CAAS,CAAA,OAAA,CAAA,CACtD,QAAA,CAAU,OACZ,CAAA,CAGF,GAAI2I,GAAUpB,CAAAA,EAAcoB,CAAAA,EAAU,CAACC,CAAAA,CAAc,GAAA,CAAIE,CAAS,CAAA,CAAG,CAInE,GAFAF,CAAAA,CAAc,GAAA,CAAIE,CAAS,EAEvBF,CAAAA,CAAc,IAAA,CAAO,GAAA,CAAqB,CAC5C,IAAMG,CAAAA,CAAWH,CAAAA,CAAc,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA,CAC3CG,CAAAA,EAAUH,CAAAA,CAAc,OAAOG,CAAQ,EAC7C,CAEA,OAAO,CACL,MAAA,CAAQ,IAAA,CACR,OAAA,CAAS,CAAA,4BAAA,EAA+BxB,CAAU,CAAA,CAAA,EAAIvH,CAAS,CAAA,OAAA,CAAA,CAC/D,QAAA,CAAU,SACZ,CACF,CAEA,OAAO,CAAE,OAAQ,IAAK,CACxB,CACF,CACF,CAgBO,SAASgJ,EAAAA,CAAgCxN,CAAAA,CAGzB,CACrB,GAAM,CAAE,QAAA,CAAAiB,CAAAA,CAAU,UAAA,CAAA+L,EAAa,IAAK,CAAA,CAAIhN,CAAAA,CAExC,OAAO,CACL,IAAA,CAAM,mBAAA,CACN,UAAA,CAAAgN,CAAAA,CACA,MAAMlB,CAAAA,CAAe,CACnB,IAAA,GAAW,CAAE,MAAA2B,CAAAA,CAAO,IAAA,CAAAC,CAAK,CAAA,GAAKzM,CAAAA,CAC5B,GAAIwM,CAAAA,CAAM,IAAA,CAAK3B,CAAa,CAAA,CAC1B,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,YAAY4B,CAAI,CAAA,kBAAA,CAAA,CACxB,QAAA,CAAU,OACZ,EAGJ,OAAO,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CACF,CAaO,SAASC,GACdC,CAAAA,CACA5N,CAAAA,CAAwD,EAAC,CACrC,CACpB,GAAM,CAAE,IAAA,CAAA0N,CAAAA,CAAO,qBAAsB,eAAA,CAAAG,CAAAA,CAAkB,IAAK,CAAA,CAAI7N,EAEhE,OAAO,CACL,IAAA,CAAA0N,CAAAA,CACA,WAAYG,CAAAA,CACZ,MAAM,KAAA,CAAM/B,CAAAA,CAAeC,EAAY,CACrC,IAAA,IAAWtJ,CAAAA,IAAamL,CAAAA,CAAY,CAClC,IAAMhK,CAAAA,CAAS,MAAMnB,CAAAA,CAAU,MAAMqJ,CAAAA,CAAeC,CAAU,CAAA,CAC9D,GAAI,CAACnI,CAAAA,CAAO,MAAA,EAAUiK,CAAAA,CACpB,OAAO,CACL,GAAGjK,CAAAA,CACH,MAAA,CAAQ,CAAA,CAAA,EAAInB,EAAU,IAAI,CAAA,EAAA,EAAKmB,EAAO,MAAM,CAAA,CAC9C,CAEJ,CACA,OAAO,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CACF,CAmBO,SAASkK,EAAAA,CACdJ,CAAAA,CACAjL,CAAAA,CACAzC,CAAAA,CAII,EAAC,CACe,CACpB,GAAM,CAAE,UAAA+N,CAAAA,CAAY,CAAA,CAAG,UAAA,CAAAf,CAAAA,CAAa,IAAK,CAAA,CAAIhN,CAAAA,CAE7C,OAAO,CACL,KAAA0N,CAAAA,CACA,UAAA,CAAAV,CAAAA,CACA,MAAM,MAAMlB,CAAAA,CAAeC,CAAAA,CAAY,CACrC,GAAIA,EAAagC,CAAAA,CACf,OAAO,CAAE,MAAA,CAAQ,IAAK,CAAA,CAGxB,IAAMnK,CAAAA,CAAS,MAAMnB,EACnB,CACE,MAAA,CAAQqJ,CAAAA,CACR,SAAA,CAAW,YACX,KAAA,CAAO,EAAA,CACP,QAAA,CAAU,EACZ,CAAA,CACA,CACE,SAAA,CAAW,WAAA,CACX,MAAO,EAAA,CACP,KAAA,CAAO,EACT,CACF,CAAA,CAEA,OAAO,CACL,MAAA,CAAQlI,EAAO,MAAA,CACf,MAAA,CAAQA,EAAO,MAAA,CACf,QAAA,CAAUA,EAAO,MAAA,CAAS,MAAA,CAAY,OACxC,CACF,CACF,CACF,CAeA,eAAsBoK,EAAAA,CAAcC,EAAqD,CACvF,IAAI7J,CAAAA,CAAS,EAAA,CACb,cAAiBiI,CAAAA,IAAS4B,CAAAA,CACpB5B,CAAAA,CAAM,IAAA,GAAS,UACjBjI,CAAAA,EAAUiI,CAAAA,CAAM,IAAA,CAAA,CAGpB,OAAOjI,CACT,CAaA,eAAuB8J,EAAAA,CACrBD,CAAAA,CACAE,EAC4B,CAC5B,UAAA,IAAiB9B,CAAAA,IAAS4B,CAAAA,CACxB,MAAME,CAAAA,CAAG9B,CAAK,CAAA,CACd,MAAMA,EAEV,CAUA,eAAuB+B,EAAAA,CACrBH,CAAAA,CACAI,EACkD,CAClD,IAAMC,CAAAA,CAAU,IAAI,IAAID,CAAK,CAAA,CAC7B,UAAA,IAAiBhC,CAAAA,IAAS4B,EACpBK,CAAAA,CAAQ,GAAA,CAAIjC,CAAAA,CAAM,IAAS,IAC7B,MAAMA,CAAAA,EAGZ,CAaA,eAAuBkC,GACrBN,CAAAA,CACAE,CAAAA,CACkB,CAClB,UAAA,IAAiB9B,KAAS4B,CAAAA,CACxB,MAAM,MAAME,CAAAA,CAAG9B,CAAK,EAExB,KC9tBamC,EAAAA,CAAN,KAAgB,CACb,KAAA,CACS,UAAA,CACA,KAAA,CAA2F,GAE5G,WAAA,CAAYC,CAAAA,CAAa,CACvB,IAAA,CAAK,WAAaA,CAAAA,CAClB,IAAA,CAAK,KAAA,CAAQA,EACf,CAEA,MAAM,OAAA,EAA+B,CACnC,OAAI,KAAK,KAAA,CAAQ,CAAA,EACf,IAAA,CAAK,KAAA,EAAA,CACE,IAAM,IAAA,CAAK,OAAA,EAAQ,EAGrB,IAAI,QAAoB,CAACxD,CAAAA,CAASyD,CAAAA,GAAW,CAClD,KAAK,KAAA,CAAM,IAAA,CAAK,CACd,OAAA,CAAUC,GAA0B1D,CAAAA,CAAQ0D,CAAS,CAAA,CACrD,MAAA,CAAAD,CACF,CAAC,EACH,CAAC,CACH,CAEQ,OAAA,EAAgB,CACtB,IAAA,CAAK,KAAA,EAAA,CACL,IAAME,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GACpBA,CAAAA,GACF,IAAA,CAAK,KAAA,EAAA,CACLA,CAAAA,CAAK,QAAQ,IAAM,IAAA,CAAK,OAAA,EAAS,GAErC,CAGA,IAAI,SAAA,EAAoB,CACtB,OAAO,IAAA,CAAK,KACd,CAGA,IAAI,OAAA,EAAkB,CACpB,OAAO,IAAA,CAAK,KAAA,CAAM,MACpB,CAGA,IAAI,GAAA,EAAc,CAChB,OAAO,KAAK,UACd,CAGA,KAAA,EAAc,CACZ,IAAMnJ,CAAAA,CAAM,IAAI,KAAA,CAAM,6EAA6E,EAC7FoJ,CAAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAG,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CACtD,QAAW1D,CAAAA,IAAU0D,CAAAA,CACnB1D,CAAAA,CAAO,MAAA,CAAO1F,CAAG,CAAA,CAEnB,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,WACpB,CACF,EAsPO,SAASqJ,EAAAA,CACd9O,EACwB,CACxB,GAAM,CACJ,MAAA,CAAA+O,EACA,MAAA,CAAAC,CAAAA,CACA,QAAA,CAAA/N,CAAAA,CAAW,EAAC,CACZ,SAAA,CAAAgO,CAAAA,CACA,iBAAA,CAAAC,EACA,iBAAA,CAAAC,CAAAA,CAAoB,GACtB,CAAA,CAAInP,EAGEoP,CAAAA,CAAqB,IAAI,GAAA,CAAI,MAAA,CAAO,KAAKJ,CAAM,CAAC,CAAA,CAChDK,CAAAA,CAA+D,EAAC,CAEtE,IAAA,GAAW,CAACC,CAAAA,CAAW/N,CAAO,IAAK,MAAA,CAAO,OAAA,CAAQN,CAAQ,CAAA,CAAG,CAC3D,IAAMsO,CAAAA,CAA0B,EAAC,CAEjC,OAAQhO,CAAAA,CAAQ,IAAA,EACd,KAAK,WACHgO,CAAAA,CAAc,IAAA,CAAK,GAAGhO,CAAAA,CAAQ,MAAM,CAAA,CACpC,MACF,KAAK,YAAA,CACHgO,EAAc,IAAA,CAAK,GAAGhO,CAAAA,CAAQ,MAAM,EACpC,MACF,KAAK,YAAA,CACHgO,CAAAA,CAAc,KAAKhO,CAAAA,CAAQ,UAAA,CAAY,GAAGA,CAAAA,CAAQ,OAAO,EACzD,KACJ,CAEA,IAAA,IAAWiO,CAAAA,IAAWD,EACfH,CAAAA,CAAmB,GAAA,CAAII,CAAO,CAAA,EACjCH,EAAc,IAAA,CAAK,CAAE,SAAA,CAAAC,CAAAA,CAAW,QAAAE,CAAQ,CAAC,EAG/C,CAEA,GAAIH,CAAAA,CAAc,MAAA,CAAS,CAAA,CAAG,CAC5B,IAAMI,CAAAA,CAAUJ,CAAAA,CACb,GAAA,CAAI,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAE,CAAQ,IAAM,CAAA,aAAA,EAAgBF,CAAS,+BAA+BE,CAAO,CAAA,CAAA,CAAG,EAClG,IAAA,CAAK;AAAA,CAAI,CAAA,CACZ,MAAM,IAAI,KAAA,CACR,CAAA;AAAA,EAA+FC,CAAO;;AAAA,mBAAA,EAA0B,CAAC,GAAGL,CAAkB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAK,QAAQ,CAAA,CAChL,CACF,CAGA,IAAMM,CAAAA,CAAa,IAAI,GAAA,CAGjBC,CAAAA,CAAmE,EAAC,CAC1E,IAAA,IAAWH,CAAAA,IAAW,MAAA,CAAO,IAAA,CAAKR,CAAM,CAAA,CAAG,CACzC,IAAMY,CAAAA,CAAgBZ,CAAAA,CAAOQ,CAAO,CAAA,EAAG,aAAA,EAAiB,CAAA,CACxDG,CAAAA,CAAYH,CAAO,CAAA,CAAI,CACrB,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,CAAA,CACV,WAAA,CAAa,CACf,CAAA,CACAE,CAAAA,CAAW,GAAA,CAAIF,CAAAA,CAAS,IAAIhB,EAAAA,CAAUoB,CAAa,CAAC,EACtD,CAGA,IACMC,CAAAA,CAAoC,EAAC,CAEvCC,CAAAA,CAAiB,EAGrB,eAAeC,CAAAA,CAAYP,CAAAA,CAAsC,CAC/D,IAAMQ,CAAAA,CAAYN,CAAAA,CAAW,GAAA,CAAIF,CAAO,CAAA,CACxC,GAAI,CAACQ,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkBR,CAAO,CAAA,CAAE,CAAA,CAG7C,OAAOQ,CAAAA,CAAU,OAAA,EACnB,CAGA,SAASC,EAAiBrM,CAAAA,CAA6B,CAMvD,CAGA,eAAesM,CAAAA,CACbV,CAAAA,CACAtJ,CAAAA,CACAiK,CAAAA,CACuB,CACvB,IAAMC,CAAAA,CAAepB,CAAAA,CAAOQ,CAAO,CAAA,CACnC,GAAI,CAACY,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkBZ,CAAO,CAAA,CAAE,CAAA,CAG7C,IAAMa,CAAAA,CAAU,MAAMN,CAAAA,CAAYP,CAAO,CAAA,CACnCvK,CAAAA,CAAQ0K,CAAAA,CAAYH,CAAO,CAAA,CAEjCvK,EAAM,MAAA,CAAS,SAAA,CACfA,CAAAA,CAAM,SAAA,CAAYiB,CAAAA,CAGlB,IAAMoK,CAAAA,CAAa,IAAI,eAAA,CACnBC,CAAAA,CACAtE,CAAAA,CAEJ,GAAI,CACEmE,CAAAA,CAAa,UACfG,CAAAA,CAAY,UAAA,CAAW,IAAMD,CAAAA,CAAW,KAAA,EAAM,CAAGF,CAAAA,CAAa,OAAO,CAAA,CAAA,CAInED,CAAAA,EAAM,MAAA,GACRlE,CAAAA,CAAe,IAAMqE,CAAAA,CAAW,KAAA,EAAM,CACtCH,CAAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAASlE,CAAY,CAAA,CAAA,CAGpD,IAAMrI,CAAAA,CAAS,MAAMmL,CAAAA,CAAUqB,CAAAA,CAAa,KAAA,CAAOlK,CAAAA,CAAO,CACxD,GAAGkK,CAAAA,CAAa,UAAA,CAChB,GAAGD,CAAAA,CACH,MAAA,CAAQG,CAAAA,CAAW,MACrB,CAAC,CAAA,CAED,OAAArL,CAAAA,CAAM,MAAA,CAAS,WAAA,CACfA,CAAAA,CAAM,UAAA,CAAarB,CAAAA,CAAO,MAAA,CAC1BqB,CAAAA,CAAM,QAAA,EAAA,CACNA,CAAAA,CAAM,WAAA,EAAerB,CAAAA,CAAO,WAAA,CAErBA,CACT,CAAA,MAAS1D,CAAAA,CAAO,CACd,MAAA+E,CAAAA,CAAM,MAAA,CAAS,QACfA,CAAAA,CAAM,SAAA,CAAY/E,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAA,CACjEA,CACR,CAAA,OAAE,CAEIqQ,CAAAA,EAAW,YAAA,CAAaA,CAAS,CAAA,CACjCtE,CAAAA,EAAgBkE,CAAAA,EAAM,MAAA,EACxBA,CAAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAASlE,CAAY,CAAA,CAEvDoE,CAAAA,GACF,CACF,CAGA,eAAeG,EACbjP,CAAAA,CACAkP,CAAAA,CACY,CACZ,IAAMH,CAAAA,CAAa,IAAI,eAAA,CACnBC,CAAAA,CAEAhP,CAAAA,CAAQ,OAAA,GACVgP,CAAAA,CAAY,UAAA,CAAW,IAAMD,CAAAA,CAAW,OAAM,CAAG/O,CAAAA,CAAQ,OAAO,CAAA,CAAA,CAGlE,GAAI,CACF,IAAMmP,CAAAA,CAAWnP,CAAAA,CAAQ,MAAA,CAAO,GAAA,CAAKiO,CAAAA,EACnCU,CAAAA,CAAeV,CAAAA,CAASiB,EAAQ,CAAE,MAAA,CAAQH,CAAAA,CAAW,MAAO,CAAC,CAAA,CAAE,KAAA,CAC5DpQ,CAAAA,EAAU,CACT,GAAIqB,CAAAA,CAAQ,UAAA,GAAe,KAAA,CAAA,CAAW,MAAMrB,CAAAA,CAC5C,OAAO,IACT,CACF,CACF,CAAA,CAGMyQ,CAAAA,CAAAA,CADU,MAAM,OAAA,CAAQ,GAAA,CAAID,CAAQ,CAAA,EACX,MAAA,CAAQE,CAAAA,EAA+BA,CAAAA,GAAM,IAAI,EAEhF,GAAIrP,CAAAA,CAAQ,UAAA,EAAcoP,CAAAA,CAAe,MAAA,CAASpP,CAAAA,CAAQ,UAAA,CACxD,MAAM,IAAI,KAAA,CACR,CAAA,+BAAA,EAAkCoP,CAAAA,CAAe,MAAM,CAAA,CAAA,EAAIpP,EAAQ,UAAU,CAAA,CAC/E,CAAA,CAGF,OAAOA,CAAAA,CAAQ,KAAA,CAAMoP,CAAc,CACrC,CAAA,OAAE,CACIJ,CAAAA,EAAW,YAAA,CAAaA,CAAS,EACvC,CACF,CAGA,eAAeM,CAAAA,CACbtP,CAAAA,CACAuP,CAAAA,CACY,CACZ,IAAIC,CAAAA,CAAeD,CAAAA,CACfE,CAAAA,CAEJ,IAAA,IAAS1I,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI/G,CAAAA,CAAQ,MAAA,CAAO,MAAA,CAAQ+G,CAAAA,EAAAA,CAAK,CAC9C,IAAMkH,CAAAA,CAAUjO,CAAAA,CAAQ,MAAA,CAAO+G,CAAC,CAAA,CAEhC,GAAI,CACF0I,CAAAA,CAAa,MAAMd,CAAAA,CAAeV,EAASuB,CAAY,CAAA,CAGnDzI,CAAAA,CAAI/G,CAAAA,CAAQ,MAAA,CAAO,MAAA,CAAS,CAAA,GAC1BA,CAAAA,CAAQ,SAAA,CACVwP,CAAAA,CAAexP,CAAAA,CAAQ,SAAA,CAAUyP,CAAAA,CAAW,MAAA,CAAQxB,EAASlH,CAAC,CAAA,CAE9DyI,CAAAA,CACE,OAAOC,CAAAA,CAAW,MAAA,EAAW,QAAA,CACzBA,CAAAA,CAAW,MAAA,CACX,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAW,MAAM,CAAA,EAG5C,OAAS9Q,CAAAA,CAAO,CACd,GAAI,CAACqB,CAAAA,CAAQ,eAAA,CAAiB,MAAMrB,CACtC,CACF,CAEA,GAAI,CAAC8Q,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA,CAG/D,OAAOzP,CAAAA,CAAQ,OAAA,CACXA,CAAAA,CAAQ,OAAA,CAAQyP,CAAAA,CAAW,MAAM,CAAA,CAChCA,CAAAA,CAAW,MAClB,CAGA,eAAeC,EACb1P,CAAAA,CACA2E,CAAAA,CACY,CACZ,IAAMgL,CAAAA,CAAsC,EAAC,CACvCC,CAAAA,CAAY5P,CAAAA,CAAQ,SAAA,EAAa,CAAA,CAGnC6P,CAAAA,CAAmB,MAAMlB,CAAAA,CAK1B3O,CAAAA,CAAQ,UAAA,CAAY2E,CAAK,CAAA,CAE5B,IAAA,IAASmL,CAAAA,CAAQ,CAAA,CAAGA,CAAAA,CAAQF,CAAAA,CAAWE,CAAAA,EAAAA,CAAS,CAC9C,IAAMC,CAAAA,CAASF,CAAAA,CAAiB,MAAA,CAEhC,GAAIE,EAAO,MAAA,GAAW,UAAA,EAAc,CAACA,CAAAA,CAAO,MAAA,CAC1C,MAIF,GAAI,CAAC/P,CAAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS+P,CAAAA,CAAO,MAAM,CAAA,CACzC,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmBA,CAAAA,CAAO,MAAM,CAAA,CAAE,CAAA,CAIpD,IAAMC,CAAAA,CAAe,MAAMrB,CAAAA,CACzBoB,CAAAA,CAAO,MAAA,CACPA,CAAAA,CAAO,WAAA,EAAe,EACxB,CAAA,CACAJ,CAAAA,CAAc,IAAA,CAAKK,CAAY,CAAA,CAG/BH,CAAAA,CAAmB,MAAMlB,CAAAA,CACvB3O,CAAAA,CAAQ,UAAA,CACR,CAAA,OAAA,EAAU+P,CAAAA,CAAO,MAAM,CAAA,wBAAA,EAA2B,KAAK,SAAA,CAAUC,CAAAA,CAAa,MAAM,CAAC,CAAA,CACvF,EACF,CAEA,OAAOhQ,CAAAA,CAAQ,OAAA,CACXA,CAAAA,CAAQ,OAAA,CAAQ6P,CAAAA,CAAiB,MAAA,CAAQF,CAAa,CAAA,CACrDE,CAAAA,CAAiB,MACxB,CAEA,IAAMI,CAAAA,CAAuC,CAC3C,QAAA,CAAUtB,CAAAA,CAEV,MAAM,UAAA,CAAcZ,CAAAA,CAAmBpJ,CAAAA,CAA2B,CAChE,IAAM3E,CAAAA,CAAUN,CAAAA,CAASqO,CAAS,CAAA,CAClC,GAAI,CAAC/N,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB+N,CAAS,CAAA,CAAE,CAAA,CAGjD,OAAQ/N,EAAQ,IAAA,EACd,KAAK,UAAA,CACH,OAAOiP,CAAAA,CAAmBjP,CAAAA,CAA+B2E,CAAK,CAAA,CAChE,KAAK,YAAA,CACH,OAAO2K,CAAAA,CAAqBtP,CAAAA,CAAiC2E,CAAK,CAAA,CACpE,KAAK,YAAA,CACH,OAAO+K,CAAAA,CAAqB1P,CAAAA,CAAiC2E,CAAK,CAAA,CACpE,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAA0B3E,CAAAA,CAA6B,IAAI,CAAA,CAAE,CACjF,CACF,CAAA,CAEA,MAAM,WAAA,CACJkQ,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAa,KAAA,CAAM,OAAA,CAAQF,CAAM,CAAA,CACnCA,CAAAA,CACAD,CAAAA,CAAS,GAAA,CAAI,IAAMC,CAAM,CAAA,CAE7B,GAAIE,CAAAA,CAAW,MAAA,GAAWH,CAAAA,CAAS,MAAA,CACjC,MAAM,IAAI,KAAA,CAAM,oCAAoC,CAAA,CAGtD,IAAMf,CAAAA,CAAWe,CAAAA,CAAS,GAAA,CAAI,CAACjC,CAAAA,CAASlH,CAAAA,GACtC4H,CAAAA,CAAeV,CAAAA,CAASoC,CAAAA,CAAWtJ,CAAC,CAAE,CACxC,EAEMuJ,CAAAA,CAAU,MAAM,OAAA,CAAQ,GAAA,CAAInB,CAAQ,CAAA,CAC1C,OAAOiB,CAAAA,CAAME,CAAO,CACtB,CAAA,CAEA,MAAM,aAAA,CACJJ,CAAAA,CACAX,EACAX,CAAAA,CACyB,CACzB,IAAM0B,CAAAA,CAAgC,EAAC,CACnCd,CAAAA,CAAeD,CAAAA,CAEnB,IAAA,IAASxI,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAImJ,CAAAA,CAAS,MAAA,CAAQnJ,CAAAA,EAAAA,CAAK,CACxC,IAAMkH,CAAAA,CAAUiC,CAAAA,CAASnJ,CAAC,CAAA,CACpB1E,CAAAA,CAAS,MAAMsM,CAAAA,CAAeV,CAAAA,CAASuB,CAAY,CAAA,CACzDc,CAAAA,CAAQ,IAAA,CAAKjO,CAAM,EAEf0E,CAAAA,CAAImJ,CAAAA,CAAS,MAAA,CAAS,CAAA,GACpBtB,CAAAA,EAAM,SAAA,CACRY,CAAAA,CAAeZ,CAAAA,CAAK,SAAA,CAAUvM,CAAAA,CAAO,MAAA,CAAQ4L,CAAAA,CAASlH,CAAC,CAAA,CAEvDyI,CAAAA,CACE,OAAOnN,CAAAA,CAAO,MAAA,EAAW,QAAA,CACrBA,CAAAA,CAAO,MAAA,CACP,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAO,MAAM,CAAA,EAGxC,CAEA,OAAOiO,CACT,CAAA,CAEA,MAAM,OAAA,CACJC,CAAAA,CACAC,CAAAA,CACA7L,CAAAA,CACAvD,CAAAA,CAC6B,CAC7B,IAAMqP,CAAAA,CAA0B,CAC9B,EAAA,CAAI,CAAA,QAAA,EAAW,EAAElC,CAAc,CAAA,CAAA,CAC/B,SAAA,CAAAgC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAA7L,CAAAA,CACA,OAAA,CAAAvD,CAAAA,CACA,WAAA,CAAa,IAAA,CAAK,GAAA,EACpB,CAAA,CAEAkN,CAAAA,CAAgB,IAAA,CAAKmC,CAAO,EAC5B/C,CAAAA,GAAY+C,CAAO,CAAA,CAEnB,GAAI,CACF,IAAMpO,CAAAA,CAAS,MAAMsM,CAAAA,CAAe6B,CAAAA,CAAS7L,CAAK,CAAA,CAE5C+L,CAAAA,CAA+B,CACnC,QAAAD,CAAAA,CACA,MAAA,CAAApO,CAAAA,CACA,WAAA,CAAa,IAAA,CAAK,GAAA,EACpB,CAAA,CAEAqM,CAAAA,CAAiBgC,CAAa,CAAA,CAC9B/C,CAAAA,GAAoB+C,CAAa,CAAA,CAGjC,IAAMC,CAAAA,CAAQrC,CAAAA,CAAgB,OAAA,CAAQmC,CAAO,CAAA,CAC7C,OAAIE,CAAAA,EAAS,CAAA,EAAGrC,CAAAA,CAAgB,MAAA,CAAOqC,CAAAA,CAAO,CAAC,CAAA,CAExCtO,CACT,CAAA,MAAS1D,CAAAA,CAAO,CAEd,IAAMgS,CAAAA,CAAQrC,CAAAA,CAAgB,OAAA,CAAQmC,CAAO,CAAA,CAC7C,MAAIE,CAAAA,EAAS,CAAA,EAAGrC,CAAAA,CAAgB,MAAA,CAAOqC,CAAAA,CAAO,CAAC,EACzChS,CACR,CACF,CAAA,CAEA,aAAA,CAAcsP,CAAAA,CAAiB,CAC7B,OAAOG,CAAAA,CAAYH,CAAO,CAC5B,CAAA,CAEA,iBAAA,EAAoB,CAClB,OAAO,CAAE,GAAGG,CAAY,CAC1B,CAAA,CAEA,kBAAA,EAAqB,CACnB,OAAO,CAAC,GAAGE,CAAe,CAC5B,CAAA,CAEA,KAAA,EAAQ,CACN,QAAWL,CAAAA,IAAW,MAAA,CAAO,IAAA,CAAKR,CAAM,CAAA,CAAG,CACzC,IAAMY,CAAAA,CAAgBZ,CAAAA,CAAOQ,CAAO,CAAA,EAAG,aAAA,EAAiB,CAAA,CACxDG,CAAAA,CAAYH,CAAO,CAAA,CAAI,CACrB,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,CAAA,CACV,WAAA,CAAa,CACf,CAAA,CAEA,IAAM2C,CAAAA,CAAWzC,CAAAA,CAAW,GAAA,CAAIF,CAAO,CAAA,CACnC2C,GACFA,CAAAA,CAAS,KAAA,EAAM,CAEjBzC,CAAAA,CAAW,GAAA,CAAIF,CAAAA,CAAS,IAAIhB,EAAAA,CAAUoB,CAAa,CAAC,EACtD,CACAC,CAAAA,CAAgB,MAAA,CAAS,EAE3B,CAAA,CAEA,OAAA,EAAU,CACR2B,CAAAA,CAAa,KAAA,GACf,CACF,CAAA,CAEA,OAAOA,CACT,CAiBO,SAASY,EAAAA,CACdpD,CAAAA,CACA2C,CAAAA,CACA3R,CAAAA,CACoB,CACpB,OAAO,CACL,IAAA,CAAM,UAAA,CACN,MAAA,CAAAgP,CAAAA,CACA,KAAA,CAAA2C,CAAAA,CACA,GAAG3R,CACL,CACF,CAaO,SAASqS,EAAAA,CACdrD,CAAAA,CACAhP,CAAAA,CAKsB,CACtB,OAAO,CACL,IAAA,CAAM,YAAA,CACN,MAAA,CAAAgP,CAAAA,CACA,GAAGhP,CACL,CACF,CAcO,SAASsS,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAxS,CAAAA,CAIsB,CACtB,OAAO,CACL,IAAA,CAAM,YAAA,CACN,UAAA,CAAYuS,CAAAA,CACZ,OAAA,CAAAC,CAAAA,CACA,GAAGxS,CACL,CACF,CAoBO,SAASyS,EAAAA,CACdxL,CAAAA,CACAhB,CAAAA,CACAC,CAAAA,CACAwM,CAAAA,CAC0B,CAC1B,OAAO,CAAE,IAAA,CAAAzL,CAAAA,CAAM,OAAQhB,CAAAA,CAAO,KAAA,CAAAC,CAAAA,CAAO,QAAA,CAAAwM,CAAS,CAChD,CAeO,SAASC,EAAAA,CACd1M,CAAAA,CACAC,CAAAA,CACAvD,CAAAA,CACqB,CACrB,OAAO,CACL,IAAA,CAAM,WAAA,CACN,KAAA,CAAAsD,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,OAAA,CAAAvD,CACF,CACF,CASO,SAASiQ,EAAAA,CACdf,CAAAA,CACAgB,CAAAA,CAAY;;AAAA,CAAA,CACJ,CACR,OAAOhB,CAAAA,CACJ,GAAA,CAAK,GACJ,OAAO,CAAA,CAAE,MAAA,EAAW,QAAA,CAChB,EAAE,MAAA,CACF,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,MAAM,CAC7B,CAAA,CACC,IAAA,CAAKgB,CAAS,CACnB,CAKO,SAASC,EAAAA,CACdjB,EACA5E,CAAAA,CACc,CACd,GAAI4E,CAAAA,CAAQ,SAAW,CAAA,CACrB,MAAM,IAAI,KAAA,CAAM,yBAAyB,CAAA,CAG3C,OAAOA,CAAAA,CAAQ,MAAA,CAAO,CAACkB,CAAAA,CAAMC,CAAAA,GAC3B/F,CAAAA,CAAM+F,CAAO,CAAA,CAAI/F,CAAAA,CAAM8F,CAAI,CAAA,CAAIC,EAAUD,CAC3C,CACF,CAKO,SAASE,GAAkBpB,CAAAA,CAA8B,CAC9D,OAAOA,CAAAA,CAAQ,GAAA,CAAKjB,CAAAA,EAAMA,CAAAA,CAAE,MAAM,CACpC,CAKO,SAASsC,EAAAA,CAAgBrB,CAAAA,CAAuC,CACrE,OAAOA,CAAAA,CAAQ,MAAA,CAAO,CAACxK,EAAK,CAAA,GAAMA,CAAAA,CAAM,CAAA,CAAE,WAAA,CAAa,CAAC,CAC1D,CCpvBA,SAAS8L,IAAqB,CAC5B,OAAO,UAAA,CAAW,MAAA,EAAQ,cAAa,EAAK,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CACnH,CA6BO,SAASC,EAAAA,CAAiB1L,EAA2B,EAAC,CAAe,CAC1E,GAAM,CACJ,UAAA,CAAA2L,CAAAA,CAAa,GAAA,CACb,aAAAC,CAAAA,CAAe,IAAA,CACf,kBAAA,CAAAC,CAAAA,CAAqB,IACrB,WAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,gBAAAC,CACF,CAAA,CAAIhM,CAAAA,CAEEiM,CAAAA,CAAgB,IAAI,GAAA,CACpBC,CAAAA,CAAsC,EAAC,CACvCC,EAAe,IAAI,GAAA,CACnBC,CAAAA,CAAkB,IAAI,IAE5B,SAASC,CAAAA,CAAcrS,CAAAA,CAA4BsS,CAAAA,CAAgC,CAIjF,GAHIA,CAAAA,CAAO,KAAA,EAAS,CAACA,CAAAA,CAAO,KAAA,CAAM,QAAA,CAAStS,CAAAA,CAAQ,IAAI,CAAA,EAGnDsS,CAAAA,CAAO,IAAA,EAEL,CAAA,CADa,MAAM,OAAA,CAAQA,CAAAA,CAAO,IAAI,CAAA,CAAIA,EAAO,IAAA,CAAO,CAACA,CAAAA,CAAO,IAAI,CAAA,EAC1D,QAAA,CAAStS,CAAAA,CAAQ,IAAI,EACjC,OAAO,MAAA,CAGX,GAAIsS,CAAAA,CAAO,OAAQ,CACjB,IAAMC,CAAAA,CAASvS,CAAAA,CAA0C,MACzD,GAAIuS,CAAAA,EAAS,CAACD,CAAAA,CAAO,MAAA,CAAO,QAAA,CAASC,CAAK,CAAA,CACxC,OAAO,MAEX,CAIA,OAHI,EAAAD,EAAO,QAAA,EAAYtS,CAAAA,CAAQ,QAAA,EAAY,CAACsS,EAAO,QAAA,CAAS,QAAA,CAAStS,CAAAA,CAAQ,QAAQ,CAAA,EAGjFsS,CAAAA,CAAO,MAAA,EAAU,CAACA,EAAO,MAAA,CAAOtS,CAAO,CAAA,CAI7C,CAEA,SAASwS,CAAAA,CAAUxS,CAAAA,CAAqC,CACtD,OAAKA,EAAQ,KAAA,CACN,IAAA,CAAK,GAAA,EAAI,CAAIA,CAAAA,CAAQ,SAAA,CAAYA,CAAAA,CAAQ,KAAA,CADrB,KAE7B,CAEA,SAASyS,CAAAA,CAAczS,CAAAA,CAAsC,CAC3D,OAAIA,CAAAA,CAAQ,EAAA,GAAO,GAAA,CACV,MAAM,IAAA,CAAKiS,CAAAA,CAAc,IAAA,EAAM,CAAA,CAEpC,KAAA,CAAM,OAAA,CAAQjS,CAAAA,CAAQ,EAAE,CAAA,CACnBA,CAAAA,CAAQ,EAAA,CAEV,CAACA,EAAQ,EAAE,CACpB,CAEA,eAAe0S,EAAe1S,CAAAA,CAA2C,CAEvE,GAAIwS,CAAAA,CAAUxS,CAAO,CAAA,CAAG,OAExB,IAAM2S,EAAaF,CAAAA,CAAczS,CAAO,CAAA,CAClC4S,CAAAA,CAAwB,EAAC,CAGzBC,CAAAA,CAAoC,EAAC,CAE3C,QAAWC,CAAAA,IAAeH,CAAAA,CAAY,CACpC,IAAMI,EAAgBd,CAAAA,CAAc,GAAA,CAAIa,CAAW,CAAA,EAAK,EAAC,CAEzD,GAAIC,CAAAA,CAAc,MAAA,GAAW,EAAG,CAE9B,IAAM5F,CAAAA,CAAUiF,CAAAA,CAAgB,IAAIU,CAAW,CAAA,EAAK,EAAC,CAGrD,IAFA3F,CAAAA,CAAQ,IAAA,CAAKnN,CAAO,EAEbmN,CAAAA,CAAQ,MAAA,CAAS0E,CAAAA,EACtB1E,CAAAA,CAAQ,OAAM,CAEhBiF,CAAAA,CAAgB,GAAA,CAAIU,CAAAA,CAAa3F,CAAO,CAAA,CACxC,QACF,CAEA,IAAA,IAAW6F,CAAAA,IAAOD,CAAAA,CAAAA,CACZ,CAACC,CAAAA,CAAI,QAAUX,CAAAA,CAAcrS,CAAAA,CAASgT,CAAAA,CAAI,MAAM,IAClDH,CAAAA,CAAiB,IAAA,CACf,OAAA,CAAQ,OAAA,CAAQG,EAAI,OAAA,CAAQhT,CAAO,CAAC,CAAA,CAAE,IAAA,CACpC,IAAM,CAAE4S,CAAAA,CAAY,KAAKE,CAAW,EAAG,CAAA,CACtCtU,CAAAA,EAAU,CAAEwT,CAAAA,GAAkBhS,CAAAA,CAASxB,CAAAA,YAAiB,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAC,EAAG,CACtG,CACF,EAGN,CAGIqU,CAAAA,CAAiB,MAAA,CAAS,GAC5B,MAAM,OAAA,CAAQ,UAAA,CAAWA,CAAgB,EAGvCD,CAAAA,CAAY,MAAA,CAAS,CAAA,EACvBb,CAAAA,GAAa/R,CAAAA,CAAS4S,CAAW,CAAA,CAI/Bd,CAAAA,EACF,MAAMA,CAAAA,CAAY,IAAA,CAAK9R,CAAO,EAElC,CAEA,OAAO,CACL,OAAA,CAAQiT,CAAAA,CAA8D,CACpE,IAAMjT,CAAAA,CAA6B,CACjC,GAAGiT,CAAAA,CACH,EAAA,CAAIxB,EAAAA,EAAW,CACf,UAAW,IAAA,CAAK,GAAA,EAAI,CACpB,QAAA,CAAUwB,EAAQ,QAAA,EAAY,QAAA,CAC9B,KAAA,CAAOA,CAAAA,CAAQ,OAASrB,CAC1B,CAAA,CAOA,IAJAM,CAAAA,CAAe,IAAA,CAAKlS,CAAO,CAAA,CAC3BmS,CAAAA,CAAa,IAAInS,CAAAA,CAAQ,EAAA,CAAIA,CAAO,CAAA,CAG7BkS,EAAe,MAAA,CAASP,CAAAA,EAAY,CACzC,IAAMuB,EAAUhB,CAAAA,CAAe,KAAA,EAAM,CACjCgB,CAAAA,EACFf,EAAa,MAAA,CAAOe,CAAAA,CAAQ,EAAE,EAElC,CAGA,OAAAR,CAAAA,CAAe1S,CAAO,CAAA,CAAE,MAAOxB,CAAAA,EAAU,CACvC,IAAMuF,CAAAA,CAAMvF,aAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CAChEwT,EACFA,CAAAA,CAAgBhS,CAAAA,CAAS+D,CAAG,CAAA,CAE5B,QAAQ,KAAA,CAAM,wCAAA,CAA0CA,CAAG,EAE/D,CAAC,CAAA,CAEM/D,CAAAA,CAAQ,EACjB,CAAA,CAEA,SAAA,CAAU8N,CAAAA,CAAiBqF,CAAAA,CAAyBb,CAAAA,CAAsC,CACxF,IAAMc,CAAAA,CAAQ3B,EAAAA,EAAW,CAEnB4B,EAA6B,CACjC,EAAA,CAAID,CAAAA,CACJ,OAAA,CAAAtF,EACA,OAAA,CAAAqF,CAAAA,CACA,MAAA,CAAAb,CAAAA,CACA,WAAA,CAAa,IAAM,CACjB,IAAMgB,EAAOrB,CAAAA,CAAc,GAAA,CAAInE,CAAO,CAAA,EAAK,EAAC,CACtC0C,CAAAA,CAAQ8C,CAAAA,CAAK,SAAA,CAAWpL,GAAMA,CAAAA,CAAE,EAAA,GAAOkL,CAAK,CAAA,CAC9C5C,CAAAA,EAAS,CAAA,EACX8C,CAAAA,CAAK,MAAA,CAAO9C,EAAO,CAAC,EAExB,CACF,CAAA,CAEMC,EAAWwB,CAAAA,CAAc,GAAA,CAAInE,CAAO,CAAA,EAAK,EAAC,CAChD2C,CAAAA,CAAS,IAAA,CAAK4C,CAAY,CAAA,CAC1BpB,CAAAA,CAAc,GAAA,CAAInE,CAAAA,CAAS2C,CAAQ,CAAA,CAGnC,IAAMtD,CAAAA,CAAUiF,CAAAA,CAAgB,IAAItE,CAAO,CAAA,EAAK,EAAC,CACjDsE,EAAgB,MAAA,CAAOtE,CAAO,CAAA,CAC9B,IAAA,IAAWlI,CAAAA,IAAOuH,CAAAA,CAChB,GAAI,CAACmF,GAAUD,CAAAA,CAAczM,CAAAA,CAAK0M,CAAM,CAAA,CAAG,CACzC,IAAMpQ,CAAAA,CAASiR,CAAAA,CAAQvN,CAAG,EACtB1D,CAAAA,YAAkB,OAAA,EACpBA,CAAAA,CAAO,KAAA,CAAO1D,CAAAA,EAAU,CACtB,IAAMuF,CAAAA,CAAMvF,aAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,OAAOA,CAAK,CAAC,CAAA,CAChEwT,CAAAA,CACFA,EAAgBpM,CAAAA,CAAK7B,CAAG,CAAA,CAExB,OAAA,CAAQ,MAAM,gDAAA,CAAkDA,CAAG,EAEvE,CAAC,EAEL,CAGF,OAAOsP,CACT,CAAA,CAEA,WAAWf,CAAAA,CAAwBiB,CAAAA,CAAQ,GAAA,CAA0B,CACnE,IAAI5O,CAAAA,CAAWuN,CAAAA,CAAe,MAAA,CAAQ1J,CAAAA,EAAM,CAACgK,CAAAA,CAAUhK,CAAC,CAAC,EAEzD,OAAI8J,CAAAA,GACF3N,CAAAA,CAAWA,CAAAA,CAAS,OAAQ6D,CAAAA,EAAM6J,CAAAA,CAAc7J,CAAAA,CAAG8J,CAAM,CAAC,CAAA,CAAA,CAGrD3N,CAAAA,CAAS,KAAA,CAAM,CAAC4O,CAAK,CAC9B,CAAA,CAEA,UAAA,CAAWxI,EAA2C,CACpD,IAAMnF,CAAAA,CAAMuM,CAAAA,CAAa,IAAIpH,CAAE,CAAA,CAC/B,GAAI,EAAAnF,GAAO4M,CAAAA,CAAU5M,CAAG,CAAA,CAAA,CACxB,OAAOA,CACT,CAAA,CAEA,UAAA,CAAWkI,CAAAA,CAAsC,CAE/C,OAAA,CADgBsE,CAAAA,CAAgB,GAAA,CAAItE,CAAO,GAAK,EAAC,EAClC,MAAA,CAAQtF,CAAAA,EAAM,CAACgK,CAAAA,CAAUhK,CAAC,CAAC,CAC5C,CAAA,CAEA,KAAA,EAAc,CACZ0J,CAAAA,CAAe,OAAS,CAAA,CACxBC,CAAAA,CAAa,KAAA,EAAM,CACnBC,EAAgB,KAAA,GAClB,CAAA,CAEA,OAAA,EAAgB,CACdF,CAAAA,CAAe,MAAA,CAAS,CAAA,CACxBC,CAAAA,CAAa,KAAA,EAAM,CACnBC,CAAAA,CAAgB,KAAA,GAChBH,CAAAA,CAAc,KAAA,GAChB,CACF,CACF,CA8FO,SAASuB,EAAAA,CAAmBxN,CAAAA,CAA0C,CAC3E,GAAM,CACJ,GAAA,CAAAyN,CAAAA,CACA,MAAA,CAAQC,CAAAA,CAAgB,EAAC,CACzB,eAAAC,CAAAA,CAAiB,GAAA,CACjB,aAAA,CAAAC,CAAAA,CACA,eAAAC,CACF,CAAA,CAAI7N,CAAAA,CAEEsH,CAAAA,CAAS,IAAI,GAAA,CACbwG,CAAAA,CAAkB,IAAI,GAAA,CAO5B,IAAA,GAAW,CAAC/I,CAAAA,CAAIgJ,CAAI,IAAK,MAAA,CAAO,OAAA,CAAQL,CAAa,CAAA,CACnDpG,EAAO,GAAA,CAAIvC,CAAAA,CAAI,CACb,GAAGgJ,EACH,EAAA,CAAAhJ,CAAAA,CACA,MAAA,CAAQ,SAAA,CACR,SAAU,IAAA,CAAK,GAAA,EACjB,CAAC,EAIH,SAASiJ,CAAAA,CAAehU,CAAAA,CAAkC,CACxD,GAAIA,CAAAA,CAAQ,IAAA,GAAS,UAAA,EAAcA,CAAAA,CAAQ,OAAS,mBAAA,CAClD,OAGF,IAAMiU,CAAAA,CAAgBjU,CAAAA,CAAQ,aAAA,EAAiBA,CAAAA,CAAQ,OAAA,CACvD,GAAI,CAACiU,CAAAA,CAAe,OAEpB,IAAMxK,EAASqK,CAAAA,CAAgB,GAAA,CAAIG,CAAa,CAAA,CAC5CxK,IACF,YAAA,CAAaA,CAAAA,CAAO,KAAK,CAAA,CACzBqK,CAAAA,CAAgB,MAAA,CAAOG,CAAa,CAAA,CACpCxK,EAAO,OAAA,CAAQzJ,CAAoD,CAAA,EAEvE,CAEA,OAAO,CACL,QAAA,CAAS+K,CAAAA,CAAYgJ,CAAAA,CAA2D,CAC9E,IAAMG,CAAAA,CAAa,CAAC5G,CAAAA,CAAO,GAAA,CAAIvC,CAAE,CAAA,EAAKuC,CAAAA,CAAO,IAAIvC,CAAE,CAAA,EAAG,MAAA,GAAW,SAAA,CAEjEuC,EAAO,GAAA,CAAIvC,CAAAA,CAAI,CACb,GAAGgJ,EACH,EAAA,CAAAhJ,CAAAA,CACA,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,IAAA,CAAK,GAAA,EACjB,CAAC,CAAA,CAEGmJ,CAAAA,EACFN,CAAAA,GAAgB7I,CAAE,EAEtB,CAAA,CAEA,UAAA,CAAWA,CAAAA,CAAkB,CAC3B,IAAMxG,CAAAA,CAAQ+I,CAAAA,CAAO,GAAA,CAAIvC,CAAE,CAAA,CACvBxG,CAAAA,GACFA,CAAAA,CAAM,MAAA,CAAS,UACfsP,CAAAA,GAAiB9I,CAAE,CAAA,EAEvB,CAAA,CAEA,SAASA,CAAAA,CAAmC,CAC1C,OAAOuC,CAAAA,CAAO,IAAIvC,CAAE,CACtB,CAAA,CAEA,SAAA,EAAyB,CACvB,OAAO,KAAA,CAAM,IAAA,CAAKuC,EAAO,MAAA,EAAQ,CACnC,CAAA,CAEA,iBAAiB6G,CAAAA,CAAiC,CAChD,OAAO,KAAA,CAAM,KAAK7G,CAAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,CAChC/I,CAAAA,EAAUA,CAAAA,CAAM,YAAA,CAAa,SAAS4P,CAAU,CAAA,EAAK5P,CAAAA,CAAM,MAAA,GAAW,QACzE,CACF,CAAA,CAEA,IAAA,CAAK6P,CAAAA,CAAcC,EAAuBrU,CAAAA,CAA6C,CAErF,IAAMsU,CAAAA,CAAShH,EAAO,GAAA,CAAI8G,CAAI,CAAA,CAC9B,OAAIE,IACFA,CAAAA,CAAO,QAAA,CAAW,IAAA,CAAK,GAAA,GACvBA,CAAAA,CAAO,MAAA,CAAS,QAAA,CAAA,CAGXb,CAAAA,CAAI,QAAQ,CACjB,GAAGzT,CAAAA,CACH,IAAA,CAAAoU,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,IAAA,CAAMrU,EAAQ,IAAA,EAAQ,QACxB,CAAgD,CAClD,EAEA,MAAM,OAAA,CACJoU,CAAAA,CACAC,CAAAA,CACAzE,EACA2E,CAAAA,CACAC,CAAAA,CAAUb,CAAAA,CACgB,CAC1B,OAAO,IAAI,OAAA,CAAQ,CAACpK,EAASyD,CAAAA,GAAW,CAEtC,IAAMiH,CAAAA,CAAgBxC,IAAW,CAG3BuB,CAAAA,CAAMS,CAAAA,CAAI,SAAA,CAAUW,EAAOxO,CAAAA,EAAQ,CAAA,CACnCA,CAAAA,CAAI,aAAA,GAAkBqO,CAAAA,EAAiBrO,CAAAA,CAAI,OAAA,GAAYqO,CAAAA,IACzDjB,EAAI,WAAA,EAAY,CAChBgB,CAAAA,CAAepO,CAAG,GAEtB,CAAA,CAAG,CAAE,KAAA,CAAO,CAAC,UAAU,CAAE,CAAC,CAAA,CAEpB6O,CAAAA,CAAQ,UAAA,CAAW,IAAM,CAC7BzB,CAAAA,CAAI,aAAY,CAChBc,CAAAA,CAAgB,MAAA,CAAOG,CAAa,EACpCjH,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAmDwH,CAAO,CAAA,EAAA,CAAI,CAAC,EAClF,CAAA,CAAGA,CAAO,CAAA,CAEVV,CAAAA,CAAgB,GAAA,CAAIG,EAAe,CAAE,OAAA,CAAS1K,CAAAA,CAAqE,MAAA,CAAAyD,EAAQ,KAAA,CAAAyH,CAAM,CAAC,CAAA,CAElIhB,EAAI,OAAA,CAAQ,CACV,IAAA,CAAM,SAAA,CACN,IAAA,CAAAW,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,OAAAzE,CAAAA,CACA,OAAA,CAAA2E,CAAAA,CACA,OAAA,CAAAC,EACA,aAAA,CAAAP,CACF,CAAyE,EAC3E,CAAC,CACH,CAAA,CAEA,MAAM,QAAA,CACJG,CAAAA,CACAC,CAAAA,CACAK,CAAAA,CACAzT,CAAAA,CACkC,CAClC,OAAO,IAAI,OAAA,CAAQ,CAACsI,EAASyD,CAAAA,GAAW,CACtC,IAAMiH,CAAAA,CAAgBxC,IAAW,CAG3BuB,CAAAA,CAAMS,CAAAA,CAAI,SAAA,CAAUW,EAAOxO,CAAAA,EAAQ,CAAA,CACnCA,CAAAA,CAAI,aAAA,GAAkBqO,GAAiBrO,CAAAA,CAAI,OAAA,GAAYqO,CAAAA,IACzDjB,CAAAA,CAAI,aAAY,CAChBgB,CAAAA,CAAepO,CAAG,CAAA,EAEtB,EAAG,CAAE,KAAA,CAAO,CAAC,mBAAmB,CAAE,CAAC,CAAA,CAE7B6O,CAAAA,CAAQ,WAAW,IAAM,CAC7BzB,CAAAA,CAAI,WAAA,GACJc,CAAAA,CAAgB,MAAA,CAAOG,CAAa,CAAA,CACpCjH,EAAO,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAsD2G,CAAc,CAAA,EAAA,CAAI,CAAC,EAC5F,CAAA,CAAGA,CAAc,CAAA,CAEjBG,CAAAA,CAAgB,GAAA,CAAIG,CAAAA,CAAe,CAAE,OAAA,CAAS1K,CAAAA,CAAqE,MAAA,CAAAyD,CAAAA,CAAQ,MAAAyH,CAAM,CAAC,CAAA,CAElIhB,CAAAA,CAAI,OAAA,CAAQ,CACV,IAAA,CAAM,YAAA,CACN,KAAAW,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,IAAA,CAAAK,EACA,OAAA,CAAAzT,CAAAA,CACA,aAAA,CAAAgT,CACF,CAA4E,EAC9E,CAAC,CACH,CAAA,CAEA,MAAM,KAAA,CACJG,CAAAA,CACAC,CAAAA,CACAM,CAAAA,CACA1T,EAC0B,CAC1B,OAAO,IAAI,OAAA,CAAQ,CAACsI,CAAAA,CAASyD,CAAAA,GAAW,CACtC,IAAMiH,EAAgBxC,EAAAA,EAAW,CAG3BuB,CAAAA,CAAMS,CAAAA,CAAI,SAAA,CAAUW,CAAAA,CAAOxO,CAAAA,EAAQ,CAAA,CACnCA,EAAI,aAAA,GAAkBqO,CAAAA,EAAiBrO,CAAAA,CAAI,OAAA,GAAYqO,KACzDjB,CAAAA,CAAI,WAAA,EAAY,CAChBgB,CAAAA,CAAepO,CAAG,CAAA,EAEtB,CAAA,CAAG,CAAE,KAAA,CAAO,CAAC,UAAU,CAAE,CAAC,EAEpB6O,CAAAA,CAAQ,UAAA,CAAW,IAAM,CAC7BzB,EAAI,WAAA,EAAY,CAChBc,CAAAA,CAAgB,MAAA,CAAOG,CAAa,CAAA,CACpCjH,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD2G,CAAc,CAAA,EAAA,CAAI,CAAC,EACvF,CAAA,CAAGA,CAAc,CAAA,CAEjBG,CAAAA,CAAgB,IAAIG,CAAAA,CAAe,CAAE,OAAA,CAAS1K,CAAAA,CAAqE,OAAAyD,CAAAA,CAAQ,KAAA,CAAAyH,CAAM,CAAC,EAElIhB,CAAAA,CAAI,OAAA,CAAQ,CACV,IAAA,CAAM,QACN,IAAA,CAAAW,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,SAAAM,CAAAA,CACA,OAAA,CAAA1T,CAAAA,CACA,aAAA,CAAAgT,CACF,CAAuE,EACzE,CAAC,CACH,CAAA,CAEA,SAAA,CAAUG,CAAAA,CAAcpU,CAAAA,CAA6C,CACnE,OAAOyT,CAAAA,CAAI,OAAA,CAAQ,CACjB,GAAGzT,CAAAA,CACH,IAAA,CAAAoU,CAAAA,CACA,EAAA,CAAI,IACJ,IAAA,CAAMpU,CAAAA,CAAQ,IAAA,EAAQ,QACxB,CAAgD,CAClD,CAAA,CAEA,MAAA,CAAO8N,EAAiBqF,CAAAA,CAAyBb,CAAAA,CAAsC,CAErF,IAAM/N,EAAQ+I,CAAAA,CAAO,GAAA,CAAIQ,CAAO,CAAA,CAChC,OAAIvJ,CAAAA,GACFA,CAAAA,CAAM,MAAA,CAAS,QAAA,CACfA,CAAAA,CAAM,QAAA,CAAW,IAAA,CAAK,GAAA,GACtBqP,CAAAA,GAAgB9F,CAAO,CAAA,CAAA,CAGlB2F,CAAAA,CAAI,UAAU3F,CAAAA,CAASqF,CAAAA,CAASb,CAAM,CAC/C,EAEA,MAAA,EAAqB,CACnB,OAAOmB,CACT,CAAA,CAEA,OAAA,EAAgB,CAEd,IAAA,GAAW,EAAGhK,CAAM,CAAA,GAAKqK,CAAAA,CACvB,aAAarK,CAAAA,CAAO,KAAK,CAAA,CAE3BqK,CAAAA,CAAgB,OAAM,CACtBxG,CAAAA,CAAO,KAAA,GACT,CACF,CACF,CAmBO,SAASsH,GAAgBC,CAAAA,CAAuB/G,CAAAA,CAAiB,CACtE,IAAMgH,EAAW,IAAI,GAAA,CAEfzB,CAAAA,CAAewB,CAAAA,CAAQ,OAAO/G,CAAAA,CAAS,MAAO9N,CAAAA,EAAY,CAC9D,GAAIA,CAAAA,CAAQ,IAAA,GAAS,SAAA,CAAW,CAC9B,IAAMsQ,CAAAA,CAAUtQ,CAAAA,CACVmT,CAAAA,CAAU2B,EAAS,GAAA,CAAIxE,CAAAA,CAAQ,MAAM,CAAA,CAEvCxL,EACJ,GAAIqO,CAAAA,CACF,GAAI,CACF,IAAMjR,CAAAA,CAAS,MAAMiR,CAAAA,CAAQ7C,EAAQ,OAAO,CAAA,CAC5CxL,CAAAA,CAAW,CACT,KAAM,UAAA,CACN,OAAA,CAAS5C,CAAAA,CAAO,OAAA,CAChB,OAAQA,CAAAA,CAAO,MAAA,CACf,KAAA,CAAOA,CAAAA,CAAO,KAChB,EACF,CAAA,MAAS1D,CAAAA,CAAO,CACdsG,EAAW,CACT,IAAA,CAAM,UAAA,CACN,OAAA,CAAS,MACT,KAAA,CAAOtG,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,QAAU,MAAA,CAAOA,CAAK,CAC9D,EACF,CAAA,KAEAsG,CAAAA,CAAW,CACT,IAAA,CAAM,WACN,OAAA,CAAS,KAAA,CACT,KAAA,CAAO,CAAA,gBAAA,EAAmBwL,EAAQ,MAAM,CAAA,CAC1C,CAAA,CAGFuE,CAAAA,CAAQ,KAAK/G,CAAAA,CAAS9N,CAAAA,CAAQ,IAAA,CAAM,CAClC,GAAG8E,CAAAA,CACH,aAAA,CAAe9E,CAAAA,CAAQ,eAAiBA,CAAAA,CAAQ,EAAA,CAChD,OAAA,CAASA,CAAAA,CAAQ,eAAiBA,CAAAA,CAAQ,EAC5C,CAAC,EACH,CACF,CAAA,CAAG,CAAE,KAAA,CAAO,CAAC,SAAS,CAAE,CAAC,CAAA,CAEzB,OAAO,CACL,SAAA,CACE4P,CAAAA,CACAuD,CAAAA,CACM,CACN2B,CAAAA,CAAS,GAAA,CAAIlF,CAAAA,CAAQuD,CAAO,EAC9B,CAAA,CAGA,UAAA,CAAWvD,CAAAA,CAAsB,CAC/BkF,CAAAA,CAAS,MAAA,CAAOlF,CAAM,EACxB,EAGA,OAAA,EAAgB,CACdyD,CAAAA,CAAa,WAAA,GACbyB,CAAAA,CAAS,KAAA,GACX,CACF,CACF,CAmBO,SAASC,EAAAA,CAAgBF,CAAAA,CAAuB/G,CAAAA,CAAiB,CACtE,IAAIkH,CAAAA,CAKS,KAEP3B,CAAAA,CAAewB,CAAAA,CAAQ,MAAA,CAAO/G,CAAAA,CAAS,MAAO9N,CAAAA,EAAY,CAC9D,GAAIA,CAAAA,CAAQ,OAAS,YAAA,EAAgBgV,CAAAA,CAAmB,CACtD,IAAMC,CAAAA,CAAajV,CAAAA,CACbkV,CAAAA,CAAQ,IAAA,CAAK,KAAI,CAEnBhT,CAAAA,CACJ,GAAI,CACF,IAAM4C,CAAAA,CAAW,MAAMkQ,CAAAA,CAAkBC,CAAAA,CAAW,KAAMA,CAAAA,CAAW,OAAO,CAAA,CAC5E/S,CAAAA,CAAS,CACP,IAAA,CAAM,mBAAA,CACN,OAAA,CAAS4C,EAAS,OAAA,CAClB,MAAA,CAAQA,CAAAA,CAAS,MAAA,CACjB,MAAOA,CAAAA,CAAS,KAAA,CAChB,OAAA,CAASA,CAAAA,CAAS,SAAW,CAAE,UAAA,CAAY,IAAA,CAAK,GAAA,GAAQoQ,CAAM,CAChE,EACF,CAAA,MAAS1W,EAAO,CACd0D,CAAAA,CAAS,CACP,IAAA,CAAM,oBACN,OAAA,CAAS,KAAA,CACT,KAAA,CAAO1D,CAAAA,YAAiB,MAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAAA,CAC5D,OAAA,CAAS,CAAE,UAAA,CAAY,KAAK,GAAA,EAAI,CAAI0W,CAAM,CAC5C,EACF,CAEAL,CAAAA,CAAQ,IAAA,CAAK/G,CAAAA,CAAS9N,EAAQ,IAAA,CAAM,CAClC,GAAGkC,CAAAA,CACH,aAAA,CAAelC,CAAAA,CAAQ,aAAA,EAAiBA,CAAAA,CAAQ,GAChD,OAAA,CAASA,CAAAA,CAAQ,aAAA,EAAiBA,CAAAA,CAAQ,EAC5C,CAAC,EACH,CACF,CAAA,CAAG,CAAE,KAAA,CAAO,CAAC,YAAY,CAAE,CAAC,CAAA,CAE5B,OAAO,CACL,aACEmT,CAAAA,CAMM,CACN6B,CAAAA,CAAoB7B,EACtB,EAGA,aAAA,EAAsB,CACpB6B,CAAAA,CAAoB,KACtB,EAGA,OAAA,EAAgB,CACd3B,CAAAA,CAAa,WAAA,EAAY,CACzB2B,CAAAA,CAAoB,KACtB,CACF,CACF,CAkBO,SAASG,EAAAA,CAAaN,CAAAA,CAAuB/G,EAAiB,CACnE,IAAMsH,CAAAA,CAAgB,IAAI,IAEpB/B,CAAAA,CAAewB,CAAAA,CAAQ,MAAA,CAAO/G,CAAAA,CAAU9N,CAAAA,EAAY,CACxD,GAAIA,CAAAA,CAAQ,OAAS,QAAA,CAAU,CAC7B,IAAMqV,CAAAA,CAASrV,EACT8U,CAAAA,CAAWM,CAAAA,CAAc,GAAA,CAAIC,CAAAA,CAAO,KAAK,CAAA,EAAK,EAAC,CACrD,IAAA,IAAWlC,CAAAA,IAAW2B,CAAAA,CACpB3B,CAAAA,CAAQkC,CAAAA,CAAO,OAAO,EAE1B,CACF,CAAA,CAAG,CAAE,MAAO,CAAC,QAAQ,CAAE,CAAC,EAExB,OAAO,CACL,SAAA,CAAUC,CAAAA,CAAkBnC,CAAAA,CAAgE,CAE1F,IAAMoC,CAAAA,CAAkB,IAAI,GAAA,CAE5B,IAAA,IAAWhD,CAAAA,IAAS+C,CAAAA,CAAQ,CAC1B,IAAMR,CAAAA,CAAWM,CAAAA,CAAc,GAAA,CAAI7C,CAAK,CAAA,EAAK,EAAC,CACxCiD,CAAAA,CAAkB/P,GAAqB0N,CAAAA,CAAQZ,CAAAA,CAAO9M,CAAO,CAAA,CACnE8P,EAAgB,GAAA,CAAIhD,CAAAA,CAAOiD,CAAc,CAAA,CACzCV,EAAS,IAAA,CAAKU,CAAc,CAAA,CAC5BJ,CAAAA,CAAc,IAAI7C,CAAAA,CAAOuC,CAAQ,EACnC,CAGA,OAAAD,CAAAA,CAAQ,SAAA,CAAU/G,CAAAA,CAAS,CACzB,IAAA,CAAM,WAAA,CACN,MAAA,CAAAwH,CACF,CAA8B,CAAA,CAEvB,IAAM,CAEX,IAAA,GAAW,CAAC/C,CAAAA,CAAOiD,CAAc,CAAA,GAAKD,CAAAA,CAAiB,CACrD,IAAMT,CAAAA,CAAWM,CAAAA,CAAc,IAAI7C,CAAK,CAAA,CACxC,GAAIuC,CAAAA,CAAU,CACZ,IAAMW,CAAAA,CAAMX,CAAAA,CAAS,OAAA,CAAQU,CAAc,CAAA,CACvCC,CAAAA,EAAO,CAAA,EAAGX,CAAAA,CAAS,MAAA,CAAOW,CAAAA,CAAK,CAAC,CAAA,CAChCX,EAAS,MAAA,GAAW,CAAA,EAAGM,CAAAA,CAAc,MAAA,CAAO7C,CAAK,EACvD,CACF,CACAgD,CAAAA,CAAgB,OAAM,CACtBV,CAAAA,CAAQ,SAAA,CAAU/G,CAAAA,CAAS,CACzB,IAAA,CAAM,aAAA,CACN,MAAA,CAAAwH,CACF,CAAsE,EACxE,CACF,CAAA,CAEA,QAAQ/C,CAAAA,CAAe9M,CAAAA,CAAwB,CAC7CoP,CAAAA,CAAQ,UAAU/G,CAAAA,CAAS,CACzB,IAAA,CAAM,QAAA,CACN,KAAA,CAAAyE,CAAAA,CACA,OAAA,CAAA9M,CACF,CAA2B,EAC7B,CAAA,CAGA,OAAA,EAAgB,CACd4N,EAAa,WAAA,EAAY,CACzB+B,CAAAA,CAAc,KAAA,GAChB,CACF,CACF,CCz8BA,IAAMM,EAAAA,CAA6B,CAEjC,CACE,IAAA,CAAM,KAAA,CACN,OAAA,CAAS,oCAAA,CACT,SAAWC,CAAAA,EAAU,CAEnB,IAAMC,CAAAA,CAASD,EAAM,OAAA,CAAQ,QAAA,CAAU,EAAE,CAAA,CAUzC,OARI,EAAAC,CAAAA,CAAO,UAAA,CAAW,KAAK,GAAKA,CAAAA,CAAO,UAAA,CAAW,KAAK,CAAA,EAAKA,EAAO,UAAA,CAAW,GAAG,CAAA,EAI7EA,CAAAA,CAAO,MAAM,CAAA,CAAG,CAAC,CAAA,GAAM,IAAA,EAIvBA,EAAO,KAAA,CAAM,CAAC,CAAA,GAAM,MAAA,CAI1B,CAAA,CACA,UAAA,CAAY,GACd,CAAA,CAGA,CACE,IAAA,CAAM,aAAA,CACN,OAAA,CAAS,+DAAA,CACT,SAAWD,CAAAA,EAAU,CACnB,IAAMC,CAAAA,CAASD,EAAM,OAAA,CAAQ,QAAA,CAAU,EAAE,CAAA,CACzC,GAAIC,CAAAA,CAAO,MAAA,CAAS,EAAA,EAAMA,EAAO,MAAA,CAAS,EAAA,CAAI,OAAO,MAAA,CAErD,IAAIjQ,CAAAA,CAAM,CAAA,CACNkQ,CAAAA,CAAS,KAAA,CACb,QAASjP,CAAAA,CAAIgP,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAGhP,CAAAA,EAAK,CAAA,CAAGA,CAAAA,EAAAA,CAAK,CAC3C,IAAMkP,CAAAA,CAAOF,CAAAA,CAAOhP,CAAC,CAAA,CACrB,GAAI,CAACkP,CAAAA,CAAM,SACX,IAAIC,EAAQ,MAAA,CAAO,QAAA,CAASD,CAAAA,CAAM,EAAE,CAAA,CAChCD,CAAAA,GACFE,CAAAA,EAAS,CAAA,CACLA,EAAQ,CAAA,GAAGA,CAAAA,EAAS,CAAA,CAAA,CAAA,CAE1BpQ,CAAAA,EAAOoQ,EACPF,CAAAA,CAAS,CAACA,EACZ,CACA,OAAOlQ,CAAAA,CAAM,EAAA,GAAO,CACtB,CAAA,CACA,UAAA,CAAY,GACd,CAAA,CAGA,CACE,KAAM,OAAA,CACN,OAAA,CAAS,+CAAA,CACT,UAAA,CAAY,EACd,CAAA,CAGA,CACE,IAAA,CAAM,OAAA,CAEN,QAAS,iEAAA,CACT,QAAA,CAAWgQ,CAAAA,EAAU,CACnB,IAAMC,CAAAA,CAASD,CAAAA,CAAM,OAAA,CAAQ,MAAO,EAAE,CAAA,CAEtC,OAAOC,CAAAA,CAAO,QAAU,EAAA,EAAMA,CAAAA,CAAO,MAAA,EAAU,EACjD,EACA,UAAA,CAAY,EACd,CAAA,CAGA,CACE,IAAA,CAAM,eAAA,CAEN,OAAA,CAAS,oFAAA,CACT,WAAY,GACd,CAAA,CAGA,CACE,IAAA,CAAM,aACN,OAAA,CAAS,2CAAA,CACT,QAAA,CAAWD,CAAAA,EACKA,EAAM,KAAA,CAAM,GAAG,CAAA,CAChB,KAAA,CAAOvS,GAAM,CACxB,IAAM4S,CAAAA,CAAM,MAAA,CAAO,SAAS5S,CAAAA,CAAG,EAAE,CAAA,CACjC,OAAO4S,GAAO,CAAA,EAAKA,CAAAA,EAAO,GAC5B,CAAC,EAEH,UAAA,CAAY,EACd,CAAA,CAGA,CACE,IAAA,CAAM,cAAA,CAEN,OAAA,CAAS,uCAAA,CACT,WAAY,EACd,CAAA,CAGA,CACE,IAAA,CAAM,WAEN,OAAA,CAAS,wCAAA,CACT,UAAA,CAAY,GACd,EAGA,CACE,IAAA,CAAM,gBAAA,CACN,OAAA,CAAS,2DAAA,CACT,UAAA,CAAY,EACd,CAAA,CAGA,CACE,IAAA,CAAM,YAAA,CACN,OAAA,CAAS,iEAAA,CACT,WAAY,EACd,CACF,CAAA,CAOA,SAASC,GAAgBtW,CAAAA,CAA6B,CACpD,IAAMwQ,CAAAA,CAAyB,EAAC,CAK1B+F,CAAAA,CAAc,+FAAA,CACdC,EAAiB,IAAI,MAAA,CACzB,CAAA,oCAAA,EAAuCD,CAAW,wDAClD,IACF,CAAA,CAEIP,CAAAA,CACJ,KAAA,CAAQA,EAAQQ,CAAAA,CAAe,IAAA,CAAKxW,CAAI,CAAA,IAAO,IAAA,EAC7CwQ,CAAAA,CAAQ,IAAA,CAAK,CACX,KAAM,SAAA,CACN,KAAA,CAAOwF,CAAAA,CAAM,CAAC,EACd,QAAA,CAAU,CAAE,KAAA,CAAOA,CAAAA,CAAM,MAAO,GAAA,CAAKA,CAAAA,CAAM,KAAA,CAAQA,CAAAA,CAAM,CAAC,CAAA,CAAE,MAAO,CAAA,CACnE,WAAY,EACd,CAAC,CAAA,CAGH,OAAOxF,CACT,CAOA,IAAMiG,EAAAA,CAAgB,CACpB,KAAM,KAAA,CAAO,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,MAAA,CAAQ,KAAA,CAAO,OAAA,CAChD,SAAA,CAAW,SAAU,UAAA,CAAY,WAAA,CAAa,MAAA,CAC9C,MAAA,CAAQ,KAAM,OAAA,CAAS,SAAA,CAAW,WACpC,CAAA,CAGA,SAASC,EAAAA,CAAY1W,CAAAA,CAA6B,CAChD,IAAMwQ,CAAAA,CAAyB,EAAC,CAK1BmG,CAAAA,CAAgBF,GAAc,IAAA,CAAK,GAAG,CAAA,CACtCG,CAAAA,CAAY,IAAI,MAAA,CACpB,CAAA,IAAA,EAAOD,CAAa,CAAA,4DAAA,CAAA,CACpB,IACF,CAAA,CAEIX,CAAAA,CAEJ,KAAA,CAAQA,CAAAA,CAAQY,EAAU,IAAA,CAAK5W,CAAI,CAAA,IAAO,IAAA,EAAM,CAC9C,IAAMqM,CAAAA,CAAO2J,CAAAA,CAAM,CAAC,EACda,CAAAA,CAASb,CAAAA,CAAM,CAAC,CAAA,CAEjB3J,IAEDA,CAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,EAAU,CAAA,EAAMwK,CAAAA,EAAUJ,EAAAA,CAAc,KAAKhT,CAAAA,EAAKoT,CAAAA,CAAO,WAAA,EAAY,CAAE,SAASpT,CAAC,CAAC,CAAA,CAAA,EACtG+M,CAAAA,CAAQ,KAAK,CACX,IAAA,CAAM,MAAA,CACN,KAAA,CAAOnE,CAAAA,CACP,QAAA,CAAU,CAAE,KAAA,CAAO2J,EAAM,KAAA,CAAO,GAAA,CAAKA,CAAAA,CAAM,KAAA,CAAQA,EAAM,CAAC,CAAA,CAAE,MAAO,CAAA,CACnE,WAAY,EAAA,CACZ,OAAA,CAASA,CAAAA,CAAM,CAAC,CAClB,CAAC,EAEL,CAEA,OAAOxF,CACT,CAOA,IAAMsG,EAAAA,CAAuB,IAShBC,EAAAA,CAA6B,CACxC,IAAA,CAAM,OAAA,CACN,MAAM,MAAA,CAAO/W,CAAAA,CAAcgN,CAAAA,CAA0C,CAEnE,GAAIhN,CAAAA,CAAK,MAAA,CAAS8W,EAAAA,CAChB,MAAM,IAAI,KAAA,CACR,CAAA,4CAAA,EAA+CA,EAAoB,qEAErE,CAAA,CAGF,IAAMtG,CAAAA,CAAyB,GACzBvD,CAAAA,CAAU,IAAI,GAAA,CAAID,CAAK,CAAA,CAG7B,IAAA,IAAW9M,CAAAA,IAAW6V,EAAAA,CAAc,CAClC,GAAI,CAAC9I,CAAAA,CAAQ,GAAA,CAAI/M,EAAQ,IAAI,CAAA,CAAG,SAEhC,IAAMkM,EAAQ,IAAI,MAAA,CAAOlM,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAQA,CAAAA,CAAQ,OAAA,CAAQ,KAAK,EAClE8V,CAAAA,CAEJ,KAAA,CAAQA,CAAAA,CAAQ5J,CAAAA,CAAM,KAAKpM,CAAI,CAAA,IAAO,IAAA,EAAM,CAC1C,IAAMV,CAAAA,CAAQ0W,CAAAA,CAAM,CAAC,CAAA,EAAKA,CAAAA,CAAM,CAAC,CAAA,CAC3B1U,CAAAA,CAAUtB,EAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGgW,EAAM,KAAA,CAAQ,EAAE,CAAA,CAAGA,CAAAA,CAAM,MAAQ1W,CAAAA,CAAM,MAAA,CAAS,EAAE,CAAA,CAGrFY,EAAQ,QAAA,EAAY,CAACA,CAAAA,CAAQ,QAAA,CAASZ,EAAOgC,CAAO,CAAA,EAIxDkP,CAAAA,CAAQ,IAAA,CAAK,CACX,IAAA,CAAMtQ,CAAAA,CAAQ,IAAA,CACd,KAAA,CAAAZ,EACA,QAAA,CAAU,CAAE,KAAA,CAAO0W,CAAAA,CAAM,KAAA,CAAO,GAAA,CAAKA,CAAAA,CAAM,KAAA,CAAQ1W,EAAM,MAAO,CAAA,CAChE,UAAA,CAAYY,CAAAA,CAAQ,WACpB,OAAA,CAAAoB,CACF,CAAC,EACH,CACF,CAGA,OAAI2L,CAAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EACvBuD,CAAAA,CAAQ,IAAA,CAAK,GAAG8F,EAAAA,CAAgBtW,CAAI,CAAC,CAAA,CAInCiN,EAAQ,GAAA,CAAI,MAAM,CAAA,EACpBuD,CAAAA,CAAQ,KAAK,GAAGkG,EAAAA,CAAY1W,CAAI,CAAC,CAAA,CAG5BwQ,CACT,CACF,CAAA,CAkBO,SAASwG,EAAAA,CACdhX,CAAAA,CACAiX,CAAAA,CACAC,CAAAA,CAAwB,QAChB,CAER,IAAMC,CAAAA,CAAS,CAAC,GAAGF,CAAK,CAAA,CAAE,IAAA,CAAK,CAAC,EAAGG,CAAAA,GAAMA,CAAAA,CAAE,QAAA,CAAS,KAAA,CAAQ,EAAE,QAAA,CAAS,KAAK,CAAA,CAExE7U,CAAAA,CAASvC,EACb,IAAA,IAAW0J,CAAAA,IAAQyN,CAAAA,CAAQ,CACzB,IAAIE,CAAAA,CAEJ,OAAQH,CAAAA,EACN,KAAK,aAAA,CACHG,CAAAA,CAAc,YAAA,CACd,MACF,KAAK,OAAA,CACHA,CAAAA,CAAc,CAAA,CAAA,EAAI3N,EAAK,IAAA,CAAK,WAAA,EAAa,CAAA,CAAA,CAAA,CACzC,MACF,KAAK,QAAA,CACH2N,CAAAA,CAAc,GAAA,CAAI,MAAA,CAAO3N,CAAAA,CAAK,KAAA,CAAM,MAAM,EAC1C,MACF,KAAK,QAAA,CAGH2N,CAAAA,CAAc,SAASC,EAAAA,CAAU5N,CAAAA,CAAK,KAAK,CAAC,IAC5C,KACJ,CAEAnH,CAAAA,CAASA,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAGmH,CAAAA,CAAK,QAAA,CAAS,KAAK,CAAA,CAAI2N,CAAAA,CAAc9U,CAAAA,CAAO,KAAA,CAAMmH,EAAK,QAAA,CAAS,GAAG,EAC9F,CAEA,OAAOnH,CACT,CAaA,SAAS+U,EAAAA,CAAUC,EAAqB,CAKtC,IAAIC,CAAAA,CAAO,UAAA,CACX,QAASvQ,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIsQ,CAAAA,CAAI,OAAQtQ,CAAAA,EAAAA,CAC9BuQ,CAAAA,EAAQD,CAAAA,CAAI,UAAA,CAAWtQ,CAAC,CAAA,CACxBuQ,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAKA,CAAAA,CAAM,QAAS,CAAA,CAIlC,OAAA,CAAQA,IAAS,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,CAAG,GAAG,CAClD,CA6BA,IAAMC,EAAAA,CAA+B,CACnC,KAAA,CACA,aAAA,CACA,OAAA,CACA,OAAA,CACA,eAAA,CACA,cACF,EAuBO,SAASC,EAAAA,CACd/Y,CAAAA,CAAuC,GACN,CACjC,GAAM,CACJ,KAAA,CAAAqO,EAAQyK,EAAAA,CACR,QAAA,CAAAE,CAAAA,CAAW,OAAA,CACX,MAAA,CAAA9X,CAAAA,CAAS,KAAA,CACT,cAAA,CAAA+X,EAAiB,OAAA,CACjB,aAAA,CAAAC,CAAAA,CAAgB,EAAA,CAChB,WAAAC,CAAAA,CACA,SAAA,CAAAhW,CAAAA,CAAY,GACZ,eAAA,CAAAiW,CAAAA,CAAkB,CAAA,CAClB,eAAA,CAAAC,CAAAA,CAAkB,GACpB,CAAA,CAAIrZ,CAAAA,CAEEsZ,EAAmBN,CAAAA,GAAa,OAAA,CAAUZ,EAAAA,CAAgBY,CAAAA,CAE1DO,EAAW,IAAI,GAAA,CAAIpW,CAAAA,CAAU,GAAA,CAAKqW,GAAMA,CAAAA,CAAE,WAAA,EAAY,CAAE,IAAA,EAAM,CAAC,CAAA,CAGrE,eAAeC,EAAkBpY,CAAAA,CAAcqY,CAAAA,CAA6C,CAE1F,GAAIJ,IAAqBlB,EAAAA,CACvB,OAAOkB,CAAAA,CAAiB,MAAA,CAAOjY,EAAMqY,CAAQ,CAAA,CAI/C,IAAIvD,CAAAA,CACJ,GAAI,CACF,OAAO,MAAM,QAAQ,IAAA,CAAK,CACxBmD,CAAAA,CAAiB,MAAA,CAAOjY,EAAMqY,CAAQ,CAAA,CACtC,IAAI,OAAA,CAAe,CAACC,CAAAA,CAAGjL,CAAAA,GAAW,CAChCyH,CAAAA,CAAQ,UAAA,CACN,IAAMzH,CAAAA,CAAO,IAAI,MAAM,CAAA,0BAAA,EAA6B4K,CAAAA,CAAiB,IAAI,CAAA,kBAAA,EAAqBD,CAAe,CAAA,EAAA,CAAI,CAAC,CAAA,CAClHA,CACF,EACF,CAAC,CACH,CAAC,CACH,QAAE,CACA,YAAA,CAAalD,CAAM,EACrB,CACF,CAEA,OAAO,MAAO/U,CAAAA,EAAmC,CAI/C,IAAMwY,CAAAA,CAAAA,CAHQ,MAAMH,CAAAA,CAAkBrY,EAAK,KAAA,CAAOiN,CAAK,CAAA,EAGhC,MAAA,CAAQtD,CAAAA,EACzB,EAAAA,CAAAA,CAAK,UAAA,CAAamO,GAElBK,CAAAA,CAAS,GAAA,CAAIxO,CAAAA,CAAK,KAAA,CAAM,aAAY,CAAE,IAAA,EAAM,CAAA,CAEjD,EAMD,GAJI6O,CAAAA,CAAS,MAAA,CAAS,CAAA,EACpBT,CAAAA,GAAaS,CAAQ,CAAA,CAGnBA,CAAAA,CAAS,QAAUR,CAAAA,CAAiB,CACtC,GAAIlY,CAAAA,CAEF,OAAO,CACL,MAAA,CAAQ,IAAA,CACR,WAAA,CAHmBmX,GAAUjX,CAAAA,CAAK,KAAA,CAAOwY,CAAAA,CAAUX,CAAc,CAInE,CAAA,CAGF,IAAMY,CAAAA,CAAqC,EAAC,CAC5C,IAAA,IAAW9O,CAAAA,IAAQ6O,CAAAA,CACjBC,EAAW9O,CAAAA,CAAK,IAAI,CAAA,CAAA,CAAK8O,CAAAA,CAAW9O,EAAK,IAAI,CAAA,EAAK,CAAA,EAAK,CAAA,CAOzD,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,OAAQ,CAAA,cAAA,EANM,MAAA,CAAO,OAAA,CAAQ8O,CAAU,EACtC,GAAA,CAAI,CAAC,CAAC/V,CAAAA,CAAMgW,CAAK,CAAA,GAAM,CAAA,EAAGhW,CAAI,CAAA,EAAA,EAAKgW,CAAK,CAAA,CAAE,CAAA,CAC1C,IAAA,CAAK,IAAI,CAIsB,CAAA,CAAA,CAClC,CACF,CAEA,OAAO,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CAaO,SAASC,EAAAA,CACd/Z,CAAAA,CAAuC,EAAC,CACN,CAClC,IAAMga,EAAiBjB,EAAAA,CAA2B/Y,CAAO,CAAA,CAEzD,aAAcoB,CAAAA,CAAMuB,CAAAA,GAAsC,CACxD,IAAMtB,EAAO,OAAOD,CAAAA,CAAK,MAAA,EAAW,QAAA,CAAWA,CAAAA,CAAK,MAAA,CAAS,IAAA,CAAK,SAAA,CAAUA,EAAK,MAAM,CAAA,CAEvF,OAAO4Y,CAAAA,CACL,CAAE,KAAA,CAAO3Y,CAAAA,CAAM,SAAA,CAAWD,CAAAA,CAAK,SAAU,CAAA,CACzCuB,CACF,CACF,CACF,CAsBA,eAAsBsX,EAAAA,CACpB5Y,CAAAA,CACArB,CAAAA,CAMI,EAAC,CACwB,CAC7B,GAAM,CACJ,MAAAqO,CAAAA,CAAQyK,EAAAA,CACR,QAAA,CAAAE,CAAAA,CAAW,QACX,aAAA,CAAAE,CAAAA,CAAgB,EAAA,CAChB,OAAA,CAAAhD,CAAAA,CAAU,GACZ,CAAA,CAAIlW,CAAAA,CAEEsZ,EAAmBN,CAAAA,GAAa,OAAA,CAAUZ,EAAAA,CAAgBY,CAAAA,CAG5DV,EACJ,GAAIgB,CAAAA,GAAqBlB,EAAAA,CAEvBE,CAAAA,CAAQ,MAAMgB,CAAAA,CAAiB,MAAA,CAAOjY,CAAAA,CAAMgN,CAAK,CAAA,CAAA,KAC5C,CAEL,IAAI8H,CAAAA,CACJ,GAAI,CACFmC,CAAAA,CAAQ,MAAM,OAAA,CAAQ,KAAK,CACzBgB,CAAAA,CAAiB,MAAA,CAAOjY,CAAAA,CAAMgN,CAAK,CAAA,CACnC,IAAI,OAAA,CAAe,CAACsL,CAAAA,CAAGjL,CAAAA,GAAW,CAChCyH,CAAAA,CAAQ,WACN,IAAMzH,CAAAA,CAAO,IAAI,KAAA,CAAM,6BAA6B4K,CAAAA,CAAiB,IAAI,CAAA,kBAAA,EAAqBpD,CAAO,IAAI,CAAC,CAAA,CAC1GA,CACF,EACF,CAAC,CACH,CAAC,EACH,QAAE,CACA,YAAA,CAAaC,CAAM,EACrB,CACF,CAEA,IAAMyD,CAAAA,CAAWtB,CAAAA,CAAM,OAAQvN,CAAAA,EAASA,CAAAA,CAAK,UAAA,EAAcmO,CAAa,CAAA,CAElEW,CAAAA,CAA+C,EAAC,CACtD,QAAW9O,CAAAA,IAAQ6O,CAAAA,CACjBC,CAAAA,CAAW9O,CAAAA,CAAK,IAAI,CAAA,CAAA,CAAK8O,CAAAA,CAAW9O,CAAAA,CAAK,IAAI,GAAK,CAAA,EAAK,CAAA,CAGzD,OAAO,CACL,QAAA,CAAU6O,CAAAA,CAAS,MAAA,CAAS,CAAA,CAC5B,MAAOA,CAAAA,CACP,UAAA,CAAAC,CACF,CACF,CC5bA,IAAMK,EAAAA,CAAsB,GAAA,CAGtBC,EAAAA,CAAuB,MAAc,EAAA,CAAK,GAAA,CAG1CC,EAAAA,CAA0B,GAAA,CAG1BC,EAAAA,CAAwB,GAAA,CAAI,MAAA,CAAO,EAAE,EAO3C,SAASlH,EAAAA,EAAqB,CAC7B,OAAO,WAAW,MAAA,EAAQ,UAAA,IAAa,EAAK,CAAA,EAAG,KAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAClH,CAGA,SAASmH,GAAc1B,CAAAA,CAAyB,CAC/C,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOA,CAAG,CACpC,CAGA,SAAS2B,EAAAA,CAAWC,CAAAA,CAA2B,CAC9C,OAAO,KAAA,CAAM,IAAA,CAAKA,CAAK,EACrB,GAAA,CAAK/B,CAAAA,EAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CACV,CAGA,eAAegC,EAAAA,CAAOtT,CAAAA,CAAkC,CACvD,IAAMqT,CAAAA,CAAQF,EAAAA,CAAcnT,CAAO,CAAA,CAC7BuT,CAAAA,CAAa,MAAM,UAAA,CAAW,OAAO,MAAA,CAAO,MAAA,CACjD,SAAA,CACAF,CACD,EACA,OAAOD,EAAAA,CAAW,IAAI,UAAA,CAAWG,CAAU,CAAC,CAC7C,CAGA,SAASC,EAAAA,CAAkBC,CAAAA,CAAuD,CACjF,GAAM,CAAE,EAAA,CAAAnO,CAAAA,CAAI,SAAA,CAAAoO,CAAAA,CAAW,UAAAC,CAAAA,CAAW,YAAA,CAAAC,CAAAA,CAAc,OAAA,CAAA9E,EAAS,OAAA,CAAA+E,CAAAA,CAAS,SAAA,CAAAC,CAAU,CAAA,CAAIL,CAAAA,CAChF,OAAO,IAAA,CAAK,UAAU,CACrB,EAAA,CAAAnO,CAAAA,CACA,SAAA,CAAAoO,EACA,SAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,QAAA9E,CAAAA,CACA,OAAA,CAAA+E,CAAAA,CACA,SAAA,CAAAC,CACD,CAAC,CACF,CAGA,SAASC,EAAAA,CAAaC,CAAAA,CAAW,CAChC,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAUA,CAAG,CAAC,CACtC,CAGA,eAAeC,EAAAA,CACdnF,CAAAA,CACAvO,CAAAA,CACmC,CACnC,IAAM2T,EAASH,EAAAA,CAAUjF,CAAO,CAAA,CAGhC,eAAeqF,EAAa3a,CAAAA,CAAkC,CAC7D,GAAI,OAAOA,GAAU,QAAA,CAAU,CAC9B,IAAMiD,CAAAA,CAAS,MAAMqW,EAAAA,CAAUtZ,CAAAA,CAAO,CACrC,KAAA,CAAO+G,EAAO,KAAA,CACd,aAAA,CAAeA,CAAAA,CAAO,aAAA,EAAiB,EACxC,CAAC,CAAA,CAED,GAAI9D,CAAAA,CAAO,SAAU,CAEpB,IAAM2X,CAAAA,CAAgB7T,CAAAA,CAAO,SAAA,CAC1B9D,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAQmH,GAAS,CAACrD,CAAAA,CAAO,SAAA,CAAW,QAAA,CAASqD,EAAK,KAAA,CAAM,WAAA,EAAa,CAAC,EACnFnH,CAAAA,CAAO,KAAA,CAEV,GAAI2X,CAAAA,CAAc,MAAA,CAAS,CAAA,CAC1B,OAAOlD,EAAAA,CAAU1X,EAAO4a,CAAAA,CAAe7T,CAAAA,CAAO,cAAc,CAE9D,CACA,OAAO/G,CACR,CAEA,GAAI,MAAM,OAAA,CAAQA,CAAK,CAAA,CACtB,OAAO,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAM,GAAA,CAAI2a,CAAY,CAAC,CAAA,CAG3C,GAAI3a,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAAU,CACvC,IAAM6a,EAAqC,EAAC,CAC5C,IAAA,GAAW,CAACC,CAAAA,CAAGjC,CAAC,CAAA,GAAK,MAAA,CAAO,QAAQ7Y,CAAK,CAAA,CACxC6a,CAAAA,CAAUC,CAAC,EAAI,MAAMH,CAAAA,CAAa9B,CAAC,CAAA,CAEpC,OAAOgC,CACR,CAEA,OAAO7a,CACR,CAEA,IAAA,GAAW,CAAC+a,CAAAA,CAAK/a,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ0a,CAAM,EAC/CA,CAAAA,CAAOK,CAAG,CAAA,CAAI,MAAMJ,EAAa3a,CAAK,CAAA,CAGvC,OAAO0a,CACR,CAoDO,SAASM,EAAAA,CAAiBjU,CAAAA,CAA4B,EAAC,CAAkB,CAC/E,GAAM,CACL,WAAA3F,CAAAA,CAAamY,EAAAA,CACb,WAAA,CAAA0B,CAAAA,CAAczB,GACd,cAAA,CAAA0B,CAAAA,CAAiBzB,EAAAA,CACjB,QAAA,CAAA0B,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,EACA,SAAA,CAAAf,CAAAA,CACA,OAAA,CAAAD,CAAAA,CACA,OAAAiB,CAAAA,CAAS,EACV,CAAA,CAAIvU,EAGEwU,CAAAA,CAAwB,EAAC,CAC3BC,CAAAA,CAAkB,EAClBC,CAAAA,CAAgB,CAAA,CAChBC,CAAAA,CAAkB,CAAA,CAClBC,EAAgB,IAAA,CAChBC,CAAAA,CAGJ,SAASC,CAAAA,EAAsB,CAC9B,OAAIN,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACf7B,GAED6B,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,CAAG,IACrC,CAGA,eAAeO,EACd3B,CAAAA,CACA7E,CAAAA,CACAyG,CAAAA,CACsB,CACtB,IAAM9B,CAAAA,CAAgD,CACrD,EAAA,CAAIzH,EAAAA,GACJ,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,SAAA,CAAA2H,CAAAA,CACA,YAAA,CAAc0B,CAAAA,GACd,OAAA,CAAAvG,CAAAA,CACA,OAAA,CAA+B+E,CAAAA,CAC/B,SAAA,CAAmCC,CACpC,CAAA,CAGIc,CAAAA,EAAY,OAAA,GACfnB,CAAAA,CAAM,aAAA,CAAgB,MAAMQ,EAAAA,CAAYnF,CAAAA,CAAS8F,CAAU,CAAA,CAAA,CAI5D,IAAMY,CAAAA,CAAchC,EAAAA,CAAkBC,CAAK,CAAA,CACrC/B,CAAAA,CAAO,MAAM4B,EAAAA,CAAOkC,CAAW,CAAA,CAE/BC,CAAAA,CAAwB,CAC7B,GAAGhC,CAAAA,CACH,IAAA,CAAA/B,CACD,CAAA,CAWA,IARImD,CAAAA,GACHY,CAAAA,CAAU,SAAA,CAAY,MAAMZ,EAAQ,MAAA,CAAOnD,CAAI,CAAA,CAAA,CAIhDqD,CAAAA,CAAQ,KAAKU,CAAS,CAAA,CAGfV,CAAAA,CAAQ,MAAA,CAASna,CAAAA,EACvBma,CAAAA,CAAQ,KAAA,EAAM,CACdE,IAEID,CAAAA,CAAkB,CAAA,EACrBA,CAAAA,EAAAA,CAIF,OAAAF,EAAO,YAAA,GAAeW,CAAS,CAAA,CAExBA,CACR,CAGA,OAAId,CAAAA,EAAYD,CAAAA,CAAiB,CAAA,GAChCU,CAAAA,CAAc,WAAA,CAAY,SAAY,CACrC,GAAI,CACH,IAAMM,CAAAA,CAAWX,CAAAA,CAAQ,MAAMC,CAAe,CAAA,CAC1CU,CAAAA,CAAS,MAAA,CAAS,IACrB,MAAMf,CAAAA,CAASe,CAAQ,CAAA,CACvBR,CAAAA,EAAmBQ,CAAAA,CAAS,MAAA,CAC5BV,CAAAA,CAAkBD,EAAQ,MAAA,EAE5B,CAAA,MAAShc,CAAAA,CAAO,CACf+b,EAAO,aAAA,GACN/b,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,EACxDgc,CAAAA,CAAQ,KAAA,CAAMC,CAAe,CAC9B,EACD,CACD,CAAA,CAAGN,CAAc,CAAA,CAAA,CAGX,CACN,UAAA,CAAW7H,CAAAA,CAAyC,CACnD,IAAIpQ,EAAS,CAAC,GAAGsY,CAAO,CAAA,CAExB,GAAIlI,CAAAA,CAAQ,CACX,GAAIA,EAAO,UAAA,EAAY,MAAA,CAAQ,CAC9B,IAAM1F,EAAU,IAAI,GAAA,CAAI0F,CAAAA,CAAO,UAAU,EACzCpQ,CAAAA,CAASA,CAAAA,CAAO,MAAA,CAAQkZ,CAAAA,EAAMxO,CAAAA,CAAQ,GAAA,CAAIwO,CAAAA,CAAE,SAAS,CAAC,EACvD,CAEI9I,CAAAA,CAAO,OAAA,GACVpQ,EAASA,CAAAA,CAAO,MAAA,CAAQkZ,CAAAA,EAAMA,CAAAA,CAAE,UAAY9I,CAAAA,CAAO,OAAO,CAAA,CAAA,CAGvDA,CAAAA,CAAO,SAAA,GACVpQ,CAAAA,CAASA,CAAAA,CAAO,MAAA,CAAQkZ,GAAMA,CAAAA,CAAE,SAAA,GAAc9I,CAAAA,CAAO,SAAS,GAG3DA,CAAAA,CAAO,KAAA,GAAU,MAAA,GACpBpQ,CAAAA,CAASA,EAAO,MAAA,CAAQkZ,CAAAA,EAAMA,CAAAA,CAAE,SAAA,EAAa9I,CAAAA,CAAO,KAAM,CAAA,CAAA,CAGvDA,CAAAA,CAAO,QAAU,MAAA,GACpBpQ,CAAAA,CAASA,CAAAA,CAAO,MAAA,CAAQkZ,GAAMA,CAAAA,CAAE,SAAA,EAAa9I,CAAAA,CAAO,KAAM,GAGvDA,CAAAA,CAAO,MAAA,GAAW,MAAA,GACrBpQ,CAAAA,CAASA,CAAAA,CAAO,KAAA,CAAMoQ,CAAAA,CAAO,MAAM,GAGhCA,CAAAA,CAAO,KAAA,GAAU,MAAA,GACpBpQ,CAAAA,CAASA,EAAO,KAAA,CAAM,CAAA,CAAGoQ,CAAAA,CAAO,KAAK,GAEvC,CAEA,OAAOpQ,CACR,CAAA,CAEA,MAAM,WAAA,EAAgD,CACrD,GAAIsY,EAAQ,MAAA,GAAW,CAAA,CACtB,OAAO,CACN,MAAO,IAAA,CACP,eAAA,CAAiB,CAAA,CACjB,UAAA,CAAY,KAAK,GAAA,EAClB,CAAA,CAIkBA,CAAAA,CAAQ,CAAC,CAAA,CACb,YAAA,CAMf,IAAA,IAAS5T,EAAI,CAAA,CAAGA,CAAAA,CAAI4T,CAAAA,CAAQ,MAAA,CAAQ5T,IAAK,CACxC,IAAMsS,CAAAA,CAAQsB,CAAAA,CAAQ5T,CAAC,CAAA,CAGjBqU,CAAAA,CAAchC,EAAAA,CAAkB,CACrC,GAAIC,CAAAA,CAAM,EAAA,CACV,SAAA,CAAWA,CAAAA,CAAM,UACjB,SAAA,CAAWA,CAAAA,CAAM,SAAA,CACjB,YAAA,CAAcA,EAAM,YAAA,CACpB,OAAA,CAASA,CAAAA,CAAM,OAAA,CACf,QAASA,CAAAA,CAAM,OAAA,CACf,SAAA,CAAWA,CAAAA,CAAM,SAClB,CAAC,CAAA,CACKmC,CAAAA,CAAe,MAAMtC,EAAAA,CAAOkC,CAAW,CAAA,CAE7C,GAAI/B,EAAM,IAAA,GAASmC,CAAAA,CAAc,CAChCT,CAAAA,CAAgB,MAChB,IAAM1Y,CAAAA,CAAkC,CACvC,KAAA,CAAO,KAAA,CACP,eAAA,CAAiB0E,CAAAA,CACjB,QAAA,CAAU,CACT,KAAA,CAAOA,CAAAA,CACP,OAAA,CAASsS,CAAAA,CAAM,GACf,YAAA,CAAAmC,CAAAA,CACA,UAAA,CAAYnC,CAAAA,CAAM,IACnB,CAAA,CACA,UAAA,CAAY,IAAA,CAAK,GAAA,EAClB,CAAA,CACA,OAAAqB,CAAAA,CAAO,gBAAgBrY,CAAM,CAAA,CACtBA,CACR,CAGA,GAAI0E,CAAAA,CAAI,CAAA,CAAG,CACV,IAAM0U,EAAYd,CAAAA,CAAQ5T,CAAAA,CAAI,CAAC,CAAA,CAC/B,GAAIsS,CAAAA,CAAM,YAAA,GAAiBoC,CAAAA,CAAU,IAAA,CAAM,CAC1CV,CAAAA,CAAgB,KAAA,CAChB,IAAM1Y,CAAAA,CAAkC,CACvC,KAAA,CAAO,KAAA,CACP,eAAA,CAAiB0E,CAAAA,CACjB,SAAU,CACT,KAAA,CAAOA,CAAAA,CACP,OAAA,CAASsS,CAAAA,CAAM,EAAA,CACf,YAAA,CAAcoC,CAAAA,CAAU,KACxB,UAAA,CAAYpC,CAAAA,CAAM,YACnB,CAAA,CACA,WAAY,IAAA,CAAK,GAAA,EAClB,CAAA,CACA,OAAAqB,CAAAA,CAAO,aAAA,GAAgBrY,CAAM,CAAA,CACtBA,CACR,CACD,CAGA,GAAIoY,GAAS,QAAA,EAAYpB,CAAAA,CAAM,SAAA,EAE1B,CADmB,MAAMoB,CAAAA,CAAQ,QAAA,CAASpB,CAAAA,CAAM,IAAA,CAAMA,EAAM,SAAS,CAAA,CACpD,CACpB0B,CAAAA,CAAgB,KAAA,CAChB,IAAM1Y,CAAAA,CAAkC,CACvC,MAAO,KAAA,CACP,eAAA,CAAiB0E,CAAAA,CACjB,QAAA,CAAU,CACT,KAAA,CAAOA,CAAAA,CACP,OAAA,CAASsS,CAAAA,CAAM,GACf,YAAA,CAAc,mBAAA,CACd,UAAA,CAAYA,CAAAA,CAAM,SACnB,CAAA,CACA,UAAA,CAAY,IAAA,CAAK,GAAA,EAClB,CAAA,CACA,OAAAqB,CAAAA,CAAO,aAAA,GAAgBrY,CAAM,CAAA,CACtBA,CACR,CAEF,CAEA,OAAA0Y,CAAAA,CAAgB,IAAA,CACT,CACN,KAAA,CAAO,IAAA,CACP,eAAA,CAAiBJ,CAAAA,CAAQ,MAAA,CACzB,WAAY,IAAA,CAAK,GAAA,EAClB,CACD,EAEA,MAAM,MAAA,CAAOe,CAAAA,CAAuC,CACnD,IAAIJ,CAAAA,CAAW,CAAC,GAAGX,CAAO,CAAA,CAE1B,OAAIe,CAAAA,GAAU,MAAA,GACbJ,EAAWA,CAAAA,CAAS,MAAA,CAAQC,CAAAA,EAAMA,CAAAA,CAAE,WAAaG,CAAK,CAAA,CAAA,CAGnDnB,CAAAA,EAAYe,CAAAA,CAAS,OAAS,CAAA,GACjC,MAAMf,CAAAA,CAASe,CAAQ,CAAA,CACvBR,CAAAA,EAAmBQ,CAAAA,CAAS,MAAA,CAAA,CAGtBA,CACR,CAAA,CAEA,KAAA,EAAgB,CACf,IAAMK,EAAS,IAAA,CAAK,GAAA,EAAI,CAAItB,CAAAA,CACtBuB,EAAgBjB,CAAAA,CAAQ,MAAA,CAG9B,KAAOA,CAAAA,CAAQ,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAQ,CAAC,EAAG,SAAA,CAAYgB,CAAAA,EACpDhB,CAAAA,CAAQ,KAAA,GACJC,CAAAA,CAAkB,CAAA,EACrBA,CAAAA,EAAAA,CAIF,IAAMiB,EAASD,CAAAA,CAAgBjB,CAAAA,CAAQ,MAAA,CACvC,OAAAE,CAAAA,EAAiBgB,CAAAA,CACVA,CACR,CAAA,CAEA,UAAuB,CACtB,IAAMC,CAAAA,CAAuD,GAE7D,IAAA,IAAWzC,CAAAA,IAASsB,CAAAA,CACnBmB,CAAAA,CAAYzC,EAAM,SAAS,CAAA,CAAA,CAAKyC,CAAAA,CAAYzC,CAAAA,CAAM,SAAS,CAAA,EAAK,CAAA,EAAK,CAAA,CAGtE,OAAO,CACN,YAAA,CAAcsB,CAAAA,CAAQ,MAAA,CACtB,YAAAmB,CAAAA,CACA,WAAA,CAAanB,CAAAA,CAAQ,CAAC,GAAG,SAAA,CACzB,WAAA,CAAaA,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,EAAG,SAAA,CAC1C,cAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,cAAA,CAAgBC,CACjB,CACD,CAAA,CAEA,MAAM,OAAA,EAAyB,CAQ9B,GANIC,CAAAA,GACH,aAAA,CAAcA,CAAW,EACzBA,CAAAA,CAAc,MAAA,CAAA,CAIXT,CAAAA,CACH,GAAI,CACH,IAAMe,CAAAA,CAAWX,CAAAA,CAAQ,KAAA,CAAMC,CAAe,CAAA,CAC1CU,CAAAA,CAAS,MAAA,CAAS,CAAA,GACrB,MAAMf,CAAAA,CAASe,CAAQ,CAAA,CACvBR,CAAAA,EAAmBQ,CAAAA,CAAS,MAAA,EAE9B,CAAA,MAAS3c,CAAAA,CAAO,CACf+b,CAAAA,CAAO,aAAA,GACN/b,CAAAA,YAAiB,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CACxDgc,CAAAA,CAAQ,KAAA,CAAMC,CAAe,CAC9B,EACD,CAEF,CAAA,CAEA,SAASrB,CAAAA,CAA2B7E,CAAAA,CAAuD,CAC1F,OAAOwG,EAAS3B,CAAAA,CAAW7E,CAAO,CACnC,CAAA,CAEA,cAAkD,CACjD,OAAO,CACN,IAAA,CAAM,aAAA,CAGN,SAAA,CAAW,CAACyF,CAAAA,CAAK/a,EAAO2c,CAAAA,GAAS,CAChCb,CAAAA,CAAS,UAAA,CAAY,CAAE,GAAA,CAAAf,CAAAA,CAAK,KAAA,CAAA/a,CAAAA,CAAO,KAAA2c,CAAK,CAAC,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,EAC/D,CAAA,CAEA,aAAeC,CAAAA,EAAY,CAC1Bd,CAAAA,CAAS,YAAA,CAAc,CACtB,OAAA,CAASc,CAAAA,CAAQ,GAAA,CAAKC,CAAAA,GAAO,CAC5B,GAAA,CAAKA,CAAAA,CAAE,GAAA,CACP,KAAA,CAAOA,CAAAA,CAAE,KAAA,CACT,IAAA,CAAMA,CAAAA,CAAE,IACT,CAAA,CAAE,CACH,CAAC,CAAA,CAAE,MAAM,OAAA,CAAQ,KAAK,EACvB,CAAA,CAGA,qBAAuBxW,CAAAA,EAAQ,CAC9ByV,CAAAA,CAAS,qBAAA,CAAuB,CAC/B,EAAA,CAAIzV,CAAAA,CAAI,EAAA,CACR,KAAMA,CAAAA,CAAI,WAAA,CAAY,IAAA,CACtB,OAAA,CAASA,EAAI,WACd,CAAC,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,EACvB,CAAA,CAEA,gBAAA,CAAkB,CAACA,CAAAA,CAAKyW,CAAAA,GAAe,CACtChB,EAAS,iBAAA,CAAmB,CAC3B,EAAA,CAAIzV,CAAAA,CAAI,GACR,IAAA,CAAMA,CAAAA,CAAI,WAAA,CAAY,IAAA,CACtB,WAAAyW,CACD,CAAC,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,EACvB,CAAA,CAGA,eAAA,CAAiB,CAACC,CAAAA,CAAU1W,CAAAA,GAAQ,CACnCyV,CAAAA,CAAS,iBAAkB,CAC1B,QAAA,CAAAiB,CAAAA,CACA,aAAA,CAAe1W,EAAI,EAAA,CACnB,eAAA,CAAiBA,CAAAA,CAAI,WAAA,CAAY,IAClC,CAAC,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,EACvB,CAAA,CAEA,kBAAA,CAAoB,CAAC0W,CAAAA,CAAU1W,CAAAA,CAAK2F,CAAAA,GAAa,CAChD8P,EAAS,mBAAA,CAAqB,CAC7B,QAAA,CAAAiB,CAAAA,CACA,aAAA,CAAe1W,CAAAA,CAAI,EAAA,CACnB,eAAA,CAAiBA,EAAI,WAAA,CAAY,IAAA,CACjC,QAAA,CAAA2F,CACD,CAAC,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,EACvB,CAAA,CAEA,eAAA,CAAiB,CAAC+Q,CAAAA,CAAU1W,CAAAA,CAAK9G,CAAAA,GAAU,CAC1Cuc,CAAAA,CAAS,iBAAkB,CAC1B,QAAA,CAAAiB,CAAAA,CACA,aAAA,CAAe1W,EAAI,EAAA,CACnB,eAAA,CAAiBA,CAAAA,CAAI,WAAA,CAAY,KACjC,KAAA,CAAO9G,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAC7D,CAAC,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,EACvB,CAAA,CAGA,OAAA,CAAUA,CAAAA,EAAU,CACnBuc,EAAS,gBAAA,CAAkB,CAC1B,MAAA,CAAQvc,CAAAA,CAAM,MAAA,CACd,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAChB,QAASA,CAAAA,CAAM,OAAA,CACf,OAAA,CAASA,CAAAA,CAAM,OAChB,CAAC,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,EACvB,CAAA,CAEA,eAAA,CAAiB,CAACA,CAAAA,CAAO4I,CAAAA,GAAa,CACrC2T,CAAAA,CAAS,iBAAkB,CAC1B,MAAA,CAAQvc,CAAAA,CAAM,MAAA,CACd,QAASA,CAAAA,CAAM,OAAA,CACf,QAAA,CAAA4I,CACD,CAAC,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,EACvB,CACD,CACD,CACD,CACD,CAuBO,SAAS6U,EAAAA,CAAyBC,CAAAA,CAAsB,CAC9D,OAAO,CACN,YAAA,CAAc,CAACC,EAAmB3X,CAAAA,GAAkB,CACnD0X,CAAAA,CAAM,QAAA,CAAS,kBAAmB,CAAE,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAA3X,CAAM,CAAC,EACvD,CAAA,CAEA,eAAA,CAAiB,CAAC2X,CAAAA,CAAmBzZ,CAAAA,CAAiBM,CAAAA,CAAgBoZ,CAAAA,GAAiB,CACtFF,CAAAA,CAAM,QAAA,CAAS,oBAAA,CAAsB,CAAE,SAAA,CAAAC,CAAAA,CAAW,MAAA,CAAAzZ,CAAAA,CAAQ,OAAAM,CAAAA,CAAQ,IAAA,CAAAoZ,CAAK,CAAC,EACzE,CAAA,CAEA,YAAA,CAAc,CAACD,CAAAA,CAAmB3d,IAAiB,CAClD0d,CAAAA,CAAM,QAAA,CAAS,iBAAA,CAAmB,CAAE,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAO3d,EAAM,OAAA,CAAS,KAAA,CAAOA,CAAAA,CAAM,KAAM,CAAC,EAC1F,CAAA,CAEA,WAAA,CAAa,CAACsD,EAAkBua,CAAAA,CAAoBrR,CAAAA,GAAkB,CACrEkR,CAAAA,CAAM,QAAA,CAAS,iBAAA,CAAmB,CAAE,QAAA,CAAApa,EAAU,UAAA,CAAAua,CAAAA,CAAY,IAAA,CAAArR,CAAK,CAAC,EACjE,CAAA,CAEA,cAAA,CAAgB,CAAClJ,EAAkBua,CAAAA,CAAoBna,CAAAA,GAAoB,CAC1Ega,CAAAA,CAAM,QAAA,CAAS,oBAAA,CAAsB,CAAE,QAAA,CAAApa,EAAU,UAAA,CAAAua,CAAAA,CAAY,MAAA,CAAAna,CAAO,CAAC,EACtE,CAAA,CAEA,WAAA,CAAa,CAACJ,EAAkBua,CAAAA,CAAoB7d,CAAAA,GAAiB,CACpE0d,CAAAA,CAAM,QAAA,CAAS,iBAAA,CAAmB,CAAE,QAAA,CAAApa,EAAU,UAAA,CAAAua,CAAAA,CAAY,KAAA,CAAO7d,CAAAA,CAAM,OAAQ,CAAC,EACjF,CAAA,CAEA,mBAAA,CAAqB,CAACsD,CAAAA,CAAkBua,CAAAA,CAAoBrR,CAAAA,GAAkB,CAC7EkR,CAAAA,CAAM,QAAA,CAAS,oBAAA,CAAsB,CAAE,SAAApa,CAAAA,CAAU,UAAA,CAAAua,CAAAA,CAAY,IAAA,CAAArR,CAAK,CAAC,EACpE,CAAA,CAEA,iBAAA,CAAmB,CAAClJ,CAAAA,CAAkBua,CAAAA,GAAuB,CAC5DH,CAAAA,CAAM,QAAA,CAAS,kBAAA,CAAoB,CAAE,QAAA,CAAApa,EAAU,UAAA,CAAAua,CAAW,CAAC,EAC5D,EAEA,gBAAA,CAAkB,CAACva,CAAAA,CAAkBua,CAAAA,CAAoBC,IAAoB,CAC5EJ,CAAAA,CAAM,QAAA,CAAS,iBAAA,CAAmB,CAAE,QAAA,CAAApa,CAAAA,CAAU,UAAA,CAAAua,CAAAA,CAAY,OAAAC,CAAO,CAAC,EACnE,CACD,CACD,CCzxBO,IAAMC,EAAAA,CAAiD,CAE5D,CACE,OAAA,CAAS,iGAAA,CACT,IAAA,CAAM,iBAAA,CACN,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,sBACZ,EACA,CACE,OAAA,CAAS,iFAAA,CACT,IAAA,CAAM,qBACN,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,sBACZ,EACA,CACE,OAAA,CAAS,8EAAA,CACT,IAAA,CAAM,iBAAA,CACN,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,sBACZ,CAAA,CACA,CACE,OAAA,CAAS,6DAAA,CACT,KAAM,iBAAA,CACN,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,sBACZ,CAAA,CAGA,CACE,OAAA,CAAS,6BAAA,CACT,IAAA,CAAM,UAAA,CACN,QAAA,CAAU,UAAA,CACV,SAAU,WACZ,CAAA,CACA,CACE,OAAA,CAAS,gCACT,IAAA,CAAM,mBAAA,CACN,QAAA,CAAU,MAAA,CACV,SAAU,WACZ,CAAA,CACA,CACE,OAAA,CAAS,4CAAA,CACT,IAAA,CAAM,gBAAA,CACN,QAAA,CAAU,WACV,QAAA,CAAU,WACZ,CAAA,CACA,CACE,QAAS,yFAAA,CACT,IAAA,CAAM,yBAAA,CACN,QAAA,CAAU,OACV,QAAA,CAAU,WACZ,CAAA,CACA,CACE,OAAA,CAAS,kFAAA,CACT,IAAA,CAAM,iBAAA,CACN,SAAU,MAAA,CACV,QAAA,CAAU,WACZ,CAAA,CAGA,CACE,OAAA,CAAS,gEAAA,CACT,IAAA,CAAM,iBAAA,CACN,SAAU,QAAA,CACV,QAAA,CAAU,mBACZ,CAAA,CACA,CACE,OAAA,CAAS,+DAAA,CACT,IAAA,CAAM,cACN,QAAA,CAAU,QAAA,CACV,QAAA,CAAU,mBACZ,EAGA,CACE,OAAA,CAAS,gCAAA,CACT,IAAA,CAAM,mBACN,QAAA,CAAU,MAAA,CACV,QAAA,CAAU,sBACZ,CAAA,CACA,CACE,OAAA,CAAS,+CAAA,CACT,KAAM,yBAAA,CACN,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,sBACZ,CAAA,CAGA,CACE,OAAA,CAAS,wCAAA,CACT,KAAM,yBAAA,CACN,QAAA,CAAU,QAAA,CACV,QAAA,CAAU,qBACZ,CAAA,CACA,CACE,OAAA,CAAS,wDAAA,CACT,KAAM,mBAAA,CACN,QAAA,CAAU,MAAA,CACV,QAAA,CAAU,qBACZ,CAAA,CAGA,CACE,OAAA,CAAS,gDAAA,CACT,KAAM,uBAAA,CACN,QAAA,CAAU,QAAA,CACV,QAAA,CAAU,oBACZ,CAAA,CACA,CACE,OAAA,CAAS,2DACT,IAAA,CAAM,qBAAA,CACN,QAAA,CAAU,MAAA,CACV,SAAU,oBACZ,CACF,CAAA,CAGaC,EAAAA,CAAgD,CAC3D,GAAGD,EAAAA,CAGH,CACE,OAAA,CAAS,6CAAA,CACT,IAAA,CAAM,QAAA,CACN,QAAA,CAAU,MACV,QAAA,CAAU,mBACZ,CAAA,CACA,CACE,QAAS,uBAAA,CACT,IAAA,CAAM,kBAAA,CACN,QAAA,CAAU,SACV,QAAA,CAAU,sBACZ,CAAA,CACA,CACE,OAAA,CAAS,qCAAA,CACT,IAAA,CAAM,qBAAA,CACN,SAAU,QAAA,CACV,QAAA,CAAU,sBACZ,CAAA,CACA,CACE,OAAA,CAAS,mCAAA,CACT,IAAA,CAAM,oBAAA,CACN,SAAU,KAAA,CACV,QAAA,CAAU,kBACZ,CAAA,CACA,CACE,OAAA,CAAS,oCAAA,CACT,IAAA,CAAM,mBACN,QAAA,CAAU,QAAA,CACV,QAAA,CAAU,kBACZ,CACF,CAAA,CAyBME,EAAAA,CAA6B,IAQ5B,SAASC,GACd/c,CAAAA,CACAJ,CAAAA,CAA+Bgd,EAAAA,CACL,CAE1B,GAAI5c,CAAAA,CAAK,MAAA,CAAS8c,EAAAA,CAChB,MAAM,IAAI,KAAA,CACR,CAAA,4CAAA,EAA+CA,EAA0B,2EAE3E,CAAA,CAGF,IAAME,CAAAA,CAAgD,GAEtD,IAAA,GAAW,CAAE,OAAA,CAAA9c,CAAAA,CAAS,IAAA,CAAAmM,CAAAA,CAAM,QAAA,CAAA4Q,CAAAA,CAAU,SAAAC,CAAS,CAAA,GAAKtd,CAAAA,CAAU,CAG5D,IAAMoW,CAAAA,CADQ,IAAI,MAAA,CAAO9V,CAAAA,CAAQ,OAAQA,CAAAA,CAAQ,KAAK,CAAA,CAClC,IAAA,CAAKF,CAAI,CAAA,CAEzBgW,CAAAA,EACFgH,CAAAA,CAAQ,KAAK,CACX,IAAA,CAAA3Q,CAAAA,CACA,QAAA,CAAA6Q,EACA,QAAA,CAAAD,CAAAA,CACA,KAAA,CAAOjH,CAAAA,CAAM,CAAC,CAAA,CACd,QAAA,CAAUA,CAAAA,CAAM,KAClB,CAAC,EAEL,CAGA,IAAMmH,CAAAA,CAAiB,CACrB,GAAA,CAAK,EAAA,CACL,MAAA,CAAQ,EAAA,CACR,KAAM,EAAA,CACN,QAAA,CAAU,GACZ,CAAA,CAEMC,EAAaJ,CAAAA,CAAQ,MAAA,CAAO,CAAChX,CAAAA,CAAK6C,CAAAA,GAAM7C,CAAAA,CAAMmX,CAAAA,CAAetU,CAAAA,CAAE,QAAQ,CAAA,CAAG,CAAC,CAAA,CAC3EwU,CAAAA,CAAY,KAAK,GAAA,CAAI,GAAA,CAAKD,CAAU,CAAA,CAE1C,OAAO,CACL,QAAA,CAAUJ,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAC3B,QAAA,CAAUA,CAAAA,CACV,SAAA,CAAAK,CACF,CACF,CASO,SAASC,EAAAA,CACdtd,EACAJ,CAAAA,CAA+Bgd,EAAAA,CACvB,CAER,IAAIW,EAAYvd,CAAAA,CAAK,OAAA,CAAQ,mCAAA,CAAqC,EAAE,CAAA,CAI9Dwd,CAAAA,CAAc5d,CAAAA,CAAS,GAAA,CAAK6D,GAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA,CAC/D,GAAI+Z,CAAAA,CAAY,MAAA,GAAW,EAAG,OAAOD,CAAAA,CAGrC,IAAME,CAAAA,CAAY7d,CAAAA,CAAS,IAAA,CAAM6D,CAAAA,EAAMA,CAAAA,CAAE,QAAQ,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,EAC9Dia,CAAAA,CAAgB9d,CAAAA,CAAS,IAAA,CAAM6D,CAAAA,EAAMA,EAAE,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA,CAClEka,CAAAA,CAAe/d,CAAAA,CAAS,KAAM6D,CAAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,SAAS,GAAG,CAAC,CAAA,CAEjEma,CAAAA,CAAQ,GAAGH,CAAAA,CAAY,GAAA,CAAM,EAAE,CAAA,EAAGC,CAAAA,CAAgB,GAAA,CAAM,EAAE,CAAA,EAAGC,EAAe,GAAA,CAAM,EAAE,CAAA,CAAA,CACpFE,CAAAA,CAAgB,IAAI,MAAA,CAAOL,CAAAA,CAAY,IAAA,CAAK,GAAG,EAAGI,CAAAA,EAAS,IAAI,CAAA,CAGrE,OAAAL,CAAAA,CAAYA,CAAAA,CAAU,OAAA,CAAQM,CAAAA,CAAe,YAAY,CAAA,CAElDN,CACT,CA4CO,SAASO,GACdnf,CAAAA,CAA2C,EAAC,CACX,CACjC,GAAM,CACJ,kBAAA,CAAAof,CAAAA,CAAqB,GACrB,eAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,MACb,cAAA,CAAAC,CAAAA,CAAiB,EAAA,CACjB,QAAA,CAAAC,EAAW,KAAA,CACX,SAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,EAAmB,EACrB,CAAA,CAAI1f,CAAAA,CAGAiB,CAAAA,CASJ,GARIoe,CAAAA,CACFpe,CAAAA,CAAWoe,EAEXpe,CAAAA,CAAWqe,CAAAA,CAAa,CAAC,GAAGpB,EAAyB,CAAA,CAAI,CAAC,GAAGD,EAA0B,EAEzFhd,CAAAA,CAAW,CAAC,GAAGA,CAAAA,CAAU,GAAGme,CAAkB,CAAA,CAG1CM,CAAAA,CAAiB,OAAS,CAAA,CAAG,CAC/B,IAAMC,CAAAA,CAAa,IAAI,GAAA,CAAID,CAAgB,CAAA,CAC3Cze,CAAAA,CAAWA,EAAS,MAAA,CAAQ6D,CAAAA,EAAM,CAAC6a,CAAAA,CAAW,GAAA,CAAI7a,CAAAA,CAAE,QAAQ,CAAC,EAC/D,CAEA,OAAQ1D,CAAAA,EAA0B,CAChC,IAAMwC,CAAAA,CAASwa,EAAAA,CAAsBhd,CAAAA,CAAK,KAAA,CAAOH,CAAQ,CAAA,CAEzD,GAAI2C,CAAAA,CAAO,QAAA,EAAYA,EAAO,SAAA,EAAa2b,CAAAA,CAAgB,CAGzD,GAFAE,IAAYre,CAAAA,CAAK,KAAA,CAAOwC,CAAM,CAAA,CAE1B4b,EAEF,OAAO,CACL,MAAA,CAAQ,IAAA,CACR,YAHgBb,EAAAA,CAAkBvd,CAAAA,CAAK,KAAA,CAAOH,CAAQ,CAIxD,CAAA,CAGF,IAAM2e,CAAAA,CAAchc,EAAO,QAAA,CACxB,IAAA,CAAK,CAACic,CAAAA,CAAGpH,IAAM,CACd,IAAMqH,CAAAA,CAAQ,CAAE,SAAU,CAAA,CAAG,IAAA,CAAM,CAAA,CAAG,MAAA,CAAQ,CAAA,CAAG,GAAA,CAAK,CAAE,CAAA,CACxD,OAAOA,CAAAA,CAAMD,CAAAA,CAAE,QAAQ,CAAA,CAAIC,EAAMrH,CAAAA,CAAE,QAAQ,CAC7C,CAAC,EACA,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CACV,GAAA,CAAK3T,CAAAA,EAAMA,CAAAA,CAAE,IAAI,EACjB,IAAA,CAAK,IAAI,CAAA,CAEZ,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,CAAA,iCAAA,EAAoClB,EAAO,SAAS,CAAA,aAAA,EAAgBgc,CAAW,CAAA,CAAA,CACzF,CACF,CAEA,OAAO,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CAiBO,SAASG,GAAqB5Y,CAAAA,CAAiB6Y,CAAAA,CAAwB,CAG5E,OAAO,8BAA8BA,CAAM,CAAA;AAAA,EAAO7Y,CAAO;AAAA,oBAAA,CAC3D,CAYO,SAAS8Y,EAAAA,CAAgCjgB,CAAAA,CAKZ,CAClC,GAAM,CACJ,aAAA,CAAAkgB,CAAAA,CAAgBf,EAAAA,CAA+B,CAAE,UAAA,CAAY,KAAM,cAAA,CAAgB,EAAG,CAAC,CAAA,CACvF,kBAAA,CAAAC,CAAAA,CAAqB,EACvB,EAAIpf,CAAAA,CAEEmgB,CAAAA,CAAuB,0EAAA,CAE7B,OAAO,MAAO/e,CAAAA,CAAMuB,CAAAA,GAAsC,CAExD,IAAMyd,CAAAA,CAAa,MAAMF,CAAAA,CAAc9e,CAAAA,CAAMuB,CAAO,CAAA,CACpD,GAAI,CAACyd,CAAAA,CAAW,MAAA,CACd,OAAOA,CAAAA,CAIT,IAAM/B,CAAAA,CAAUjd,CAAAA,CAAK,KAAA,CAAM,SAAS+e,CAAoB,CAAA,CACxD,IAAA,IAAW9I,CAAAA,IAASgH,CAAAA,CAAS,CAC3B,GAAM,EAAG2B,CAAAA,CAAQ7Y,CAAO,CAAA,CAAIkQ,CAAAA,CAG5B,GAAI,CAAClQ,CAAAA,CAAS,SAGd,IAAMkZ,CAAAA,CAAejC,EAAAA,CAAsBjX,CAAAA,CAAS,CAClD,GAAG+W,EAAAA,CACH,GAAGkB,CACL,CAAC,CAAA,CAED,GAAIiB,CAAAA,CAAa,QAAA,EAAYA,CAAAA,CAAa,SAAA,EAAa,EAAA,CACrD,OAAO,CACL,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,CAAA,wBAAA,EAA2BL,CAAM,CAAA,sCAAA,EAAyCK,CAAAA,CAAa,SAAS,CAAA,EAAA,CAC1G,CAEJ,CAEA,OAAO,CAAE,MAAA,CAAQ,IAAK,CACxB,CACF,CCjNA,SAASlN,EAAAA,EAAqB,CAC7B,OAAO,UAAA,CAAW,MAAA,EAAQ,UAAA,IAAa,EAAK,CAAA,EAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAClH,CAGA,SAASmH,EAAAA,CAAc1B,CAAAA,CAAyB,CAC/C,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOA,CAAG,CACpC,CAGA,SAAS2B,EAAAA,CAAWC,CAAAA,CAA2B,CAC9C,OAAO,KAAA,CAAM,IAAA,CAAKA,CAAK,CAAA,CACrB,GAAA,CAAK/B,GAAMA,CAAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,EAC1C,IAAA,CAAK,EAAE,CACV,CAGA,eAAegC,EAAAA,CAAOtT,CAAAA,CAAkC,CACvD,IAAMqT,CAAAA,CAAQF,EAAAA,CAAcnT,CAAO,CAAA,CAC7BuT,CAAAA,CAAa,MAAM,UAAA,CAAW,MAAA,CAAO,MAAA,CAAO,MAAA,CACjD,SAAA,CACAF,CACD,CAAA,CACA,OAAOD,EAAAA,CAAW,IAAI,WAAWG,CAAU,CAAC,CAC7C,CAGA,SAAS4F,EAAAA,CAAMlf,CAAAA,CAA8C,CAC5D,GAAIA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAG,OAAO,EAAA,CAG9B,IAAMmf,CAAAA,CAAO,IAAI,IACjB,IAAA,IAAWC,CAAAA,IAAUpf,CAAAA,CACpB,IAAA,IAAWsa,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAK8E,CAAM,CAAA,CACnCD,CAAAA,CAAK,GAAA,CAAI7E,CAAG,CAAA,CAId,IAAM+E,CAAAA,CAAU,KAAA,CAAM,KAAKF,CAAI,CAAA,CAGzBG,CAAAA,CAAkB,CAACD,CAAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,EAE1C,IAAA,IAAWD,CAAAA,IAAUpf,CAAAA,CAAM,CAC1B,IAAMuf,CAAAA,CAASF,CAAAA,CAAQ,GAAA,CAAK/E,GAAQ,CACnC,IAAM/a,CAAAA,CAAQ6f,CAAAA,CAAO9E,CAAG,CAAA,CACxB,GAAI/a,CAAAA,EAAU,IAAA,CAA6B,OAAO,EAAA,CAClD,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,OAAO,KAAK,SAAA,CAAUA,CAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAM,IAAI,CAAA,CAC9E,IAAMiY,EAAM,MAAA,CAAOjY,CAAK,CAAA,CAExB,OAAIiY,CAAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAKA,EAAI,QAAA,CAAS;AAAA,CAAI,CAAA,EAAKA,CAAAA,CAAI,QAAA,CAAS,GAAG,CAAA,CACvD,IAAIA,CAAAA,CAAI,OAAA,CAAQ,IAAA,CAAM,IAAI,CAAC,CAAA,CAAA,CAAA,CAE5BA,CACR,CAAC,CAAA,CACD8H,CAAAA,CAAM,IAAA,CAAKC,CAAAA,CAAO,IAAA,CAAK,GAAG,CAAC,EAC5B,CAEA,OAAOD,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CACvB,CAOO,SAASE,EAAAA,EAAqD,CACpE,IAAMxf,CAAAA,CAAO,IAAI,GAAA,CAKXyf,CAAAA,CAAW,IAAI,GAAA,CACfC,CAAAA,CAAe,IAAI,GAAA,CAEzB,OAAO,CACN,MAAM,cAAA,CAAeC,CAAAA,CAAWC,CAAAA,CAAY,CAC3C,IAAMpd,CAAAA,CAGD,EAAC,CAEN,IAAA,GAAW,CAAC2a,CAAAA,CAAU0C,CAAU,CAAA,GAAK7f,CAAAA,CAAM,CAC1C,GAAI4f,CAAAA,EAAc,CAACA,CAAAA,CAAW,QAAA,CAASzC,CAAQ,CAAA,CAAG,SAElD,IAAM2C,CAAAA,CAAUD,CAAAA,CAAW,GAAA,CAAIF,CAAS,CAAA,CACpCG,CAAAA,EAAWA,CAAAA,CAAQ,MAAA,CAAS,CAAA,EAC/Btd,CAAAA,CAAO,IAAA,CAAK,CAAE,QAAA,CAAA2a,CAAAA,CAAU,OAAA,CAAS,CAAC,GAAG2C,CAAO,CAAE,CAAC,EAEjD,CAEA,OAAOtd,CACR,CAAA,CAEA,MAAM,iBAAA,CAAkBmd,CAAAA,CAAWC,CAAAA,CAAY,CAC9C,IAAIlH,CAAAA,CAAQ,CAAA,CAEZ,IAAA,GAAW,CAACyE,CAAAA,CAAU0C,CAAU,CAAA,GAAK7f,CAAAA,CAAM,CAC1C,GAAI4f,CAAAA,EAAc,CAACA,CAAAA,CAAW,QAAA,CAASzC,CAAQ,CAAA,CAAG,SAElD,IAAM2C,CAAAA,CAAUD,CAAAA,CAAW,GAAA,CAAIF,CAAS,CAAA,CACpCG,CAAAA,GACHpH,CAAAA,EAASoH,CAAAA,CAAQ,MAAA,CACjBD,CAAAA,CAAW,MAAA,CAAOF,CAAS,CAAA,EAE7B,CAEA,OAAOjH,CACR,CAAA,CAEA,MAAM,oBAAA,CAAqBiH,CAAAA,CAAWC,CAAAA,CAAY,CACjD,IAAIlH,CAAAA,CAAQ,CAAA,CAEZ,IAAA,GAAW,CAACyE,CAAAA,CAAU0C,CAAU,CAAA,GAAK7f,CAAAA,CAAM,CAC1C,GAAI4f,CAAAA,EAAc,CAACA,CAAAA,CAAW,QAAA,CAASzC,CAAQ,CAAA,CAAG,SAElD,IAAM2C,CAAAA,CAAUD,CAAAA,CAAW,GAAA,CAAIF,CAAS,CAAA,CACxC,GAAIG,CAAAA,CACH,IAAA,IAAWV,CAAAA,IAAUU,CAAAA,CAEpBV,CAAAA,CAAO,IAAA,CAAO,CACb,GAAGA,CAAAA,CAAO,IAAA,CACV,WAAA,CAAa,IAAA,CACb,aAAA,CAAe,IAAA,CAAK,GAAA,EACrB,CAAA,CACA1G,CAAAA,GAGH,CAEA,OAAOA,CACR,CAAA,CAEA,MAAM,cAAA,CAAeyE,CAAAA,CAAU4C,CAAAA,CAAW,CACzC,IAAMvd,CAAAA,CAAmD,EAAC,CACpDwd,CAAAA,CAAehgB,CAAAA,CAAK,GAAA,CAAImd,CAAQ,CAAA,CAEtC,GAAI6C,CAAAA,CACH,IAAA,IAAWF,CAAAA,IAAWE,CAAAA,CAAa,MAAA,EAAO,CACzC,IAAA,IAAWZ,CAAAA,IAAUU,CAAAA,CAChBV,CAAAA,CAAO,SAAA,CAAYW,GACtBvd,CAAAA,CAAO,IAAA,CAAK,CAAE,EAAA,CAAI4c,CAAAA,CAAO,EAAA,CAAI,SAAA,CAAWA,CAAAA,CAAO,SAAU,CAAC,CAAA,CAM9D,OAAO5c,CACR,CAAA,CAEA,MAAM,WAAA,CAAYyd,CAAAA,CAAK,CACtB,IAAMC,CAAAA,CAAQ,IAAI,GAAA,CAAID,CAAG,CAAA,CACrBvH,CAAAA,CAAQ,CAAA,CAEZ,IAAA,IAAWsH,CAAAA,IAAgBhgB,CAAAA,CAAK,MAAA,EAAO,CACtC,IAAA,GAAW,CAAC2f,CAAAA,CAAWG,CAAO,CAAA,GAAKE,CAAAA,CAAc,CAChD,IAAMxH,CAAAA,CAAWsH,CAAAA,CAAQ,MAAA,CAAQtQ,CAAAA,EAAM,CAAC0Q,CAAAA,CAAM,GAAA,CAAI1Q,CAAAA,CAAE,EAAE,CAAC,CAAA,CACnDgJ,CAAAA,CAAS,MAAA,GAAWsH,CAAAA,CAAQ,MAAA,GAC/BpH,CAAAA,EAASoH,CAAAA,CAAQ,MAAA,CAAStH,CAAAA,CAAS,MAAA,CAC/BA,CAAAA,CAAS,MAAA,GAAW,CAAA,CACvBwH,EAAa,MAAA,CAAOL,CAAS,CAAA,CAE7BK,CAAAA,CAAa,GAAA,CAAIL,CAAAA,CAAWnH,CAAQ,CAAA,EAGvC,CAGD,OAAOE,CACR,CAAA,CAEA,MAAM,YAAA,CAAa0G,CAAAA,CAAQ,CAC1BK,CAAAA,CAAS,GAAA,CAAI,CAAA,EAAGL,CAAAA,CAAO,SAAS,CAAA,CAAA,EAAIA,CAAAA,CAAO,OAAO,CAAA,CAAA,CAAIA,CAAM,EAC7D,CAAA,CAEA,MAAM,UAAA,CAAWO,EAAWQ,CAAAA,CAAS,CACpC,OAAOV,CAAAA,CAAS,GAAA,CAAI,CAAA,EAAGE,CAAS,CAAA,CAAA,EAAIQ,CAAO,CAAA,CAAE,CAAA,EAAK,IACnD,CAAA,CAEA,MAAM,oBAAA,CAAqBR,CAAAA,CAAW,CACrC,IAAMnd,CAAAA,CAA0B,EAAC,CACjC,IAAA,GAAW,CAAC8X,CAAAA,CAAK8E,CAAM,CAAA,GAAKK,CAAAA,CACvBnF,CAAAA,CAAI,UAAA,CAAW,CAAA,EAAGqF,CAAS,CAAA,CAAA,CAAG,CAAA,EACjCnd,CAAAA,CAAO,IAAA,CAAK4c,CAAM,CAAA,CAGpB,OAAO5c,CACR,CAAA,CAEA,MAAM,oBAAA,CAAqB2d,CAAAA,CAAS,CACnC,IAAM3d,CAAAA,CAA0B,EAAC,CACjC,IAAA,GAAW,CAAC8X,CAAAA,CAAK8E,CAAM,CAAA,GAAKK,CAAAA,CACvBnF,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAA,EAAI6F,CAAO,CAAA,CAAE,CAAA,EAC7B3d,CAAAA,CAAO,IAAA,CAAK4c,CAAM,CAAA,CAGpB,OAAO5c,CACR,CAAA,CAEA,MAAM,wBAAA,CAAyB4d,CAAAA,CAAa,CAC3CV,CAAAA,CAAa,GAAA,CAAIU,CAAAA,CAAY,SAAA,CAAWA,CAAW,EACpD,CACD,CACD,CAuCO,SAASC,EAAAA,CAAiB/Z,CAAAA,CAA8C,CAC9E,GAAM,CACL,OAAA,CAAAga,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CAAqB,KAAA,CACrB,OAAA3F,CAAAA,CAAS,EACV,CAAA,CAAIvU,CAAAA,CAGEma,CAAAA,CAA0B,CAC/B,MAAM,KAAA,CAAMd,CAAAA,CAAWQ,CAAAA,CAASvhB,CAAAA,CAAU,EAAC,CAAG,CAC7C,IAAMwgB,CAAAA,CAAwB,CAC7B,SAAA,CAAAO,CAAAA,CACA,OAAA,CAAAQ,CAAAA,CACA,OAAA,CAAS,IAAA,CACT,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,SAAA,CAAWvhB,CAAAA,CAAQ,SAAA,CACnB,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAChB,OAAA,CAASA,CAAAA,CAAQ,OAClB,CAAA,CAEA,OAAA,MAAM0hB,CAAAA,CAAQ,YAAA,CAAalB,CAAM,CAAA,CACjCvE,CAAAA,CAAO,eAAA,GAAkBuE,CAAM,CAAA,CAExBA,CACR,CAAA,CAEA,MAAM,MAAA,CAAOO,CAAAA,CAAWQ,CAAAA,CAAS,CAChC,IAAMpP,CAAAA,CAAW,MAAMuP,CAAAA,CAAQ,UAAA,CAAWX,CAAAA,CAAWQ,CAAO,CAAA,CAC5D,GAAI,CAACpP,CAAAA,CAAU,OAAO,IAAA,CAEtB,IAAMqO,CAAAA,CAAwB,CAC7B,GAAGrO,CAAAA,CACH,OAAA,CAAS,KAAA,CACT,SAAA,CAAW,IAAA,CAAK,GAAA,EACjB,CAAA,CAEA,OAAA,MAAMuP,CAAAA,CAAQ,YAAA,CAAalB,CAAM,CAAA,CACjCvE,CAAAA,CAAO,eAAA,GAAkBuE,CAAM,CAAA,CAExBA,CACR,CAAA,CAEA,MAAM,KAAA,CAAMO,CAAAA,CAAWQ,CAAAA,CAAS,CAC/B,IAAMf,CAAAA,CAAS,MAAMkB,CAAAA,CAAQ,UAAA,CAAWX,CAAAA,CAAWQ,CAAO,CAAA,CAG1D,OAFI,EAAA,CAACf,CAAAA,EACD,CAACA,CAAAA,CAAO,OAAA,EACRA,CAAAA,CAAO,SAAA,EAAaA,CAAAA,CAAO,SAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAErD,CAAA,CAEA,MAAM,aAAA,CAAcO,CAAAA,CAAW,CAC9B,OAAOW,CAAAA,CAAQ,oBAAA,CAAqBX,CAAS,CAC9C,CAAA,CAEA,MAAM,aAAA,CAAcQ,CAAAA,CAAS,CAC5B,OAAOG,CAAAA,CAAQ,oBAAA,CAAqBH,CAAO,CAC5C,CACD,CAAA,CAEA,OAAO,CACN,MAAM,UAAA,CAAWvP,CAAAA,CAAS,CACzB,GAAI,CACH,IAAM8P,CAAAA,CAAc,MAAMJ,CAAAA,CAAQ,cAAA,CACjC1P,CAAAA,CAAQ,SAAA,CACRA,CAAAA,CAAQ,UACT,CAAA,CAGM+P,EAKD,EAAC,CAEAf,CAAAA,CAAuB,EAAC,CAE9B,IAAA,GAAW,CAAE,QAAA,CAAAzC,CAAAA,CAAU,OAAA,CAAA2C,CAAQ,CAAA,GAAKY,CAAAA,CAAa,CAChDd,CAAAA,CAAW,IAAA,CAAKzC,CAAQ,CAAA,CACxB,IAAA,IAAWiC,CAAAA,IAAUU,CAAAA,CACpBa,CAAAA,CAAW,IAAA,CAAK,CAAE,QAAA,CAAAxD,CAAAA,CAAU,GAAGiC,CAAO,CAAC,EAEzC,CAGA,GAAIxO,CAAAA,CAAQ,YAAA,EAAgB0P,CAAAA,CAAQ,eAAA,CAAiB,CACpD,IAAMM,CAAAA,CAAe,MAAMN,CAAAA,CAAQ,eAAA,CAAgB1P,CAAAA,CAAQ,SAAS,CAAA,CACpEgP,CAAAA,CAAW,IAAA,CAAK,OAAO,CAAA,CACvB,IAAA,IAAWpG,CAAAA,IAASoH,CAAAA,CACnBD,CAAAA,CAAW,IAAA,CAAK,CACf,QAAA,CAAU,OAAA,CACV,EAAA,CAAInH,CAAAA,CAAM,EAAA,CACV,IAAA,CAAMA,CAAAA,CAAM,OAAA,CACZ,SAAA,CAAWA,CAAAA,CAAM,SAClB,CAAC,EAEH,CAGA,IAAIxZ,CAAAA,CACA4Q,CAAAA,CAAQ,MAAA,GAAW,KAAA,CACtB5Q,CAAAA,CAAOkf,EAAAA,CAAMyB,CAAAA,CAAW,GAAA,CAAKnR,CAAAA,GAAO,CACnC,QAAA,CAAUA,CAAAA,CAAE,QAAA,CACZ,EAAA,CAAIA,CAAAA,CAAE,EAAA,CACN,SAAA,CAAW,IAAI,IAAA,CAAKA,CAAAA,CAAE,SAAS,CAAA,CAAE,WAAA,GACjC,GAAGA,CAAAA,CAAE,IACN,CAAA,CAAE,CAAC,CAAA,CAEHxP,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CACrB,SAAA,CAAW4Q,CAAAA,CAAQ,SAAA,CACnB,UAAA,CAAY,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACnC,WAAA,CAAa+P,CAAAA,CAAW,MAAA,CACxB,UAAA,CAAAf,CAAAA,CACA,OAAA,CAASe,CACV,CAAA,CAAG,IAAA,CAAM,CAAC,CAAA,CAIX,IAAME,CAAAA,CAAW,MAAMxH,EAAAA,CAAOrZ,CAAI,CAAA,CAE5BwC,CAAAA,CAA2B,CAChC,OAAA,CAAS,CAAA,CAAA,CACT,SAAA,CAAWoO,CAAAA,CAAQ,SAAA,CACnB,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAChB,IAAA,CAAA5Q,CAAAA,CACA,UAAA,CAAA4f,CAAAA,CACA,WAAA,CAAae,CAAAA,CAAW,MAAA,CACxB,QAAA,CAAAE,CAAAA,CACA,UAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CACrB,SAAA,CAAW,IAAA,CAAK,GAAA,GAAQL,CACzB,CAAA,CAEA,OAAA3F,CAAAA,CAAO,QAAA,GAAWrY,CAAM,CAAA,CACjBA,CACR,CAAA,MAAS1D,CAAAA,CAAO,CACf,OAAO,CACN,OAAA,CAAS,KAAA,CACT,SAAA,CAAW8R,CAAAA,CAAQ,SAAA,CACnB,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAChB,IAAA,CAAM,EAAA,CACN,UAAA,CAAY,EAAC,CACb,WAAA,CAAa,CAAA,CACb,QAAA,CAAU,EAAA,CACV,UAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CACrB,KAAA,CAAO9R,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAC7D,CACD,CACD,CAAA,CAEA,MAAM,UAAA,CAAW8R,CAAAA,CAAS,CACzB,GAAI,CACH,IAAIkQ,CAAAA,CAAkB,CAAA,CAChBC,CAAAA,CAA+B,EAAC,CAElCnQ,CAAAA,CAAQ,SAAA,CACXkQ,CAAAA,CAAkB,MAAMR,CAAAA,CAAQ,qBAC/B1P,CAAAA,CAAQ,SAAA,CACRA,CAAAA,CAAQ,UACT,CAAA,CAEAkQ,CAAAA,CAAkB,MAAMR,CAAAA,CAAQ,iBAAA,CAC/B1P,CAAAA,CAAQ,SAAA,CACRA,CAAAA,CAAQ,UACT,CAAA,CAIGA,CAAAA,CAAQ,UAAA,CACXmQ,CAAAA,CAAmB,IAAA,CAAK,GAAGnQ,CAAAA,CAAQ,UAAU,CAAA,CACnCA,CAAAA,CAAQ,KAAA,GAAU,KAAA,EAC5BmQ,CAAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,CAI9B,IAAMC,CAAAA,CAAqB,IAAA,CAAK,SAAA,CAAU,CACzC,SAAA,CAAWpQ,CAAAA,CAAQ,SAAA,CACnB,IAAA,CAAMA,CAAAA,CAAQ,SAAA,CAAY,eAAA,CAAkB,MAAA,CAC5C,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CACf,UAAA,CAAYmQ,CAAAA,CACZ,WAAA,CAAaD,CAAAA,CACb,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,MAAA,CAAQlQ,CAAAA,CAAQ,MACjB,CAAC,CAAA,CAEKwP,CAAAA,CAAmC,CACxC,EAAA,CAAIrO,EAAAA,GACJ,SAAA,CAAWnB,CAAAA,CAAQ,SAAA,CACnB,IAAA,CAAMA,CAAAA,CAAQ,SAAA,CAAY,eAAA,CAAkB,MAAA,CAC5C,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CACf,UAAA,CAAYmQ,CAAAA,CACZ,WAAA,CAAaD,CAAAA,CACb,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,MAAA,CAAQlQ,CAAAA,CAAQ,MAAA,CAChB,IAAA,CAAM,MAAMyI,EAAAA,CAAO2H,CAAkB,CACtC,CAAA,CAEA,MAAMV,CAAAA,CAAQ,wBAAA,CAAyBF,CAAW,CAAA,CAElD,IAAM5d,CAAAA,CAA6B,CAClC,OAAA,CAAS,CAAA,CAAA,CACT,SAAA,CAAWoO,CAAAA,CAAQ,SAAA,CACnB,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CACf,UAAA,CAAYA,CAAAA,CAAQ,SAAA,EAAa,CAAA,CAAA,CACjC,eAAA,CAAAkQ,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,WAAA,CAAAX,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,GAAA,EACjB,CAAA,CAEA,OAAAvF,CAAAA,CAAO,QAAA,GAAWrY,CAAM,CAAA,CACjBA,CACR,CAAA,MAAS1D,CAAAA,CAAO,CACf,OAAO,CACN,OAAA,CAAS,KAAA,CACT,SAAA,CAAW8R,CAAAA,CAAQ,SAAA,CACnB,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CACf,UAAA,CAAYA,CAAAA,CAAQ,SAAA,EAAa,KAAA,CACjC,eAAA,CAAiB,CAAA,CACjB,kBAAA,CAAoB,EAAC,CACrB,WAAA,CAAa,CACZ,EAAA,CAAI,OAAA,CACJ,SAAA,CAAWA,CAAAA,CAAQ,SAAA,CACnB,IAAA,CAAM,MAAA,CACN,KAAA,CAAOA,CAAAA,CAAQ,KAAA,CACf,UAAA,CAAY,EAAC,CACb,WAAA,CAAa,CAAA,CACb,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,IAAA,CAAM,EACP,CAAA,CACA,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,KAAA,CAAO9R,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAC7D,CACD,CACD,EAEA,OAAA,CAAA2hB,CAAAA,CAEA,MAAM,gBAAA,EAAmB,CACxB,GAAI,CAACF,CAAAA,CAAW,OAAO,CAAA,CAEvB,IAAIU,CAAAA,CAAe,CAAA,CACbzf,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAGfoe,CAAAA,CAAa,IAAI,GAAA,CACvB,GAAIW,CAAAA,CAAU,iBAAA,CACb,IAAA,IAAWpD,CAAAA,IAAY,MAAA,CAAO,IAAA,CAAKoD,CAAAA,CAAU,iBAAiB,CAAA,CAC7DX,CAAAA,CAAW,GAAA,CAAIzC,CAAQ,CAAA,CAKzByC,CAAAA,CAAW,GAAA,CAAI,SAAS,CAAA,CAExB,IAAA,IAAWzC,CAAAA,IAAYyC,CAAAA,CAAY,CAClC,IAAMpF,CAAAA,CAAc+F,CAAAA,CAAU,iBAAA,GAAoBpD,CAAQ,CAAA,EAAKoD,CAAAA,CAAU,kBAAA,CACnEzE,CAAAA,CAASta,CAAAA,CAAMgZ,CAAAA,CAEf0G,CAAAA,CAAU,MAAMZ,CAAAA,CAAQ,cAAA,CAAenD,CAAAA,CAAUrB,CAAM,CAAA,CAE7D,GAAIoF,CAAAA,CAAQ,OAAS,CAAA,CAAG,CACvB,MAAMX,CAAAA,CAAU,cAAA,GAAiB,CAAE,QAAA,CAAApD,CAAAA,CAAU,KAAA,CAAO+D,CAAAA,CAAQ,MAAO,CAAC,CAAA,CAEpE,IAAMC,CAAAA,CAAU,MAAMb,CAAAA,CAAQ,WAAA,CAAYY,CAAAA,CAAQ,GAAA,CAAKxF,CAAAA,EAAMA,CAAAA,CAAE,EAAE,CAAC,CAAA,CAClEuF,CAAAA,EAAgBE,CAAAA,CAEhBZ,CAAAA,CAAU,aAAA,GAAgB,CAAE,SAAApD,CAAAA,CAAU,KAAA,CAAOgE,CAAQ,CAAC,CAAA,CACtDtG,CAAAA,CAAO,mBAAA,GAAsBsC,CAAAA,CAAUgE,CAAO,EAC/C,CACD,CAEA,OAAOF,CACR,CAAA,CAEA,sBAAA,CAAuBd,CAAAA,CAAkD,CACxE,OAAO,MAAOngB,CAAAA,EAAmC,CAIhD,IAAM2f,CAAAA,CADiB3f,CAAAA,CAAK,KAAA,CAAM,KAAA,CAAM,mCAAmC,CAAA,GACxC,CAAC,EAEpC,OAAK2f,CAAAA,CAMc,MAAMc,CAAAA,CAAQ,KAAA,CAAMd,CAAAA,CAAWQ,CAAO,CAAA,CASlD,CAAE,MAAA,CAAQ,IAAK,CAAA,CANd,CACN,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,CAAA,gBAAA,EAAmBA,CAAO,CAAA,eAAA,EAAkBR,CAAS,CAAA,CAC9D,CAAA,CATO,CAAE,MAAA,CAAQ,IAAK,CAaxB,CACD,CAAA,CAEA,MAAM,sBAAA,CAAuByB,CAAAA,CAAY,CAGxC,OAAO,IACR,CACD,CACD,CC1rBO,SAASC,EAAAA,CAAiB5C,CAAAA,CAAcpH,CAAAA,CAAsB,CACnE,GAAIoH,CAAAA,CAAE,MAAA,GAAWpH,CAAAA,CAAE,MAAA,CACjB,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiCoH,CAAAA,CAAE,MAAM,CAAA,IAAA,EAAOpH,CAAAA,CAAE,MAAM,CAAA,CAAE,CAAA,CAG5E,IAAIiK,CAAAA,CAAa,CAAA,CACbC,CAAAA,CAAQ,EACRC,CAAAA,CAAQ,CAAA,CAEZ,IAAA,IAASta,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIuX,CAAAA,CAAE,MAAA,CAAQvX,CAAAA,EAAAA,CAAK,CACjC,IAAMua,CAAAA,CAAKhD,CAAAA,CAAEvX,CAAC,CAAA,CACRwa,CAAAA,CAAKrK,CAAAA,CAAEnQ,CAAC,CAAA,CACdoa,CAAAA,EAAcG,CAAAA,CAAKC,CAAAA,CACnBH,CAAAA,EAASE,CAAAA,CAAKA,CAAAA,CACdD,CAAAA,EAASE,CAAAA,CAAKA,EAChB,CAKA,OAHAH,CAAAA,CAAQ,IAAA,CAAK,IAAA,CAAKA,CAAK,CAAA,CACvBC,CAAAA,CAAQ,IAAA,CAAK,IAAA,CAAKA,CAAK,CAAA,CAEnBD,CAAAA,GAAU,CAAA,EAAKC,CAAAA,GAAU,CAAA,CACpB,CAAA,CAGFF,CAAAA,EAAcC,CAAAA,CAAQC,CAAAA,CAC/B,CAKA,SAASG,EAAAA,CACPC,CAAAA,CACA9G,CAAAA,CACAnP,CAAAA,CACA8Q,CAAAA,CACkD,CAClD,IAAIoF,CAAAA,CAA8D,IAAA,CAElE,IAAA,IAAWrI,CAAAA,IAASsB,CAAAA,CAAS,CAE3B,GAAI2B,CAAAA,EAAajD,CAAAA,CAAM,SAAA,EAAaA,CAAAA,CAAM,SAAA,GAAciD,CAAAA,CACtD,SAGF,IAAMqF,CAAAA,CAAaT,EAAAA,CAAiBO,CAAAA,CAAgBpI,CAAAA,CAAM,cAAc,CAAA,CAEpEsI,CAAAA,EAAcnW,CAAAA,GACZ,CAACkW,CAAAA,EAAaC,CAAAA,CAAaD,CAAAA,CAAU,UAAA,CAAA,GACvCA,CAAAA,CAAY,CAAE,KAAA,CAAArI,CAAAA,CAAO,UAAA,CAAAsI,CAAW,CAAA,EAGtC,CAEA,OAAOD,CACT,CASO,SAASE,EAAAA,EAA8C,CAC5D,IAAMzB,CAAAA,CAAU,IAAI,GAAA,CAEpB,SAAS0B,CAAAA,CAAaC,CAAAA,CAA4C,CAChE,IAAIC,CAAAA,CAAK5B,CAAAA,CAAQ,GAAA,CAAI2B,CAAS,CAAA,CAC9B,OAAKC,CAAAA,GACHA,CAAAA,CAAK,IAAI,GAAA,CACT5B,CAAAA,CAAQ,GAAA,CAAI2B,CAAAA,CAAWC,CAAE,CAAA,CAAA,CAEpBA,CACT,CAEA,OAAO,CACL,MAAM,UAAA,CAAWD,CAAAA,CAA0C,CACzD,OAAO,KAAA,CAAM,IAAA,CAAKD,CAAAA,CAAaC,CAAS,CAAA,CAAE,MAAA,EAAQ,CACpD,CAAA,CAEA,MAAM,QAAA,CAASA,CAAAA,CAAmBzI,CAAAA,CAAkC,CAClEwI,CAAAA,CAAaC,CAAS,CAAA,CAAE,GAAA,CAAIzI,CAAAA,CAAM,EAAA,CAAIA,CAAK,EAC7C,CAAA,CAEA,MAAM,YAAYyI,CAAAA,CAAmB5W,CAAAA,CAAY8W,CAAAA,CAA6C,CAC5F,IAAMD,CAAAA,CAAKF,CAAAA,CAAaC,CAAS,CAAA,CAC3BzI,CAAAA,CAAQ0I,CAAAA,CAAG,GAAA,CAAI7W,CAAE,CAAA,CACnBmO,CAAAA,EACF0I,CAAAA,CAAG,GAAA,CAAI7W,CAAAA,CAAI,CAAE,GAAGmO,CAAAA,CAAO,GAAG2I,CAAQ,CAAC,EAEvC,CAAA,CAEA,MAAM,WAAA,CAAYF,CAAAA,CAAmB5W,CAAAA,CAA2B,CAC9D2W,CAAAA,CAAaC,CAAS,CAAA,CAAE,MAAA,CAAO5W,CAAE,EACnC,CAAA,CAEA,MAAM,KAAA,CAAM4W,CAAAA,CAAkC,CAC5C3B,CAAAA,CAAQ,MAAA,CAAO2B,CAAS,EAC1B,CACF,CACF,CAmCO,SAASG,EAAAA,CAAoB9b,CAAAA,CAA4C,CAC9E,GAAM,CACJ,QAAA,CAAA+b,CAAAA,CACA,mBAAA,CAAAC,CAAAA,CAAsB,EAAA,CACtB,YAAA,CAAAC,CAAAA,CAAe,GAAA,CACf,KAAA,CAAAC,CAAAA,CAAQ,IAAA,CACR,SAAA,CAAAP,CAAAA,CAAY,SAAA,CACZ,OAAA,CAAA3B,CAAAA,CAAUyB,EAAAA,EAAsB,CAChC,KAAA,CAAAU,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAW,KACb,CAAA,CAAItc,CAAAA,CAGAuc,CAAAA,CAAoB,CACtB,YAAA,CAAc,CAAA,CACd,SAAA,CAAW,CAAA,CACX,WAAA,CAAa,CAAA,CACb,OAAA,CAAS,EACT,kBAAA,CAAoB,CAAA,CACpB,WAAA,CAAa,IAAA,CACb,WAAA,CAAa,IACf,CAAA,CAEIC,CAAAA,CAAqB,CAAA,CAEzB,SAASC,CAAAA,CAAYjI,CAAAA,CAA6B,CAShD,GARA+H,CAAAA,CAAM,YAAA,CAAe/H,CAAAA,CAAQ,MAAA,CAC7B+H,CAAAA,CAAM,OAAA,CACJA,CAAAA,CAAM,SAAA,CAAYA,CAAAA,CAAM,WAAA,CAAc,CAAA,CAClCA,CAAAA,CAAM,SAAA,EAAaA,CAAAA,CAAM,SAAA,CAAYA,CAAAA,CAAM,WAAA,CAAA,CAC3C,CAAA,CACNA,CAAAA,CAAM,kBAAA,CACJA,CAAAA,CAAM,SAAA,CAAY,CAAA,CAAIC,CAAAA,CAAqBD,CAAAA,CAAM,SAAA,CAAY,CAAA,CAE3D/H,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAG,CACtB,IAAMkI,CAAAA,CAAQlI,CAAAA,CAAQ,GAAA,CAAKY,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,CAC5CmH,CAAAA,CAAM,WAAA,CAAc,IAAA,CAAK,GAAA,CAAI,GAAGG,CAAK,CAAA,CACrCH,CAAAA,CAAM,WAAA,CAAc,KAAK,GAAA,CAAI,GAAGG,CAAK,EACvC,CAAA,KACEH,CAAAA,CAAM,WAAA,CAAc,IAAA,CACpBA,CAAAA,CAAM,WAAA,CAAc,KAExB,CAEA,eAAeI,CAAAA,EAAuC,CACpD,IAAMnI,CAAAA,CAAU,MAAMwF,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CAAA,CAC5CzgB,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CAGrB,IAAA,IAAWgY,CAAAA,IAASsB,CAAAA,CACdtZ,CAAAA,CAAMgY,CAAAA,CAAM,SAAA,CAAYgJ,CAAAA,EAC1B,MAAMlC,CAAAA,CAAQ,WAAA,CAAY2B,CAAAA,CAAWzI,CAAAA,CAAM,EAAE,CAAA,CAKjD,IAAM0J,CAAAA,CAAmB,MAAM5C,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CAAA,CAG3D,GAAIiB,CAAAA,CAAiB,MAAA,CAASX,CAAAA,CAAc,CAE1C,IAAMY,CAAAA,CADSD,CAAAA,CAAiB,IAAA,CAAK,CAACzE,CAAAA,CAAGpH,CAAAA,GAAMoH,CAAAA,CAAE,UAAA,CAAapH,CAAAA,CAAE,UAAU,CAAA,CAClD,KAAA,CAAM,CAAA,CAAG6L,CAAAA,CAAiB,MAAA,CAASX,CAAY,CAAA,CACvE,IAAA,IAAW/I,CAAAA,IAAS2J,CAAAA,CAClB,MAAM7C,CAAAA,CAAQ,WAAA,CAAY2B,CAAAA,CAAWzI,CAAAA,CAAM,EAAE,EAEjD,CACF,CAEA,OAAO,CACL,MAAM,MAAA,CAAO4J,CAAAA,CAAe3G,CAAAA,CAAgD,CAC1E,IAAMjH,CAAAA,CAAQ,IAAA,CAAK,GAAA,GAEnB,GAAI,CAEF,IAAMoM,CAAAA,CAAiB,MAAMS,CAAAA,CAASe,CAAK,CAAA,CAGrCtI,CAAAA,CAAU,MAAMwF,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CAAA,CAG5ChM,CAAAA,CAAQ0L,EAAAA,CACZC,CAAAA,CACA9G,CAAAA,CACAwH,CAAAA,CACAM,CAAAA,CAAWnG,CAAAA,CAAY,KAAA,CACzB,CAAA,CAEA,OAAIxG,CAAAA,EAEF,MAAMqK,CAAAA,CAAQ,WAAA,CAAY2B,CAAAA,CAAWhM,CAAAA,CAAM,MAAM,EAAA,CAAI,CACnD,UAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CACrB,WAAA,CAAaA,CAAAA,CAAM,KAAA,CAAM,WAAA,CAAc,CACzC,CAAC,CAAA,CAED4M,CAAAA,CAAM,SAAA,EAAA,CACNC,CAAAA,EAAsB7M,CAAAA,CAAM,UAAA,CAC5B8M,CAAAA,CAAYjI,CAAO,CAAA,CAEnB2H,CAAAA,GAAQxM,CAAAA,CAAM,KAAA,CAAOA,CAAAA,CAAM,UAAU,CAAA,CAE9B,CACL,GAAA,CAAK,CAAA,CAAA,CACL,KAAA,CAAOA,CAAAA,CAAM,KAAA,CACb,UAAA,CAAYA,CAAAA,CAAM,UAAA,CAClB,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAIT,CAC1B,CAAA,GAGFqN,CAAAA,CAAM,WAAA,EAAA,CACNE,CAAAA,CAAYjI,CAAO,CAAA,CAEnB4H,CAAAA,GAASU,CAAK,CAAA,CAEP,CACL,GAAA,CAAK,CAAA,CAAA,CACL,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAI5N,CAC1B,CAAA,CACF,CAAA,MAAS1W,CAAAA,CAAO,CAEd,OAAA+jB,CAAAA,CAAM,WAAA,EAAA,CACNF,CAAAA,GAAU7jB,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAC,CAAA,CAC5D,CACL,GAAA,CAAK,KAAA,CACL,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAI0W,CAC1B,CACF,CACF,CAAA,CAEA,MAAM,KAAA,CACJ4N,CAAAA,CACAhe,CAAAA,CACAqX,CAAAA,CACA4G,CAAAA,CAAoC,EAAC,CACtB,CAEf,IAAMzB,CAAAA,CAAiB,MAAMS,CAAAA,CAASe,CAAK,CAAA,CAErC5J,CAAAA,CAAoB,CACxB,EAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,UAAA,IAAa,EAAK,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,CACjG,MAAA4J,CAAAA,CACA,cAAA,CAAAxB,CAAAA,CACA,QAAA,CAAAxc,CAAAA,CACA,QAAA,CAAAie,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACpB,UAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CACrB,WAAA,CAAa,CAAA,CACb,SAAA,CAAWT,CAAAA,CAAWnG,CAAAA,CAAY,MACpC,CAAA,CAEA,MAAM6D,CAAAA,CAAQ,QAAA,CAAS2B,CAAAA,CAAWzI,CAAK,CAAA,CAGvC,MAAMyJ,CAAAA,EAAsB,CAE5B,IAAMnI,CAAAA,CAAU,MAAMwF,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CAAA,CAClDc,CAAAA,CAAYjI,CAAO,EACrB,CAAA,CAEA,MAAM,UAAA,CAAWwI,CAAAA,CAA4D,CAC3E,IAAMxI,CAAAA,CAAU,MAAMwF,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CAAA,CAC9CzO,CAAAA,CAAU,CAAA,CAEd,IAAA,IAAWgG,CAAAA,IAASsB,CAAAA,CACdwI,CAAAA,CAAU9J,CAAK,CAAA,GACjB,MAAM8G,EAAQ,WAAA,CAAY2B,CAAAA,CAAWzI,CAAAA,CAAM,EAAE,CAAA,CAC7ChG,CAAAA,EAAAA,CAAAA,CAIJ,IAAM0P,CAAAA,CAAmB,MAAM5C,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CAAA,CAC3D,OAAAc,CAAAA,CAAYG,CAAgB,CAAA,CAErB1P,CACT,CAAA,CAEA,MAAM,KAAA,EAAuB,CAC3B,MAAM8M,CAAAA,CAAQ,KAAA,CAAM2B,CAAS,CAAA,CAC7BY,CAAAA,CAAQ,CACN,YAAA,CAAc,CAAA,CACd,SAAA,CAAW,CAAA,CACX,WAAA,CAAa,CAAA,CACb,OAAA,CAAS,CAAA,CACT,kBAAA,CAAoB,CAAA,CACpB,WAAA,CAAa,IAAA,CACb,WAAA,CAAa,IACf,CAAA,CACAC,CAAAA,CAAqB,EACvB,CAAA,CAEA,QAAA,EAAuB,CACrB,OAAO,CAAE,GAAGD,CAAM,CACpB,CAAA,CAEA,MAAM,MAAA,EAAgC,CACpC,OAAOvC,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CACrC,CAAA,CAEA,MAAM,MAAA,CAAOnH,CAAAA,CAAsC,CACjD,IAAA,IAAWtB,CAAAA,IAASsB,CAAAA,CAClB,MAAMwF,CAAAA,CAAQ,QAAA,CAAS2B,CAAAA,CAAWzI,CAAK,CAAA,CAEzC,MAAMyJ,CAAAA,EAAsB,CAC5B,IAAMM,CAAAA,CAAa,MAAMjD,CAAAA,CAAQ,UAAA,CAAW2B,CAAS,CAAA,CACrDc,CAAAA,CAAYQ,CAAU,EACxB,CACF,CACF,CA6EO,SAASC,EAAAA,CAA6Bld,CAAAA,CAEmC,CAC9E,GAAM,CAAE,KAAA,CAAAmd,CAAM,CAAA,CAAInd,CAAAA,CAElB,OAAO,MAAOtG,CAAAA,EAA4E,CACxF,IAAMwC,CAAAA,CAAS,MAAMihB,CAAAA,CAAM,MAAA,CAAOzjB,CAAAA,CAAK,KAAA,CAAOA,CAAAA,CAAK,SAAS,CAAA,CAE5D,OAAIwC,CAAAA,CAAO,GAAA,EAAOA,CAAAA,CAAO,KAAA,CAChB,CACL,MAAA,CAAQ,KAAA,CACR,SAAU,IAAA,CACV,MAAA,CAAQ,CAAA,uBAAA,EAAA,CAA2BA,CAAAA,CAAO,UAAA,CAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,CACvE,cAAA,CAAgBA,CAAAA,CAAO,KAAA,CAAM,QAAA,CAC7B,UAAA,CAAYA,CAAAA,CAAO,UACrB,CAAA,CAGK,CACL,MAAA,CAAQ,IAAA,CACR,QAAA,CAAU,KACZ,CACF,CACF,CAUO,SAASkhB,EAAAA,CAAmBC,CAAAA,CAAa,GAAA,CAAiB,CAC/D,OAAO,MAAO1jB,CAAAA,EAAqC,CACjD,IAAM2jB,CAAAA,CAAY,IAAI,KAAA,CAAMD,CAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAG9C,IAAA,IAASzc,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIjH,CAAAA,CAAK,MAAA,CAAQiH,CAAAA,EAAAA,CAAK,CACpC,IAAM2c,CAAAA,CAAW5jB,CAAAA,CAAK,UAAA,CAAWiH,CAAC,CAAA,CAClC0c,CAAAA,CAAU1c,CAAAA,CAAIyc,CAAU,CAAA,EAAKE,EAAW,IAC1C,CAGA,IAAMC,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAKF,CAAAA,CAAU,MAAA,CAAO,CAAC3d,CAAAA,CAAKtG,CAAAA,GAAQsG,CAAAA,CAAMtG,CAAAA,CAAMA,CAAAA,CAAK,CAAC,CAAC,CAAA,CACzE,GAAImkB,CAAAA,CAAO,CAAA,CACT,IAAA,IAAS5c,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIyc,CAAAA,CAAYzc,CAAAA,EAAAA,CAC9B0c,CAAAA,CAAU1c,CAAC,CAAA,EAAK4c,CAAAA,CAIpB,OAAOF,CACT,CACF,CA0CO,SAASG,EAAAA,CAAsBzd,CAAAA,CAIlB,CAClB,GAAM,CAAE,SAAA,CAAA0d,CAAAA,CAAY,EAAA,CAAI,UAAA,CAAAC,CAAAA,CAAY,SAAA,CAAAC,CAAAA,CAAY,EAAG,CAAA,CAAI5d,CAAAA,CAEvD,GAAI0d,CAAAA,CAAY,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASA,CAAS,CAAA,CAC7C,MAAM,IAAI,KAAA,CAAM,CAAA,sDAAA,EAAyDA,CAAS,CAAA,CAAE,CAAA,CAGtF,IAAIG,CAAAA,CAIC,EAAC,CACFC,CAAAA,CAAmD,IAAA,CACnDC,CAAAA,CAAa,KAAA,CAEjB,eAAeC,CAAAA,EAA4B,CACzC,GAAIH,CAAAA,CAAa,MAAA,GAAW,CAAA,CAAG,OAE/B,IAAMI,CAAAA,CAAQJ,CAAAA,CACdA,CAAAA,CAAe,EAAC,CAEZC,CAAAA,GACF,YAAA,CAAaA,CAAU,CAAA,CACvBA,CAAAA,CAAa,IAAA,CAAA,CAGf,GAAI,CACF,IAAMI,CAAAA,CAAQD,CAAAA,CAAM,GAAA,CAAK5a,CAAAA,EAASA,CAAAA,CAAK,IAAI,CAAA,CACrC8a,CAAAA,CAAa,MAAMR,CAAAA,CAAWO,CAAK,CAAA,CAEzC,GAAIC,CAAAA,CAAW,MAAA,GAAWF,CAAAA,CAAM,MAAA,CAC9B,MAAM,IAAI,KAAA,CACR,CAAA,8CAAA,EAAiDE,CAAAA,CAAW,MAAM,CAAA,gBAAA,EAAmBF,CAAAA,CAAM,MAAM,CAAA,iFAAA,CAEnG,CAAA,CAGF,QAASrd,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIqd,CAAAA,CAAM,MAAA,CAAQrd,CAAAA,EAAAA,CAChCqd,CAAAA,CAAMrd,CAAC,CAAA,CAAG,OAAA,CAAQud,CAAAA,CAAWvd,CAAC,CAAE,EAEpC,CAAA,MAASpI,CAAAA,CAAO,CACd,IAAMuF,CAAAA,CAAMvF,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CACpE,IAAA,IAAW6K,CAAAA,IAAQ4a,CAAAA,CACjB5a,CAAAA,CAAK,MAAA,CAAOtF,CAAG,EAEnB,CACF,CAEA,OAAO,CACL,MAAM,KAAA,CAAMpE,CAAAA,CAAkC,CAC5C,GAAIokB,CAAAA,CACF,MAAM,IAAI,KAAA,CAAM,mCAAmC,CAAA,CAGrD,OAAO,IAAI,OAAA,CAAQ,CAACxa,CAAAA,CAASyD,CAAAA,GAAW,CACtC6W,CAAAA,CAAa,IAAA,CAAK,CAAE,IAAA,CAAAlkB,CAAAA,CAAM,QAAA4J,CAAAA,CAAS,MAAA,CAAAyD,CAAO,CAAC,CAAA,CAEvC6W,CAAAA,CAAa,MAAA,EAAUH,CAAAA,CACzBM,CAAAA,EAAW,CACDF,CAAAA,GACVA,CAAAA,CAAa,UAAA,CAAWE,CAAAA,CAAYJ,CAAS,CAAA,EAEjD,CAAC,CACH,CAAA,CAEA,MAAM,KAAA,EAAuB,CAC3B,MAAMI,CAAAA,GACR,CAAA,CAEA,OAAA,EAAgB,CACdD,CAAAA,CAAa,IAAA,CAGTD,CAAAA,GACF,YAAA,CAAaA,CAAU,CAAA,CACvBA,CAAAA,CAAa,IAAA,CAAA,CAIf,IAAMG,CAAAA,CAAQJ,CAAAA,CACdA,CAAAA,CAAe,EAAC,CAChB,IAAM9f,CAAAA,CAAM,IAAI,KAAA,CAAM,0BAA0B,CAAA,CAChD,IAAA,IAAWsF,CAAAA,IAAQ4a,CAAAA,CACjB5a,CAAAA,CAAK,MAAA,CAAOtF,CAAG,EAEnB,CACF,CACF,CC3pBO,SAASqgB,EAAAA,EAAkC,CACjD,IAAMC,EAAU,IAAI,GAAA,CAChBC,CAAAA,CAAmC,IAAA,CAEvC,SAASC,CAAAA,CAAkBjB,CAAAA,CAA4B,CACtD,GAAIgB,CAAAA,GAAsB,IAAA,CACzBA,CAAAA,CAAoBhB,CAAAA,CAAU,MAAA,CAAA,KAAA,GACpBA,CAAAA,CAAU,MAAA,GAAWgB,CAAAA,CAC/B,MAAM,IAAI,KAAA,CACT,CAAA,kDAAA,EAAqDA,CAAiB,CAAA,MAAA,EAAShB,CAAAA,CAAU,MAAM,CAAA,CAChG,CAEF,CAEA,OAAO,CACN,GAAA,CAAIvY,CAAAA,CAAYuY,CAAAA,CAA4B,CAC3CiB,CAAAA,CAAkBjB,CAAS,CAAA,CAC3Be,CAAAA,CAAQ,GAAA,CAAItZ,CAAAA,CAAIuY,CAAS,EAC1B,CAAA,CAEA,MAAA,CAAOvY,CAAAA,CAAkB,CACxBsZ,CAAAA,CAAQ,MAAA,CAAOtZ,CAAE,EAClB,CAAA,CAEA,MAAA,CAAO+X,CAAAA,CAAkB/I,CAAAA,CAAW1O,CAAAA,CAAY,CAAA,CAAsB,CACrE,GAAIiZ,CAAAA,GAAsB,IAAA,EAAQxB,CAAAA,CAAM,MAAA,GAAWwB,EAClD,MAAM,IAAI,KAAA,CACT,CAAA,wDAAA,EAA2DA,CAAiB,CAAA,MAAA,EAASxB,CAAAA,CAAM,MAAM,CAAA,CAClG,CAAA,CAED,IAAM3S,CAAAA,CAA6B,EAAC,CAEpC,IAAA,GAAW,CAACpF,CAAAA,CAAIuY,CAAS,CAAA,GAAKe,CAAAA,CAAS,CACtC,IAAM7C,CAAAA,CAAaT,EAAAA,CAAiB+B,CAAAA,CAAOQ,CAAS,CAAA,CAChD9B,CAAAA,EAAcnW,CAAAA,EACjB8E,CAAAA,CAAQ,KAAK,CAAE,EAAA,CAAApF,CAAAA,CAAI,UAAA,CAAAyW,CAAW,CAAC,EAEjC,CAGA,OAAArR,CAAAA,CAAQ,IAAA,CAAK,CAACgO,CAAAA,CAAGpH,CAAAA,GAAMA,CAAAA,CAAE,UAAA,CAAaoH,CAAAA,CAAE,UAAU,CAAA,CAC3ChO,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG4J,CAAC,CAC1B,CAAA,CAEA,OAAA,EAAgB,CAEhB,CAAA,CAEA,IAAA,EAAe,CACd,OAAOsK,CAAAA,CAAQ,IAChB,CAAA,CAEA,KAAA,EAAc,CACbA,CAAAA,CAAQ,KAAA,EAAM,CACdC,CAAAA,CAAoB,KACrB,CAAA,CAEA,YAAA,EAAwB,CACvB,OAAO,MACR,CACD,CACD,CAcA,SAASE,EAAAA,CAAerG,CAAAA,CAAcpH,CAAAA,CAAsB,CAC3D,OAAO,CAAA,CAAIgK,EAAAA,CAAiB5C,CAAAA,CAAGpH,CAAC,CACjC,CAQA,SAAS0N,EAAAA,CACR7N,CAAAA,CACA8N,CAAAA,CACgB,CAChB,GAAI9N,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CAG/B,IAAM+N,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAMD,CAAAA,EAAO,CAAI9N,CAAAA,CAAM,MAAM,CAAA,CAC1CgO,CAAAA,CAAKhO,CAAAA,CAAM+N,CAAK,CAAA,CAChBE,CAAAA,CAAOjO,CAAAA,CAAM,MAAA,CAAO,CAACqB,CAAAA,CAAGrR,CAAAA,GAAMA,CAAAA,GAAM+d,CAAK,EAE/C,GAAIE,CAAAA,CAAK,MAAA,GAAW,CAAA,CACnB,OAAO,CACN,EAAA,CAAID,CAAAA,CAAG,EAAA,CACP,SAAA,CAAWA,CAAAA,CAAG,SAAA,CACd,EAAA,CAAI,CAAA,CACJ,IAAA,CAAM,IAAA,CACN,KAAA,CAAO,IACR,CAAA,CAID,IAAME,CAAAA,CAAYD,CAAAA,CAAK,GAAA,CAAKxb,CAAAA,GAAU,CACrC,IAAA,CAAAA,CAAAA,CACA,QAAA,CAAUmb,EAAAA,CAAeI,CAAAA,CAAG,SAAA,CAAWvb,CAAAA,CAAK,SAAS,CACtD,CAAA,CAAE,CAAA,CAGFyb,CAAAA,CAAU,IAAA,CAAK,CAAC3G,CAAAA,CAAGpH,CAAAA,GAAMoH,CAAAA,CAAE,QAAA,CAAWpH,CAAAA,CAAE,QAAQ,CAAA,CAChD,IAAMgO,CAAAA,CAAY,IAAA,CAAK,KAAA,CAAMD,CAAAA,CAAU,MAAA,CAAS,CAAC,CAAA,CAC3CE,CAAAA,CAAKF,CAAAA,CAAUC,CAAS,CAAA,CAAG,QAAA,CAE3BE,CAAAA,CAAYH,CAAAA,CAAU,KAAA,CAAM,EAAGC,CAAS,CAAA,CAAE,GAAA,CAAK,CAAA,EAAM,CAAA,CAAE,IAAI,CAAA,CAC3DG,CAAAA,CAAaJ,CAAAA,CAAU,KAAA,CAAMC,CAAS,CAAA,CAAE,GAAA,CAAK,CAAA,EAAM,CAAA,CAAE,IAAI,CAAA,CAE/D,OAAO,CACN,EAAA,CAAIH,CAAAA,CAAG,EAAA,CACP,SAAA,CAAWA,CAAAA,CAAG,SAAA,CACd,EAAA,CAAAI,CAAAA,CACA,IAAA,CAAMP,EAAAA,CAAYQ,CAAAA,CAAWP,CAAM,CAAA,CACnC,KAAA,CAAOD,EAAAA,CAAYS,CAAAA,CAAYR,CAAM,CACtC,CACD,CAEA,SAASS,EAAAA,CACRC,CAAAA,CACAtC,CAAAA,CACA/I,CAAAA,CACA1O,CAAAA,CACA8E,CAAAA,CACAkV,CAAAA,CACO,CACP,GAAI,CAACD,CAAAA,CAAM,OAEX,IAAME,CAAAA,CAAOd,EAAAA,CAAe1B,CAAAA,CAAOsC,CAAAA,CAAK,SAAS,CAAA,CAC3C5D,CAAAA,CAAa,CAAA,CAAI8D,CAAAA,CAEnB9D,GAAcnW,CAAAA,GACjB8E,CAAAA,CAAQ,IAAA,CAAK,CAAE,EAAA,CAAIiV,CAAAA,CAAK,EAAA,CAAI,UAAA,CAAA5D,CAAW,CAAC,CAAA,CACxCrR,CAAAA,CAAQ,IAAA,CAAK,CAACgO,CAAAA,CAAGpH,CAAAA,GAAMA,CAAAA,CAAE,UAAA,CAAaoH,CAAAA,CAAE,UAAU,CAAA,CAE9ChO,CAAAA,CAAQ,MAAA,CAAS4J,CAAAA,EACpB5J,CAAAA,CAAQ,GAAA,EAAI,CAGTA,CAAAA,CAAQ,MAAA,GAAW4J,CAAAA,GACtBsL,EAAQ,KAAA,CAAQ,CAAA,CAAIlV,CAAAA,CAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,CAAG,UAAA,CAAA,CAAA,CAK/CmV,CAAAA,CAAOF,CAAAA,CAAK,EAAA,EAEfD,EAAAA,CAAaC,CAAAA,CAAK,IAAA,CAAMtC,CAAAA,CAAO/I,CAAAA,CAAG1O,CAAAA,CAAW8E,CAAAA,CAASkV,CAAO,CAAA,CAEzDC,CAAAA,CAAOD,CAAAA,CAAQ,KAAA,EAASD,CAAAA,CAAK,EAAA,EAChCD,EAAAA,CAAaC,CAAAA,CAAK,KAAA,CAAOtC,CAAAA,CAAO/I,CAAAA,CAAG1O,EAAW8E,CAAAA,CAASkV,CAAO,CAAA,GAI/DF,EAAAA,CAAaC,CAAAA,CAAK,KAAA,CAAOtC,CAAAA,CAAO/I,CAAAA,CAAG1O,CAAAA,CAAW8E,CAAAA,CAASkV,CAAO,CAAA,CAE1DC,CAAAA,CAAOD,CAAAA,CAAQ,KAAA,EAASD,CAAAA,CAAK,EAAA,EAChCD,EAAAA,CAAaC,CAAAA,CAAK,IAAA,CAAMtC,CAAAA,CAAO/I,CAAAA,CAAG1O,CAAAA,CAAW8E,CAAAA,CAASkV,CAAO,CAAA,EAGhE,CAwBO,SAASE,EAAAA,CAAkBC,CAAAA,CAA8B,EAAC,CAAa,CAC7E,GAAM,CAAE,MAAA,CAAAd,CAAAA,CAAS,IAAA,CAAK,MAAO,CAAA,CAAIc,CAAAA,CAC3B5O,CAAAA,CAAQ,IAAI,GAAA,CACd6O,CAAAA,CAAsB,IAAA,CACtBC,CAAAA,CAAe,KAAA,CACfpB,CAAAA,CAAmC,IAAA,CAEvC,SAASC,CAAAA,CAAkBjB,CAAAA,CAA4B,CACtD,GAAIgB,CAAAA,GAAsB,IAAA,CACzBA,CAAAA,CAAoBhB,CAAAA,CAAU,MAAA,CAAA,KAAA,GACpBA,CAAAA,CAAU,MAAA,GAAWgB,EAC/B,MAAM,IAAI,KAAA,CACT,CAAA,kDAAA,EAAqDA,CAAiB,CAAA,MAAA,EAAShB,CAAAA,CAAU,MAAM,CAAA,CAChG,CAEF,CAEA,OAAO,CACN,GAAA,CAAIvY,CAAAA,CAAYuY,CAAAA,CAA4B,CAC3CiB,CAAAA,CAAkBjB,CAAS,CAAA,CAC3B1M,CAAAA,CAAM,GAAA,CAAI7L,CAAAA,CAAIuY,CAAS,CAAA,CACvBoC,CAAAA,CAAe,KAChB,CAAA,CAEA,MAAA,CAAO3a,CAAAA,CAAkB,CACxB6L,CAAAA,CAAM,MAAA,CAAO7L,CAAE,CAAA,CACf2a,CAAAA,CAAe,KAChB,CAAA,CAEA,MAAA,CAAO5C,CAAAA,CAAkB/I,CAAAA,CAAW1O,CAAAA,CAAY,CAAA,CAAsB,CACrE,GAAIiZ,CAAAA,GAAsB,IAAA,EAAQxB,CAAAA,CAAM,MAAA,GAAWwB,CAAAA,CAClD,MAAM,IAAI,KAAA,CACT,CAAA,wDAAA,EAA2DA,CAAiB,CAAA,MAAA,EAASxB,CAAAA,CAAM,MAAM,CAAA,CAClG,CAAA,CAED,GAAI4C,CAAAA,EAAgB,CAACD,CAAAA,CAAM,CAE1B,IAAMtV,CAAAA,CAA6B,EAAC,CACpC,IAAA,GAAW,CAACpF,CAAAA,CAAIuY,CAAS,CAAA,GAAK1M,CAAAA,CAAO,CACpC,IAAM4K,CAAAA,CAAaT,EAAAA,CAAiB+B,CAAAA,CAAOQ,CAAS,CAAA,CAChD9B,CAAAA,EAAcnW,CAAAA,EACjB8E,CAAAA,CAAQ,IAAA,CAAK,CAAE,EAAA,CAAApF,CAAAA,CAAI,UAAA,CAAAyW,CAAW,CAAC,EAEjC,CACA,OAAArR,CAAAA,CAAQ,IAAA,CAAK,CAACgO,CAAAA,CAAGpH,CAAAA,GAAMA,CAAAA,CAAE,UAAA,CAAaoH,CAAAA,CAAE,UAAU,CAAA,CAC3ChO,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG4J,CAAC,CAC1B,CAEA,IAAM5J,CAAAA,CAA6B,EAAC,CAC9BkV,CAAAA,CAAU,CAAE,KAAA,CAAO,MAAA,CAAO,iBAAkB,CAAA,CAClD,OAAAF,EAAAA,CAAaM,CAAAA,CAAM3C,CAAAA,CAAO/I,EAAG1O,CAAAA,CAAW8E,CAAAA,CAASkV,CAAO,CAAA,CACjDlV,CACR,CAAA,CAEA,OAAA,EAAgB,CACf,IAAMwV,CAAAA,CAAY,KAAA,CAAM,IAAA,CAAK/O,CAAAA,CAAM,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC7L,CAAAA,CAAIuY,CAAS,CAAA,IAAO,CAAE,EAAA,CAAAvY,CAAAA,CAAI,SAAA,CAAAuY,CAAU,CAAA,CAAE,CAAA,CAC1FmC,CAAAA,CAAOhB,EAAAA,CAAYkB,CAAAA,CAAWjB,CAAM,CAAA,CACpCgB,CAAAA,CAAe,MAChB,CAAA,CAEA,IAAA,EAAe,CACd,OAAO9O,CAAAA,CAAM,IACd,CAAA,CAEA,KAAA,EAAc,CACbA,CAAAA,CAAM,KAAA,EAAM,CACZ6O,CAAAA,CAAO,IAAA,CACPC,CAAAA,CAAe,KAAA,CACfpB,CAAAA,CAAoB,KACrB,CAAA,CAEA,YAAA,EAAwB,CACvB,OAAOoB,CACR,CACD,CACD,CC3PO,SAASE,EAAAA,CAAuB5f,CAAAA,CAA8B,EAAC,CAAqB,CAC1F,GAAM,CAAE,UAAA,CAAA+D,CAAAA,CAAa,GAAI,CAAA,CAAI/D,CAAAA,CAE7B,GAAI+D,CAAAA,CAAa,CAAA,EAAK,CAAC,MAAA,CAAO,QAAA,CAASA,CAAU,CAAA,CAChD,MAAM,IAAI,KAAA,CAAM,CAAA,uDAAA,EAA0DA,CAAU,CAAA,CAAE,CAAA,CAGvF,IAAMG,CAAAA,CAAc,EAAC,CACjB3G,CAAAA,CAA4B,MAAA,CAC5BsiB,CAAAA,CAA4B,IAAA,CAG5BC,CAAAA,CAAuG,IAAA,CAGvGC,CAAAA,CAAsC,IAAA,CAGtCC,CAAAA,CAAc,KAAA,CAElB,SAASC,CAAAA,CAAgBhnB,CAAAA,CAAgB,CACxC,GAAI6mB,CAAAA,CAAgB,CACnB,IAAMrc,CAAAA,CAASqc,CAAAA,CACfA,CAAAA,CAAiB,IAAA,CACjBrc,CAAAA,CAAO,OAAA,CAAQ,CAAE,KAAA,CAAAxK,CAAAA,CAAO,IAAA,CAAM,KAAM,CAAC,EACtC,CACD,CAEA,SAASinB,CAAAA,EAAoB,CAC5B,GAAIJ,CAAAA,CAAgB,CACnB,IAAMrc,CAAAA,CAASqc,CAAAA,CACfA,CAAAA,CAAiB,IAAA,CACjBrc,CAAAA,CAAO,OAAA,CAAQ,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,EAChE,CACD,CAEA,SAAS0c,CAAAA,CAAcpiB,CAAAA,CAAkB,CACxC,GAAI+hB,CAAAA,CAAgB,CACnB,IAAMrc,CAAAA,CAASqc,CAAAA,CACfA,CAAAA,CAAiB,IAAA,CACjBE,CAAAA,CAAc,KAAA,CACdvc,CAAAA,CAAO,MAAA,CAAO1F,CAAG,EAClB,CACD,CAEA,SAASqiB,CAAAA,EAAwB,CAChC,GAAIL,CAAAA,CAAgB,CACnB,IAAMtc,CAAAA,CAASsc,CAAAA,CACfA,CAAAA,CAAiB,IAAA,CACjBtc,CAAAA,GACD,CACD,CA2GA,OAzGkC,CACjC,MAAM,IAAA,CAAKxK,EAAyB,CACnC,GAAIsE,CAAAA,GAAU,MAAA,CACb,MAAM,IAAI,KAAA,CACT,CAAA,yCAAA,EAA4CA,CAAK,CAAA,QAAA,EAAWyC,CAAAA,CAAO,IAAA,CAAO,CAAA,EAAA,EAAKA,CAAAA,CAAO,IAAI,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,CACnG,CAAA,CAID,GAAI8f,CAAAA,CAAgB,CACnBG,CAAAA,CAAgBhnB,CAAK,CAAA,CACrB,MACD,CAGA,GAAIiL,CAAAA,CAAO,MAAA,EAAUH,CAAAA,CAAY,CAKhC,GAJA,MAAM,IAAI,OAAA,CAAeR,CAAAA,EAAY,CACpCwc,CAAAA,CAAiBxc,EAClB,CAAC,CAAA,CAEGhG,CAAAA,GAAU,MAAA,CACb,MAAM,IAAI,KAAA,CACT,CAAA,yCAAA,EAA4CA,CAAK,CAAA,QAAA,EAAWyC,CAAAA,CAAO,IAAA,CAAO,CAAA,EAAA,EAAKA,CAAAA,CAAO,IAAI,CAAA,CAAA,CAAA,CAAM,EAAE,CAAA,CACnG,CAAA,CAGD,GAAI8f,CAAAA,CAAgB,CACnBG,EAAgBhnB,CAAK,CAAA,CACrB,MACD,CACD,CAGAiL,CAAAA,CAAO,IAAA,CAAKjL,CAAK,EAClB,CAAA,CAEA,GAAA,EAAY,CACPsE,CAAAA,GAAU,MAAA,GACdA,CAAAA,CAAQ,QAAA,CACR2iB,CAAAA,EAAY,EACb,CAAA,CAEA,KAAA,CAAMniB,CAAAA,CAAkB,CACnBR,CAAAA,GAAU,MAAA,GACdA,CAAAA,CAAQ,OAAA,CACRsiB,CAAAA,CAAc9hB,CAAAA,CACdoiB,CAAAA,CAAcpiB,CAAG,EACjBqiB,CAAAA,EAAgB,EACjB,CAAA,CAEA,QAAA,EAA+B,CAC9B,OAAO7iB,CACR,CAAA,CAEA,aAAA,EAAwB,CACvB,OAAO2G,CAAAA,CAAO,MACf,CAAA,CAEA,CAAC,MAAA,CAAO,aAAa,CAAA,EAAsB,CAC1C,GAAI8b,CAAAA,CACH,MAAM,IAAI,KAAA,CACT,iHAED,CAAA,CAED,OAAAA,CAAAA,CAAc,IAAA,CAEP,CACN,MAAmC,CAElC,GAAIziB,CAAAA,GAAU,OAAA,EAAWsiB,CAAAA,CACxB,OAAAG,CAAAA,CAAc,KAAA,CACP,OAAA,CAAQ,MAAA,CAAOH,CAAW,CAAA,CAIlC,GAAI3b,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAG,CACtB,IAAMjL,CAAAA,CAAQiL,CAAAA,CAAO,KAAA,EAAM,CAC3B,OAAAkc,CAAAA,EAAgB,CACT,OAAA,CAAQ,OAAA,CAAQ,CAAE,KAAA,CAAAnnB,CAAAA,CAAO,IAAA,CAAM,KAAM,CAAC,CAC9C,CAGA,OAAIsE,CAAAA,GAAU,QAAA,EACbyiB,CAAAA,CAAc,KAAA,CACP,OAAA,CAAQ,OAAA,CAAQ,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,CAAA,EAIjE,IAAI,OAAA,CAAQ,CAACzc,CAAAA,CAASyD,CAAAA,GAAW,CACvC8Y,CAAAA,CAAiB,CAAE,OAAA,CAAAvc,CAAAA,CAAS,MAAA,CAAAyD,CAAO,EACpC,CAAC,CACF,CAAA,CAEA,MAAA,EAAqC,CACpC,OAAAzJ,CAAAA,CAAQ,QAAA,CACR2G,CAAAA,CAAO,MAAA,CAAS,CAAA,CAChB8b,CAAAA,CAAc,KAAA,CACdI,CAAAA,EAAgB,CACT,OAAA,CAAQ,OAAA,CAAQ,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,CACxE,CACD,CACD,CACD,CAGD,CAyBO,SAASC,EAAAA,CACfrgB,CAAAA,CAC6E,CAC7E,IAAMsgB,CAAAA,CAAcV,EAAAA,CAAwB5f,CAAM,CAAA,CAC5CugB,CAAAA,CAAcX,EAAAA,CAAwB5f,CAAM,CAAA,CAElD,OAAO,CACN,KAAA,CAAO,CACN,IAAA,CAAO/G,CAAAA,EAAcqnB,CAAAA,CAAY,IAAA,CAAKrnB,CAAK,CAAA,CAC3C,OAAA,CAASsnB,CAAAA,CACT,KAAA,EAAQ,CACPD,CAAAA,CAAY,GAAA,EAAI,CAChBC,CAAAA,CAAY,GAAA,GACb,CACD,EACA,KAAA,CAAO,CACN,IAAA,CAAOtnB,CAAAA,EAAcsnB,CAAAA,CAAY,IAAA,CAAKtnB,CAAK,CAAA,CAC3C,OAAA,CAASqnB,CAAAA,CACT,KAAA,EAAQ,CACPA,CAAAA,CAAY,GAAA,EAAI,CAChBC,CAAAA,CAAY,GAAA,GACb,CACD,CACD,CACD,CAiBA,eAAsBC,EAAAA,CACrBlI,CAAAA,CACAmI,CAAAA,CACAC,CAAAA,CACgB,CAChB,GAAI,CACH,UAAA,IAAiBznB,CAAAA,IAASqf,CAAAA,CAAQ,CACjC,IAAMqI,CAAAA,CAAc,MAAMD,CAAAA,CAAUznB,CAAK,CAAA,CACzC,MAAMwnB,CAAAA,CAAY,IAAA,CAAKE,CAAW,EACnC,CACAF,CAAAA,CAAY,GAAA,GACb,CAAA,MAASjoB,CAAAA,CAAO,CACfioB,CAAAA,CAAY,KAAA,CAAMjoB,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAC,EAC5E,CACD,CAkBO,SAASooB,EAAAA,CAAAA,GAAmBC,CAAAA,CAA+C,CAGjF,OAAO,CACN,CAAC,MAAA,CAAO,aAAa,CAAA,EAAsB,CAC1C,IAAM3c,CAAAA,CAAc,EAAC,CACjB4c,CAAAA,CAAY,CAAA,CACZrd,CAAAA,CAAsD,IAAA,CACtDsd,CAAAA,CAA2B,IAAA,CAC3Bzc,CAAAA,CAAU,KAAA,CACV0c,CAAAA,CAAgB,KAAA,CACdC,CAAAA,CAAsC,GAE5C,SAASC,CAAAA,CAAahlB,CAAAA,CAAoC,CACzD,GAAIuH,CAAAA,CAAQ,CACX,IAAM0d,CAAAA,CAAI1d,CAAAA,CACV,OAAAA,CAAAA,CAAS,IAAA,CACT0d,CAAAA,CAAEjlB,CAAM,CAAA,CACD,IACR,CACA,OAAO,MACR,CAGA,IAAA,IAAWoc,CAAAA,IAAUuI,CAAAA,CAAS,CAC7B,IAAMO,CAAAA,CAAO9I,CAAAA,CAAO,MAAA,CAAO,aAAa,GAAE,CAC1C2I,CAAAA,CAAgB,IAAA,CAAKG,CAAI,CAAA,CAAA,CACxB,SAAY,CACZ,GAAI,CACH,KAAO,CAAC9c,CAAAA,EAAS,CAChB,IAAMpI,CAAAA,CAAS,MAAMklB,CAAAA,CAAK,IAAA,EAAK,CAC/B,GAAIllB,CAAAA,CAAO,IAAA,EAAQoI,CAAAA,CAAS,MACvB4c,CAAAA,CAAa,CAAE,KAAA,CAAOhlB,CAAAA,CAAO,KAAA,CAAO,IAAA,CAAM,CAAA,CAAM,CAAC,CAAA,GACjDgI,CAAAA,CAAO,MAAA,CAAS,GAAA,CACnBA,CAAAA,CAAO,IAAA,CAAKhI,CAAAA,CAAO,KAAK,CAAA,CACb8kB,CAAAA,GACXA,CAAAA,CAAgB,CAAA,CAAA,CAChB,OAAA,CAAQ,IAAA,CACP,oJAED,CAAA,CAAA,EAGH,CACD,CAAA,MAASxoB,CAAAA,CAAO,CACV8L,CAAAA,GACJA,CAAAA,CAAU,IAAA,CACVyc,CAAAA,CAAavoB,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CACrE0oB,CAAAA,CAAa,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,CAAA,EAE/D,CACAJ,CAAAA,EAAAA,CACIA,CAAAA,EAAaD,CAAAA,CAAQ,MAAA,EAAU,CAACvc,CAAAA,EACnC4c,CAAAA,CAAa,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,EAE/D,CAAA,IACD,CAEA,OAAO,CACN,IAAA,EAAmC,CAClC,OAAIH,CAAAA,CACI,OAAA,CAAQ,MAAA,CAAOA,CAAU,CAAA,CAG7B7c,CAAAA,CAAO,MAAA,CAAS,CAAA,CACZ,OAAA,CAAQ,OAAA,CAAQ,CAAE,KAAA,CAAOA,CAAAA,CAAO,KAAA,EAAM,CAAI,IAAA,CAAM,KAAM,CAAC,CAAA,CAG3D4c,CAAAA,EAAaD,CAAAA,CAAQ,MAAA,CACjB,OAAA,CAAQ,OAAA,CAAQ,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,CAAA,CAGjE,IAAI,OAAA,CAAStd,CAAAA,EAAY,CAC/BE,CAAAA,CAASF,EACV,CAAC,CACF,CAAA,CAEA,MAAA,EAAqC,CACpCe,CAAAA,CAAU,IAAA,CACVJ,CAAAA,CAAO,MAAA,CAAS,CAAA,CAChB,IAAA,IAAWkd,CAAAA,IAAQH,CAAAA,CAClBG,CAAAA,CAAK,MAAA,GAAS,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,CAAA,CAE/D,GAAI3d,CAAAA,CAAQ,CACX,IAAM0d,CAAAA,CAAI1d,CAAAA,CACVA,CAAAA,CAAS,IAAA,CACT0d,CAAAA,CAAE,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,EACnD,CACA,OAAO,OAAA,CAAQ,OAAA,CAAQ,CAAE,KAAA,CAAO,MAAA,CAA2B,IAAA,CAAM,IAAK,CAAC,CACxE,CACD,CACD,CACD,CACD,CCvXO,IAAME,EAAAA,CAAN,cAAkC,KAAM,CACpC,UAAA,CACA,SAAA,CAET,WAAA,CAAYC,CAAAA,CAAoBC,CAAAA,CAAkB,CAChD,KAAA,CAAM,CAAA,gBAAA,EAAmBD,CAAU,CAAA,oBAAA,EAAuBC,CAAAA,CAAU,OAAO,CAAA,CAAE,EAC7E,IAAA,CAAK,IAAA,CAAO,qBAAA,CACZ,IAAA,CAAK,UAAA,CAAaD,CAAAA,CAClB,IAAA,CAAK,SAAA,CAAYC,CAAAA,CACjB,IAAA,CAAK,KAAA,CAAQA,EACf,CACF,CAAA,CAOMC,EAAAA,CAAyB,IAAI,GAAA,CAAI,CAAC,GAAA,CAAK,GAAA,CAAK,GAAA,CAAK,GAAA,CAAK,GAAG,CAAC,EAQzD,SAASC,EAAAA,CAAgBjpB,CAAAA,CAA6B,CAE3D,IAAMkpB,EAASlpB,CAAAA,CACf,GAAI,OAAOkpB,CAAAA,CAAO,MAAA,EAAW,QAAA,EAAYA,CAAAA,CAAO,MAAA,EAAU,GAAA,EAAOA,CAAAA,CAAO,MAAA,EAAU,GAAA,CAChF,OAAOA,CAAAA,CAAO,MAAA,CAEhB,GAAI,OAAOA,CAAAA,CAAO,UAAA,EAAe,QAAA,EAAYA,CAAAA,CAAO,UAAA,EAAc,GAAA,EAAOA,CAAAA,CAAO,UAAA,EAAc,GAAA,CAC5F,OAAOA,CAAAA,CAAO,UAAA,CAOhB,IAAM/R,CAAAA,CAAAA,CADMnX,CAAAA,CAAM,OAAA,CAAQ,MAAA,CAAS,GAAA,CAAOA,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,GAAI,CAAA,CAAIA,CAAAA,CAAM,OAAA,EAC7D,KAAA,CAAM,8CAA8C,CAAA,CACtE,GAAI,CAACmX,CAAAA,CACH,OAAO,IAAA,CAGT,IAAMgS,CAAAA,CAAS,MAAA,CAAOhS,CAAAA,CAAM,CAAC,CAAC,CAAA,CAC9B,OAAIgS,CAAAA,EAAU,GAAA,EAAOA,CAAAA,EAAU,IACtBA,CAAAA,CAGF,IACT,CAQO,SAASC,EAAAA,CAAgBppB,CAAAA,CAA6B,CAE3D,IAAMkpB,CAAAA,CAASlpB,CAAAA,CACf,GAAI,OAAOkpB,CAAAA,CAAO,UAAA,EAAe,QAAA,EAAYA,CAAAA,CAAO,UAAA,CAAa,CAAA,CAC/D,OAAOA,CAAAA,CAAO,UAAA,CAAa,GAAA,CAK7B,IAAM/R,CAAAA,CAAAA,CADMnX,CAAAA,CAAM,OAAA,CAAQ,MAAA,CAAS,GAAA,CAAOA,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,GAAI,CAAA,CAAIA,CAAAA,CAAM,OAAA,EAC7D,KAAA,CAAM,6BAA6B,CAAA,CACrD,GAAI,CAACmX,CAAAA,CACH,OAAO,IAAA,CAGT,IAAMkS,CAAAA,CAAU,MAAA,CAAOlS,CAAAA,CAAO,CAAC,CAAC,CAAA,CAChC,OAAIkS,CAAAA,CAAU,CAAA,CACLA,CAAAA,CAAU,GAAA,CAGZ,IACT,CAGA,SAASC,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACAC,EACQ,CACR,IAAMC,CAAAA,CAAcF,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGD,CAAAA,CAAU,CAAC,CAAA,CACnDI,CAAAA,CAAS,IAAA,CAAK,MAAA,EAAO,CAAIH,CAAAA,CAAc,EAAA,CACvCI,CAAAA,CAAQF,CAAAA,CAAcC,CAAAA,CAE5B,OAAO,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAOH,CAAU,CACnC,CAGA,SAASI,EAAAA,CACP7pB,CAAAA,CACAupB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACQ,CAIR,GAHeR,EAAAA,CAAgBjpB,CAAK,CAAA,GAGrB,GAAA,CAAK,CAClB,IAAM8pB,CAAAA,CAAaV,EAAAA,CAAgBppB,CAAK,CAAA,CACxC,GAAI8pB,CAAAA,GAAe,IAAA,CACjB,OAAO,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAYL,CAAU,CAE1C,CAGA,OAAOH,EAAAA,CAAsBC,CAAAA,CAASC,CAAAA,CAAaC,CAAU,CAC/D,CAGA,SAASM,GAAkB/pB,CAAAA,CAAuB,CAChD,IAAMmpB,CAAAA,CAASF,EAAAA,CAAgBjpB,CAAK,CAAA,CACpC,OAAImpB,CAAAA,GAAW,IAAA,CAEN,IAAA,CAGF,CAACH,EAAAA,CAAuB,GAAA,CAAIG,CAAM,CAC3C,CAoBO,SAASa,EAAAA,CAAUnb,CAAAA,CAAqBrH,CAAAA,CAAsB,EAAC,CAAgB,CACpF,GAAM,CACJ,UAAA,CAAAyiB,CAAAA,CAAa,CAAA,CACb,WAAA,CAAAT,CAAAA,CAAc,GAAA,CACd,UAAA,CAAAC,CAAAA,CAAa,GAAA,CACb,WAAA,CAAAS,CAAAA,CACA,OAAA,CAAAC,CACF,CAAA,CAAI3iB,CAAAA,CAGJ,GAAI,CAAC,MAAA,CAAO,QAAA,CAASyiB,CAAU,CAAA,EAAKA,CAAAA,CAAa,CAAA,CAC/C,MAAM,IAAI,KAAA,CAAM,yEAAyE,CAAA,CAE3F,GAAI,CAAC,MAAA,CAAO,QAAA,CAAST,CAAW,CAAA,EAAKA,CAAAA,CAAc,CAAA,CACjD,MAAM,IAAI,KAAA,CAAM,0EAA0E,CAAA,CAE5F,GAAI,CAAC,MAAA,CAAO,QAAA,CAASC,CAAU,CAAA,EAAKA,CAAAA,CAAa,CAAA,CAC/C,MAAM,IAAI,KAAA,CAAM,yEAAyE,CAAA,CAG3F,OAAO,MACL1jB,CAAAA,CACAC,CAAAA,CACAlG,CAAAA,GAC0B,CAC1B,IAAIipB,CAAAA,CAEJ,IAAA,IAASQ,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAWU,CAAAA,CAAYV,CAAAA,EAAAA,CAC3C,GAAI,CACF,OAAO,MAAM1a,CAAAA,CAAU9I,CAAAA,CAAOC,CAAAA,CAAOlG,CAAO,CAC9C,CAAA,MAASyF,CAAAA,CAAK,CAIZ,GAHAwjB,CAAAA,CAAYxjB,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAA,CAG1DgkB,CAAAA,EAAWU,CAAAA,CACb,MAIF,GAAIC,CAAAA,CACF,GAAI,CACF,GAAI,CAACA,CAAAA,CAAYnB,CAAS,CAAA,CACxB,KAEJ,CAAA,KAAQ,CAEN,KACF,CAIF,GAAI,CAACgB,EAAAA,CAAkBhB,CAAS,CAAA,CAC9B,MAIF,IAAMqB,CAAAA,CAAUP,EAAAA,CAAcd,CAAAA,CAAWQ,CAAAA,CAAU,CAAA,CAAGC,CAAAA,CAAaC,CAAU,CAAA,CAC7E,GAAI,CAAEU,CAAAA,GAAUZ,CAAAA,CAAU,CAAA,CAAGR,CAAAA,CAAWqB,CAAO,EAAG,CAAA,KAAQ,CAAmD,CAG7G,IAAM/e,CAAAA,CAASvL,CAAAA,EAAS,MAAA,CACxB,GAAIuL,CAAAA,EAAQ,OAAA,CACV,MAEF,MAAM,IAAI,OAAA,CAAc,CAACN,CAAAA,CAASyD,CAAAA,GAAW,CAC3C,IAAMyH,CAAAA,CAAQ,UAAA,CAAW,IAAM,CAC7B5K,CAAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASgf,CAAO,CAAA,CAC5Ctf,CAAAA,GACF,CAAA,CAAGqf,CAAO,CAAA,CACV,SAASC,CAAAA,EAAU,CACjB,YAAA,CAAapU,CAAK,CAAA,CAClBzH,CAAAA,CAAOnD,CAAAA,CAAQ,MAAA,EAAU,IAAI,KAAA,CAAM,SAAS,CAAC,EAC/C,CACIA,CAAAA,EACFA,CAAAA,CAAO,gBAAA,CAAiB,OAAA,CAASgf,CAAAA,CAAS,CAAE,IAAA,CAAM,IAAK,CAAC,EAE5D,CAAC,EACH,CAIF,MAAM,IAAIxB,EAAAA,CAAoBoB,CAAAA,CAAYlB,CAAU,CACtD,CACF,CCxPO,IAAMuB,EAAAA,CAAN,cAAsC,KAAM,CACxC,MAAA,CAET,WAAA,CAAYC,CAAAA,CAAiB,CAC3B,IAAMhhB,CAAAA,CAAUghB,CAAAA,CACb,GAAA,CAAI,CAAC3N,CAAAA,CAAGxU,CAAAA,GAAM,CAAA,GAAA,EAAMA,CAAC,CAAA,EAAA,EAAKwU,CAAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CACrC,IAAA,CAAK;AAAA,CAAI,CAAA,CACZ,KAAA,CAAM,CAAA,gBAAA,EAAmB2N,CAAAA,CAAO,MAAM,CAAA;AAAA,EAAuBhhB,CAAO,CAAA,CAAE,CAAA,CACtE,IAAA,CAAK,IAAA,CAAO,yBAAA,CACZ,IAAA,CAAK,MAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,GAAGghB,CAAM,CAAC,CAAA,CAEnCA,CAAAA,CAAO,MAAA,CAAS,CAAA,GAClB,IAAA,CAAK,KAAA,CAAQA,CAAAA,CAAOA,CAAAA,CAAO,MAAA,CAAS,CAAC,CAAA,EAEzC,CACF,EAsBO,SAASC,EAAAA,CACdC,CAAAA,CACAjjB,CAAAA,CAAyB,EAAC,CACb,CACb,GAAIijB,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACrB,MAAM,IAAI,KAAA,CAAM,wDAAwD,CAAA,CAG1E,GAAM,CAAE,cAAA,CAAAC,CAAAA,CAAgB,UAAA,CAAAC,CAAW,CAAA,CAAInjB,CAAAA,CAEvC,OAAO,MACLzB,CAAAA,CACAC,CAAAA,CACAlG,CAAAA,GAC0B,CAC1B,IAAMyqB,CAAAA,CAAkB,EAAC,CAEzB,IAAA,IAAS,CAAA,CAAI,CAAA,CAAG,CAAA,CAAIE,CAAAA,CAAQ,MAAA,CAAQ,CAAA,EAAA,CAClC,GAAI,CACF,OAAO,MAAMA,CAAAA,CAAQ,CAAC,CAAA,CAAM1kB,CAAAA,CAAOC,CAAAA,CAAOlG,CAAO,CACnD,CAAA,MAASyF,CAAAA,CAAK,CACZ,IAAMvF,CAAAA,CAAQuF,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAA,CAIhE,GAHAglB,CAAAA,CAAO,IAAA,CAAKvqB,CAAK,CAAA,CAGb,CAAA,CAAIyqB,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAG,CAC1B,GAAIC,CAAAA,CACF,GAAI,CACF,GAAI,CAACA,CAAAA,CAAe1qB,CAAK,CAAA,CACvB,KAEJ,CAAA,KAAQ,CAEN,KACF,CAEF,GAAI,CAAE2qB,CAAAA,GAAa,CAAA,CAAG,CAAA,CAAI,CAAA,CAAG3qB,CAAK,EAAG,CAAA,KAAQ,CAAsD,CACrG,CACF,CAGF,MAAM,IAAIsqB,EAAAA,CAAwBC,CAAM,CAC1C,CACF,CCjBO,IAAMK,EAAAA,CAAN,cAAkC,KAAM,CACpC,SAAA,CACA,SAAA,CACA,MAAA,CAET,WAAA,CAAYrb,CAAAA,CAAgC,CAC1C,KAAA,CACE,CAAA,6BAAA,EAAgCA,CAAAA,CAAQ,MAAM,CAAA,cAAA,EAAiBA,CAAAA,CAAQ,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,aAAA,EAC7EA,CAAAA,CAAQ,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,CAC5C,CAAA,CACA,IAAA,CAAK,IAAA,CAAO,qBAAA,CACZ,IAAA,CAAK,SAAA,CAAYA,CAAAA,CAAQ,SAAA,CACzB,IAAA,CAAK,SAAA,CAAYA,CAAAA,CAAQ,SAAA,CACzB,IAAA,CAAK,MAAA,CAASA,CAAAA,CAAQ,OACxB,CACF,CAAA,CAWMsb,EAAAA,CAAN,KAAiB,CACP,OAAA,CAAuB,EAAC,CAEhC,OAAOjN,CAAAA,CAAoB,CACzB,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAE,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAG,IAAA,CAAAA,CAAK,CAAC,EACnD,CAGA,eAAA,CAAgB5b,CAAAA,CAA0B,CACxC,IAAMgb,CAAAA,CAAS,IAAA,CAAK,GAAA,EAAI,CAAIhb,CAAAA,CAC5B,IAAA,CAAK,KAAA,CAAMgb,CAAM,CAAA,CAEjB,IAAI8N,CAAAA,CAAQ,CAAA,CACZ,IAAA,IAAWpQ,CAAAA,IAAS,IAAA,CAAK,OAAA,CACnBA,CAAAA,CAAM,SAAA,EAAasC,CAAAA,GACrB8N,CAAAA,EAASpQ,CAAAA,CAAM,IAAA,CAAA,CAInB,OAAOoQ,CACT,CAGQ,KAAA,CAAM9N,CAAAA,CAAsB,CAClC,IAAI+N,CAAAA,CAAa,CAAA,CACjB,KAAOA,CAAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAU,IAAA,CAAK,OAAA,CAAQA,CAAU,CAAA,CAAG,SAAA,CAAY/N,CAAAA,EAC/E+N,CAAAA,EAAAA,CAEEA,CAAAA,CAAa,CAAA,EACf,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAGA,CAAU,EAErC,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,OAAA,CAAU,GACjB,CACF,CAAA,CAMMC,EAAAA,CAAoC,CACxC,IAAA,CAAM,IAAA,CAAU,GAAA,CAChB,GAAA,CAAK,IAAA,CAAU,EAAA,CAAK,GACtB,EAEA,SAASC,EAAAA,CAAoBjlB,CAAAA,CAAeklB,CAAAA,CAA+B,CACzE,OAAO,IAAA,CAAK,IAAA,CAAKllB,CAAAA,CAAM,MAAA,CAASklB,CAAa,CAC/C,CAEA,SAASC,EAAAA,CAAcC,CAAAA,CAAmBC,CAAAA,CAA+B,CACvE,OACGD,CAAAA,CAAM,WAAA,CAAc,GAAA,CAAaC,CAAAA,CAAQ,eAAA,CACzCD,CAAAA,CAAM,YAAA,CAAe,GAAA,CAAaC,CAAAA,CAAQ,gBAE/C,CAEA,SAASC,EAAAA,CAAiBC,CAAAA,CAAqBF,CAAAA,CAAuBG,CAAAA,CAAmB,CAAA,CAAa,CACpG,IAAMC,CAAAA,CAAwB,IAAA,CAAK,KAAKF,CAAAA,CAAcC,CAAgB,CAAA,CAEtE,OACGD,CAAAA,CAAc,GAAA,CAAaF,CAAAA,CAAQ,eAAA,CACnCI,CAAAA,CAAwB,GAAA,CAAaJ,CAAAA,CAAQ,gBAElD,CAqBO,SAASK,EAAAA,CAAW7c,CAAAA,CAAqBrH,CAAAA,CAAoC,CAClF,GAAM,CACJ,cAAA,CAAAmkB,CAAAA,CACA,OAAA,CAAAC,CAAAA,CAAU,EAAC,CACX,OAAA,CAAAP,CAAAA,CACA,aAAA,CAAAH,CAAAA,CAAgB,CAAA,CAChB,yBAAA,CAAAW,CAAAA,CAA4B,CAAA,CAC5B,gBAAA,CAAAC,CACF,CAAA,CAAItkB,CAAAA,CAGJ,GAAI,CAAC,MAAA,CAAO,QAAA,CAAS0jB,CAAa,CAAA,EAAKA,CAAAA,EAAiB,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,yEAAyE,CAAA,CAE3F,GAAIS,CAAAA,EAAkB,IAAA,GAAS,CAAC,MAAA,CAAO,QAAA,CAASA,CAAc,CAAA,EAAKA,CAAAA,CAAiB,CAAA,CAAA,CAClF,MAAM,IAAI,KAAA,CAAM,8EAA8E,CAAA,CAEhG,GAAI,CAAC,MAAA,CAAO,QAAA,CAASE,CAAyB,CAAA,EAAKA,CAAAA,CAA4B,CAAA,CAC7E,MAAM,IAAI,KAAA,CAAM,yFAAyF,CAAA,CAEvGF,CAAAA,EAAkB,IAAA,EAAQ,CAACN,CAAAA,EAC7B,OAAA,CAAQ,IAAA,CAAK,oIAAoI,CAAA,CAEnJ,IAAA,IAAWU,CAAAA,IAAUH,CAAAA,CACnB,GAAI,CAAC,MAAA,CAAO,QAAA,CAASG,CAAAA,CAAO,OAAO,CAAA,EAAKA,CAAAA,CAAO,OAAA,CAAU,CAAA,CACvD,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCA,CAAAA,CAAO,MAAM,CAAA,+CAAA,CAAiD,CAAA,CAKrH,IAAMC,CAAAA,CAAgB,IAAI,GAAA,CAC1B,IAAA,IAAWD,CAAAA,IAAUH,CAAAA,CACnBI,CAAAA,CAAc,GAAA,CAAID,CAAAA,CAAO,MAAA,CAAQ,IAAIlB,EAAY,CAAA,CAGnD,IAAMoB,CAAAA,CAAa,IAAIpB,EAAAA,CAEjBqB,CAAAA,CAA4B,MAChCnmB,CAAAA,CACAC,EACAlG,CAAAA,GAC0B,CAC1B,IAAMyrB,CAAAA,CAAcN,EAAAA,CAAoBjlB,CAAAA,CAAOklB,CAAa,CAAA,CAG5D,GAAIS,CAAAA,EAAkB,IAAA,EAAQN,CAAAA,CAAS,CACrC,IAAMc,CAAAA,CAAYb,EAAAA,CAAiBC,CAAAA,CAAaF,CAAAA,CAASQ,CAAyB,CAAA,CAClF,GAAIM,CAAAA,CAAYR,CAAAA,CAAgB,CAC9B,IAAMpc,CAAAA,CAAiC,CACrC,SAAA,CAAA4c,CAAAA,CACA,SAAA,CAAWR,CAAAA,CACX,MAAA,CAAQ,UACV,CAAA,CACA,GAAI,CAAEG,CAAAA,GAAmBvc,CAAO,EAAG,CAAA,KAAQ,CAAoD,CAC/F,MAAM,IAAIqb,EAAAA,CAAoBrb,CAAO,CACvC,CACF,CAGA,IAAA,IAAWwc,CAAAA,IAAUH,CAAAA,CAAS,CAC5B,IAAM5pB,CAAAA,CAAWgpB,EAAAA,CAAUe,CAAAA,CAAO,MAAM,CAAA,CAElCK,CAAAA,CADSJ,CAAAA,CAAc,GAAA,CAAID,CAAAA,CAAO,MAAM,EACzB,eAAA,CAAgB/pB,CAAQ,CAAA,CACvCqqB,CAAAA,CAAYN,CAAAA,CAAO,OAAA,CAAUK,CAAAA,CAC7BD,CAAAA,CAAYb,EAAAA,CAAiBC,CAAAA,CAAaQ,CAAAA,CAAO,OAAA,CAASF,CAAyB,CAAA,CAEzF,GAAIM,CAAAA,CAAYE,CAAAA,CAAW,CACzB,IAAM9c,CAAAA,CAAiC,CACrC,SAAA,CAAA4c,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGE,CAAS,CAAA,CAChC,MAAA,CAAQN,CAAAA,CAAO,MACjB,CAAA,CACA,GAAI,CAAED,CAAAA,GAAmBvc,CAAO,EAAG,CAAA,KAAQ,CAAoD,CAC/F,MAAM,IAAIqb,EAAAA,CAAoBrb,CAAO,CACvC,CACF,CAGA,IAAM7L,CAAAA,CAAS,MAAMmL,CAAAA,CAAU9I,CAAAA,CAAOC,CAAAA,CAAOlG,CAAO,CAAA,CAGpD,GAAI4D,CAAAA,CAAO,UAAA,CAAY,CACrB,IAAA,IAAWqoB,CAAAA,IAAUH,CAAAA,CAAS,CAC5B,IAAMU,CAAAA,CAASN,CAAAA,CAAc,GAAA,CAAID,CAAAA,CAAO,MAAM,CAAA,CACxCQ,CAAAA,CAAapB,EAAAA,CAAcznB,CAAAA,CAAO,UAAA,CAAYqoB,CAAAA,CAAO,OAAO,CAAA,CAClEO,CAAAA,CAAO,MAAA,CAAOC,CAAU,EAC1B,CAEA,GAAIlB,CAAAA,EAAWO,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,CACnC,IAAMW,CAAAA,CAAapB,EAAAA,CAAcznB,CAAAA,CAAO,UAAA,CAAY2nB,CAAO,CAAA,CAC3DY,CAAAA,CAAW,MAAA,CAAOM,CAAU,EAC9B,CACF,CAEA,OAAO7oB,CACT,CAAA,CAYA,SAAS8oB,CAAAA,CAASC,CAAAA,CAAgC,CAChD,IAAMH,CAAAA,CAASN,CAAAA,CAAc,GAAA,CAAIS,CAAM,CAAA,CACvC,GAAI,CAACH,CAAAA,CACH,OAAO,CAAA,CAET,IAAMtqB,CAAAA,CAAWgpB,EAAAA,CAAUyB,CAAM,CAAA,CAEjC,OAAOH,CAAAA,CAAO,eAAA,CAAgBtqB,CAAQ,CACxC,CAGA,OAACkqB,CAAAA,CAAoD,QAAA,CAAWM,CAAAA,CAEzDN,CACT,CC9QO,SAASQ,EAAAA,CAAc3oB,CAAAA,CAAmB4oB,CAAAA,CAA0B,CACzE,OAAO,CACL,KAAA,CAAO,CAACC,CAAAA,CAAQ5mB,CAAAA,GAAUA,CAAAA,CAAM,MAAA,EAAUjC,CAAAA,CAC1C,KAAA,CAAA4oB,CACF,CACF,CAUO,SAASE,EAAAA,CAAYrf,CAAAA,CAAcmf,CAAAA,CAA0B,CAClE,OAAO,CACL,KAAA,CAAQ5mB,CAAAA,EAAUA,CAAAA,CAAM,IAAA,GAASyH,CAAAA,CACjC,KAAA,CAAAmf,CACF,CACF,CAUO,SAASG,EAAAA,CAAUzrB,CAAAA,CAAiBsrB,CAAAA,CAA0B,CACnE,OAAO,CACL,KAAA,CAAO,CAACC,CAAAA,CAAQ5mB,CAAAA,IAEd3E,CAAAA,CAAQ,SAAA,CAAY,CAAA,CAEbA,CAAAA,CAAQ,IAAA,CAAK2E,CAAK,CAAA,CAAA,CAE3B,KAAA,CAAA2mB,CACF,CACF,CAkCO,SAASI,GACdle,CAAAA,CACAme,CAAAA,CACa,CACb,IAAMxlB,CAAAA,CAAS,KAAA,CAAM,OAAA,CAAQwlB,CAAa,CAAA,CACtC,CAAE,KAAA,CAAOA,CAAc,CAAA,CACvBA,CAAAA,CACE,CAAE,KAAA,CAAAC,CAAAA,CAAO,eAAA,CAAAC,CAAgB,CAAA,CAAI1lB,CAAAA,CAEnC,OAAO,MACLzB,CAAAA,CACAC,CAAAA,CACAlG,CAAAA,GAC0B,CAC1B,IAAIqtB,CAAAA,CAAgBpnB,CAAAA,CAAM,KAAA,CAE1B,IAAA,IAAWqnB,CAAAA,IAAQH,CAAAA,CACjB,GAAI,CACF,GAAIG,CAAAA,CAAK,KAAA,CAAMrnB,CAAAA,CAAOC,CAAK,CAAA,CAAG,CAC5BmnB,CAAAA,CAAgBC,CAAAA,CAAK,KAAA,CACrB,KACF,CACF,CAAA,KAAQ,CAER,CAGF,GAAI,CAAEF,CAAAA,GAAkBnnB,CAAAA,CAAM,KAAA,CAAOonB,CAAa,EAAG,CAAA,KAAQ,CAA6D,CAG1H,IAAME,CAAAA,CAAiBF,CAAAA,GAAkBpnB,EAAM,KAAA,CAC3C,CAAE,GAAGA,CAAAA,CAAO,KAAA,CAAOonB,CAAc,CAAA,CACjCpnB,CAAAA,CAEJ,OAAO8I,CAAAA,CAAUwe,CAAAA,CAAgBrnB,CAAAA,CAAOlG,CAAO,CACjD,CACF,CC3FO,SAASwtB,EAAAA,CAAsBppB,CAAAA,CAAyB,CAC7D,GAAIA,CAAAA,CAAO,MAAA,CAAS,OAAA,CAClB,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqDA,CAAAA,CAAO,MAAM,CAAA,qBAAA,CAAqC,CAAA,CAGzH,IAAMqpB,CAAAA,CAAUrpB,CAAAA,CAAO,IAAA,EAAK,CAG5B,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMqpB,CAAO,CAC3B,CAAA,KAAQ,CAER,CAGA,IAAMC,CAAAA,CAAcD,CAAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,CACjCE,CAAAA,CAAaF,CAAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,CAElC7W,CAAAA,CACAgX,CAAAA,CACAC,CAAAA,CAEJ,GAAIH,CAAAA,GAAgB,EAAA,EAAMC,IAAe,EAAA,CACvC,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAGnED,CAAAA,GAAgB,EAAA,EAClB9W,CAAAA,CAAQ+W,CAAAA,CACRC,CAAAA,CAAW,GAAA,CACXC,CAAAA,CAAY,GAAA,EACHF,CAAAA,GAAe,EAAA,EACxB/W,CAAAA,CAAQ8W,CAAAA,CACRE,CAAAA,CAAW,GAAA,CACXC,CAAAA,CAAY,GAAA,GAEZjX,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI8W,CAAAA,CAAaC,CAAU,CAAA,CACxCC,CAAAA,CAAWhX,CAAAA,GAAU8W,CAAAA,CAAc,GAAA,CAAM,GAAA,CACzCG,CAAAA,CAAYjX,CAAAA,GAAU8W,CAAAA,CAAc,GAAA,CAAM,GAAA,CAAA,CAI5C,IAAII,CAAAA,CAAQ,CAAA,CACRC,CAAAA,CAAW,KAAA,CACXhpB,CAAAA,CAAU,KAAA,CAEd,IAAA,IAASuD,CAAAA,CAAIsO,CAAAA,CAAOtO,CAAAA,CAAImlB,CAAAA,CAAQ,MAAA,CAAQnlB,CAAAA,EAAAA,CAAK,CAC3C,IAAMkP,CAAAA,CAAOiW,CAAAA,CAAQnlB,CAAC,CAAA,CAEtB,GAAIvD,CAAAA,CAAS,CACXA,CAAAA,CAAU,KAAA,CACV,QACF,CAEA,GAAIyS,CAAAA,GAAS,IAAA,CAAM,CACjBzS,CAAAA,CAAU,IAAA,CACV,QACF,CAEA,GAAIyS,CAAAA,GAAS,GAAA,CAAK,CAChBuW,CAAAA,CAAW,CAACA,CAAAA,CACZ,QACF,CAEA,GAAI,CAAAA,CAAAA,CAAAA,CAIJ,GAAIvW,CAAAA,GAASoW,CAAAA,CACXE,CAAAA,EAAAA,CAAAA,KAAAA,GACStW,CAAAA,GAASqW,CAAAA,GAClBC,CAAAA,EAAAA,CACIA,CAAAA,GAAU,CAAA,CAAA,CAAG,CACf,IAAME,CAAAA,CAAUP,CAAAA,CAAQ,KAAA,CAAM7W,CAAAA,CAAOtO,CAAAA,CAAI,CAAC,CAAA,CAE1C,OAAO,IAAA,CAAK,KAAA,CAAM0lB,CAAO,CAC3B,CAAA,CAEJ,CAEA,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAC7D,CAGA,SAASC,EAAAA,CAAsB/tB,CAAAA,CAAkD,CAC/E,OAAKA,CAAAA,CAIDA,CAAAA,CAAM,MAAA,EAAUA,CAAAA,CAAM,MAAA,CAAO,MAAA,CAAS,CAAA,CACjCA,CAAAA,CAAM,OAAO,GAAA,CAAKguB,CAAAA,EAAUA,CAAAA,CAAM,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAGtDhuB,CAAAA,CAAM,OAAA,EAAW,mBAAA,CAPf,mBAQX,CA2BO,SAASiuB,EAAAA,CACdpf,CAAAA,CACArH,CAAAA,CACa,CACb,GAAM,CACJ,MAAA,CAAA0mB,CAAAA,CACA,UAAA,CAAAjE,CAAAA,CAAa,CAAA,CACb,WAAA,CAAAkE,CAAAA,CAAcb,EAAAA,CACd,iBAAA,CAAAc,CACF,CAAA,CAAI5mB,CAAAA,CAGJ,GAAI,CAAC,MAAA,CAAO,QAAA,CAASyiB,CAAU,CAAA,EAAKA,CAAAA,CAAa,CAAA,CAC/C,MAAM,IAAI,KAAA,CAAM,oFAAoF,CAAA,CAGtG,IAAMoE,CAAAA,CAAeD,CAAAA,EAAqBF,CAAAA,CAAO,WAAA,EAAe,2BAAA,CAIhE,OAAO,MACLnoB,CAAAA,CACAC,CAAAA,CACAlG,CAAAA,GAC2B,CAE3B,IAAMwuB,CAAAA,CAA6B,CACjC,GAAGvoB,CAAAA,CACH,YAAA,CAAA,CAAeA,CAAAA,CAAM,cAAgB,EAAA,EACnC;;AAAA,4CAAA,CAAA,CAAqDsoB,EAAe,2EAExE,CAAA,CAEIvd,EACAiY,CAAAA,CAEJ,IAAA,IAASQ,EAAU,CAAA,CAAGA,CAAAA,EAAWU,CAAAA,CAAYV,CAAAA,EAAAA,CAAW,CAEtD,IAAMgF,CAAAA,CAAiBhF,IAAY,CAAA,CAC/BvjB,CAAAA,CACA,GAAGA,CAAK;;AAAA,kDAAA,EAAyD+iB,CAAS;AAAA,sCAAA,CAAA,CAExErlB,CAAAA,CAAS,MAAMmL,CAAAA,CAAOyf,CAAAA,CAAiBC,CAAAA,CAAgBzuB,CAAO,CAAA,CACpEgR,CAAAA,CAAapN,CAAAA,CAGb,IAAM8qB,CAAAA,CAAY,OAAO9qB,EAAO,MAAA,EAAW,QAAA,CACvCA,CAAAA,CAAO,MAAA,CACP,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAO,MAAM,CAAA,CAEhC,GAAI,CACF,IAAM+qB,CAAAA,CAAYN,CAAAA,CAAYK,CAAS,CAAA,CACjChoB,CAAAA,CAAS0nB,CAAAA,CAAO,SAAA,CAAUO,CAAS,CAAA,CAEzC,GAAIjoB,CAAAA,CAAO,OAAA,CACT,OAAO,CACL,GAAG9C,CAAAA,CACH,OAAQ8C,CAAAA,CAAO,IACjB,CAAA,CAGFuiB,CAAAA,CAAYgF,EAAAA,CAAsBvnB,CAAAA,CAAO,KAAK,EAChD,CAAA,MAASjB,CAAAA,CAAK,CACZwjB,CAAAA,CAAYxjB,CAAAA,YAAe,KAAA,CAAQA,EAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,EAC7D,CACF,CAGA,MAAM,IAAImpB,EAAAA,CACR,CAAA,wDAAA,EAA2DzE,CAAAA,CAAa,CAAC,CAAA,WAAA,EAAclB,CAAS,CAAA,CAAA,CAChGjY,CACF,CACF,CACF,CAGO,IAAM4d,EAAAA,CAAN,cAAoC,KAAM,CACtC,UAAA,CAET,WAAA,CAAYltB,CAAAA,CAAiBsP,CAAAA,CAAiC,CAC5D,KAAA,CAAMtP,CAAO,CAAA,CACb,IAAA,CAAK,IAAA,CAAO,uBAAA,CACZ,IAAA,CAAK,UAAA,CAAasP,EACpB,CACF,EC7BA,SAAS6d,EAAAA,CAAiBrV,CAAAA,CAA8B,CACvD,GAAIA,CAAAA,EAAK,IAAA,EAAQ,OAAOA,CAAAA,EAAM,QAAA,CAAU,OAAO,MAAA,CAC/C,IAAM2B,CAAAA,CAAM3B,CAAAA,CACZ,OAAO,OAAO2B,CAAAA,CAAI,UAAa,UAAA,EAAc,OAAOA,CAAAA,CAAI,UAAA,EAAe,UAAA,EAAc,OAAOA,EAAI,KAAA,EAAU,UAC3G,CAEA,SAAS2T,EAAAA,CACRC,CAAAA,CACqB,CACrB,OAAKA,CAAAA,CACDF,EAAAA,CAAiBE,CAAG,CAAA,CAAUA,CAAAA,CAC3BlmB,EAAAA,CAAkB,CACxB,QAAA,CAAUtB,EAAAA,EAA4B,CACtC,cAAA,CAAgB,CACf,WAAA,CAAawnB,EAAI,WAAA,EAAe,EAAA,CAChC,mBAAA,CAAqBA,CAAAA,CAAI,mBAAA,EAAuB,CACjD,CAAA,CACA,UAAA,CAAY,IACb,CAAC,CAAA,CATgB,IAUlB,CAEA,SAASC,GAAyBxV,CAAAA,CAAiC,CAClE,GAAIA,CAAAA,EAAK,IAAA,EAAQ,OAAOA,CAAAA,EAAM,QAAA,CAAU,OAAO,MAAA,CAC/C,IAAM2B,CAAAA,CAAM3B,CAAAA,CACZ,OAAO,OAAO2B,CAAAA,CAAI,OAAA,EAAY,UAAA,EAAc,OAAOA,CAAAA,CAAI,QAAA,EAAa,YAAc,OAAOA,CAAAA,CAAI,KAAA,EAAU,UACxG,CAEA,SAAS8T,GACRF,CAAAA,CACwB,CACxB,GAAI,CAACA,CAAAA,CAAK,OAAO,IAAA,CACjB,GAAIC,EAAAA,CAAyBD,CAAG,CAAA,CAAG,OAAOA,CAAAA,CAC1C,IAAMG,EAAUH,CAAAA,CAChB,GAAIG,CAAAA,CAAQ,gBAAA,EAAoB,IAAA,EAAQA,CAAAA,CAAQ,gBAAA,CAAmB,CAAA,CAClE,MAAM,IAAI,KAAA,CAAM,kEAAkE,CAAA,CAEnF,GAAIA,EAAQ,cAAA,EAAkB,IAAA,EAAQA,CAAAA,CAAQ,cAAA,CAAiB,CAAA,CAC9D,MAAM,IAAI,KAAA,CAAM,kEAAkE,CAAA,CAEnF,OAAOC,4BAAAA,CAASD,CAAO,CACxB,CAEA,SAASE,EAAAA,CAAc5V,CAAAA,CAAwC,CAC9D,GAAIA,CAAAA,EAAK,MAAQ,OAAOA,CAAAA,EAAM,QAAA,CAAU,OAAO,MAAA,CAC/C,IAAM2B,EAAM3B,CAAAA,CACZ,OAAO,OAAO2B,CAAAA,CAAI,SAAA,EAAc,UAAA,EAAc,OAAOA,CAAAA,CAAI,OAAA,EAAY,UAAA,EAAc,OAAOA,CAAAA,CAAI,YAAA,EAAiB,UAChH,CAEA,SAASkU,EAAAA,CACRN,CAAAA,CAC+B,CAC/B,OAAKA,CAAAA,CACDK,GAAcL,CAAG,CAAA,CAAUA,CAAAA,CACxBO,2BAAAA,CAAU,CAChB,WAAA,CAAaP,EAAI,WAAA,CACjB,OAAA,CAAS,CAAE,OAAA,CAAS,IAAK,CAAA,CACzB,OAAA,CAAS,CAAE,OAAA,CAAS,IAAA,CAAM,UAAA,CAAY,CAAI,CAAA,CAC1C,MAAA,CAAQA,EAAI,MACb,CAAC,CAAA,CAPgB,IAQlB,CAEA,SAASQ,GAAgB/V,CAAAA,CAAgC,CACxD,GAAIA,CAAAA,EAAK,IAAA,EAAQ,OAAOA,GAAM,QAAA,CAAU,OAAO,MAAA,CAC/C,IAAM2B,CAAAA,CAAM3B,CAAAA,CACZ,OAAO,OAAO2B,CAAAA,CAAI,MAAA,EAAW,UAAA,EAAc,OAAOA,CAAAA,CAAI,KAAA,EAAU,YAAc,OAAOA,CAAAA,CAAI,QAAA,EAAa,UACvG,CAEA,SAASqU,EAAAA,CACRT,CAAAA,CACuB,CACvB,GAAI,CAACA,CAAAA,CAAK,OAAO,IAAA,CACjB,GAAIQ,EAAAA,CAAgBR,CAAG,CAAA,CAAG,OAAOA,CAAAA,CACjC,GAAIA,CAAAA,CAAI,SAAA,EAAa,IAAA,GAASA,CAAAA,CAAI,SAAA,CAAY,CAAA,EAAKA,CAAAA,CAAI,SAAA,CAAY,GAClE,MAAM,IAAI,KAAA,CAAM,uDAAuD,CAAA,CAExE,GAAIA,EAAI,OAAA,EAAW,IAAA,EAAQA,CAAAA,CAAI,OAAA,CAAU,CAAA,CACxC,MAAM,IAAI,KAAA,CAAM,gDAAgD,CAAA,CAEjE,OAAKA,CAAAA,CAAI,QAAA,EACR,OAAA,CAAQ,IAAA,CAAK,uIAAkI,CAAA,CAEzIvL,EAAAA,CAAoB,CAC1B,QAAA,CAAUuL,CAAAA,CAAI,UAAYjK,EAAAA,EAAmB,CAC7C,mBAAA,CAAqBiK,CAAAA,CAAI,SAAA,EAAa,GAAA,CACtC,YAAA,CAAcA,CAAAA,CAAI,OAAA,EAAW,GAAA,CAC7B,KAAA,CAAOA,CAAAA,CAAI,KAAA,EAAS,GACrB,CAAC,CACF,CAEA,SAASU,EAAAA,CAAcjW,CAAAA,CAA6B,CACnD,GAAIA,CAAAA,EAAK,IAAA,EAAQ,OAAOA,CAAAA,EAAM,QAAA,CAAU,OAAO,MAAA,CAC/C,IAAM2B,CAAAA,CAAM3B,CAAAA,CACZ,OAAO,OAAO2B,CAAAA,CAAI,OAAA,EAAY,YAAc,OAAOA,CAAAA,CAAI,UAAA,EAAe,UAAA,EAAc,OAAOA,CAAAA,CAAI,OAAU,UAC1G,CAEA,SAASuU,EAAAA,CAAUX,CAAAA,CAAiD,CACnE,OAAKA,CAAAA,CACDU,EAAAA,CAAcV,CAAG,CAAA,CAAUA,CAAAA,CACxB3b,EAAAA,CAAU,CAAE,WAAY2b,CAAAA,CAAI,UAAA,EAAc,GAAI,CAAC,CAAA,CAFrC,IAGlB,CAMA,IAAMY,EAAAA,CAAN,KAA4D,CAC3D,MAAA,CACA,KAAA,CAEQ,QAAA,CAER,YACCC,CAAAA,CACAhsB,CAAAA,CACAisB,CAAAA,CACC,CACD,IAAA,CAAK,QAAA,CAAWD,CAAAA,CAChB,IAAA,CAAK,MAAA,CAAShsB,CAAAA,CACd,IAAA,CAAK,KAAA,CAAQisB,EACd,CAEA,CAAC,MAAA,CAAO,aAAa,CAAA,EAA2B,CAC/C,OAAO,IAAA,CAAK,SAAS,MAAA,CAAO,aAAa,CAAA,EAC1C,CACD,CAAA,CAaO,SAASC,EAAAA,CAAiBpoB,CAAAA,CAAsC,CACtE,GAAM,CACL,SAAA,CAAWqoB,CAAAA,CACX,MAAA,CAAQC,CAAAA,CACR,QAAA,CAAA/uB,CAAAA,CACA,UAAA,CAAA2M,CAAAA,CAAa,GACb,cAAA,CAAAqiB,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,KACT,CAAA,CAAIxoB,EACEyoB,CAAAA,CAAqBzoB,CAAAA,CAAO,oBAAA,EAAwBA,CAAAA,CAAO,kBAAA,EAAsB,CAAA,CAGnFA,EAAO,KAAA,EAASA,CAAAA,CAAO,gBAAA,EAC1B,OAAA,CAAQ,IAAA,CACP,kPAED,CAAA,CAMD,IAAIqH,CAAAA,CAAsBrH,CAAAA,CAAO,MAAA,CAG7BA,CAAAA,CAAO,cAAA,EAAkBA,CAAAA,CAAO,eAAe,MAAA,CAAS,CAAA,GAC3DqH,CAAAA,CAASke,EAAAA,CAAmBle,CAAAA,CAAQrH,CAAAA,CAAO,cAAc,CAAA,CAAA,CAItDA,CAAAA,CAAO,QAAA,GACVqH,CAAAA,CAAS2b,EAAAA,CAAa,CAAC3b,EAAQ,GAAGrH,CAAAA,CAAO,QAAA,CAAS,OAAO,CAAA,CAAGA,CAAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CAAA,CAI/EA,CAAAA,CAAO,gBAAA,GACVqH,CAAAA,CAASmb,EAAAA,CAAUnb,CAAAA,CAAQrH,EAAO,gBAAgB,CAAA,CAAA,CAI/CA,CAAAA,CAAO,MAAA,GACVqH,CAAAA,CAAS6c,EAAAA,CAAW7c,CAAAA,CAAQrH,CAAAA,CAAO,MAAM,CAAA,CAAA,CAItCA,CAAAA,CAAO,gBAAA,GACVqH,CAAAA,CAASof,EAAAA,CAAqBpf,EAAQrH,CAAAA,CAAO,gBAAgB,CAAA,CAAA,CAI9D,IAAM0oB,CAAAA,CAAStB,EAAAA,CAAapnB,CAAAA,CAAO,MAAM,CAAA,CACnC2oB,CAAAA,CAAiBpB,EAAAA,CAAqBvnB,CAAAA,CAAO,cAAc,CAAA,CAC3D4oB,EAAcjB,EAAAA,CAAoB3nB,CAAAA,CAAO,aAAa,CAAA,CACtD6oB,CAAAA,CAAgBf,EAAAA,CAAY9nB,EAAO,KAAK,CAAA,CACxC8oB,CAAAA,CAAcd,EAAAA,CAAUhoB,CAAAA,CAAO,UAAA,EAAcA,EAAO,GAAG,CAAA,CAGvD+oB,CAAAA,CAAUH,CAAAA,CAAcI,0BAAAA,CAAmBJ,CAAW,CAAA,CAAI,IAAA,CAG5DK,CAAAA,CAAgE,IAAA,CAChEC,CAAAA,CAAuC,IAAA,CACvCC,CAAAA,CAAoB,CAAA,CACxB,GAAInpB,CAAAA,CAAO,SAAA,CAAW,CACrB,GAAM,CAAE,YAAA,CAAAopB,CAAa,CAAA,CAAIppB,CAAAA,CAAO,SAAA,CAChC,GAAIopB,CAAAA,CAAe,CAAA,EAAK,CAAC,OAAO,QAAA,CAASA,CAAY,CAAA,CACpD,MAAM,IAAI,KAAA,CAAM,uEAAuE,CAAA,CAExFF,CAAAA,CAAsB,EAAC,CACvB,IAAMG,CAAAA,CAAaH,CAAAA,CACnBD,EAAqB,CACpB,IAAA,CAAM,YAAA,CACN,EAAA,CAAI,IAAM,CACT,IAAM/tB,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CACfouB,CAAAA,CAAcpuB,CAAAA,CAAM,IAE1B,KAAOiuB,CAAAA,CAAoBE,CAAAA,CAAW,MAAA,EAAUA,CAAAA,CAAWF,CAAiB,CAAA,CAAKG,CAAAA,EAChFH,CAAAA,EAAAA,CAQD,OALIA,CAAAA,CAAoBE,CAAAA,CAAW,MAAA,CAAS,CAAA,EAAKF,EAAoB,GAAA,GACpEE,CAAAA,CAAW,MAAA,CAAO,CAAA,CAAGF,CAAiB,CAAA,CACtCA,CAAAA,CAAoB,CAAA,CAAA,CAENE,CAAAA,CAAW,MAAA,CAASF,CAAAA,EACrBC,CAAAA,CACN,CAAE,MAAA,CAAQ,MAAO,MAAA,CAAQ,CAAA,qBAAA,EAAwBA,CAAY,CAAA,KAAA,CAAQ,CAAA,EAE7EC,CAAAA,CAAW,IAAA,CAAKnuB,CAAG,CAAA,CACZ,CAAE,MAAA,CAAQ,IAAK,CAAA,CACvB,CACD,EACD,CAGA,IAAMquB,CAAAA,CAA+F,CACpG,GAAIN,CAAAA,CAAqB,CAACA,CAAkB,CAAA,CAAI,EAAC,CACjD,GAAI/iB,CAAAA,CAAW,OAAS,EACzB,CAAA,CAGM4D,CAAAA,CAAe0f,EAAAA,CAAwB,CAC5C,MAAA,CAAAniB,CAAAA,CACA,cAAA,CAAAkhB,CAAAA,CACA,MAAA,CAAQG,CAAAA,EAAU,MAAA,CAClB,cAAA,CAAgBC,GAAkB,MAAA,CAClC,UAAA,CAAY,CACX,KAAA,CAAOY,CAAAA,CAAgB,MAAA,CAAS,EAAIA,CAAAA,CAAkB,MAAA,CACtD,MAAA,CAAQrjB,CAAAA,CAAW,MACpB,CAAA,CACA,YAAalG,CAAAA,CAAO,WAAA,CACpB,SAAA,CAAWA,CAAAA,CAAO,SAAA,CAClB,oBAAA,CAAsBA,CAAAA,CAAO,SAAA,EAAW,oBAAA,CACxC,iBAAA,CAAmBA,CAAAA,CAAO,SAAA,EAAW,SAAA,CACrC,iBAAA,CAAmBA,EAAO,SAAA,EAAW,SAAA,CACrC,UAAA,CAAYA,CAAAA,CAAO,KAAA,CACnB,KAAA,CAAOA,EAAO,KAAA,CACd,KAAA,CAAAwoB,CACD,CAAC,CAAA,CAGGiB,CAAAA,CAAuC,KACvCnB,CAAAA,GACHmB,CAAAA,CAAQriB,EAAAA,CAA6B,CACpC,MAAA,CAAAC,CAAAA,CACA,MAAA,CAAQihB,CAAAA,CACR,QAAA,CAAA/uB,CAED,CAAC,CAAA,CAAA,CAIF,IAAImwB,CAAAA,CAA4C,IAAA,CAC5CrB,CAAAA,GACHqB,CAAAA,CAAuBhmB,EAAAA,CAAsB2kB,CAAAA,CAAgB,MAAA,CAAQ,CACpE,mBAAA,CAAqBniB,CAAAA,CAAW,SACjC,CAAC,CAAA,CAAA,CAIF,IAAIyjB,EAAoC,IAAA,CACpCC,CAAAA,CAAsD,IAAA,CAC1D,GAAI5pB,CAAAA,CAAO,IAAA,EAAQ4oB,CAAAA,CAAa,CAC/B,GAAI5oB,CAAAA,CAAO,IAAA,CAAK,UAAA,EAAc,IAAA,GAAS,CAAC,OAAO,QAAA,CAASA,CAAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAKA,CAAAA,CAAO,KAAK,UAAA,CAAa,GAAA,CAAA,CAC3G,MAAM,IAAI,KAAA,CAAM,uDAAuD,EAExE2pB,CAAAA,CAAeE,0BAAAA,CAAmB,CACjC,QAAA,CAAU7pB,CAAAA,CAAO,IAAA,CAAK,QAAA,CACtB,WAAA,CACEA,CAAAA,CAAO,aAAA,EAAiB,CAAC0nB,EAAAA,CAAc1nB,CAAAA,CAAO,aAAa,EACxDA,CAAAA,CAAO,aAAA,CAA0C,WAAA,CAClD,kBAAA,CACJ,OAAA,CAASA,CAAAA,CAAO,IAAA,CAAK,OACtB,CAAC,CAAA,CACD,IAAM8pB,CAAAA,CAAc9pB,CAAAA,CAAO,IAAA,CAAK,QAC1B+pB,CAAAA,CAAa/pB,CAAAA,CAAO,IAAA,CAAK,UAAA,EAAc,IAAA,CAC7C4pB,CAAAA,CAAe,WAAA,CAAY,IAAM,CAChC,GAAI,EAAA,CAAChB,CAAAA,EAAe,CAACe,CAAAA,CAAAA,CACrB,GAAI,CACH,IAAMjwB,CAAAA,CAAOkvB,CAAAA,CAAY,MAAA,EAAO,CAC5BlvB,EAAK,OAAA,CAAQ,MAAA,CAAS,CAAA,EAAGiwB,CAAAA,CAAa,aAAA,CAAcjwB,CAAAA,CAAK,OAAO,CAAA,CAChEA,CAAAA,CAAK,MAAA,CAAO,MAAA,CAAS,CAAA,EAAGiwB,CAAAA,CAAa,YAAA,CAAajwB,CAAAA,CAAK,MAAM,EAClE,CAAA,MAASqE,CAAAA,CAAK,CACb+rB,CAAAA,GAAc/rB,aAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAA,CAAG,SAAS,EAC7E,CACD,CAAA,CAAGgsB,CAAU,EACd,CAGA,IAAI1nB,CAAAA,CAAc,CAAA,CAGlB,SAAS2nB,CAAAA,CAAaliB,CAAAA,CAA4B,CACjD,GAAI,CAACwgB,CAAAA,CACJ,MAAM,IAAI,KAAA,CACV,CAAA;AAAA,6EAAA,CAED,EAEA,IAAM2B,CAAAA,CAAM3B,EAAcxgB,CAAO,CAAA,CACjC,GAAI,CAACmiB,CAAAA,CAAK,CACT,IAAMC,CAAAA,CAAY,OAAO,IAAA,CAAK5B,CAAa,EAAE,IAAA,CAAK,IAAI,EACtD,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuBxgB,CAAO,uCAAuCoiB,CAAS,CAAA,CAAE,CACjG,CACA,OAAOD,EAAI,KACZ,CAMA,eAAeE,CAAAA,CACdriB,CAAAA,CACAtJ,EACAlG,CAAAA,CAA2B,GACH,CACxB,IAAMiG,EAAQyrB,CAAAA,CAAaliB,CAAO,CAAA,CAC5BsiB,CAAAA,CAAY9xB,EAAQ,KAAA,GAAU,KAAA,CAGpC,GAAIuwB,CAAAA,EAAiB,CAACuB,EACrB,GAAI,CACH,IAAMC,CAAAA,CAAS,MAAMxB,EAAc,MAAA,CAAOrqB,CAAAA,CAAOsJ,CAAO,CAAA,CACxD,GAAIuiB,EAAO,GAAA,EAAOA,CAAAA,CAAO,MAAO,CAC/BzB,CAAAA,EAAa,iBAAiB,YAAY,CAAA,CAC1C,GAAI,CAEH,OAAO,CACN,MAAA,CAFc,IAAA,CAAK,MAAMyB,CAAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAG9C,QAAA,CAAU,EAAC,CACX,SAAA,CAAW,EAAC,CACZ,WAAA,CAAa,CAAA,CACb,QAAA,CAAU,EACX,CACD,CAAA,KAAQ,CACH7B,CAAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,4BAAA,EAA+B1gB,CAAO,+DAA0D,EAC1H,CACD,CACA8gB,CAAAA,EAAa,gBAAA,CAAiB,cAAc,EAC7C,CAAA,KAAQ,CAEPA,CAAAA,EAAa,gBAAA,CAAiB,qBAAqB,EACpD,CAID,IAAM0B,CAAAA,CAAO1B,CAAAA,EAAa,UAAU,CAAA,MAAA,EAAS9gB,CAAO,EAAE,CAAA,CAChDpJ,CAAAA,CAAY,KAAK,GAAA,EAAI,CAE3B,GAAI,CAEH,IAAM6rB,EAA2B,EAAC,CAC9BjyB,EAAQ,UAAA,EAAY,MAAA,CAEvBiyB,CAAAA,CAAS,gBAAA,CAAmBjyB,EAAQ,UAAA,CAAW,MAAA,CACrCgwB,IAAgBxgB,CAAO,CAAA,EAAG,YAAY,MAAA,GAEhDyiB,CAAAA,CAAS,iBAAmB,CAC3B,GAAIrkB,EAAW,MAAA,EAAU,GACzB,GAAGoiB,CAAAA,CAAcxgB,CAAO,CAAA,CAAG,UAAA,CAAY,MACxC,CAAA,CAAA,CAEGxP,CAAAA,CAAQ,SACXiyB,CAAAA,CAAS,MAAA,CAASjyB,EAAQ,MAAA,CAAA,CAG3B,IAAM4D,EAAS,MAAM4N,CAAAA,CAAa,IAAOvL,CAAAA,CAAOC,CAAAA,CAAO+rB,CAAQ,CAAA,CACzDC,CAAAA,CAAY,KAAK,GAAA,EAAI,CAAI9rB,EAI/B,GAHA2D,CAAAA,EAAenG,CAAAA,CAAO,WAAA,CAGlB2sB,GAAiB,CAACuB,CAAAA,EAAaluB,EAAO,MAAA,EAAU,IAAA,CACnD,GAAI,CACH,IAAMuuB,EAAa,OAAOvuB,CAAAA,CAAO,QAAW,QAAA,CACzCA,CAAAA,CAAO,OACP,IAAA,CAAK,SAAA,CAAUA,EAAO,MAAM,CAAA,CAC/B,MAAM2sB,CAAAA,CAAc,KAAA,CAAMrqB,EAAOisB,CAAAA,CAAY3iB,CAAO,EACrD,CAAA,KAAQ,CAEP8gB,GAAa,gBAAA,CAAiB,oBAAoB,EACnD,CAID,OAAIE,GACHA,CAAAA,CAAY,OAAA,CAAQ,CACnB,IAAA,CAAM,QAAA,CACN,KAAMhhB,CAAAA,CACN,EAAA,CAAI,GAAA,CACJ,KAAA,CAAO,GAAGA,CAAO,CAAA,UAAA,CAAA,CACjB,QAAS,CAAE,UAAA,CAAY5L,EAAO,WAAY,CAC3C,CAAgD,CAAA,CAI7C6sB,CAAAA,EACHA,EAAQ,QAAA,CAASjhB,CAAAA,CAAS,CACzB,OAAA,CAAS,CAAA,CAAA,CACT,UAAA0iB,CAAAA,CACA,IAAA,CAAM/B,EAAqB,CAAA,CAAIhrB,EAAAA,CAAavB,EAAO,WAAA,CAAausB,CAAkB,EAAI,KAAA,CACvF,CAAC,EAIE6B,CAAAA,EAAM1B,CAAAA,EAAa,QAAQ0B,CAAAA,CAAK,MAAA,CAAQ,IAAI,CAAA,CAEzCpuB,CACR,OAAS6B,CAAAA,CAAK,CACb,IAAMysB,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAI9rB,EAC/B,MAAI4rB,CAAAA,EAAM1B,GAAa,OAAA,CAAQ0B,CAAAA,CAAK,OAAQ,OAAO,CAAA,CAC/CvB,GAASA,CAAAA,CAAQ,QAAA,CAASjhB,EAAS,CAAE,OAAA,CAAS,MAAO,SAAA,CAAA0iB,CAAU,CAAC,CAAA,CAC9DzsB,CACP,CACD,CAMA,eAAe2sB,EACd5iB,CAAAA,CACAtJ,CAAAA,CACAlG,EACwB,CACxB,GAAM,CAAE,QAAA,CAAA0D,CAAAA,CAAU,QAAA2uB,CAAAA,CAAU,CAAA,CAAG,GAAGC,CAAQ,CAAA,CAAItyB,EAC1CipB,CAAAA,CAA0B,IAAA,CAE9B,QAASQ,CAAAA,CAAU,CAAA,CAAGA,GAAW4I,CAAAA,CAAS5I,CAAAA,EAAAA,CAAW,CAEpD,IAAM8I,CAAAA,CAAc9I,EAAU,CAAA,CAAI,CAAE,GAAG6I,CAAAA,CAAS,KAAA,CAAO,KAAe,CAAA,CAAIA,CAAAA,CACpE1uB,EAAS,MAAMiuB,CAAAA,CAAOriB,EAAStJ,CAAAA,CAAOqsB,CAAW,EACjDC,CAAAA,CAAa9uB,CAAAA,CAASE,EAAO,MAAM,CAAA,CAGzC,GAFgB,OAAO4uB,CAAAA,EAAe,UAAYA,CAAAA,CAAaA,CAAAA,CAAW,MAGzE,OAAO5uB,CAAAA,CAGR,IAAM6mB,CAAAA,CAAS,OAAO+H,GAAe,QAAA,EAAYA,CAAAA,CAAW,OACzDA,CAAAA,CAAW,MAAA,CAAO,KAAK,IAAI,CAAA,CAC3B,mBAAA,CACHvJ,CAAAA,CAAY,IAAIlpB,CAAAA,CAAe,CAC9B,QAAS,CAAA,kCAAA,EAAqC0pB,CAAAA,CAAU,CAAC,CAAA,CAAA,EAAI4I,CAAAA,CAAU,CAAC,CAAA,GAAA,EAAM5H,CAAM,GACpF,IAAA,CAAM,yBAAA,CACN,cAAe,eAAA,CACf,aAAA,CAAe,SACf,SAAA,CAAWjb,CAAAA,CACX,MAAAtJ,CAAAA,CACA,IAAA,CAAMtC,EAAO,MACd,CAAC,EAEGssB,CAAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,sDAAA,EAAyDzG,CAAAA,CAAU,CAAC,CAAA,EAAA,CAAA,CAAMgB,CAAM,EAC1G,CAEA,MAAMxB,CACP,CAMA,eAAewJ,EACdnjB,CAAAA,CACApJ,CAAAA,CACAlG,CAAAA,CAA2B,GACd,CACb,GAAI,CAACmxB,CAAAA,CACJ,MAAM,IAAI,KAAA,CAAM,qFAAqF,EAGtG,IAAMW,CAAAA,CAAY9xB,EAAQ,KAAA,GAAU,KAAA,CAGpC,GAAIuwB,CAAAA,EAAiB,CAACuB,EACrB,GAAI,CACH,IAAMC,CAAAA,CAAS,MAAMxB,EAAc,MAAA,CAAOrqB,CAAAA,CAAOoJ,CAAS,CAAA,CAC1D,GAAIyiB,EAAO,GAAA,EAAOA,CAAAA,CAAO,MAAO,CAC/BzB,CAAAA,EAAa,iBAAiB,YAAY,CAAA,CAC1C,GAAI,CACH,OAAO,KAAK,KAAA,CAAMyB,CAAAA,CAAO,KAAA,CAAM,QAAQ,CACxC,CAAA,KAAQ,CACH7B,GAAO,OAAA,CAAQ,KAAA,CAAM,uCAAuC5gB,CAAS,CAAA,6DAAA,CAA0D,EACpI,CACD,CACAghB,GAAa,gBAAA,CAAiB,cAAc,EAC7C,CAAA,KAAQ,CAEPA,GAAa,gBAAA,CAAiB,qBAAqB,EACpD,CAID,IAAA,IAAWoC,KAASzB,CAAAA,CAAiB,CACpC,IAAM9iB,CAAAA,CAAK,OAAOukB,GAAU,UAAA,CAAaA,CAAAA,CAAQA,EAAM,EAAA,CACjDhlB,CAAAA,CAAO,OAAOglB,CAAAA,EAAU,UAAA,CAAa,kBAAoBA,CAAAA,CAAM,IAAA,CAC/DC,EAAc,MAAMxkB,CAAAA,CAAG,CAAE,KAAA,CAAAjI,EAAO,SAAA,CAAWoJ,CAAU,EAAG,CAAE,SAAA,CAAWA,EAAW,KAAA,CAAApJ,CAAAA,CAAO,MAAO,EAA8B,CAAC,CAAA,CACnI,GAAIysB,GAAe,CAACA,CAAAA,CAAY,OAC/B,MAAM,IAAI5yB,EAAe,CACxB,OAAA,CAAS,oBAAoB2N,CAAI,CAAA,UAAA,EAAailB,EAAY,MAAA,EAAU,SAAS,GAC7E,IAAA,CAAM,wBAAA,CACN,cAAejlB,CAAAA,CACf,aAAA,CAAe,QACf,SAAA,CAAW4B,CAAAA,CACX,MAAApJ,CACD,CAAC,CAEH,CAEA,IAAM8rB,CAAAA,CAAO1B,CAAAA,EAAa,UAAU,CAAA,QAAA,EAAWhhB,CAAS,EAAE,CAAA,CACpDlJ,CAAAA,CAAY,KAAK,GAAA,EAAI,CAGrBwsB,EAAezB,CAAAA,CAAM,iBAAA,GACvB0B,CAAAA,CAAe,CAAA,CACnB,QAAWjpB,CAAAA,IAAK,MAAA,CAAO,OAAOgpB,CAAY,CAAA,CAAGC,GAAgBjpB,CAAAA,CAAE,WAAA,CAE/D,GAAI,CACH,IAAMhG,EAAS,MAAMutB,CAAAA,CAAM,WAAc7hB,CAAAA,CAAWpJ,CAAK,EACnDgsB,CAAAA,CAAY,IAAA,CAAK,KAAI,CAAI9rB,CAAAA,CAGzB0sB,EAAc3B,CAAAA,CAAM,iBAAA,GACtB4B,CAAAA,CAAc,CAAA,CAClB,IAAA,IAAWnpB,CAAAA,IAAK,OAAO,MAAA,CAAOkpB,CAAW,EAAGC,CAAAA,EAAenpB,CAAAA,CAAE,YAC7D,IAAMopB,CAAAA,CAAgBD,EAAcF,CAAAA,CAIpC,GAHA9oB,GAAeipB,CAAAA,CAGXzC,CAAAA,EAAiB,CAACuB,CAAAA,EAAaluB,CAAAA,EAAU,KAC5C,GAAI,CACH,IAAMuuB,CAAAA,CAAa,OAAOvuB,GAAW,QAAA,CAAWA,CAAAA,CAAS,KAAK,SAAA,CAAUA,CAAM,EAC9E,MAAM2sB,CAAAA,CAAc,MAAMrqB,CAAAA,CAAOisB,CAAAA,CAAY7iB,CAAS,EACvD,CAAA,KAAQ,CAEPghB,CAAAA,EAAa,gBAAA,CAAiB,oBAAoB,EACnD,CAID,OAAIE,CAAAA,EACHA,EAAY,OAAA,CAAQ,CACnB,KAAM,QAAA,CACN,IAAA,CAAMlhB,EACN,EAAA,CAAI,GAAA,CACJ,MAAO,CAAA,EAAGA,CAAS,aACnB,OAAA,CAAS,CAAE,cAAA0jB,CAAc,CAC1B,CAAgD,CAAA,CAI7CvC,CAAAA,EACHA,EAAQ,QAAA,CAASnhB,CAAAA,CAAW,CAC3B,OAAA,CAAS,CAAA,CAAA,CACT,UAAA4iB,CAAAA,CACA,IAAA,CAAM/B,EAAqB,CAAA,CAAIhrB,EAAAA,CAAa6tB,EAAe7C,CAAkB,CAAA,CAAI,MAClF,CAAC,CAAA,CAGE6B,GAAM1B,CAAAA,EAAa,OAAA,CAAQ0B,EAAK,MAAA,CAAQ,IAAI,EACzCpuB,CACR,CAAA,MAAS6B,EAAK,CACb,IAAMysB,EAAY,IAAA,CAAK,GAAA,GAAQ9rB,CAAAA,CAC/B,MAAI4rB,GAAM1B,CAAAA,EAAa,OAAA,CAAQ0B,EAAK,MAAA,CAAQ,OAAO,EAC/CvB,CAAAA,EAASA,CAAAA,CAAQ,SAASnhB,CAAAA,CAAW,CAAE,QAAS,KAAA,CAAO,SAAA,CAAA4iB,CAAU,CAAC,CAAA,CAChEzsB,CACP,CACD,CAMA,SAASwI,CAAAA,CACRuB,CAAAA,CACAtJ,EACAlG,CAAAA,CAA8B,GACb,CACjB,GAAI,CAACoxB,CAAAA,CACJ,MAAM,IAAI,KAAA,CACV,CAAA;AAAA,wEAAA,CAED,CAAA,CAIA,GAAIf,CAAAA,EAAgB,QAAA,EAAS,GAAM,MAAA,CAElC,MAAM,IAAI,KAAA,CAAM,gEAAgE,CAAA,CAGjF,IAAMpqB,CAAAA,CAAQyrB,EAAaliB,CAAO,CAAA,CAC5BogB,CAAAA,CAAUtI,EAAAA,CAA4B,CAAE,UAAA,CAAY,GAAI,CAAC,CAAA,CACzDzb,CAAAA,CAAkB,IAAI,eAAA,CAGtB0e,CAAAA,CAAU,IAAM1e,EAAgB,KAAA,EAAM,CACxC7L,CAAAA,CAAQ,MAAA,EACXA,CAAAA,CAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAASuqB,CAAAA,CAAS,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAGjE,IAAMyH,CAAAA,CAAO1B,CAAAA,EAAa,SAAA,CAAU,CAAA,OAAA,EAAU9gB,CAAO,CAAA,CAAE,CAAA,CACjDpJ,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAErB,CAAE,MAAA,CAAQ6sB,CAAAA,CAAa,MAAA,CAAArvB,EAAQ,KAAA,CAAOsvB,CAAY,CAAA,CAAI9B,CAAAA,CAAwBnrB,CAAAA,CAAOC,CAAAA,CAAO,CACjG,MAAA,CAAQ2F,CAAAA,CAAgB,MACzB,CAAC,CAAA,CAGKsnB,CAAAA,CAAcjL,EAAAA,CACnB+K,EACArD,CAAAA,CACCvjB,CAAAA,EAAwBA,CAAAA,CAAM,IAAA,GAAS,OAAA,CAAUA,CAAAA,CAAM,IAAA,CAAO,EAChE,CAAA,CAGM+mB,CAAAA,CAAgBxvB,CAAAA,CAAO,IAAA,CAAMgN,CAAAA,EAAM,CACxC,IAAMshB,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAI9rB,CAAAA,CAC/B,OAAA2D,CAAAA,EAAe6G,CAAAA,CAAE,WAAA,CAGjB5Q,CAAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASuqB,CAAO,CAAA,CAGhDyH,CAAAA,EAAM1B,CAAAA,EAAa,OAAA,CAAQ0B,CAAAA,CAAK,MAAA,CAAQ,IAAI,CAAA,CAG5CxB,CAAAA,EACHA,CAAAA,CAAY,OAAA,CAAQ,CACnB,IAAA,CAAM,QAAA,CACN,IAAA,CAAMhhB,CAAAA,CACN,GAAI,GAAA,CACJ,KAAA,CAAO,CAAA,EAAGA,CAAO,CAAA,iBAAA,CAAA,CACjB,OAAA,CAAS,CAAE,UAAA,CAAYoB,CAAAA,CAAE,WAAY,CACtC,CAAgD,CAAA,CAI7C6f,CAAAA,EACHA,EAAQ,QAAA,CAASjhB,CAAAA,CAAS,CACzB,OAAA,CAAS,IAAA,CACT,SAAA,CAAA0iB,CAAAA,CACA,IAAA,CAAM/B,CAAAA,CAAqB,CAAA,CAAIhrB,EAAAA,CAAayL,CAAAA,CAAE,WAAA,CAAauf,CAAkB,EAAI,MAClF,CAAC,CAAA,CAGKvf,CACR,CAAC,CAAA,CAAE,KAAA,CAAOnL,CAAAA,EAAQ,CACjB,IAAMysB,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAI9rB,CAAAA,CAC/B,MAAApG,CAAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASuqB,CAAO,CAAA,CAChDyH,CAAAA,EAAM1B,CAAAA,EAAa,OAAA,CAAQ0B,CAAAA,CAAK,MAAA,CAAQ,OAAO,CAAA,CAC/CvB,CAAAA,EAASA,EAAQ,QAAA,CAASjhB,CAAAA,CAAS,CAAE,OAAA,CAAS,KAAA,CAAO,SAAA,CAAA0iB,CAAU,CAAC,CAAA,CAC9DzsB,CACP,CAAC,CAAA,CAGD,OAAA0tB,CAAAA,CAAY,MAAO1tB,CAAAA,EAAQ,CACtByqB,CAAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,0BAAA,CAA4BzqB,CAAG,EACzD,CAAC,CAAA,CAEM,IAAIkqB,EAAAA,CACVC,CAAAA,CACAwD,CAAAA,CACA,IAAM,CACLF,CAAAA,EAAY,CACZrnB,CAAAA,CAAgB,KAAA,EAAM,CACtB7L,CAAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASuqB,CAAO,EACrD,CACD,CACD,CAMA,SAAS8I,CAAAA,CACR7jB,CAAAA,CACAtJ,CAAAA,CACAlG,CAAAA,CAA8B,EAAC,CACP,CACxB,GAAI,CAACoxB,CAAAA,CACJ,MAAM,IAAI,KAAA,CACT,CAAA;AAAA,wEAAA,CAED,CAAA,CAGD,GAAIf,CAAAA,EAAgB,QAAA,EAAS,GAAM,MAAA,CAClC,MAAM,IAAI,KAAA,CAAM,gEAAgE,CAAA,CAGjF,IAAMpqB,EAAQyrB,CAAAA,CAAaliB,CAAO,CAAA,CAC5B3D,CAAAA,CAAkB,IAAI,eAAA,CAEtB0e,CAAAA,CAAU,IAAM1e,EAAgB,KAAA,EAAM,CACxC7L,CAAAA,CAAQ,MAAA,EACXA,CAAAA,CAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAASuqB,EAAS,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAGjE,IAAMyH,CAAAA,CAAO1B,CAAAA,EAAa,SAAA,CAAU,CAAA,aAAA,EAAgB9gB,CAAO,CAAA,CAAE,CAAA,CACvDpJ,CAAAA,CAAY,IAAA,CAAK,GAAA,GAEjB,CAAE,MAAA,CAAQ6sB,CAAAA,CAAa,MAAA,CAAArvB,CAAAA,CAAQ,KAAA,CAAOsvB,CAAY,CAAA,CAAI9B,EAAwBnrB,CAAAA,CAAOC,CAAAA,CAAO,CACjG,MAAA,CAAQ2F,CAAAA,CAAgB,MACzB,CAAC,CAAA,CAGKunB,EAAgBxvB,CAAAA,CAAO,IAAA,CAAMgN,CAAAA,EAAM,CACxC,IAAMshB,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAI9rB,CAAAA,CAC/B,OAAA2D,CAAAA,EAAe6G,CAAAA,CAAE,WAAA,CAEjB5Q,CAAAA,CAAQ,MAAA,EAAQ,oBAAoB,OAAA,CAASuqB,CAAO,CAAA,CAChDyH,CAAAA,EAAM1B,CAAAA,EAAa,OAAA,CAAQ0B,CAAAA,CAAK,MAAA,CAAQ,IAAI,CAAA,CAC5CxB,CAAAA,EACHA,CAAAA,CAAY,OAAA,CAAQ,CACnB,IAAA,CAAM,QAAA,CACN,IAAA,CAAMhhB,EACN,EAAA,CAAI,GAAA,CACJ,KAAA,CAAO,CAAA,EAAGA,CAAO,CAAA,uBAAA,CAAA,CACjB,OAAA,CAAS,CAAE,UAAA,CAAYoB,CAAAA,CAAE,WAAY,CACtC,CAAgD,CAAA,CAE7C6f,CAAAA,EACHA,CAAAA,CAAQ,SAASjhB,CAAAA,CAAS,CACzB,OAAA,CAAS,IAAA,CACT,SAAA,CAAA0iB,CAAAA,CACA,IAAA,CAAM/B,CAAAA,CAAqB,EAAIhrB,EAAAA,CAAayL,CAAAA,CAAE,WAAA,CAAauf,CAAkB,CAAA,CAAI,MAClF,CAAC,CAAA,CAEKvf,CACR,CAAC,CAAA,CAAE,KAAA,CAAOnL,CAAAA,EAAQ,CACjB,IAAMysB,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAI9rB,CAAAA,CAC/B,MAAApG,CAAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,CAASuqB,CAAO,CAAA,CAChDyH,CAAAA,EAAM1B,CAAAA,EAAa,OAAA,CAAQ0B,CAAAA,CAAK,MAAA,CAAQ,OAAO,CAAA,CAC/CvB,GAASA,CAAAA,CAAQ,QAAA,CAASjhB,CAAAA,CAAS,CAAE,OAAA,CAAS,KAAA,CAAO,SAAA,CAAA0iB,CAAU,CAAC,CAAA,CAC9DzsB,CACP,CAAC,CAAA,CAEG6tB,CAAAA,CAAU,KAAA,CACd,OAAO,CACN,MAAA,CAAQL,CAAAA,CACR,MAAA,CAAQG,CAAAA,CACR,KAAA,CAAO,IAAM,CACRE,CAAAA,GACJA,EAAU,IAAA,CACVJ,CAAAA,EAAY,CACZrnB,CAAAA,CAAgB,KAAA,EAAM,CACtB7L,CAAAA,CAAQ,MAAA,EAAQ,oBAAoB,OAAA,CAASuqB,CAAO,CAAA,EACrD,CACD,CACD,CAMA,SAASgJ,CAAAA,EAA4B,CAEpC,IAAIC,CAAAA,CAAoC,IAAA,CACxC,GAAI9rB,CAAAA,CAAO,SAAA,EAAakpB,CAAAA,CAAqB,CAE5C,IAAMI,CAAAA,CADM,IAAA,CAAK,GAAA,EAAI,CACK,GAAA,CAE1B,KAAOH,CAAAA,CAAoBD,EAAoB,MAAA,EAAUA,CAAAA,CAAoBC,CAAiB,CAAA,CAAKG,CAAAA,EAClGH,CAAAA,EAAAA,CAED,IAAM4C,CAAAA,CAAS7C,EAAoB,MAAA,CAASC,CAAAA,CAC5C2C,CAAAA,CAAqB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG9rB,CAAAA,CAAO,SAAA,CAAU,aAAe+rB,CAAM,EACxE,CAEA,OAAO,CACN,WAAA,CAAA1pB,CAAAA,CACA,aAAA,CAAeomB,CAAAA,CAAqB,CAAA,CAAIhrB,EAAAA,CAAa4E,CAAAA,CAAaomB,CAAkB,CAAA,CAAI,CAAA,CACxF,YAAA,CAAcE,GAAgB,QAAA,EAAS,EAAK,QAAA,CAC5C,UAAA,CAAYE,CAAAA,EAAe,QAAA,EAAS,EAAK,CAAE,aAAc,CAAA,CAAG,SAAA,CAAW,CAAA,CAAG,WAAA,CAAa,CAAA,CAAG,OAAA,CAAS,CAAA,CAAG,kBAAA,CAAoB,EAAG,WAAA,CAAa,IAAA,CAAM,WAAA,CAAa,IAAK,CAAA,CAClK,kBAAA,CAAoBH,CAAAA,EAAQ,QAAA,EAAS,EAAG,QAAA,EAAU,MAAA,EAAU,CAAA,CAC5D,eAAA,CAAiBI,CAAAA,EAAa,UAAA,EAAW,EAAG,QAAU,CAAA,CACtD,kBAAA,CAAAgD,CACD,CACD,CAEA,SAASE,CAAAA,EAAc,CACtBtD,GAAQ,KAAA,EAAM,CACdC,CAAAA,EAAgB,KAAA,EAAM,CACtBE,CAAAA,EAAe,KAAA,EAAM,CACrBD,GAAa,KAAA,EAAM,CACnBE,CAAAA,EAAa,KAAA,EAAM,CACnBW,CAAAA,EAAO,KAAA,EAAM,CACTP,CAAAA,GACHA,CAAAA,CAAoB,MAAA,CAAS,CAAA,CAC7BC,CAAAA,CAAoB,CAAA,CAAA,CAErB9mB,CAAAA,CAAc,EACf,CAEA,IAAI4pB,CAAAA,CAAW,KAAA,CACf,eAAeC,CAAAA,EAAyB,CACvC,GAAI,CAAAD,EAIJ,CAAA,GAHAA,CAAAA,CAAW,IAAA,CAGPrC,CAAAA,EAAgBhB,CAAAA,EAAee,CAAAA,CAAc,CAChD,aAAA,CAAcC,CAAY,CAAA,CAC1BA,CAAAA,CAAe,IAAA,CACf,GAAI,CACH,IAAMlwB,CAAAA,CAAOkvB,CAAAA,CAAY,MAAA,EAAO,CAC5BlvB,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAAS,CAAA,EAAGiwB,CAAAA,CAAa,aAAA,CAAcjwB,EAAK,OAAO,CAAA,CAChEA,CAAAA,CAAK,MAAA,CAAO,MAAA,CAAS,CAAA,EAAGiwB,CAAAA,CAAa,YAAA,CAAajwB,EAAK,MAAM,EAClE,CAAA,KAAQ,CAER,CACD,CAAA,KAAWkwB,CAAAA,GACV,aAAA,CAAcA,CAAY,CAAA,CAC1BA,CAAAA,CAAe,IAAA,CAAA,CAEhB9f,CAAAA,CAAa,OAAA,EAAQ,CACrB2f,CAAAA,EAAO,OAAA,EAAQ,CACf,MAAMb,CAAAA,EAAa,OAAA,GAAQ,CAC5B,CAEA,OAAO,CACN,IAAAuB,CAAAA,CACA,aAAA,CAAAO,CAAAA,CACA,UAAA,CAAAK,CAAAA,CACA,MAAA,CAAAxkB,CAAAA,CACA,YAAA,CAAAolB,EACA,OAAA,CAAUQ,CAAAA,EAAsBriB,CAAAA,CAAa,OAAA,CAAQqiB,CAAS,CAAA,CAC9D,MAAA,CAAQ,CAACA,EAAmB7V,CAAAA,GAAoBxM,CAAAA,CAAa,MAAA,CAAOqiB,CAAAA,CAAW7V,CAAM,CAAA,CACrF,QAAA,CAAAuV,CAAAA,CACA,KAAA,CAAAG,CAAAA,CACA,OAAA,CAAAE,CAAAA,CACA,IAAI,YAAA,EAAe,CAAE,OAAOpiB,CAAc,CAAA,CAC1C,IAAI,aAAA,EAAgB,CAAE,OAAO8e,CAAa,CAAA,CAC1C,IAAI,YAAa,CAAE,OAAOE,CAAa,CAAA,CACvC,IAAI,WAAA,EAAc,CAAE,OAAOW,CAAO,CAAA,CAClC,IAAI,KAAA,EAAQ,CAAE,OAAOZ,CAAe,CAAA,CACpC,IAAI,MAAA,EAAS,CAAE,OAAOH,CAAQ,CAAA,CAC9B,WAAA,CAAYnb,CAAAA,CAAQ,EAAA,CAAI,CACvB,OAAO,CACN,KAAA,CAAOqb,CAAAA,EAAa,SAAA,CAAUrb,CAAK,CAAA,EAAK,GACxC,OAAA,CAASqb,CAAAA,EAAa,YAAA,EAAa,EAAG,OAAA,EAAW,EAClD,CACD,EAEA,IAAI,GAAA,EAAM,CAAE,OAAOA,CAAa,CAAA,CAChC,IAAI,GAAA,EAAM,CAAE,OAAOE,CAAa,CAAA,CAChC,IAAI,KAAA,EAAQ,CAAE,OAAOW,CAAO,CAC7B,CACD,CCjkCO,SAAS2C,EAAAA,CACf9T,CAAAA,CACA+T,CAAAA,CACa,CACb,OAAO,UAAgB,CACtBA,CAAAA,CAAO/T,CAAAA,CAAO,QAAA,EAAU,EACzB,CACD,CCkDA,SAASgU,EAAAA,CAAmB3nB,CAAAA,CAAiB4nB,CAAAA,CAA6B,CACxE,IAAMC,CAAAA,CAAS7nB,CAAAA,CAAM,QAAA,CAAS,KAAA,EAAoB,EAAA,CAC5C8nB,CAAAA,CAAW9nB,CAAAA,CAAM,QAAA,CAAS,OAAA,EAAsB,EAAA,CAChD7G,EAAO6G,CAAAA,CAAM,QAAA,CAAS,GAAA,EAAkB,EAAA,CAO9C,OAAO,CAAA,EALL6nB,CAAAA,EAASC,CAAAA,EAAW3uB,EAChB,CAAA,CAAA,EAAI0uB,CAAK,CAAA,QAAA,EAAMC,CAAO,CAAA,EAAA,EAAK3uB,CAAG,CAAA,CAAA,CAAA,CAC9B0uB,CAAAA,EAEE7nB,EAAM,EACE;AAAA,EAAKA,CAAAA,CAAM,OAAO,CAAA,CACpC,CAEA,SAAS+nB,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACQ,CACR,OAAID,CAAAA,CAAgB,MAAA,GAAW,EAAU,EAAA,CAClC,CAAA;;AAAA,EAAsCA,EAAgB,IAAA,CAAK;;AAAA,CAAM,CAAC,CAAA,CAC3E,CAOA,SAASE,EAAAA,CAAM5zB,CAAAA,CAAe6zB,CAAAA,CAAa/lB,CAAAA,CAAqB,CAC9D,OAAO,IAAA,CAAK,GAAA,CAAI+lB,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAI/lB,CAAAA,CAAK9N,CAAK,CAAC,CAC3C,CAMO,SAAS8zB,EAAAA,CAAkB/sB,CAAAA,CAAwC,CACxE,GAAM,CACJ,QAAA,CAAA+b,CAAAA,CACA,OAAA,CAAA/B,CAAAA,CACA,IAAA,CAAMgT,CAAAA,CAAc,CAAA,CACpB,aAAA,CAAeC,CAAAA,CAAmB,EAAA,CAClC,WAAA,CAAAC,CAAAA,CAAcZ,EAAAA,CACd,aAAA,CAAAa,CAAAA,CAAgBT,EAAAA,CAChB,OAAA,CAAArQ,CACF,CAAA,CAAIrc,CAAAA,CAEEotB,CAAAA,CAAgBP,EAAAA,CAAMI,CAAAA,CAAkB,CAAA,CAAG,CAAC,CAAA,CAGhD,OAAO,OAAA,CAAY,GAAA,EACnB,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,aAAA,EAC1BA,CAAAA,GAAqBG,GAErB,OAAA,CAAQ,IAAA,CACN,CAAA,+BAAA,EAAkCH,CAAgB,CAAA,YAAA,EAAeG,CAAa,CAAA,mBAAA,CAChF,CAAA,CAGF,eAAeC,CAAAA,CACbvQ,CAAAA,CACAwQ,CAAAA,CACmD,CACnD,IAAMvZ,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMuZ,CAAAA,EAAQN,CAAW,CAAC,CAAA,CAGrD,GAAIhT,CAAAA,CAAQ,MAAA,CACV,OAAOA,CAAAA,CAAQ,MAAA,CAAO,MAAM+B,CAAAA,CAASe,CAAK,CAAA,CAAG/I,CAAAA,CAAGqZ,CAAa,CAAA,CAG/D,IAAM9R,CAAAA,CAAiB,MAAMS,CAAAA,CAASe,CAAK,CAAA,CAGrCyQ,CAAAA,CAAAA,CAFS,MAAMvT,CAAAA,CAAQ,SAAA,EAAU,EAEjB,GAAA,CAAKrV,CAAAA,GAAW,CACpC,GAAGA,CAAAA,CACH,UAAA,CAAYoW,EAAAA,CAAiBO,CAAAA,CAAgB3W,CAAAA,CAAM,SAAS,CAC9D,CAAA,CAAE,CAAA,CAEF,OAAA4oB,CAAAA,CAAO,IAAA,CAAK,CAACpV,CAAAA,CAAGpH,CAAAA,GAAMA,CAAAA,CAAE,UAAA,CAAaoH,CAAAA,CAAE,UAAU,CAAA,CAE1CoV,CAAAA,CAAO,MAAA,CAAQzX,CAAAA,EAAMA,CAAAA,CAAE,UAAA,EAAcsX,CAAa,CAAA,CAAE,KAAA,CAAM,CAAA,CAAGrZ,CAAC,CACvE,CAEA,eAAeyZ,CAAAA,CACbhvB,CAAAA,CACAlG,CAAAA,CAA4B,EAAC,CACZ,CACjB,GAAM,CAAE,MAAA,CAAAkY,CAAAA,CAAQ,OAAA,CAAAid,CAAAA,CAAS,IAAA,CAAAH,CAAAA,CAAM,MAAA,CAAAhhB,CAAO,CAAA,CAAIhU,CAAAA,CAEtCqe,CAAAA,CAAoD,EAAC,CACzD,GAAI,CACFA,CAAAA,CAAU,MAAM0W,CAAAA,CAAS7uB,CAAAA,CAAO8uB,CAAI,EACtC,CAAA,MAASvvB,CAAAA,CAAK,CACZse,CAAAA,GAAUte,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAC,EAC/D,CAEIuO,IACFqK,CAAAA,CAAUA,CAAAA,CAAQ,MAAA,CAAQnU,CAAAA,EAAM8J,CAAAA,CAAO9J,CAAC,CAAC,CAAA,CAAA,CAG3C,IAAMmqB,CAAAA,CAAkBhW,CAAAA,CAAQ,GAAA,CAAKnU,CAAAA,EAAM0qB,CAAAA,CAAY1qB,CAAAA,CAAGA,CAAAA,CAAE,UAAU,CAAC,CAAA,CACjEkrB,CAAAA,CAAeP,CAAAA,CAAcR,CAAAA,CAAiBnuB,CAAK,CAAA,CAEnDmvB,CAAAA,CAAkB,EAAC,CAGzB,GAFInd,CAAAA,EAAQmd,CAAAA,CAAM,IAAA,CAAKnd,CAAM,EACzBkd,CAAAA,EAAcC,CAAAA,CAAM,IAAA,CAAKD,CAAY,CAAA,CACrCD,CAAAA,EAAWA,CAAAA,CAAQ,MAAA,CAAS,CAAA,CAAG,CACjC,IAAMG,CAAAA,CAAeH,CAAAA,CAClB,GAAA,CACEjrB,CAAAA,EACC,CAAA,EAAGA,CAAAA,CAAE,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAIA,CAAAA,CAAE,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA,EAAKA,CAAAA,CAAE,OAAO,CAAA,CACrE,EACC,IAAA,CAAK;;AAAA,CAAM,CAAA,CACdmrB,EAAM,IAAA,CAAK,CAAA;AAAA,EAA2BC,CAAY,CAAA,CAAE,EACtD,CACA,OAAAD,EAAM,IAAA,CAAKnvB,CAAK,CAAA,CAETmvB,CAAAA,CAAM,IAAA,CAAK;;AAAA;;AAAA,CAAa,CACjC,CAEA,OAAO,CAAE,QAAA,CAAAN,EAAU,MAAA,CAAAG,CAAO,CAC5B,CAmBO,SAASK,EAAAA,CAAoBv1B,CAAAA,CAA2C,CAC7E,GAAM,CAAE,QAAA,CAAAw1B,CAAAA,CAAU,QAAA,CAAAC,CAAAA,CAAU,MAAA7R,CAAAA,CAAQ,CAAE,CAAA,CAAI5jB,CAAAA,CACtC+xB,EAA4B,IAAA,CAC5B2D,CAAAA,CAAW,CAAA,CAEf,eAAeC,GAA4B,CACzC,GAAI5D,CAAAA,GAAWnO,CAAAA,GAAU,GAAK,IAAA,CAAK,GAAA,EAAI,CAAI8R,CAAAA,CAAW9R,GACpD,OAAOmO,CAAAA,CAGT,GAAI,CAEF,IAAM3wB,CAAAA,CAAO,KAAA,CADF,MAAM,OAAO,IAAS,CAAA,EACX,QAAA,CAAS,QAAA,CAASo0B,CAAAA,CAAU,OAAO,CAAA,CACnDI,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAMx0B,CAAI,CAAA,CAE3B,OAAA2wB,CAAAA,CAAS0D,CAAAA,CACLG,EAAI,GAAA,CAAIH,CAAQ,CAAA,CACfG,CAAAA,CAELF,EAAW,IAAA,CAAK,GAAA,EAAI,CACb3D,CACT,OAAStsB,CAAAA,CAAK,CACZ,OACE,OAAO,QAAY,GAAA,EACnB,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,eAE1B,OAAA,CAAQ,IAAA,CACN,CAAA,0CAAA,EAA6C+vB,CAAQ,IACrD/vB,CACF,CAAA,CAEFssB,CAAAA,CAAS,GACT2D,CAAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACb3D,CACT,CACF,CAEA,OAAO,CACL,MAAM,SAAA,EAAY,CAChB,OAAO4D,CAAAA,EACT,CAAA,CACA,MAAM,IAAA,EAAO,CAEX,QADe,MAAMA,CAAAA,EAAK,EACZ,MAChB,EACA,MAAM,MAAA,EAAS,CACb5D,CAAAA,CAAS,KACT2D,CAAAA,CAAW,CAAA,CACX,MAAMC,CAAAA,GACR,CAAA,CACA,OAAA,EAAU,CACR5D,CAAAA,CAAS,KACT2D,CAAAA,CAAW,EACb,CACF,CACF,CC1NA,IAAMG,EAAAA,CACJ,uDAAA,CAMK,SAASC,GACdpuB,CAAAA,CAA6B,EAAC,CAChB,CACd,GAAM,CACJ,gBAAA,CAAAquB,EAAmB,MAAA,CAAO,iBAAA,CAC1B,kBAAAC,CAAAA,CAAoB;;AAAA,sBAAA,CAAA,CACpB,mBAAA,CAAAC,EAAsB,CAAA,CACtB,aAAA,CAAAC,EACA,OAAA,CAASC,CACX,CAAA,CAAIzuB,CAAAA,CAEJ,GAAIquB,CAAAA,CAAmB,EACrB,MAAM,IAAI,WAAW,uCAAuC,CAAA,CAE9D,GAAIE,CAAAA,CAAsB,CAAA,CACxB,MAAM,IAAI,UAAA,CAAW,0CAA0C,EAGjE,SAASG,CAAAA,CAAoBl2B,EAAwB,CACnD,GAAI,OAAOg2B,CAAAA,EAAkB,UAAA,CAC3B,GAAI,CACF,OAAOA,CAAAA,CAAch2B,CAAK,CAC5B,CAAA,KAAQ,CACN,OAAO21B,EACT,CAEF,GAAIK,CAAAA,EAAiB,OAAOA,CAAAA,EAAkB,QAAA,CAAU,CACtD,IAAMG,CAAAA,CACJn2B,CAAAA,EAAS,MACT,OAAOA,CAAAA,EAAU,UACjB,MAAA,GAAUA,CAAAA,EACV,OAAQA,CAAAA,CAA4B,IAAA,EAAS,QAAA,CACxCA,EAA2B,IAAA,CAC5B,MAAA,CACN,GAAIm2B,CAAAA,EAAQA,CAAAA,IAAQH,EAClB,OAAOA,CAAAA,CAAcG,CAAI,CAE7B,CACA,OAAOR,EACT,CAEA,SAASS,EACPC,CAAAA,CACA/mB,CAAAA,CACAtJ,EACAiK,CAAAA,CAC4B,CAC5B,IAAMqmB,CAAAA,CAAU,IAAI,WAAA,CAEpB,SAASC,CAAAA,CAAMC,CAAAA,CAA6B,CAC1C,OAAOF,CAAAA,CAAQ,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAUE,CAAK,CAAC;;AAAA,CAAM,CAC5D,CAEA,OAAO,IAAI,cAAA,CAA2B,CACpC,MAAM,KAAA,CAAMpmB,CAAAA,CAAY,CACtB,IAAIqmB,CAAAA,CAAwD,IAAA,CACxDC,CAAAA,CAAkC,IAAA,CAEtC,GAAI,CAEEX,CAAAA,CAAsB,CAAA,GACxBU,CAAAA,CAAiB,YAAY,IAAM,CACjC,GAAI,CACFrmB,EAAW,OAAA,CAAQmmB,CAAAA,CAAM,CAAE,IAAA,CAAM,YAAa,SAAA,CAAW,IAAA,CAAK,GAAA,EAAM,CAAC,CAAC,EACxE,CAAA,KAAQ,CAER,CACF,CAAA,CAAGR,CAAmB,CAAA,CAAA,CAGxBW,CAAAA,CAAcL,EAAM,MAAA,CAAO/mB,CAAAA,CAAStJ,CAAAA,CAAO,CACzC,OAAQiK,CAAAA,EAAM,MAChB,CAAC,CAAA,CAED,IAAI0mB,CAAAA,CAAa,CAAA,CACbC,CAAAA,CAAW,CAAA,CAAA,CAEf,cAAiBvqB,CAAAA,IAASqqB,CAAAA,CAAa,CAGrC,GAFAC,GAActqB,CAAAA,CAAM,MAAA,CAEhBsqB,CAAAA,CAAad,CAAAA,CAAkB,CACjCzlB,CAAAA,CAAW,OAAA,CACTmmB,EAAM,CAAE,IAAA,CAAM,YAAa,IAAA,CAAMT,CAAkB,CAAC,CACtD,EACA1lB,CAAAA,CAAW,OAAA,CAAQmmB,CAAAA,CAAM,CAAE,KAAM,MAAO,CAAC,CAAC,CAAA,CAC1CK,EAAW,CAAA,CAAA,CACXF,CAAAA,CAAY,KAAA,EAAM,CAClB,KACF,CAEAtmB,CAAAA,CAAW,OAAA,CAAQmmB,CAAAA,CAAM,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAMlqB,CAAM,CAAC,CAAC,EACzD,CAGA,GAAI,CACF,MAAMqqB,CAAAA,CAAY,OACpB,CAAA,KAAQ,CAER,CAEKE,CAAAA,EACHxmB,CAAAA,CAAW,OAAA,CAAQmmB,EAAM,CAAE,IAAA,CAAM,MAAO,CAAC,CAAC,EAE9C,CAAA,MAAShxB,CAAAA,CAAc,CACrB,IAAM/D,CAAAA,CAAU00B,CAAAA,CAAoB3wB,CAAG,CAAA,CACvC6K,EAAW,OAAA,CAAQmmB,CAAAA,CAAM,CAAE,IAAA,CAAM,QAAS,OAAA,CAAA/0B,CAAQ,CAAC,CAAC,EACtD,CAAA,OAAE,CACIi1B,CAAAA,EAAgB,aAAA,CAAcA,CAAc,CAAA,CAChDrmB,CAAAA,CAAW,QACb,CACF,CACF,CAAC,CACH,CAEA,IAAMymB,EAAqC,CACzC,cAAA,CAAgB,mBAAA,CAChB,eAAA,CAAiB,WACjB,UAAA,CAAY,YAAA,CACZ,GAAGZ,CACL,EAEA,OAAO,CACL,UAAA,CAAWI,CAAAA,CAAO/mB,EAAStJ,CAAAA,CAAOiK,CAAAA,CAAM,CACtC,IAAMlC,EAASqoB,CAAAA,CAAYC,CAAAA,CAAO/mB,CAAAA,CAAStJ,CAAAA,CAAOiK,CAAI,CAAA,CACtD,OAAO,IAAI,QAAA,CAASlC,EAAQ,CAAE,OAAA,CAAS8oB,CAAW,CAAC,CACrD,CAAA,CACA,QAAA,CAASR,CAAAA,CAAO/mB,CAAAA,CAAStJ,EAAOiK,CAAAA,CAAM,CACpC,OAAOmmB,CAAAA,CAAYC,EAAO/mB,CAAAA,CAAStJ,CAAAA,CAAOiK,CAAI,CAChD,CACF,CACF,CChHO,SAAS6mB,EAAAA,CACdjoB,EACArH,CAAAA,CAA2B,EAAC,CAChB,CACZ,GAAM,CACJ,YAAA,CAAAuvB,CAAAA,CAAe,EAAA,CACf,UAAA3R,CAAAA,CAAY,GAAA,CACZ,WAAA,CAAA4R,CAAAA,CAAc,CAChB,CAAA,CAAIxvB,CAAAA,CAGJ,GAAI,CAAC,MAAA,CAAO,SAASuvB,CAAY,CAAA,EAAKA,CAAAA,CAAe,CAAA,CACnD,MAAM,IAAI,KAAA,CAAM,qFAAqF,CAAA,CAEvG,GAAI,CAAC,MAAA,CAAO,QAAA,CAAS3R,CAAS,GAAKA,CAAAA,CAAY,CAAA,CAC7C,MAAM,IAAI,MAAM,+EAA+E,CAAA,CAEjG,GAAI,CAAC,OAAO,QAAA,CAAS4R,CAAW,CAAA,EAAKA,CAAAA,CAAc,EACjD,MAAM,IAAI,KAAA,CAAM,oFAAoF,EAGtG,IAAIC,CAAAA,CAAsB,EAAC,CACvBC,CAAAA,CAAmD,KACnDzD,CAAAA,CAAW,KAAA,CACX0D,CAAAA,CAAqC,IAAA,CAEzC,SAASC,CAAAA,EAAsB,CACzBF,CAAAA,GAAe,IAAA,GAGnBA,EAAa,UAAA,CAAW,IAAM,CAC5BA,CAAAA,CAAa,KACbG,CAAAA,EAAc,CAAE,KAAA,CAAM,IAAM,CAE5B,CAAC,EACH,CAAA,CAAGjS,CAAS,GACd,CAEA,SAASkS,CAAAA,EAAoB,CACvBJ,IAAe,IAAA,GACjB,YAAA,CAAaA,CAAU,CAAA,CACvBA,EAAa,IAAA,EAEjB,CAGA,eAAeK,CAAAA,CAAa9R,CAAAA,CAAoC,CAC9D,IAAIzT,CAAAA,CAAQ,CAAA,CAEZ,eAAewlB,GAAyB,CACtC,KAAOxlB,CAAAA,CAAQyT,CAAAA,CAAM,QAAQ,CAC3B,IAAM3S,CAAAA,CAAUd,CAAAA,EAAAA,CACVylB,EAAOhS,CAAAA,CAAM3S,CAAO,CAAA,CAE1B,GAAI,CACF,IAAMpP,CAAAA,CAAS,MAAMmL,CAAAA,CAAO4oB,EAAK,KAAA,CAAOA,CAAAA,CAAK,KAAA,CAAOA,CAAAA,CAAK,OAAO,CAAA,CAChEA,CAAAA,CAAK,OAAA,CAAQ/zB,CAAM,EACrB,CAAA,MAAS6B,CAAAA,CAAK,CACZkyB,CAAAA,CAAK,OAAOlyB,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,MAAM,MAAA,CAAOA,CAAG,CAAC,CAAC,EACjE,CACF,CACF,CAGA,IAAM+M,EAAU,KAAA,CAAM,IAAA,CACpB,CAAE,MAAA,CAAQ,KAAK,GAAA,CAAI0kB,CAAAA,CAAavR,CAAAA,CAAM,MAAM,CAAE,CAAA,CAC9C,IAAM+R,CAAAA,EACR,EACA,MAAM,OAAA,CAAQ,GAAA,CAAIllB,CAAO,EAC3B,CAEA,eAAe+kB,GAA+B,CAM5C,GAJIF,GACF,MAAMA,CAAAA,CAGJF,CAAAA,CAAM,MAAA,GAAW,EACnB,OAGFK,CAAAA,EAAY,CAGZ,IAAM7R,EAAQwR,CAAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAE5BE,EAAeI,CAAAA,CAAa9R,CAAK,CAAA,CAAE,OAAA,CAAQ,IAAM,CAC/C0R,CAAAA,CAAe,IAAA,CAGXF,CAAAA,CAAM,OAAS,CAAA,EACjBG,CAAAA,GAEJ,CAAC,EAED,MAAMD,EACR,CAEA,OAAO,CACL,MAAA,CACEpxB,CAAAA,CACAC,EACAlG,CAAAA,CACuB,CACvB,OAAI2zB,CAAAA,CACK,OAAA,CAAQ,MAAA,CAAO,IAAI,MAAM,2CAA2C,CAAC,CAAA,CAGvE,IAAI,QAAsB,CAAC1oB,CAAAA,CAASyD,CAAAA,GAAW,CACpDyoB,EAAM,IAAA,CAAK,CACT,KAAA,CAAAlxB,CAAAA,CACA,MAAAC,CAAAA,CACA,OAAA,CAAAlG,CAAAA,CACA,OAAA,CAASiL,EACT,MAAA,CAAAyD,CACF,CAAC,CAAA,CAGGyoB,EAAM,MAAA,EAAUF,CAAAA,EAClBO,CAAAA,EAAY,CACZD,GAAc,CAAE,KAAA,CAAM,IAAM,CAE5B,CAAC,GAEDD,CAAAA,GAEJ,CAAC,CACH,EAEA,MAAM,KAAA,EAAuB,CAC3B,MAAMC,IACR,CAAA,CAEA,IAAI,OAAA,EAAkB,CACpB,OAAOJ,CAAAA,CAAM,MACf,CAAA,CAEA,MAAM,OAAA,EAAyB,CACzBxD,CAAAA,GAGJA,CAAAA,CAAW,KACX6D,CAAAA,EAAY,CAERL,CAAAA,CAAM,MAAA,CAAS,GACjB,MAAMI,CAAAA,EAAc,EAExB,CACF,CACF,CCnIA,SAASK,EAAAA,EAAkC,CACzC,OAAO,CACL,SAAA,CAAW,CAAA,CACX,UAAA,CAAY,EACZ,SAAA,CAAW,CAAA,CACX,YAAA,CAAc,CAAA,CACd,YAAa,IACf,CACF,CAEA,SAASvM,GAAcC,CAAAA,CAA+BC,CAAAA,CAAyE,CAC7H,OAAI,CAACD,CAAAA,EAAS,CAACC,CAAAA,CACN,CAAA,CAIND,EAAM,WAAA,CAAc,GAAA,CAAaC,CAAAA,CAAQ,eAAA,CACzCD,EAAM,YAAA,CAAe,GAAA,CAAaC,CAAAA,CAAQ,gBAE/C,CAyBO,SAASsM,EAAAA,CAAuBnwB,EAAwD,CAC7F,GAAM,CACJ,SAAA,CAAAowB,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,YAAAC,CAAAA,CAAc,EAAC,CACf,kBAAA,CAAAC,EACA,eAAA,CAAAC,CAAAA,CAAkB,GAAA,CAClB,cAAA,CAAAC,EAAiB,KACnB,CAAA,CAAIzwB,CAAAA,CAGJ,GAAI,CAAC,MAAA,CAAO,QAAA,CAASwwB,CAAe,CAAA,EAAKA,EAAkB,CAAA,CACzD,MAAM,IAAI,KAAA,CAAM,2FAA2F,CAAA,CAI7G,IAAME,CAAAA,CAAc,IAAI,IACxB,IAAA,IAAWC,CAAAA,IAAYP,EACrBM,CAAAA,CAAY,GAAA,CAAIC,EAAS,IAAA,CAAMA,CAAQ,CAAA,CAGzC,GAAI,CAACD,CAAAA,CAAY,GAAA,CAAIL,CAAe,CAAA,CAClC,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiCA,CAAe,gCAAgC,CAAA,CAIlG,IAAMO,CAAAA,CAAsB,CAC1B,UAAW,CAAA,CACX,SAAA,CAAW,CAAA,CACX,UAAA,CAAY,EACZ,YAAA,CAAc,IAAA,CACd,YAAA,CAAc,CAAA,CACd,UAAW,MAAA,CAAO,MAAA,CAAO,IAAI,CAC/B,EAEA,IAAA,IAAWD,CAAAA,IAAYP,EACrBQ,CAAAA,CAAM,SAAA,CAAUD,EAAS,IAAI,CAAA,CAAIT,EAAAA,EAAiB,CAIpD,IAAIW,CAAAA,CAAiB,CAAA,CAGfC,CAAAA,CAAoB,CAAC,GAAGR,CAAW,CAAA,CAAE,IAAA,CACzC,CAACnY,EAAG,CAAA,GAAA,CAAO,CAAA,CAAE,QAAA,EAAY,CAAA,GAAMA,EAAE,QAAA,EAAY,CAAA,CAC/C,CAAA,CAGA,SAAS4Y,GAA+F,CACtG,IAAM71B,CAAAA,CAAM,IAAA,CAAK,KAAI,CAErB,IAAA,IAAWkE,CAAAA,IAAc0xB,CAAAA,CACvB,GAAI,CACF,GAAI1xB,CAAAA,CAAW,IAAA,CAAKwxB,CAAK,CAAA,CAAG,CAC1B,IAAMD,CAAAA,CAAWD,EAAY,GAAA,CAAItxB,CAAAA,CAAW,QAAQ,CAAA,CACpD,GAAIuxB,CAAAA,CACF,OAAO,CAAE,QAAA,CAAAA,EAAU,MAAA,CAAQ,YAAa,CAE5C,CACF,MAAQ,CAER,CAIF,IAAMK,CAAAA,CAAqBZ,EAAU,MAAA,CAAQhzB,CAAAA,EAAM,CACjD,IAAMmf,EAAQqU,CAAAA,CAAM,SAAA,CAAUxzB,CAAAA,CAAE,IAAI,EACpC,OAAKmf,CAAAA,CAGD,EAAAA,CAAAA,CAAM,WAAA,EAAerhB,EAAMqhB,CAAAA,CAAM,WAAA,CAAciU,CAAAA,CAAAA,CAF1C,IAOX,CAAC,CAAA,CAGD,GAAIC,CAAAA,EAAkBO,CAAAA,CAAmB,OAAS,CAAA,CAAG,CACnD,IAAMlgB,CAAAA,CAAS,CAAC,GAAGkgB,CAAkB,CAAA,CAAE,IAAA,CAAK,CAAC7Y,CAAAA,CAAGpH,CAAAA,GAAM,CACpD,IAAMkgB,EAAQ9Y,CAAAA,CAAE,OAAA,CAAUA,CAAAA,CAAE,OAAA,CAAQ,gBAAkBA,CAAAA,CAAE,OAAA,CAAQ,gBAAA,CAAmB,CAAA,CAAA,CAAA,CAC7E+Y,EAAQngB,CAAAA,CAAE,OAAA,CAAUA,EAAE,OAAA,CAAQ,eAAA,CAAkBA,EAAE,OAAA,CAAQ,gBAAA,CAAmB,CAAA,CAAA,CAAA,CACnF,OAAIkgB,IAAUC,CAAAA,CACLD,CAAAA,CAAQC,CAAAA,CAGb/Y,CAAAA,CAAE,OAASkY,CAAAA,CACN,EAAA,CAELtf,CAAAA,CAAE,IAAA,GAASsf,EACN,CAAA,CAGF,CACT,CAAC,CAAA,CAED,GAAIvf,CAAAA,CAAO,CAAC,CAAA,GAAM4f,CAAAA,CAAY,IAAIL,CAAe,CAAA,CAC/C,OAAO,CAAE,SAAUvf,CAAAA,CAAO,CAAC,CAAA,CAAI,MAAA,CAAQ,UAAW,CAEtD,CAGA,OAAIkgB,CAAAA,CAAmB,MAAA,CAAS,GAAK,CAACA,CAAAA,CAAmB,IAAA,CAAM5zB,CAAAA,EAAMA,EAAE,IAAA,GAASizB,CAAe,CAAA,CACtF,CAAE,SAAUW,CAAAA,CAAmB,CAAC,CAAA,CAAI,MAAA,CAAQ,SAAU,CAAA,CAIxD,CAAE,QAAA,CAAUN,CAAAA,CAAY,IAAIL,CAAe,CAAA,CAAI,MAAA,CAAQ,SAAU,CAC1E,CAGA,SAASc,CAAAA,CAAWC,CAAAA,CAAsB5G,EAAmB5G,CAAAA,CAA+BC,CAAAA,CAAiErrB,CAAAA,CAAqB,CAChL,IAAM+jB,CAAAA,CAAQqU,CAAAA,CAAM,SAAA,CAAUQ,CAAY,GAAKlB,EAAAA,EAAiB,CAKhE,GAHA3T,CAAAA,CAAM,YACNqU,CAAAA,CAAM,SAAA,EAAA,CAEFp4B,CAAAA,CACF+jB,CAAAA,CAAM,aACNqU,CAAAA,CAAM,UAAA,EAAA,CACNrU,CAAAA,CAAM,WAAA,CAAc,KAAK,GAAA,EAAI,CAAA,KACxB,CACL,IAAMnG,EAAOuN,EAAAA,CAAcC,CAAAA,CAAOC,CAAO,CAAA,CACzCtH,EAAM,SAAA,EAAanG,CAAAA,CACnBwa,CAAAA,CAAM,SAAA,EAAaxa,EACrB,CAGAya,CAAAA,EAAkBrG,CAAAA,CAClBoG,CAAAA,CAAM,aAAeC,CAAAA,CAAiBD,CAAAA,CAAM,UAE5C,IAAMS,CAAAA,CAAa9U,EAAM,SAAA,CAAY,CAAA,CAAA,CAC/BA,CAAAA,CAAM,YAAA,EAAgBA,EAAM,SAAA,CAAY,CAAA,CAAA,CAAMiO,CAAAA,EAAajO,CAAAA,CAAM,UACnEiO,CAAAA,CACJjO,CAAAA,CAAM,YAAA,CAAe8U,CAAAA,CAErBT,EAAM,SAAA,CAAUQ,CAAY,CAAA,CAAI7U,CAAAA,CAChCqU,EAAM,YAAA,CAAeQ,EACvB,CAEA,IAAME,EAA4B,MAChC/yB,CAAAA,CACAC,CAAAA,CACAlG,CAAAA,GAC0B,CAC1B,GAAM,CAAE,QAAA,CAAAq4B,CAAAA,CAAU,OAAAra,CAAO,CAAA,CAAIya,GAAe,CAC5C,GAAI,CAAER,CAAAA,GAAqBI,CAAAA,CAAS,IAAA,CAAMra,CAAM,EAAG,CAAA,KAAQ,CAAqD,CAEhH,IAAM5X,EAAY,IAAA,CAAK,GAAA,EAAI,CAE3B,GAAI,CACF,IAAMxC,CAAAA,CAAS,MAAMy0B,CAAAA,CAAS,OAAUpyB,CAAAA,CAAOC,CAAAA,CAAOlG,CAAO,CAAA,CACvDkyB,EAAY,IAAA,CAAK,GAAA,EAAI,CAAI9rB,CAAAA,CAE/B,OAAAyyB,CAAAA,CAAWR,CAAAA,CAAS,IAAA,CAAMnG,CAAAA,CAAWtuB,EAAO,UAAA,CAAYy0B,CAAAA,CAAS,OAAO,CAAA,CAEjEz0B,CACT,OAAS6B,CAAAA,CAAK,CACZ,IAAMysB,CAAAA,CAAY,KAAK,GAAA,EAAI,CAAI9rB,CAAAA,CACzBlG,CAAAA,CAAQuF,aAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,OAAOA,CAAG,CAAC,CAAA,CAEhE,MAAAozB,EAAWR,CAAAA,CAAS,IAAA,CAAMnG,CAAAA,CAAW,MAAA,CAAWmG,EAAS,OAAA,CAASn4B,CAAK,CAAA,CAEjEA,CACR,CACF,CAAA,CAGA,OAAA,MAAA,CAAO,cAAA,CAAe84B,CAAAA,CAAc,QAAS,CAC3C,GAAA,CAAK,IAAM,CACT,IAAMC,CAAAA,CAAiD,MAAA,CAAO,MAAA,CAAO,IAAI,EACzE,IAAA,IAAWvd,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAK4c,EAAM,SAAS,CAAA,CAC3CW,CAAAA,CAAgBvd,CAAG,EAAI,CAAE,GAAG4c,CAAAA,CAAM,SAAA,CAAU5c,CAAG,CAAG,CAAA,CAGpD,OAAO,CAAE,GAAG4c,CAAAA,CAAO,SAAA,CAAWW,CAAgB,CAChD,EACA,UAAA,CAAY,IACd,CAAC,CAAA,CAEMD,CACT,CCxLA,SAASE,GAAiBxxB,CAAAA,CAAyBwoB,CAAAA,CAAQ,MAAkB,CAC3E,IAAIiJ,CAAAA,CAAY,KAAA,CACVC,EAAmB,EAAC,CACpBC,CAAAA,CAA2B,GAE3BC,CAAAA,CAAMpJ,CAAAA,CACR,CAAC5oB,CAAAA,CAAAA,GAAgBoF,IAAoB,OAAA,CAAQ,KAAA,CAAM,CAAA,WAAA,EAAcpF,CAAG,GAAI,GAAGoF,CAAI,CAAA,CAC/E,IAAM,CAAC,CAAA,CAEX,OAAO,CACL,MAAM,SAAU,CACd4sB,CAAAA,CAAI,CAAA,cAAA,EAAiB5xB,CAAAA,CAAO,IAAI,CAAA,EAAA,EAAKA,CAAAA,CAAO,SAAS,CAAA,CAAA,CAAG,CAAA,CACxDyxB,EAAY,KACd,CAAA,CACA,MAAM,UAAA,EAAa,CACjBA,CAAAA,CAAY,MACd,CAAA,CACA,WAAA,EAAc,CACZ,OAAOA,CACT,CAAA,CACA,eAAA,EAAkB,CAChB,OAAO,CAAE,KAAA,CAAO,IAAA,CAAM,UAAW,IAAA,CAAM,OAAA,CAAS,IAAK,CACvD,EACA,MAAM,SAAA,EAAY,CAChB,OAAOC,CACT,CAAA,CACA,MAAM,QAAA,CAAS1rB,CAAAA,CAAchB,EAA+B,CAC1D,OAAA4sB,EAAI,CAAA,aAAA,EAAgB5rB,CAAI,GAAIhB,CAAI,CAAA,CACzB,CACL,OAAA,CAAS,CAAC,CAAE,IAAA,CAAM,MAAA,CAAiB,IAAA,CAAM,mBAAmBgB,CAAI,CAAA,CAAG,CAAC,CACtE,CACF,CAAA,CACA,MAAM,aAAA,EAAgB,CACpB,OAAO2rB,CACT,CAAA,CACA,MAAM,YAAA,CAAaE,EAAa,CAC9B,OAAAD,CAAAA,CAAI,CAAA,iBAAA,EAAoBC,CAAG,CAAA,CAAE,CAAA,CACtB,CACL,QAAA,CAAU,CAAC,CAAE,GAAA,CAAAA,CAAAA,CAAK,IAAA,CAAM,oBAAoBA,CAAG,CAAA,CAAG,CAAC,CACrD,CACF,CAAA,CACA,MAAM,WAAA,EAAc,CAClB,OAAO,EACT,CAAA,CACA,MAAM,UAAU7rB,CAAAA,CAAc,CAC5B,OAAO,CACL,SAAU,CAAC,CAAE,IAAA,CAAM,MAAA,CAAiB,QAAS,CAAE,IAAA,CAAM,MAAA,CAAiB,IAAA,CAAM,eAAeA,CAAI,CAAA,CAAG,CAAE,CAAC,CACvG,CACF,CACF,CACF,CAMA,SAAS8rB,GACPC,CAAAA,CACA/d,CAAAA,CACAzG,CAAAA,CACS,CACT,IAAMrS,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CACf82B,EAAUD,CAAAA,CAAa,GAAA,CAAI/d,CAAG,CAAA,CAEpC,OAAI,CAACge,CAAAA,EAAW92B,CAAAA,CAAM82B,CAAAA,CAAQ,WAC5BD,CAAAA,CAAa,GAAA,CAAI/d,CAAAA,CAAK,CAAE,MAAO,CAAA,CAAG,SAAA,CAAW9Y,CAAAA,CAAM,GAAM,CAAC,CAAA,CACnD,IAAA,EAGL82B,CAAAA,CAAQ,KAAA,EAASzkB,EACZ,KAAA,EAGTykB,CAAAA,CAAQ,QACD,IAAA,CACT,CA0CO,SAASC,EAAAA,CAAiBjyB,CAAAA,CAAsC,CACrE,GAAM,CACJ,OAAA,CAAAkyB,CAAAA,CACA,eAAA,CAAAC,CAAAA,CAAkB,EAAC,CACnB,gBAAA,CAAAC,CAAAA,CAAmB,GACnB,MAAA,CAAA7d,CAAAA,CAAS,EAAC,CACV,YAAA8d,CAAAA,CAAc,KAAA,CACd,aAAA,CAAAC,CAAAA,CAAgB,KAChB,KAAA,CAAA9J,CAAAA,CAAQ,KACV,CAAA,CAAIxoB,EAGoB,CAACA,CAAAA,CAAO,aAAA,GAET,OAAO,QAAY,GAAA,EAAe,OAAA,CAAQ,KAAK,QAAA,GAAa,YAAA,CAE/E,QAAQ,IAAA,CACN,CAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,KAAA,CAQF,CAAA,CACSwoB,CAAAA,EACT,OAAA,CAAQ,KAAA,CACN,gGAEF,CAAA,CAAA,CAIJ,IAAM+J,CAAAA,CAAgBvyB,CAAAA,CAAO,aAAA,GAAmBwyB,CAAAA,EAAkChB,EAAAA,CAAiBgB,EAAchK,CAAK,CAAA,CAAA,CAChHiK,CAAAA,CAAoBzyB,CAAAA,CAAO,iBAAA,EAAqB,GAAA,CAGhDzC,CAAAA,CAAyB,CAC7B,OAAA,CAAS,IAAI,GAAA,CACb,eAAA,CAAiB,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ40B,CAAe,CAAC,CAAA,CAExD,YAAA,CAAc,IAAI,GAAA,CAClB,gBAAA,CAAkB,IAAI,GAAA,CACtB,gBAAA,CAAkB,IAAI,GAAA,CACtB,gBAAA,CAAkB,IAAI,GACxB,EAGIO,CAAAA,CAAkB,CAAA,CAGhBC,CAAAA,CAAkB,IAAI,GAAA,CAOtBC,CAAAA,CAAmB,IAAI,GAAA,CAG7B,SAASC,CAAAA,CAAgB1G,CAAAA,CAAkC,CACzD,OAAO,IAAI,OAAA,CAAQ,CAAC5oB,EAASyD,CAAAA,GAAW,CAEtC,GAAIzJ,CAAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI4uB,CAAS,CAAA,CAAG,CACzC5uB,CAAAA,CAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,CAAA,CACvC5uB,CAAAA,CAAM,gBAAA,CAAiB,OAAO4uB,CAAS,CAAA,CACvC5X,CAAAA,CAAO,kBAAA,GAAqB4X,CAAAA,CAAW,IAAI,CAAA,CAC3C5oB,CAAAA,EAAQ,CACR,MACF,CACA,GAAIhG,CAAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI4uB,CAAS,EAAG,CACzC5uB,CAAAA,CAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,CAAA,CACvC5uB,CAAAA,CAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,CAAA,CACvC,IAAM7V,CAAAA,CAASsc,CAAAA,CAAiB,GAAA,CAAIzG,CAAS,EAC7CyG,CAAAA,CAAiB,MAAA,CAAOzG,CAAS,CAAA,CACjC5X,CAAAA,CAAO,kBAAA,GAAqB4X,CAAAA,CAAW,KAAK,EAC5CnlB,CAAAA,CAAO,IAAI,KAAA,CACT,CAAA,kCAAA,EAAqCmlB,CAAS,CAAA,aAAA,EAAgB7V,CAAAA,CAAS,CAAA,EAAA,EAAKA,CAAM,CAAA,CAAA,CAAK,EAAE,CAAA,CAC3F,CAAC,CAAA,CACD,MACF,CAGA,IAAMzN,CAAAA,CAAY,UAAA,CAAW,IAAM,CACjC8pB,CAAAA,CAAgB,MAAA,CAAOxG,CAAS,CAAA,CAChC5uB,EAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,CAAA,CACvCnlB,CAAAA,CAAO,IAAI,KAAA,CACT,CAAA,0CAAA,EAA6CmlB,CAAS,CAAA,qCAAA,EAAwCsG,CAAiB,CAAA,0BAAA,EACtFtG,CAAS,CAAA,sBAAA,EAAyBA,CAAS,CAAA,cAAA,CACtE,CAAC,EACH,CAAA,CAAGsG,CAAiB,CAAA,CAGpBE,CAAAA,CAAgB,GAAA,CAAIxG,CAAAA,CAAW,CAAE,OAAA,CAAA5oB,CAAAA,CAAS,MAAA,CAAAyD,CAAAA,CAAQ,SAAA,CAAA6B,CAAU,CAAC,EAC/D,CAAC,CACH,CAGA,SAASiqB,CAAAA,CAAgB3G,CAAAA,CAAmB4G,CAAAA,CAAmBzc,CAAAA,CAAuB,CACpF,IAAM7S,CAAAA,CAASkvB,CAAAA,CAAgB,GAAA,CAAIxG,CAAS,CAAA,CACxC1oB,CAAAA,EACF,YAAA,CAAaA,CAAAA,CAAO,SAAS,CAAA,CAC7BkvB,CAAAA,CAAgB,MAAA,CAAOxG,CAAS,CAAA,CAChC5uB,CAAAA,CAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,CAAA,CACvC5X,CAAAA,CAAO,kBAAA,GAAqB4X,CAAAA,CAAW4G,CAAQ,CAAA,CAE3CA,CAAAA,CACFtvB,EAAO,OAAA,EAAQ,CAEfA,CAAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAChB,CAAA,kCAAA,EAAqC0oB,CAAS,CAAA,aAAA,EAAgB7V,CAAAA,CAAS,CAAA,EAAA,EAAKA,CAAM,CAAA,CAAA,CAAK,EAAE,CAAA,CAC3F,CAAC,IAICyc,CAAAA,CACFx1B,CAAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI4uB,CAAS,CAAA,EAEpC5uB,CAAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI4uB,CAAS,CAAA,CAChC7V,CAAAA,EACFsc,CAAAA,CAAiB,GAAA,CAAIzG,CAAAA,CAAW7V,CAAM,GAI1C,UAAA,CAAW,IAAM,CACf/Y,CAAAA,CAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,CAAA,CACvC5uB,EAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,CAAA,CACvCyG,CAAAA,CAAiB,MAAA,CAAOzG,CAAS,CAAA,CACjC5uB,EAAM,gBAAA,CAAiB,MAAA,CAAO4uB,CAAS,EACzC,CAAA,CAAGsG,CAAiB,CAAA,EAExB,CAGA,IAAMO,CAAAA,CAAiB,IAAI,GAAA,CAQ3B,IAAA,IAAWR,CAAAA,IAAgBN,CAAAA,CACzB30B,CAAAA,CAAM,QAAQ,GAAA,CAAIi1B,CAAAA,CAAa,IAAA,CAAM,CACnC,MAAA,CAAQA,CAAAA,CACR,MAAA,CAAQ,IAAA,CACR,KAAA,CAAO,EAAC,CACR,SAAA,CAAW,EAAC,CACZ,MAAA,CAAQ,cACV,CAAC,CAAA,CACDQ,CAAAA,CAAe,GAAA,CAAIR,CAAAA,CAAa,IAAA,CAAM,CACpC,KAAA,CAAO,IAAA,CACP,QAAA,CAAU,CAAA,CACV,WAAA,CAAaA,CAAAA,CAAa,KAAA,EAAO,WAAA,EAAe,EAAA,CAChD,SAAA,CAAWA,EAAa,KAAA,EAAO,SAAA,EAAa,GAC9C,CAAC,CAAA,CAIH,eAAeS,CAAAA,CAAcjtB,CAAAA,CAA6B,CACxD,IAAMktB,CAAAA,CAAc31B,CAAAA,CAAM,OAAA,CAAQ,GAAA,CAAIyI,CAAI,CAAA,CAC1C,GAAI,CAACktB,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuBltB,CAAI,CAAA,CAAE,CAAA,CAG/C,GAAIktB,CAAAA,CAAY,MAAA,GAAW,WAAA,CAI3B,CAAAA,CAAAA,CAAY,MAAA,CAAS,YAAA,CAErB,GAAI,CACF,IAAMC,CAAAA,CAASZ,CAAAA,CAAcW,CAAAA,CAAY,MAAM,CAAA,CAC/C,MAAMC,CAAAA,CAAO,OAAA,EAAQ,CAErBD,CAAAA,CAAY,MAAA,CAASC,CAAAA,CACrBD,CAAAA,CAAY,MAAA,CAAS,YAGrB,IAAME,CAAAA,CAASJ,CAAAA,CAAe,GAAA,CAAIhtB,CAAI,CAAA,CAClCotB,CAAAA,GACFA,CAAAA,CAAO,QAAA,CAAW,CAAA,CACdA,CAAAA,CAAO,KAAA,GACT,YAAA,CAAaA,CAAAA,CAAO,KAAK,CAAA,CACzBA,EAAO,KAAA,CAAQ,IAAA,CAAA,CAAA,CAKfD,CAAAA,CAAO,eAAA,EAAgB,CAAE,KAAA,GAC3BD,CAAAA,CAAY,KAAA,CAAQ,MAAMC,CAAAA,CAAO,SAAA,EAAU,CAAA,CAEzCA,CAAAA,CAAO,eAAA,EAAgB,CAAE,SAAA,GAC3BD,CAAAA,CAAY,UAAY,MAAMC,CAAAA,CAAO,aAAA,EAAc,CAAA,CAGrDD,CAAAA,CAAY,QAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAChC3e,CAAAA,CAAO,SAAA,GAAYvO,CAAI,EACzB,CAAA,MAASxN,CAAAA,CAAO,CAKd,GAJA06B,CAAAA,CAAY,MAAA,CAAS,OAAA,CACrBA,CAAAA,CAAY,KAAA,CAAQ16B,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CAC5E+b,CAAAA,CAAO,OAAA,GAAUvO,EAAMktB,CAAAA,CAAY,KAAK,CAAA,CAEpCZ,CAAAA,CAAe,CACjB,IAAMc,CAAAA,CAASJ,CAAAA,CAAe,GAAA,CAAIhtB,CAAI,CAAA,CACtC,GAAIotB,CAAAA,EAAUA,CAAAA,CAAO,QAAA,CAAWA,CAAAA,CAAO,YAAa,CAClDA,CAAAA,CAAO,QAAA,EAAA,CAEP,IAAMhR,CAAAA,CAAQ,IAAA,CAAK,GAAA,CACjBgR,CAAAA,CAAO,UAAY,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,CAAAA,CAAO,QAAA,CAAW,CAAC,CAAA,CAAI,IAAA,CAAK,QAAO,CAAI,GAAA,CACtE,GACF,CAAA,CACAA,CAAAA,CAAO,KAAA,CAAQ,UAAA,CAAW,IAAM,CAC9BA,CAAAA,CAAO,KAAA,CAAQ,IAAA,CACfH,CAAAA,CAAcjtB,CAAI,CAAA,CAAE,KAAA,CAAM,IAAM,CAAC,CAAC,EACpC,CAAA,CAAGoc,CAAK,EACV,CAAA,KAAWgR,CAAAA,EACT,OAAA,CAAQ,KAAA,CACN,CAAA,wCAAA,EAA2CA,CAAAA,CAAO,WAAW,CAAA,sBAAA,EAAyBptB,CAAI,CAAA,+BAAA,EAC3DA,CAAI,CAAA,qBAAA,CACrC,EAEJ,CAEA,MAAMktB,CAAAA,CAAY,KACpB,CAAA,CACF,CAGA,eAAeG,CAAAA,CAAiBrtB,CAAAA,CAA6B,CAE3D,IAAMotB,CAAAA,CAASJ,CAAAA,CAAe,GAAA,CAAIhtB,CAAI,CAAA,CAClCotB,CAAAA,EAAQ,KAAA,GACV,YAAA,CAAaA,CAAAA,CAAO,KAAK,CAAA,CACzBA,CAAAA,CAAO,MAAQ,IAAA,CACfA,CAAAA,CAAO,QAAA,CAAW,CAAA,CAAA,CAGpB,IAAMF,CAAAA,CAAc31B,CAAAA,CAAM,OAAA,CAAQ,IAAIyI,CAAI,CAAA,CAC1C,GAAI,EAAA,CAACktB,CAAAA,EAAe,CAACA,CAAAA,CAAY,MAAA,CAAA,CAIjC,GAAI,CACF,MAAMA,CAAAA,CAAY,MAAA,CAAO,UAAA,GAC3B,CAAA,OAAE,CACAA,CAAAA,CAAY,MAAA,CAAS,cAAA,CACrBA,CAAAA,CAAY,MAAA,CAAS,IAAA,CACrB3e,CAAAA,CAAO,YAAA,GAAevO,CAAI,EAC5B,CACF,CAGA,eAAestB,CAAAA,CACbC,CAAAA,CACAzuB,CAAAA,CACAE,EACA4rB,CAAAA,CACwB,CACxB,IAAMsC,CAAAA,CAAc31B,CAAAA,CAAM,OAAA,CAAQ,GAAA,CAAIg2B,CAAM,CAAA,CAC5C,GAAI,CAACL,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,CAAA,gCAAA,EAAmCK,CAAM,CAAA,sBAAA,EACnB,KAAA,CAAM,IAAA,CAAKh2B,CAAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,KAAK,IAAI,CAAA,EAAK,QAAQ,CAAA,CAC/E,CAAA,CAEF,GAAI,CAAC21B,CAAAA,CAAY,OACf,MAAM,IAAI,KAAA,CACR,CAAA,wBAAA,EAA2BK,CAAM,CAAA,wEAAA,EACsBA,CAAM,CAAA,UAAA,CAC/D,CAAA,CAGF,IAAMC,CAAAA,CAAgB,CAAA,EAAGD,CAAM,CAAA,CAAA,EAAIzuB,CAAI,CAAA,CAAA,CACjC1F,EAAa7B,CAAAA,CAAM,eAAA,CAAgB,GAAA,CAAIi2B,CAAa,CAAA,CAG1D,GAAIp0B,CAAAA,CAAY,CAEd,GAAIA,CAAAA,CAAW,SAAA,CAAW,CACxB,IAAM4yB,CAAAA,CAAUz0B,CAAAA,CAAM,YAAA,CAAa,IAAIi2B,CAAa,CAAA,CACpD,GAAI,CAAC1B,EAAAA,CAAev0B,CAAAA,CAAM,YAAA,CAAci2B,CAAAA,CAAep0B,CAAAA,CAAW,SAAS,CAAA,CAAG,CAC5E,IAAMq0B,CAAAA,CAAUzB,CAAAA,EAAS,SAAA,CAAY,IAAI,IAAA,CAAKA,CAAAA,CAAQ,SAAS,CAAA,CAAE,WAAA,EAAY,CAAI,SAAA,CACjF,MAAM,IAAI,KAAA,CACR,CAAA,yCAAA,EAA4CwB,CAAa,CAAA,GAAA,EACtDxB,CAAAA,EAAS,KAAA,EAAS,CAAC,CAAA,CAAA,EAAI5yB,EAAW,SAAS,CAAA,gCAAA,EACjCq0B,CAAO,CAAA,CAAA,CACtB,CACF,CACF,CAGA,GAAIr0B,CAAAA,CAAW,UAAA,CAAY,CACzB,IAAMs0B,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAU1uB,CAAI,EAAE,MAAA,CACrC,GAAI0uB,CAAAA,CAAUt0B,CAAAA,CAAW,UAAA,CACvB,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8Bs0B,CAAO,CAAA,GAAA,EAAMt0B,CAAAA,CAAW,UAAU,CAAA,CAAA,CAAG,CAEvF,CAGA,GAAIA,CAAAA,CAAW,IAAA,EAET,CADY,MAAMA,CAAAA,CAAW,IAAA,CAAKwxB,CAAAA,CAAO5rB,CAAI,CAAA,CAE/C,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCwuB,CAAa,CAAA,CAAE,CAAA,CAKnE,GAAIp0B,CAAAA,CAAW,eAAA,CAAiB,CAC9B,IAAM+sB,CAAAA,CAAY,CAAA,SAAA,EAAY,EAAEuG,CAAe,IAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,CACvDiB,CAAAA,CAAsC,CAC1C,EAAA,CAAIxH,CAAAA,CACJ,OAAAoH,CAAAA,CACA,IAAA,CAAAzuB,CAAAA,CACA,IAAA,CAAAE,CAAAA,CACA,WAAA,CAAa,IAAA,CAAK,GAAA,EACpB,CAAA,CAEAzH,CAAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI4uB,CAAAA,CAAWwH,CAAe,CAAA,CACrDpf,EAAO,iBAAA,GAAoBof,CAAe,CAAA,CAG1C,MAAMd,CAAAA,CAAgB1G,CAAS,EACjC,CACF,CAEA5X,CAAAA,CAAO,UAAA,GAAagf,CAAAA,CAAQzuB,CAAAA,CAAME,CAAI,CAAA,CAGtC,IAAM9I,EAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,CAChCg3B,CAAAA,CAAY,MAAA,CAAO,QAAA,CAASpuB,CAAAA,CAAME,CAAI,CAAA,CACtC,IAAI,OAAA,CAAe,CAACiN,CAAAA,CAAGjL,CAAAA,GACrB,UAAA,CACE,IAAMA,CAAAA,CAAO,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsBwsB,CAAa,CAAA,CAAE,CAAC,CAAA,CAC7Dp0B,GAAY,OAAA,EAAW,GACzB,CACF,CACF,CAAC,CAAA,CAED,OAAAmV,CAAAA,CAAO,eAAegf,CAAAA,CAAQzuB,CAAAA,CAAM5I,CAAM,CAAA,CAEnCA,CACT,CAGA,IAAM03B,CAAAA,CAAiB,CACrB,IAAA,CAAM,aAAA,CAEN,MAAA,CAAQ,SAAY,CACdvB,CAAAA,EACF,MAAM,QAAQ,GAAA,CACZ,KAAA,CAAM,IAAA,CAAK90B,CAAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,GAAA,CAAKyI,CAAAA,EACpCitB,CAAAA,CAAcjtB,CAAI,CAAA,CAAE,KAAA,CAAOoP,CAAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,qBAAA,EAAwBpP,CAAI,CAAA,CAAA,CAAA,CAAKoP,CAAC,CAAC,CACpF,CACF,EAEJ,CAAA,CAEA,SAAA,CAAW,SAAY,CAErB,IAAA,IAAWge,CAAAA,IAAUJ,CAAAA,CAAe,MAAA,GAC9BI,CAAAA,CAAO,KAAA,GACT,YAAA,CAAaA,CAAAA,CAAO,KAAK,CAAA,CACzBA,CAAAA,CAAO,KAAA,CAAQ,MAKnB,IAAA,GAAW,EAAG3vB,CAAM,CAAA,GAAKkvB,CAAAA,CACvB,YAAA,CAAalvB,CAAAA,CAAO,SAAS,CAAA,CAC7BA,CAAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,2DAA2D,CAAC,CAAA,CAEtFkvB,CAAAA,CAAgB,KAAA,EAAM,CAEtB,MAAM,OAAA,CAAQ,GAAA,CACZ,KAAA,CAAM,IAAA,CAAKp1B,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,GAAA,CAAKyI,CAAAA,EACpCqtB,CAAAA,CAAiBrtB,CAAI,CAAA,CAAE,KAAA,CAAOoP,CAAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6BpP,CAAI,CAAA,CAAA,CAAA,CAAKoP,CAAC,CAAC,CAC5F,CACF,EACF,CACF,CAAA,CAGA,eAAeye,CAAAA,CAAcjD,CAAAA,CAA+C,CAC1E,IAAA,IAAWkD,CAAAA,IAAW1B,CAAAA,CACpB,IAAA,GAAW,CAAC2B,CAAAA,CAAYb,CAAW,CAAA,GAAK31B,CAAAA,CAAM,OAAA,CAC5C,GAAK21B,CAAAA,CAAY,MAAA,CAAA,CAEjB,IAAA,IAAWc,CAAAA,IAAYd,EAAY,SAAA,CAOjC,GAJE,OAAOY,CAAAA,CAAQ,OAAA,EAAY,QAAA,CACvBG,EAAAA,CAAUD,CAAAA,CAAS,IAAKF,CAAAA,CAAQ,OAAO,CAAA,CACvCA,CAAAA,CAAQ,OAAA,CAAQ,IAAA,CAAKE,CAAAA,CAAS,GAAG,CAAA,CAGrC,GAAI,CACF,IAAM93B,CAAAA,CAAS,MAAMg3B,CAAAA,CAAY,MAAA,CAAO,aAAac,CAAAA,CAAS,GAAG,CAAA,CAC3Dv0B,CAAAA,CAAUvD,CAAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA,EAAQ,EAAA,CACtCjD,CAAAA,CAAQ66B,CAAAA,CAAQ,SAAA,CAAYA,CAAAA,CAAQ,SAAA,CAAUr0B,CAAO,EAAIA,CAAAA,CAE/DmxB,CAAAA,CAAMkD,CAAAA,CAAQ,OAAO,CAAA,CAAI76B,CAAAA,CACzBsb,CAAAA,CAAO,gBAAA,GAAmBwf,CAAAA,CAAYC,CAAAA,CAAS,GAAA,CAAK93B,CAAM,EAC5D,CAAA,MAAS1D,CAAAA,CAAO,CACd,QAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2Bw7B,CAAAA,CAAS,GAAG,CAAA,CAAA,CAAA,CAAKx7B,CAAK,EACjE,CAAA,CAKV,CAEA,OAAO,CACL,MAAA,CAAAo7B,CAAAA,CAEA,MAAM,OAAA,EAAU,CACd,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAKr2B,CAAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI01B,CAAa,CAAC,EACvE,CAAA,CAEA,aAAA,CAAAA,CAAAA,CAEA,MAAM,YAAa,CACjB,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK11B,CAAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI81B,CAAgB,CAAC,EAC1E,CAAA,CAEA,iBAAAA,CAAAA,CAEA,QAAA,EAAW,CACT,IAAM3B,CAAAA,CAAQ,IAAI,GAAA,CAClB,IAAA,GAAW,CAAC1rB,CAAAA,CAAMktB,CAAW,CAAA,GAAK31B,CAAAA,CAAM,OAAA,CACtCm0B,CAAAA,CAAM,GAAA,CAAI1rB,EAAMktB,CAAAA,CAAY,KAAK,CAAA,CAEnC,OAAOxB,CACT,CAAA,CAEA,YAAA,EAAe,CACb,IAAMC,CAAAA,CAAY,IAAI,GAAA,CACtB,IAAA,GAAW,CAAC3rB,CAAAA,CAAMktB,CAAW,CAAA,GAAK31B,EAAM,OAAA,CACtCo0B,CAAAA,CAAU,GAAA,CAAI3rB,CAAAA,CAAMktB,CAAAA,CAAY,SAAS,CAAA,CAE3C,OAAOvB,CACT,CAAA,CAEA,MAAM,QAAA,CAAS4B,CAAAA,CAAQzuB,CAAAA,CAAME,CAAAA,CAAM4rB,CAAAA,CAAO,CACxC,OAAO0C,CAAAA,CAAwBC,CAAAA,CAAQzuB,CAAAA,CAAME,CAAAA,CAAM4rB,CAAK,CAC1D,CAAA,CAEA,MAAM,cAAA,CAAe2C,CAAAA,CAAQzuB,CAAAA,CAAME,CAAAA,CAAM,CACvC,IAAMkuB,CAAAA,CAAc31B,EAAM,OAAA,CAAQ,GAAA,CAAIg2B,CAAM,CAAA,CAC5C,GAAI,CAACL,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,CAAA,gCAAA,EAAmCK,CAAM,CAAA,sBAAA,EACnB,KAAA,CAAM,IAAA,CAAKh2B,CAAAA,CAAM,QAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAK,QAAQ,CAAA,CAC/E,CAAA,CAEF,GAAI,CAAC21B,CAAAA,CAAY,MAAA,CACf,MAAM,IAAI,KAAA,CACR,2BAA2BK,CAAM,CAAA,wEAAA,EACsBA,CAAM,CAAA,UAAA,CAC/D,CAAA,CAEFhf,CAAAA,CAAO,UAAA,GAAagf,CAAAA,CAAQzuB,CAAAA,CAAME,CAAI,CAAA,CACtC,IAAM9I,CAAAA,CAAS,MAAMg3B,CAAAA,CAAY,MAAA,CAAO,SAASpuB,CAAAA,CAAME,CAAI,CAAA,CAC3D,OAAAuP,CAAAA,CAAO,YAAA,GAAegf,CAAAA,CAAQzuB,CAAAA,CAAM5I,CAAM,CAAA,CACnCA,CACT,CAAA,CAEA,MAAM,YAAA,CAAaq3B,CAAAA,CAAQ1B,CAAAA,CAAK,CAC9B,IAAMqB,CAAAA,CAAc31B,CAAAA,CAAM,OAAA,CAAQ,GAAA,CAAIg2B,CAAM,CAAA,CAC5C,GAAI,CAACL,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,CAAA,gCAAA,EAAmCK,CAAM,CAAA,sBAAA,EACnB,MAAM,IAAA,CAAKh2B,CAAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,GAAK,QAAQ,CAAA,CAC/E,CAAA,CAEF,GAAI,CAAC21B,CAAAA,CAAY,MAAA,CACf,MAAM,IAAI,KAAA,CACR,CAAA,wBAAA,EAA2BK,CAAM,CAAA,wEAAA,EACsBA,CAAM,CAAA,UAAA,CAC/D,CAAA,CAEF,IAAMr3B,CAAAA,CAAS,MAAMg3B,CAAAA,CAAY,MAAA,CAAO,YAAA,CAAarB,CAAG,CAAA,CACxD,OAAAtd,EAAO,gBAAA,GAAmBgf,CAAAA,CAAQ1B,CAAAA,CAAK31B,CAAM,CAAA,CACtCA,CACT,CAAA,CAEA,aAAA,CAAA23B,CAAAA,CAEA,eAAA,CAAgB7tB,CAAAA,CAAM,CACpB,OAAOzI,CAAAA,CAAM,OAAA,CAAQ,GAAA,CAAIyI,CAAI,CAC/B,CAAA,CAEA,oBAAA,EAAuB,CACrB,OAAO,IAAI,GAAA,CAAIzI,CAAAA,CAAM,OAAO,CAC9B,CAAA,CAEA,OAAA,CAAQ4uB,CAAAA,CAAmB,CAEzB,GAAI,CADY5uB,EAAM,gBAAA,CAAiB,GAAA,CAAI4uB,CAAS,CAAA,EACpC,CAACwG,CAAAA,CAAgB,GAAA,CAAIxG,CAAS,EAC5C,MAAM,IAAI,KAAA,CACR,CAAA,qDAAA,EAAwDA,CAAS,CAAA,qBAAA,EAC5C,KAAA,CAAM,IAAA,CAAK5uB,EAAM,gBAAA,CAAiB,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAK,QAAQ,CAAA,CACvF,CAAA,CAEFu1B,CAAAA,CAAgB3G,CAAAA,CAAW,IAAI,EACjC,CAAA,CAEA,MAAA,CAAOA,EAAmB7V,CAAAA,CAAiB,CAEzC,GAAI,CADY/Y,CAAAA,CAAM,gBAAA,CAAiB,GAAA,CAAI4uB,CAAS,CAAA,EACpC,CAACwG,CAAAA,CAAgB,GAAA,CAAIxG,CAAS,CAAA,CAC5C,MAAM,IAAI,MACR,CAAA,qDAAA,EAAwDA,CAAS,CAAA,qBAAA,EAC5C,KAAA,CAAM,IAAA,CAAK5uB,CAAAA,CAAM,gBAAA,CAAiB,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAK,QAAQ,CAAA,CACvF,CAAA,CAEFu1B,EAAgB3G,CAAAA,CAAW,KAAA,CAAO7V,CAAM,EAC1C,CAAA,CAEA,mBAAA,EAAsB,CACpB,OAAO,MAAM,IAAA,CAAK/Y,CAAAA,CAAM,gBAAA,CAAiB,MAAA,EAAQ,CACnD,CAAA,CAEA,kBAAA,CAAmB4uB,EAAuC,CACxD,OAAOyG,CAAAA,CAAiB,GAAA,CAAIzG,CAAS,CACvC,CACF,CACF,CAOA,IAAM+H,EAAAA,CAAY,IAAI,GAAA,CAChBC,EAAAA,CAAsB,GAAA,CAG5B,SAASF,GAAU/iB,CAAAA,CAAarX,CAAAA,CAA0B,CACxD,IAAIkM,CAAAA,CAAQmuB,EAAAA,CAAU,GAAA,CAAIr6B,CAAO,CAAA,CACjC,GAAI,CAACkM,CAAAA,CAAO,CAEV,IAAMquB,CAAAA,CAAev6B,CAAAA,CAClB,QAAQ,OAAA,CAAS,cAAc,CAAA,CAC/B,OAAA,CAAQ,KAAA,CAAO,UAAU,CAAA,CACzB,OAAA,CAAQ,KAAA,CAAO,cAAc,CAAA,CAC7B,OAAA,CAAQ,mBAAA,CAAqB,MAAM,CAAA,CACnC,OAAA,CAAQ,gBAAiB,IAAI,CAAA,CAC7B,OAAA,CAAQ,WAAA,CAAa,OAAO,CAAA,CAC5B,OAAA,CAAQ,eAAA,CAAiB,GAAG,CAAA,CAI/B,GAHAkM,CAAAA,CAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIquB,CAAY,CAAA,CAAA,CAAG,EAGlCF,EAAAA,CAAU,IAAA,EAAQC,EAAAA,CAAqB,CACzC,IAAMtuB,CAAAA,CAAWquB,EAAAA,CAAU,IAAA,EAAK,CAAE,IAAA,EAAK,CAAE,KAAA,CACrCruB,CAAAA,GAAa,MAAA,EAAWquB,EAAAA,CAAU,MAAA,CAAOruB,CAAQ,EACvD,CACAquB,EAAAA,CAAU,GAAA,CAAIr6B,CAAAA,CAASkM,CAAK,EAC9B,CACA,OAAOA,CAAAA,CAAM,IAAA,CAAKmL,CAAG,CACvB,CAeO,SAASmjB,EAAAA,CACd3C,EAQC,CACD,IAAMx1B,CAAAA,CAOD,EAAC,CAEN,IAAA,GAAW,CAACq3B,CAAAA,CAAQe,CAAW,CAAA,GAAK5C,CAAAA,CAClC,IAAA,IAAW5sB,CAAAA,IAAQwvB,CAAAA,CACjBp4B,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM,UAAA,CACN,QAAA,CAAU,CACR,IAAA,CAAM,CAAA,EAAGq3B,CAAM,CAAA,CAAA,EAAIzuB,EAAK,IAAI,CAAA,CAAA,CAC5B,WAAA,CAAaA,CAAAA,CAAK,WAAA,EAAe,CAAA,MAAA,EAASA,CAAAA,CAAK,IAAI,GACnD,UAAA,CAAYA,CAAAA,CAAK,WACnB,CACF,CAAC,CAAA,CAIL,OAAO5I,CACT,CAWO,SAASq4B,EAAAA,CACdhB,CAAAA,CACAzuB,CAAAA,CACAE,CAAAA,CACwB,CACxB,OAAO,CAAE,IAAA,CAAM,eAAA,CAAiB,MAAA,CAAAuuB,CAAAA,CAAQ,IAAA,CAAAzuB,CAAAA,CAAM,IAAA,CAAAE,CAAK,CACrD,CAKO,SAASwvB,EAAAA,CAAgBjB,CAAAA,CAAgB1B,CAAAA,CAAyC,CACvF,OAAO,CAAE,IAAA,CAAM,mBAAA,CAAqB,MAAA,CAAA0B,CAAAA,CAAQ,GAAA,CAAA1B,CAAI,CAClD,CAKO,SAAS4C,EAAAA,CACdlB,CAAAA,CACArwB,CAAAA,CACA8B,CAAAA,CACyB,CACzB,OAAO,CAAE,KAAM,gBAAA,CAAkB,MAAA,CAAAuuB,CAAAA,CAAQ,MAAA,CAAArwB,CAAAA,CAAQ,IAAA,CAAA8B,CAAK,CACxD,CAKO,SAAS0vB,EAAAA,CACdnB,CAAAA,CACA15B,CAAAA,CAC6B,CAC7B,OAAO,CAAE,IAAA,CAAM,qBAAsB,MAAA,CAAA05B,CAAAA,CAAQ,OAAA,CAAA15B,CAAQ,CACvD,CCvvBA,SAAS86B,EAAAA,CAAc/D,CAAAA,CAAwB,CAC7C,OAAOgE,0BAAAA,CAA0BhE,CAAAA,CAAOn4B,EAAS,CACnD,CAGA,SAASo8B,EAAAA,CAAcjE,CAAAA,CAAYrzB,CAAAA,CAAyB,CAC1Du3B,0BAAAA,CAAclE,CAAAA,CAAOn4B,EAAAA,CAAW8E,CAAK,EACvC,CAGA,SAASw3B,EAAAA,CAAiBnE,CAAAA,CAA2B,CACnD,OAAOgE,0BAAAA,CAA6BhE,EAAOl4B,EAAY,CACzD,CAGA,SAASs8B,EAAAA,CAAiBpE,CAAAA,CAAYrzB,CAAAA,CAA4B,CAChEu3B,0BAAAA,CAAclE,CAAAA,CAAOl4B,EAAAA,CAAc6E,CAAK,EAC1C,CAGA,SAAS03B,EAAAA,CAAgBrE,EAAuB,CAC9C,OAAOgE,0BAAAA,CAAyBhE,CAAAA,CAAOj4B,EAAgB,CACzD,CAGA,SAASu8B,GAAgBtE,CAAAA,CAAYjyB,CAAAA,CAA2B,CAC9Dm2B,0BAAAA,CAAclE,CAAAA,CAAOj4B,EAAAA,CAAkBgG,CAAQ,EACjD,CAGA,SAASw2B,EAAAA,CAAavE,CAAAA,CAAwB,CAC5C,OAAOgE,0BAAAA,CAA0BhE,CAAAA,CAAOh4B,EAAc,CACxD,CAGA,SAASw8B,EAAAA,CAAaxE,CAAAA,CAAYyE,CAAAA,CAA6B,CAC7DP,0BAAAA,CAAclE,EAAOh4B,EAAAA,CAAgBy8B,CAAS,EAChD,CAIA,SAASC,EAAAA,CAAqB1E,CAAAA,CAA+B,CAC3D,OAAO,CACL,KAAA,CAAO+D,EAAAA,CAAc/D,CAAK,CAAA,CAC1B,QAAA,CAAUmE,EAAAA,CAAiBnE,CAAK,CAAA,CAChC,YAAA,CAAcqE,EAAAA,CAAgBrE,CAAK,CAAA,CACnC,SAAA,CAAWuE,EAAAA,CAAavE,CAAK,CAC/B,CACF,CAOA,SAAS2E,EAAAA,CACPjF,CAAAA,CACqB,CAErB,IAAMp0B,EAA8B,EAAC,CAErC,IAAA,GAAW,CAAC6I,CAAAA,CAAI3F,CAAU,CAAA,GAAK,MAAA,CAAO,QAAQkxB,CAAW,CAAA,CACvDp0B,CAAAA,CAAO6I,CAAE,CAAA,CAAI,CACX,QAAA,CAAU3F,CAAAA,CAAW,UAAY,CAAA,CAEjC,IAAA,CAAOwxB,CAAAA,EAAe,CACpB,IAAMrzB,CAAAA,CAAQ+3B,EAAAA,CAAqB1E,CAAK,CAAA,CAClC4E,CAAAA,CAAgB,CAAE,GAAG5E,CAAAA,CAAO,GAAGrzB,CAAM,CAAA,CAC3C,OAAO6B,CAAAA,CAAW,IAAA,CAAKo2B,CAAa,CACtC,CAAA,CAEA,OAAA,CAAU5E,CAAAA,EAAe,CACvB,IAAMrzB,CAAAA,CAAQ+3B,EAAAA,CAAqB1E,CAAK,CAAA,CAClC4E,CAAAA,CAAgB,CAAE,GAAG5E,EAAO,GAAGrzB,CAAM,CAAA,CAC3C,OAAO,OAAO6B,CAAAA,CAAW,OAAA,EAAY,UAAA,CACjCA,CAAAA,CAAW,OAAA,CAAQo2B,CAAa,CAAA,CAChCp2B,CAAAA,CAAW,OACjB,CACF,CAAA,CAGF,OAAOlD,CACT,CAGA,SAASu5B,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CAOAC,CAAAA,CACqB,CAErB,IAAM15B,CAAAA,CAA8B,EAAC,CAErC,IAAA,GAAW,CAAC6I,CAAAA,CAAIiR,CAAQ,CAAA,GAAK,OAAO,OAAA,CAAQ0f,CAAS,CAAA,CACnDx5B,CAAAA,CAAO6I,CAAE,CAAA,CAAI,CACX,WAAA,CAAaiR,CAAAA,CAAS,WAAA,CACtB,GAAA,CAAKA,CAAAA,CAAS,GAAA,CAEd,OAAA,CAAS,MAAO1W,CAAAA,CAAkBu2B,IAAa,CAC7C,IAAMt4B,CAAAA,CAAQ+3B,EAAAA,CAAqBO,CAAAA,CAAI,KAAK,CAAA,CAGtCC,CAAAA,CAAkD,CACtD,KAAA,CAHoB,CAAE,GAAGD,CAAAA,CAAI,KAAA,CAAO,GAAGt4B,CAAM,EAI7C,QAAA,CAAU,MAAUgB,CAAAA,CAAkBC,CAAAA,CAAeiK,CAAAA,GAC5CktB,CAAAA,CACLp3B,CAAAA,CACAC,CAAAA,CACAu3B,EAAAA,CAA2BH,CAAAA,EAAgB,CAAA,CAC3CntB,CACF,CAAA,CAEF,MAAA,CAAQotB,CAAAA,CAAI,MACd,CAAA,CACA,MAAM7f,CAAAA,CAAS,OAAA,CAAQ1W,CAAAA,CAAKw2B,CAAe,EAC7C,CACF,EAGF,OAAO55B,CACT,CAIA,SAAS65B,EAAAA,CAA2BnF,CAAAA,CAA+B,CACjE,OAAO0E,GAAqB1E,CAAK,CACnC,CAwJA,SAASoF,EAAAA,CACPj7B,CAAAA,CACAyP,CAAAA,CACApO,CAAAA,CACmB,CACnB,OAAI,OAAOrB,CAAAA,EAAc,UAAA,CAChB,CACL,IAAA,CAAM,CAAA,EAAGqB,CAAI,CAAA,WAAA,EAAcoO,CAAK,CAAA,CAAA,CAChC,EAAA,CAAIzP,CAAAA,CACJ,QAAA,CAAU,IACZ,CAAA,CAEKA,CACT,CAGA,SAASk7B,EAAAA,CACPlU,CAAAA,CACA/hB,CAAAA,CACQ,CACR,GAAM,CAAE,OAAA,CAAAk2B,CAAAA,CAAU,aAAA,CAAe,WAAA,CAAAlU,CAAAA,CAAc,GAAA,CAAK,UAAA,CAAAC,CAAAA,CAAa,GAAK,CAAA,CAAIjiB,CAAAA,CACtEoiB,CAAAA,CACJ,OAAQ8T,CAAAA,EACN,KAAK,cACH9T,CAAAA,CAAQJ,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGD,CAAAA,CAAU,CAAC,CAAA,CAC7C,MACF,KAAK,QAAA,CACHK,CAAAA,CAAQJ,CAAAA,CAAcD,CAAAA,CACtB,MAEF,QACEK,CAAAA,CAAQJ,EACZ,CACA,OAAO,IAAA,CAAK,GAAA,CAAII,CAAAA,CAAOH,CAAU,CACnC,CAGA,eAAekU,EAAAA,CACbp7B,CAAAA,CACArB,CAAAA,CACAuB,CAAAA,CAC0B,CAC1B,GAAM,CAAE,MAAAm7B,CAAM,CAAA,CAAIr7B,CAAAA,CACZs7B,CAAAA,CAAcD,CAAAA,EAAO,QAAA,EAAY,CAAA,CAEnC7U,CAAAA,CACJ,IAAA,IAASQ,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAWsU,CAAAA,CAAatU,CAAAA,EAAAA,CAC5C,GAAI,CACF,OAAO,MAAMhnB,CAAAA,CAAU,EAAA,CAAGrB,CAAAA,CAAMuB,CAAO,CACzC,CAAA,MAASzC,CAAAA,CAAO,CAGd,GAFA+oB,CAAAA,CAAY/oB,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,OAAOA,CAAK,CAAC,CAAA,CAEhEupB,CAAAA,CAAUsU,CAAAA,CAAa,CACzB,IAAMjU,CAAAA,CAAQ6T,GAAoBlU,CAAAA,CAASqU,CAAAA,EAAS,EAAE,CAAA,CACtD,MAAM,IAAI,OAAA,CAAS7yB,GAAY,UAAA,CAAWA,CAAAA,CAAS6e,CAAK,CAAC,EAC3D,CACF,CAGF,MAAMb,CACR,CAGA,SAAS+U,EAAAA,CACPvU,CAAAA,CACA/hB,CAAAA,CACQ,CACR,GAAM,CAAE,OAAA,CAAAk2B,CAAAA,CAAU,aAAA,CAAe,WAAA,CAAAlU,CAAAA,CAAc,GAAA,CAAM,UAAA,CAAAC,CAAAA,CAAa,GAAM,CAAA,CAAIjiB,CAAAA,CACxEoiB,CAAAA,CACJ,OAAQ8T,CAAAA,EACN,KAAK,cACH9T,CAAAA,CAAQJ,CAAAA,CAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGD,CAAAA,CAAU,CAAC,CAAA,CAC7C,MACF,KAAK,QAAA,CACHK,CAAAA,CAAQJ,CAAAA,CAAcD,CAAAA,CACtB,MAEF,QACEK,EAAQJ,EACZ,CACA,OAAO,IAAA,CAAK,GAAA,CAAII,CAAAA,CAAOH,CAAU,CACnC,CAGA,eAAesU,EAAAA,CACblvB,CAAAA,CACA9I,CAAAA,CACAC,CAAAA,CACAlG,CAAAA,CACAk+B,CAAAA,CACuB,CACvB,IAAMH,CAAAA,CAAcG,CAAAA,EAAa,QAAA,EAAY,CAAA,CACvC9T,CAAAA,CAAc8T,CAAAA,EAAa,WAAA,GAAgB,IAAM,IAAA,CAAA,CACjD7T,CAAAA,CAAU6T,CAAAA,EAAa,OAAA,CAEzBjV,CAAAA,CACJ,IAAA,IAASQ,CAAAA,CAAU,CAAA,CAAGA,GAAWsU,CAAAA,CAAatU,CAAAA,EAAAA,CAC5C,GAAI,CACF,OAAO,MAAM1a,CAAAA,CAAU9I,CAAAA,CAAOC,CAAAA,CAAOlG,CAAO,CAC9C,CAAA,MAASE,CAAAA,CAAO,CAId,GAHA+oB,CAAAA,CAAY/oB,aAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CAAA,CAGhEupB,CAAAA,CAAUsU,CAAAA,EAAe3T,CAAAA,CAAYnB,CAAS,CAAA,CAAG,CACnD,IAAMa,CAAAA,CAAQkU,GAAyBvU,CAAAA,CAASyU,CAAAA,EAAe,EAAE,CAAA,CACjE7T,CAAAA,GAAUZ,CAAAA,CAASR,CAAAA,CAAWa,CAAK,CAAA,CACnC,MAAM,IAAI,OAAA,CAAS7e,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAAS6e,CAAK,CAAC,EAC3D,CAAA,KAEE,KAEJ,CAGF,MAAMb,CACR,CA8CO,SAASiI,EAAAA,CAEdlxB,CAAAA,CAAuD,CACvD,GAAM,CACJ,MAAA,CAAA+O,CAAAA,CACA,WAAA,CAAAovB,EAAc,EAAC,CACf,IAAA,CAAA73B,CAAAA,CACA,WAAA,CAAA0xB,CAAAA,CAAc,EAAC,CACf,SAAA,CAAAoF,CAAAA,CAAY,EAAC,CACb,UAAA,CAAAxvB,CAAAA,CAAa,EAAC,CACd,kBAAAwwB,CAAAA,CACA,oBAAA,CAAAC,CAAAA,CAAuB,IAAA,CACvB,cAAA,CAAApO,CAAAA,CACA,OAAA,CAAAqO,CAAAA,CAAU,EAAC,CACX,KAAA,CAAApO,CAAAA,CAAQ,KAAA,CACR,iBAAA,CAAAiK,CAAAA,CAAoB,GAAA,CACpB,WAAAoE,CAAAA,CACA,KAAA,CAAAx4B,CAAAA,CAAQ,EAAC,CACT,MAAA,CAAAqqB,CAAAA,CACA,cAAA,CAAAC,CACF,CAAA,CAAIrwB,CAAAA,CAGJ,GAAI,CAACq+B,CAAAA,EAAwB,CAACD,CAAAA,CAC5B,MAAM,IAAI,KAAA,CACR,CAAA;AAAA;AAAA,8EAAA,CAIF,CAAA,CAIF,IAAMI,CAAAA,CAAiB,CACrB,KAAA,CAAO,CACL,GAAGj+B,EAAAA,CAAyB,KAAA,CAC5B,GAAG49B,CACL,CAAA,CACA,YAAa,EAAC,CACd,MAAA,CAAQ,EAAC,CACT,YAAA,CAAc,EAChB,EAGIM,CAAAA,CAUAC,CAAAA,CAIEC,CAAAA,CACJ1B,EAAAA,CAAkCjF,CAAW,CAAA,CAG3C/H,CAAAA,GACF0O,CAAAA,CAAqB,cAAmB,CACtC,QAAA,CAAU,GAAA,CAEV,IAAA,CAAOrG,CAAAA,EAAe+D,EAAAA,CAAc/D,CAAK,CAAA,CAAE,UAAA,CAAarI,CAAAA,CACxD,OAAA,CAAS,CAAE,IAAA,CAAM,yBAA0B,CAC7C,CAAA,CAAA,CAKF,IAAM2O,CAAAA,CACJzB,EAAAA,CACEC,CAAAA,CACA,CAACn3B,CAAAA,CAAOC,CAAAA,CAAO24B,CAAAA,CAAc1uB,CAAAA,GAASsuB,EAAyBx4B,CAAAA,CAAOC,CAAAA,CAAO24B,CAAAA,CAAc1uB,CAAI,CAAA,CAC/F,IAAMuuB,CAAAA,CAAO,KACf,EAGFE,CAAAA,CAAmB,OAAA,CAAa,CAC9B,WAAA,CAAaE,6BAAAA,CAAyC,yBAAyB,CAAA,CAE/E,OAAA,CAAS,MAAOC,CAAAA,CAAmBxB,CAAAA,GAAa,CAC9C,IAAMyB,CAAAA,CAAe3C,EAAAA,CAAckB,CAAAA,CAAI,KAAK,CAAA,CAC5ChB,EAAAA,CAAcgB,CAAAA,CAAI,KAAA,CAAO,CACvB,GAAGyB,CAAAA,CACH,MAAA,CAAQ,QACV,CAAC,EACH,CACF,CAAA,CAGA,IAAMC,CAAAA,CAAiBC,iCAAAA,CACrB,yBAAA,CACA,EACF,CAAA,CAIMC,CAAAA,CAAqBC,iBAAAA,CAAa,4BAAA,CAA8B,CACpE,MAAA,CAAQZ,CAAAA,CACR,IAAA,CAAOlG,CAAAA,EAAU,CAmBf,GAlBAiE,EAAAA,CAAcjE,CAAAA,CAAO,CACnB,MAAA,CAAQ,OACR,YAAA,CAAc,IAAA,CACd,KAAA,CAAO,IAAA,CACP,MAAA,CAAQ,IAAA,CACR,KAAA,CAAO,IAAA,CACP,WAAY,CAAA,CACZ,SAAA,CAAW,CAAA,CACX,SAAA,CAAW,IAAA,CACX,WAAA,CAAa,IACf,CAAC,EACDoE,EAAAA,CAAiBpE,CAAAA,CAAO,CACtB,OAAA,CAAS,EAAC,CACV,QAAA,CAAU,EAAC,CACX,QAAA,CAAU,EACZ,CAAC,CAAA,CACDsE,EAAAA,CAAgBtE,CAAAA,CAAO,EAAE,CAAA,CACzBwE,EAAAA,CAAaxE,CAAAA,CAAO,EAAE,CAAA,CAClBhyB,CAAAA,CAAM,CACR,IAAMrB,CAAAA,CAAQ+3B,EAAAA,CAAqB1E,CAAK,CAAA,CAClC4E,CAAAA,CAAgB,CAAE,GAAG5E,EAAO,GAAGrzB,CAAM,CAAA,CAC3CqB,CAAAA,CAAK42B,CAAa,EACpB,CACF,CAAA,CACA,WAAA,CAAayB,CAAAA,CACb,SAAA,CAAWC,CACb,CAAC,CAAA,CAGDF,CAAAA,CAASW,iBAAAA,CAAa,CACpB,MAAA,CAAQF,CAAAA,CACR,OAAA,CAAS,CAAC,GAAGb,CAAAA,CAASW,CAAc,CAAA,CACpC,MAAO/O,CAAAA,CAAQ,CAAE,UAAA,CAAY,IAAK,CAAA,CAAI,MACxC,CAAC,CAAA,CAEDwO,EAAO,KAAA,EAAM,CAGb,eAAerB,CAAAA,CACbp3B,CAAAA,CACAC,CAAAA,CACAo5B,CAAAA,CACAnvB,CAAAA,CACAovB,CAAAA,CACuB,CAEvB,OAAIlP,CAAAA,CACKA,CAAAA,CAAe,OAAA,CAAQ,IAC5BmP,CAAAA,CAA+Bv5B,EAAOC,CAAAA,CAAOo5B,CAAAA,CAAenvB,CAAAA,CAAMovB,CAAW,CAC/E,CAAA,CAEKC,CAAAA,CAA+Bv5B,CAAAA,CAAOC,EAAOo5B,CAAAA,CAAenvB,CAAAA,CAAMovB,CAAW,CACtF,CAEA,eAAeC,CAAAA,CACbv5B,CAAAA,CACAC,EACAo5B,CAAAA,CACAnvB,CAAAA,CACAovB,CAAAA,CACuB,CACvB,IAAMn5B,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAG3B,GAAIgqB,CAAAA,CAAQ,CACV,IAAMvmB,CAAAA,CAAkBumB,CAAAA,CAAO,kBAAA,GAC/B,GAAIvmB,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAAG,CAC9B,IAAM41B,CAAAA,CAAa51B,CAAAA,CAChB,IAAKK,CAAAA,EAAM,CAAA,EAAGA,CAAAA,CAAE,IAAI,CAAA,EAAA,EAAKA,CAAAA,CAAE,OAAO,CAAA,CAAE,EACpC,IAAA,CAAK;AAAA,CAAI,CAAA,CACZjE,EAAQ,CACN,GAAGA,EACH,YAAA,CAAA,CAAeA,CAAAA,CAAM,cAAgB,EAAA,EAAM;;AAAA;AAAA,CAAA,CAAgCw5B,CAC7E,EACF,CACF,CAGA15B,EAAM,YAAA,GAAe,CACnB,UAAWE,CAAAA,CAAM,IAAA,CACjB,MAAAC,CAAAA,CACA,SAAA,CAAWE,CACb,CAAC,CAAA,CAGD,IAAMs5B,CAAAA,CAA2BH,CAAAA,EAAa,kBAAoB,MAAA,CAC9DA,CAAAA,CAAY,gBACX3xB,CAAAA,CAAW,KAAA,EAAS,EAAC,CACpB+xB,CAAAA,CAA4BJ,GAAa,gBAAA,GAAqB,MAAA,CAChEA,EAAY,gBAAA,CACX3xB,CAAAA,CAAW,QAAU,EAAC,CAGrBgyB,EAAsBF,CAAAA,CAAyB,GAAA,CAAI,CAACG,CAAAA,CAAGv3B,CAAAA,GAC3Do1B,EAAAA,CAAmBmC,CAAAA,CAAGv3B,CAAAA,CAAG,OAAO,CAClC,CAAA,CACA,IAAA,IAAW7F,KAAam9B,CAAAA,CAAqB,CAC3C,GAAM,CAAE,IAAA,CAAAlyB,CAAK,CAAA,CAAIjL,CAAAA,CACXE,EAAU,CACd,SAAA,CAAWsD,EAAM,IAAA,CACjB,KAAA,CAAAC,EACA,KAAA,CAAOw4B,CAAAA,CAAO,MAAM,MAAA,CAAO,QAAA,EAC7B,CAAA,CACMoB,CAAAA,CAAiB,KAAK,GAAA,EAAI,CAC1Bl8B,EAAS,MAAMi6B,EAAAA,CACnBp7B,EACA,CAAE,KAAA,CAAAyD,EAAO,SAAA,CAAWD,CAAAA,CAAM,IAAK,CAAA,CAC/BtD,CACF,EAUA,GARAoD,CAAAA,CAAM,gBAAA,GAAmB,CACvB,aAAA,CAAe2H,CAAAA,CACf,cAAe,OAAA,CACf,MAAA,CAAQ9J,EAAO,MAAA,CACf,MAAA,CAAQA,EAAO,MAAA,CACf,UAAA,CAAY,KAAK,GAAA,EAAI,CAAIk8B,EACzB,SAAA,CAAW,IAAA,CAAK,KAClB,CAAC,EACG,CAACl8B,CAAAA,CAAO,OACV,MAAM,IAAI7D,EAAe,CACvB,IAAA,CAAM,yBACN,OAAA,CAAS,CAAA,iBAAA,EAAoB2N,CAAI,CAAA,UAAA,EAAa9J,CAAAA,CAAO,MAAM,CAAA,CAAA,CAC3D,aAAA,CAAe8J,EACf,aAAA,CAAe,OAAA,CACf,YAAa9J,CAAAA,CAAO,MAAA,EAAU,0BAC9B,SAAA,CAAWqC,CAAAA,CAAM,IAAA,CACjB,KAAA,CAAAC,CACF,CAAC,EAECtC,CAAAA,CAAO,WAAA,GAAgB,SACzBsC,CAAAA,CAAQtC,CAAAA,CAAO,aAEnB,CAGA86B,CAAAA,CAAO,MAAM,IAAM,CACjB,IAAMM,CAAAA,CAAe3C,EAAAA,CAAcqC,EAAO,KAAK,CAAA,CAC/CnC,GAAcmC,CAAAA,CAAO,KAAA,CAAO,CAC1B,GAAGM,CAAAA,CACH,MAAA,CAAQ,UACR,YAAA,CAAc/4B,CAAAA,CAAM,KACpB,KAAA,CAAAC,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAC,EACH,CAAC,CAAA,CAGD,IAAMtC,EAAS,MAAMq6B,EAAAA,CAAyBlvB,EAAQ9I,CAAAA,CAAOC,CAAAA,CAAO,CAClE,GAAGiK,CAAAA,CACH,MAAA,CAAQA,GAAM,MAAA,CACd,SAAA,CAAYzO,GAAY,CACtB,IAAMq+B,EAAsBpD,EAAAA,CAAgB+B,CAAAA,CAAO,KAAK,CAAA,CACxD9B,EAAAA,CAAgB8B,EAAO,KAAA,CAAO,CAAC,GAAGqB,CAAAA,CAAqBr+B,CAAO,CAAC,CAAA,CAC/DyO,CAAAA,EAAM,YAAYzO,CAAO,EAC3B,EACA,UAAA,CAAY,MAAOs+B,GAAa,CAE9B,IAAMC,GAAsBryB,CAAAA,CAAW,QAAA,EAAY,EAAC,EAAG,GAAA,CAAI,CAACiyB,CAAAA,CAAGv3B,CAAAA,GAC7Do1B,GAAmBmC,CAAAA,CAAGv3B,CAAAA,CAAG,UAAU,CACrC,CAAA,CACA,IAAA,IAAW7F,CAAAA,IAAaw9B,CAAAA,CAAoB,CAC1C,GAAM,CAAE,IAAA,CAAAvyB,CAAK,CAAA,CAAIjL,CAAAA,CACXE,EAAU,CACd,SAAA,CAAWsD,EAAM,IAAA,CACjB,KAAA,CAAAC,EACA,KAAA,CAAOw4B,CAAAA,CAAO,MAAM,MAAA,CAAO,QAAA,EAC7B,CAAA,CACMoB,CAAAA,CAAiB,IAAA,CAAK,GAAA,EAAI,CAC1BnN,CAAAA,CAAc,MAAMkL,EAAAA,CACxBp7B,CAAAA,CACA,CAAE,QAAA,CAAAu9B,CAAAA,CAAU,UAAW/5B,CAAAA,CAAM,IAAA,CAAM,MAAAC,CAAM,CAAA,CACzCvD,CACF,CAAA,CASA,GARAoD,EAAM,gBAAA,GAAmB,CACvB,cAAe2H,CAAAA,CACf,aAAA,CAAe,UAAA,CACf,MAAA,CAAQilB,CAAAA,CAAY,MAAA,CACpB,OAAQA,CAAAA,CAAY,MAAA,CACpB,WAAY,IAAA,CAAK,GAAA,GAAQmN,CAAAA,CACzB,SAAA,CAAW,KAAK,GAAA,EAClB,CAAC,CAAA,CACG,CAACnN,EAAY,MAAA,CACf,MAAM,IAAI5yB,CAAAA,CAAe,CACvB,KAAM,4BAAA,CACN,OAAA,CAAS,wBAAwB2N,CAAI,CAAA,UAAA,EAAailB,EAAY,MAAM,CAAA,CAAA,CACpE,cAAejlB,CAAAA,CACf,aAAA,CAAe,WACf,WAAA,CAAailB,CAAAA,CAAY,QAAU,mBAAA,CACnC,IAAA,CAAM,CAAE,QAAA,CAAAqN,CAAS,EACjB,SAAA,CAAW/5B,CAAAA,CAAM,IAAA,CACjB,KAAA,CAAAC,CACF,CAAC,CAEL,CAGA,GAAI,CAACm4B,CAAAA,CAAsB,CACzB,IAAM6B,CAAAA,CAAa,CAAA,KAAA,EAAQF,EAAS,EAAE,CAAA,CAAA,CAChC3E,EAAmC,CACvC,EAAA,CAAI6E,EACJ,IAAA,CAAM,WAAA,CACN,UAAWj6B,CAAAA,CAAM,IAAA,CACjB,WAAA,CAAa,CAAA,WAAA,EAAc+5B,CAAAA,CAAS,IAAI,GACxC,IAAA,CAAMA,CAAAA,CACN,YAAa,IAAA,CAAK,GAAA,EACpB,CAAA,CAEAtB,CAAAA,CAAO,MAAM,IAAM,CACjB,IAAMyB,CAAAA,CAAkB1D,EAAAA,CAAiBiC,EAAO,KAAK,CAAA,CACrDhC,GAAiBgC,CAAAA,CAAO,KAAA,CAAO,CAC7B,GAAGyB,CAAAA,CACH,OAAA,CAAS,CAAC,GAAGA,CAAAA,CAAgB,QAAS9E,CAAe,CACvD,CAAC,EACH,CAAC,EAED+C,CAAAA,GAAoB/C,CAAe,EAGnC,MAAMd,CAAAA,CAAgB2F,CAAU,EAClC,CAEA,IAAME,CAAAA,CAAmBvD,EAAAA,CAAa6B,EAAO,KAAK,CAAA,CAClD5B,GAAa4B,CAAAA,CAAO,KAAA,CAAO,CAAC,GAAG0B,CAAAA,CAAkBJ,CAAQ,CAAC,CAAA,CAC1D7vB,GAAM,UAAA,GAAa6vB,CAAQ,EAC7B,CACF,CAAA,CAAGzB,EAAa,CACd,GAAGA,EACH,OAAA,CAAS,CAAC9U,CAAAA,CAASvpB,CAAAA,CAAOoqB,CAAAA,GAAY,CACpCiU,EAAW,OAAA,GAAU9U,CAAAA,CAASvpB,EAAOoqB,CAAO,CAAA,CAC5CvkB,EAAM,YAAA,GAAe,CACnB,UAAWE,CAAAA,CAAM,IAAA,CACjB,MAAAC,CAAAA,CACA,OAAA,CAAAujB,EACA,KAAA,CAAAvpB,CAAAA,CACA,QAAAoqB,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,GAAA,EAClB,CAAC,EACH,CACF,CAAA,CAAI,MAAS,CAAA,CAGP+V,CAAAA,CAAuBV,EAA0B,GAAA,CAAI,CAACE,EAAGv3B,CAAAA,GAC7Do1B,EAAAA,CAAmBmC,EAAGv3B,CAAAA,CAAG,QAAQ,CACnC,CAAA,CACA,IAAA,IAAW7F,KAAa49B,CAAAA,CAAsB,CAC5C,GAAM,CAAE,IAAA,CAAA3yB,CAAK,EAAIjL,CAAAA,CACXE,CAAAA,CAAU,CACd,SAAA,CAAWsD,CAAAA,CAAM,KACjB,KAAA,CAAAC,CAAAA,CACA,MAAOw4B,CAAAA,CAAO,KAAA,CAAM,OAAO,QAAA,EAC7B,EACMoB,CAAAA,CAAiB,IAAA,CAAK,KAAI,CAC1BnN,CAAAA,CAAc,MAAMkL,EAAAA,CACxBp7B,CAAAA,CACA,CACE,MAAA,CAAQmB,CAAAA,CAAO,OACf,SAAA,CAAWqC,CAAAA,CAAM,KACjB,KAAA,CAAAC,CAAAA,CACA,SAAUtC,CAAAA,CAAO,QACnB,EACAjB,CACF,CAAA,CASA,GARAoD,CAAAA,CAAM,gBAAA,GAAmB,CACvB,aAAA,CAAe2H,CAAAA,CACf,aAAA,CAAe,QAAA,CACf,MAAA,CAAQilB,CAAAA,CAAY,OACpB,MAAA,CAAQA,CAAAA,CAAY,OACpB,UAAA,CAAY,IAAA,CAAK,KAAI,CAAImN,CAAAA,CACzB,UAAW,IAAA,CAAK,GAAA,EAClB,CAAC,CAAA,CACG,CAACnN,CAAAA,CAAY,MAAA,CACf,MAAM,IAAI5yB,CAAAA,CAAe,CACvB,IAAA,CAAM,yBAAA,CACN,OAAA,CAAS,qBAAqB2N,CAAI,CAAA,UAAA,EAAailB,EAAY,MAAM,CAAA,CAAA,CACjE,cAAejlB,CAAAA,CACf,aAAA,CAAe,SACf,WAAA,CAAailB,CAAAA,CAAY,QAAU,0BAAA,CACnC,SAAA,CAAW1sB,EAAM,IAAA,CACjB,KAAA,CAAAC,CACF,CAAC,CAAA,CAECysB,CAAAA,CAAY,WAAA,GAAgB,MAAA,GAC7B/uB,CAAAA,CAA+B,OAAS+uB,CAAAA,CAAY,WAAA,EAEzD,CAGA,OAAA+L,CAAAA,CAAO,MAAM,IAAM,CACjB,IAAMM,CAAAA,CAAe3C,EAAAA,CAAcqC,EAAO,KAAK,CAAA,CAC/CnC,GAAcmC,CAAAA,CAAO,KAAA,CAAO,CAC1B,GAAGM,CAAAA,CACH,OAAQ,WAAA,CACR,MAAA,CAAQp7B,EAAO,MAAA,CACf,UAAA,CAAYo7B,EAAa,UAAA,CAAap7B,CAAAA,CAAO,YAC7C,SAAA,CAAWo7B,CAAAA,CAAa,UAAYp7B,CAAAA,CAAO,QAAA,CAAS,OACpD,WAAA,CAAa,IAAA,CAAK,KACpB,CAAC,EACH,CAAC,CAAA,CAGGwsB,CAAAA,EAAUxsB,CAAAA,CAAO,QAAA,CAAS,MAAA,CAAS,GACrCwsB,CAAAA,CAAO,WAAA,CAAYxsB,EAAO,QAAQ,CAAA,CAIpCmC,EAAM,eAAA,GAAkB,CACtB,UAAWE,CAAAA,CAAM,IAAA,CACjB,MAAAC,CAAAA,CACA,MAAA,CAAQtC,EAAO,MAAA,CACf,UAAA,CAAYA,EAAO,WAAA,CACnB,UAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAIwC,CAAAA,CACzB,UAAW,IAAA,CAAK,GAAA,EAClB,CAAC,CAAA,CAEMxC,CACT,CAGA66B,CAAAA,CAA2BpB,EAG3B,SAAS9C,CAAAA,CAAgB1G,EAAkC,CACzD,OAAO,IAAI,OAAA,CAAQ,CAAC5oB,EAASyD,CAAAA,GAAW,CACtC,IAAI6B,CAAAA,CAAkD,IAAA,CAEhDrE,CAAAA,CAAU,IAAM,CAChBqE,CAAAA,GACF,aAAaA,CAAS,CAAA,CACtBA,EAAY,IAAA,EAEhB,CAAA,CAEM+vB,EAAc5B,CAAAA,CAAO,KAAA,CAAM,OAAO,SAAA,CAAU,CAACt+B,EAAY,CAAA,CAAG,IAAM,CACtE,IAAMmgC,CAAAA,CAAW9D,GAAiBiC,CAAAA,CAAO,KAAK,EAC9C,GAAI6B,CAAAA,CAAS,SAAS,QAAA,CAAS1M,CAAS,EACtC3nB,CAAAA,EAAQ,CACRo0B,GAAY,CACZr1B,CAAAA,QACK,CACL,IAAMu1B,EAAkBD,CAAAA,CAAS,QAAA,CAAS,KAAM3vB,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAOijB,CAAS,CAAA,CACxE,GAAI2M,EAAiB,CACnBt0B,CAAAA,GACAo0B,CAAAA,EAAY,CACZ,IAAMG,CAAAA,CAAWD,CAAAA,CAAgB,OAC7B,CAAA,QAAA,EAAW3M,CAAS,cAAc2M,CAAAA,CAAgB,MAAM,GACxD,CAAA,QAAA,EAAW3M,CAAS,YACxBnlB,CAAAA,CAAO,IAAI,KAAA,CAAM+xB,CAAQ,CAAC,EAC5B,CACF,CACF,CAAC,EAGDlwB,CAAAA,CAAY,UAAA,CAAW,IAAM,CAC3B+vB,CAAAA,GACA,IAAMI,CAAAA,CAAiB,KAAK,KAAA,CAAMvG,CAAAA,CAAoB,GAAI,CAAA,CAC1DzrB,CAAAA,CAAO,IAAI,KAAA,CACT,CAAA,sCAAA,EAAyCmlB,CAAS,CAAA,qBAAA,EAAwB6M,CAAc,CAAA;AAAA;AAAA;AAAA;AAAA,0CAAA,EAI3CvG,CAAiB,CAAA;AAAA,iDAAA,CAEhE,CAAC,EACH,CAAA,CAAGA,CAAiB,EACtB,CAAC,CACH,CAGA,SAASwG,CAAAA,EAA0C,CAEjD,OAAO,CAAE,GADK3D,GAAqB0B,CAAAA,CAAO,KAAK,CAC7B,CACpB,CAoZA,OAlZ2C,CACzC,OAAQA,CAAAA,CACR,IAAI,OAAQ,CACV,OAAOiC,GACT,CAAA,CAEA,MAAM,GAAA,CAAO16B,EAAkBC,CAAAA,CAAelG,CAAAA,CAAiD,CAC7F,OAAOq9B,CAAAA,CAA0Bp3B,EAAOC,CAAAA,CAAOy6B,CAAAA,EAAiB,CAAG,MAAA,CAAW3gC,CAAO,CACvF,CAAA,CAEA,UACEiG,CAAAA,CACAC,CAAAA,CACAlG,EAAoC,EAAC,CACR,CAC7B,IAAM6L,EAAkB,IAAI,eAAA,CACtB+0B,EAAoC,EAAC,CACrCC,EAAkE,EAAC,CACrEC,CAAAA,CAAS,KAAA,CACP16B,EAAY,IAAA,CAAK,GAAA,GACnB2F,CAAAA,CAAa,CAAA,CACbg1B,EAAoB,EAAA,CAGpB90B,CAAAA,CACAjM,EAAQ,MAAA,GACViM,CAAAA,CAAe,IAAMJ,CAAAA,CAAgB,KAAA,GACrC7L,CAAAA,CAAQ,MAAA,CAAO,iBAAiB,OAAA,CAASiM,CAAY,CAAA,CAAA,CAGvD,IAAMC,EAAU,IAAM,CAChBD,GAAgBjM,CAAAA,CAAQ,MAAA,EAC1BA,EAAQ,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAASiM,CAAY,EAE5D,CAAA,CAGM+0B,CAAAA,CAAa30B,GAAmC,CACpD,GAAIy0B,EAAQ,OACZ,IAAM31B,CAAAA,CAAS01B,CAAAA,CAAQ,OAAM,CACzB11B,CAAAA,CACFA,EAAOkB,CAAK,CAAA,CAEZu0B,EAAO,IAAA,CAAKv0B,CAAK,EAErB,CAAA,CAGM40B,EAAc,IAAM,CACxBH,EAAS,IAAA,CACT50B,CAAAA,GACA,IAAA,IAAWf,CAAAA,IAAU01B,CAAAA,CACnB11B,CAAAA,CAAO,IAAI,CAAA,CAEb01B,CAAAA,CAAQ,OAAS,EACnB,CAAA,CAGMv0B,GAAiB,SAAmC,CACxD00B,CAAAA,CAAU,CAAE,KAAM,UAAA,CAAY,KAAA,CAAO,WAAY,OAAA,CAAS,0BAA2B,CAAC,CAAA,CAEtF,GAAI,CAEF,IAAIE,EAAiBh7B,CAAAA,CACf+qB,CAAAA,CAAAA,CAAmBrjB,EAAW,KAAA,EAAS,IAAI,GAAA,CAAI,CAACiyB,EAAGv3B,CAAAA,GACvDo1B,EAAAA,CAAmBmC,EAAGv3B,CAAAA,CAAG,OAAO,CAClC,CAAA,CACA,IAAA,IAAW7F,KAAawuB,CAAAA,CAAiB,CACvC,GAAM,CAAE,KAAAvjB,CAAK,CAAA,CAAIjL,EACXE,EAAAA,CAAU,CACd,UAAWsD,CAAAA,CAAM,IAAA,CACjB,KAAA,CAAOi7B,CAAAA,CACP,MAAOxC,CAAAA,CAAO,KAAA,CAAM,OAAO,QAAA,EAC7B,EACM96B,CAAAA,CAAS,MAAMi6B,EAAAA,CACnBp7B,CAAAA,CACA,CAAE,KAAA,CAAOy+B,CAAAA,CAAgB,UAAWj7B,CAAAA,CAAM,IAAK,EAC/CtD,EACF,CAAA,CACA,GAAI,CAACiB,EAAO,MAAA,CACV,MAAAo9B,EAAU,CACR,IAAA,CAAM,sBACN,aAAA,CAAetzB,CAAAA,CACf,MAAA,CAAQ9J,CAAAA,CAAO,QAAU,yBAAA,CACzB,aAAA,CAAem9B,EACf,OAAA,CAAS,CAAA,CACX,CAAC,CAAA,CACK,IAAIhhC,CAAAA,CAAe,CACvB,KAAM,wBAAA,CACN,OAAA,CAAS,oBAAoB2N,CAAI,CAAA,UAAA,EAAa9J,EAAO,MAAM,CAAA,CAAA,CAC3D,aAAA,CAAe8J,CAAAA,CACf,cAAe,OAAA,CACf,WAAA,CAAa9J,EAAO,MAAA,EAAU,yBAAA,CAC9B,UAAWqC,CAAAA,CAAM,IAAA,CACjB,MAAOi7B,CACT,CAAC,EAECt9B,CAAAA,CAAO,WAAA,GAAgB,SACzBs9B,CAAAA,CAAiBt9B,CAAAA,CAAO,aAE5B,CAEAo9B,CAAAA,CAAU,CAAE,IAAA,CAAM,WAAY,KAAA,CAAO,YAAA,CAAc,QAAS,gBAAiB,CAAC,EAG9EtC,CAAAA,CAAO,KAAA,CAAM,IAAM,CACjB,IAAMM,CAAAA,CAAe3C,EAAAA,CAAcqC,EAAO,KAAK,CAAA,CAC/CnC,GAAcmC,CAAAA,CAAO,KAAA,CAAO,CAC1B,GAAGM,EACH,MAAA,CAAQ,SAAA,CACR,aAAc/4B,CAAAA,CAAM,IAAA,CACpB,MAAOi7B,CAAAA,CACP,SAAA,CAAW,KAAK,GAAA,EAClB,CAAC,EACH,CAAC,EAGD,IAAMt9B,CAAAA,CAAS,MAAMq6B,EAAAA,CAAyBlvB,CAAAA,CAAQ9I,CAAAA,CAAOi7B,CAAAA,CAAgB,CAC3E,MAAA,CAAQr1B,CAAAA,CAAgB,OACxB,SAAA,CAAYnK,CAAAA,EAAY,CACtB,IAAMq+B,CAAAA,CAAsBpD,EAAAA,CAAgB+B,CAAAA,CAAO,KAAK,CAAA,CAKxD,GAJA9B,GAAgB8B,CAAAA,CAAO,KAAA,CAAO,CAAC,GAAGqB,CAAAA,CAAqBr+B,CAAO,CAAC,EAC/Ds/B,CAAAA,CAAU,CAAE,KAAM,SAAA,CAAW,OAAA,CAAAt/B,CAAQ,CAAC,CAAA,CAGlCA,EAAQ,IAAA,GAAS,WAAA,EAAeA,EAAQ,OAAA,CAAS,CACnD,IAAMy/B,EAAAA,CAAY,IAAA,CAAK,KAAKz/B,CAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAS,CAAC,EACtDqK,CAAAA,EAAco1B,EAAAA,CACdJ,GAAqBr/B,CAAAA,CAAQ,OAAA,CAC7Bs/B,EAAU,CAAE,IAAA,CAAM,OAAA,CAAS,IAAA,CAAMt/B,EAAQ,OAAA,CAAS,UAAA,CAAAqK,CAAW,CAAC,EAChE,CACF,CAAA,CACA,UAAA,CAAY,MAAOi0B,CAAAA,EAAa,CAC9BgB,CAAAA,CAAU,CAAE,KAAM,YAAA,CAAc,IAAA,CAAMhB,EAAS,IAAA,CAAM,UAAA,CAAYA,CAAAA,CAAS,EAAA,CAAI,UAAWA,CAAAA,CAAS,SAAU,CAAC,CAAA,CAG7G,IAAMC,GAAsBryB,CAAAA,CAAW,QAAA,EAAY,EAAC,EAAG,IAAI,CAACiyB,CAAAA,CAAGv3B,KAC7Do1B,EAAAA,CAAmBmC,CAAAA,CAAGv3B,GAAG,UAAU,CACrC,CAAA,CACA,IAAA,IAAW7F,KAAaw9B,CAAAA,CAAoB,CAC1C,GAAM,CAAE,IAAA,CAAAvyB,EAAK,CAAA,CAAIjL,CAAAA,CACXE,EAAAA,CAAU,CACd,UAAWsD,CAAAA,CAAM,IAAA,CACjB,MAAOi7B,CAAAA,CACP,KAAA,CAAOxC,EAAO,KAAA,CAAM,MAAA,CAAO,UAC7B,CAAA,CACM/L,GAAc,MAAMkL,EAAAA,CACxBp7B,EACA,CAAE,QAAA,CAAAu9B,EAAU,SAAA,CAAW/5B,CAAAA,CAAM,IAAA,CAAM,KAAA,CAAOi7B,CAAe,CAAA,CACzDv+B,EACF,EACA,GAAI,CAACgwB,GAAY,MAAA,CACf,MAAAqO,CAAAA,CAAU,CACR,KAAM,qBAAA,CACN,aAAA,CAAetzB,GACf,MAAA,CAAQilB,EAAAA,CAAY,QAAU,mBAAA,CAC9B,aAAA,CAAeoO,CAAAA,CACf,OAAA,CAAS,EACX,CAAC,CAAA,CACK,IAAIhhC,CAAAA,CAAe,CACvB,KAAM,4BAAA,CACN,OAAA,CAAS,CAAA,qBAAA,EAAwB2N,EAAI,aAAailB,EAAAA,CAAY,MAAM,GACpE,aAAA,CAAejlB,EAAAA,CACf,cAAe,UAAA,CACf,WAAA,CAAailB,EAAAA,CAAY,MAAA,EAAU,oBACnC,IAAA,CAAM,CAAE,SAAAqN,CAAS,CAAA,CACjB,UAAW/5B,CAAAA,CAAM,IAAA,CACjB,KAAA,CAAOi7B,CACT,CAAC,CAEL,CAGA,GAAI,CAAC7C,CAAAA,CAAsB,CACzB,IAAM6B,CAAAA,CAAa,CAAA,KAAA,EAAQF,CAAAA,CAAS,EAAE,CAAA,CAAA,CACtCgB,CAAAA,CAAU,CAAE,IAAA,CAAM,mBAAA,CAAqB,UAAWd,CAAAA,CAAY,QAAA,CAAUF,EAAS,IAAK,CAAC,EAEvF,IAAM3E,EAAAA,CAAmC,CACvC,EAAA,CAAI6E,CAAAA,CACJ,KAAM,WAAA,CACN,SAAA,CAAWj6B,CAAAA,CAAM,IAAA,CACjB,YAAa,CAAA,WAAA,EAAc+5B,CAAAA,CAAS,IAAI,CAAA,CAAA,CACxC,IAAA,CAAMA,EACN,WAAA,CAAa,IAAA,CAAK,GAAA,EACpB,EAEAtB,CAAAA,CAAO,KAAA,CAAM,IAAM,CACjB,IAAMyB,GAAkB1D,EAAAA,CAAiBiC,CAAAA,CAAO,KAAK,CAAA,CACrDhC,GAAiBgC,CAAAA,CAAO,KAAA,CAAO,CAC7B,GAAGyB,EAAAA,CACH,QAAS,CAAC,GAAGA,EAAAA,CAAgB,OAAA,CAAS9E,EAAe,CACvD,CAAC,EACH,CAAC,CAAA,CAED+C,IAAoB/C,EAAe,CAAA,CACnC,MAAMd,CAAAA,CAAgB2F,CAAU,CAAA,CAChCc,CAAAA,CAAU,CAAE,IAAA,CAAM,mBAAA,CAAqB,UAAWd,CAAAA,CAAY,QAAA,CAAU,CAAA,CAAK,CAAC,EAChF,CAEA,IAAME,GAAmBvD,EAAAA,CAAa6B,CAAAA,CAAO,KAAK,CAAA,CAClD5B,EAAAA,CAAa4B,CAAAA,CAAO,KAAA,CAAO,CAAC,GAAG0B,EAAAA,CAAkBJ,CAAQ,CAAC,CAAA,CAEtDA,EAAS,MAAA,EACXgB,CAAAA,CAAU,CAAE,IAAA,CAAM,UAAA,CAAY,KAAMhB,CAAAA,CAAS,IAAA,CAAM,WAAYA,CAAAA,CAAS,EAAA,CAAI,OAAQA,CAAAA,CAAS,MAAO,CAAC,EAEzG,CACF,CAAA,CAAGzB,CAAU,EAGbyC,CAAAA,CAAU,CAAE,KAAM,UAAA,CAAY,KAAA,CAAO,WAAA,CAAa,OAAA,CAAS,2BAA4B,CAAC,CAAA,CAExF,IAAMI,CAAAA,CAAAA,CAAoBxzB,CAAAA,CAAW,QAAU,EAAC,EAAG,GAAA,CAAI,CAACiyB,EAAGv3B,CAAAA,GACzDo1B,EAAAA,CAAmBmC,EAAGv3B,CAAAA,CAAG,QAAQ,CACnC,CAAA,CACA,IAAA,IAAW7F,KAAa2+B,CAAAA,CAAkB,CACxC,GAAM,CAAE,IAAA,CAAA1zB,CAAK,CAAA,CAAIjL,CAAAA,CACXE,GAAU,CACd,SAAA,CAAWsD,CAAAA,CAAM,IAAA,CACjB,MAAOi7B,CAAAA,CACP,KAAA,CAAOxC,EAAO,KAAA,CAAM,MAAA,CAAO,UAC7B,CAAA,CACM/L,CAAAA,CAAc,MAAMkL,GACxBp7B,CAAAA,CACA,CACE,OAAQmB,CAAAA,CAAO,MAAA,CACf,UAAWqC,CAAAA,CAAM,IAAA,CACjB,KAAA,CAAOi7B,CAAAA,CACP,SAAUt9B,CAAAA,CAAO,QACnB,EACAjB,EACF,CAAA,CACA,GAAI,CAACgwB,CAAAA,CAAY,OACf,MAAAqO,CAAAA,CAAU,CACR,IAAA,CAAM,qBAAA,CACN,cAAetzB,CAAAA,CACf,MAAA,CAAQilB,EAAY,MAAA,EAAU,0BAAA,CAC9B,aAAA,CAAe,OAAO/uB,EAAO,MAAA,EAAW,QAAA,CAAWA,EAAO,MAAA,CAAS,EAAA,CACnE,QAAS,CAAA,CACX,CAAC,CAAA,CACK,IAAI7D,EAAe,CACvB,IAAA,CAAM,0BACN,OAAA,CAAS,CAAA,kBAAA,EAAqB2N,CAAI,CAAA,UAAA,EAAailB,CAAAA,CAAY,MAAM,CAAA,CAAA,CACjE,cAAejlB,CAAAA,CACf,aAAA,CAAe,SACf,WAAA,CAAailB,CAAAA,CAAY,QAAU,0BAAA,CACnC,SAAA,CAAW1sB,CAAAA,CAAM,IAAA,CACjB,MAAOi7B,CACT,CAAC,EAECvO,CAAAA,CAAY,WAAA,GAAgB,SAC7B/uB,CAAAA,CAA+B,MAAA,CAAS+uB,CAAAA,CAAY,WAAA,EAEzD,CAGA+L,CAAAA,CAAO,KAAA,CAAM,IAAM,CACjB,IAAMM,EAAe3C,EAAAA,CAAcqC,CAAAA,CAAO,KAAK,CAAA,CAC/CnC,GAAcmC,CAAAA,CAAO,KAAA,CAAO,CAC1B,GAAGM,CAAAA,CACH,OAAQ,WAAA,CACR,MAAA,CAAQp7B,CAAAA,CAAO,MAAA,CACf,WAAYo7B,CAAAA,CAAa,UAAA,CAAap7B,EAAO,WAAA,CAC7C,SAAA,CAAWo7B,EAAa,SAAA,CAAYp7B,CAAAA,CAAO,SAAS,MAAA,CACpD,WAAA,CAAa,KAAK,GAAA,EACpB,CAAC,EACH,CAAC,EAED,IAAM+I,CAAAA,CAAW,IAAA,CAAK,GAAA,GAAQvG,CAAAA,CAC9B,OAAA46B,EAAU,CAAE,IAAA,CAAM,OAAQ,WAAA,CAAap9B,CAAAA,CAAO,WAAA,CAAa,QAAA,CAAA+I,EAAU,aAAA,CAAe,CAAE,CAAC,CAAA,CACvFs0B,CAAAA,GAEOr9B,CACT,CAAA,MAAS1D,CAAAA,CAAO,CACd,MAAA8gC,CAAAA,CAAU,CAAE,KAAM,OAAA,CAAS,KAAA,CAAO9gC,aAAiB,KAAA,CAAQA,CAAAA,CAAQ,IAAI,KAAA,CAAM,OAAOA,CAAK,CAAC,CAAE,CAAC,CAAA,CAC7F+gC,GAAY,CACN/gC,CACR,CACF,CAAA,IA2BA,OAAO,CACL,OAzBqD,CACrD,CAAC,OAAO,aAAa,CAAA,EAA4C,CAC/D,OAAO,CACL,MAAM,IAAA,EAAyD,CAC7D,OAAI0gC,CAAAA,CAAO,OAAS,CAAA,CACX,CAAE,IAAA,CAAM,KAAA,CAAO,MAAOA,CAAAA,CAAO,KAAA,EAAS,CAAA,CAE3CE,CAAAA,CACK,CAAE,IAAA,CAAM,IAAA,CAAM,MAAO,MAAU,CAAA,CAEjC,IAAI,OAAA,CAAkD71B,CAAAA,EAAY,CACvE41B,CAAAA,CAAQ,IAAA,CAAMx0B,GAAU,CAEpBpB,CAAAA,CADEoB,CAAAA,GAAU,IAAA,CACJ,CAAE,IAAA,CAAM,IAAA,CAAM,MAAO,MAAU,CAAA,CAE/B,CAAE,IAAA,CAAM,KAAA,CAAO,KAAA,CAAOA,CAAM,CAFI,EAI5C,CAAC,EACH,CAAC,CACH,CACF,CACF,CACF,CAAA,CAIE,MAAA,CAAQC,EACR,KAAA,CAAO,IAAM,CACXT,CAAAA,CAAgB,KAAA,GAChBo1B,CAAAA,GACF,CACF,CACF,EAEA,OAAA,CAAQpN,CAAAA,CAAyB,CAC/B6K,CAAAA,CAAO,KAAA,CAAM,IAAM,CACjB,IAAM6B,CAAAA,CAAW9D,EAAAA,CAAiBiC,EAAO,KAAK,CAAA,CAC9C,GAAI,CAAC6B,CAAAA,CAAS,QAAQ,IAAA,CAAM3vB,CAAAA,EAAMA,CAAAA,CAAE,EAAA,GAAOijB,CAAS,CAAA,CAAG,CACjD3D,GAAO,OAAA,CAAQ,KAAA,CAAM,sDAAsD2D,CAAS,CAAA,CAAA,CAAG,CAAA,CAC3F,MACF,CACA,IAAMwN,CAAAA,CAAuB,IACvB5G,CAAAA,CAAW,CAAC,GAAG8F,CAAAA,CAAS,QAAA,CAAU1M,CAAS,CAAA,CACjD6I,EAAAA,CAAiBgC,EAAO,KAAA,CAAO,CAC7B,GAAG6B,CAAAA,CACH,OAAA,CAASA,EAAS,OAAA,CAAQ,MAAA,CAAQ3vB,CAAAA,EAAMA,CAAAA,CAAE,KAAOijB,CAAS,CAAA,CAC1D,SAAU4G,CAAAA,CAAS,MAAA,CAAS4G,EAAuB5G,CAAAA,CAAS,KAAA,CAAM,CAAC4G,CAAoB,EAAI5G,CAC7F,CAAC,EACH,CAAC,EACH,EAEA,MAAA,CAAO5G,CAAAA,CAAmB7V,CAAAA,CAAuB,CAC/C0gB,EAAO,KAAA,CAAM,IAAM,CACjB,IAAM6B,CAAAA,CAAW9D,GAAiBiC,CAAAA,CAAO,KAAK,EAC9C,GAAI,CAAC6B,EAAS,OAAA,CAAQ,IAAA,CAAM3vB,GAAMA,CAAAA,CAAE,EAAA,GAAOijB,CAAS,CAAA,CAAG,CACjD3D,CAAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,kDAAA,EAAqD2D,CAAS,GAAG,CAAA,CAC1F,MACF,CACI7V,CAAAA,EAAUkS,CAAAA,EACZ,OAAA,CAAQ,KAAA,CAAM,uBAAuB2D,CAAS,CAAA,WAAA,EAAc7V,CAAM,CAAA,CAAE,CAAA,CAEtE,IAAMwiB,CAAAA,CAAmC,CACvC,EAAA,CAAI3M,CAAAA,CACJ,OAAA7V,CAAAA,CACA,UAAA,CAAY,KAAK,GAAA,EACnB,EACMsjB,CAAAA,CAAwB,GAAA,CACxBC,EAAW,CAAC,GAAGhB,EAAS,QAAA,CAAUC,CAAe,EACvD9D,EAAAA,CAAiBgC,CAAAA,CAAO,MAAO,CAC7B,GAAG6B,CAAAA,CACH,OAAA,CAASA,EAAS,OAAA,CAAQ,MAAA,CAAQ3vB,GAAMA,CAAAA,CAAE,EAAA,GAAOijB,CAAS,CAAA,CAC1D,QAAA,CAAU0N,CAAAA,CAAS,MAAA,CAASD,EAAwBC,CAAAA,CAAS,KAAA,CAAM,CAACD,CAAqB,CAAA,CAAIC,CAC/F,CAAC,EACH,CAAC,EACH,EAEA,KAAA,EAAc,CACZ,IAAMvC,CAAAA,CAAe3C,EAAAA,CAAcqC,EAAO,KAAK,CAAA,CAC/CnC,EAAAA,CAAcmC,CAAAA,CAAO,MAAO,CAC1B,GAAGM,EACH,MAAA,CAAQ,QACV,CAAC,EACH,CAAA,CAEA,MAAA,EAAe,CACb,IAAM/4B,CAAAA,CAAQo2B,EAAAA,CAAcqC,EAAO,KAAK,CAAA,CACpCz4B,EAAM,MAAA,GAAW,QAAA,EACnBs2B,EAAAA,CAAcmC,CAAAA,CAAO,MAAO,CAC1B,GAAGz4B,EACH,MAAA,CAAQA,CAAAA,CAAM,aAAe,SAAA,CAAY,MAC3C,CAAC,EAEL,EAEA,KAAA,EAAc,CACZy4B,EAAO,KAAA,CAAM,IAAM,CACjBnC,EAAAA,CAAcmC,CAAAA,CAAO,MAAO,CAC1B,MAAA,CAAQ,OACR,YAAA,CAAc,IAAA,CACd,MAAO,IAAA,CACP,MAAA,CAAQ,KACR,KAAA,CAAO,IAAA,CACP,UAAA,CAAY,CAAA,CACZ,UAAW,CAAA,CACX,SAAA,CAAW,KACX,WAAA,CAAa,IACf,CAAC,CAAA,CACDhC,EAAAA,CAAiBgC,CAAAA,CAAO,KAAA,CAAO,CAC7B,OAAA,CAAS,GACT,QAAA,CAAU,GACV,QAAA,CAAU,EACZ,CAAC,EACD9B,EAAAA,CAAgB8B,CAAAA,CAAO,MAAO,EAAE,EAChC5B,EAAAA,CAAa4B,CAAAA,CAAO,KAAA,CAAO,EAAE,EAC/B,CAAC,EACH,CAAA,CAEA,OAAA,EAAgB,CACdA,CAAAA,CAAO,OAAA,GACT,CACF,CAGF,CAoFO,SAAS8C,IAEY,CAC1B,IAAMxJ,EAAyD,EAAC,CAC1DoF,CAAAA,CAAkE,GAClEnM,CAAAA,CAAwD,GACxDmQ,CAAAA,CAA0D,GAC1DnB,CAAAA,CAA8D,EAAC,CAC/D3B,CAAAA,CAAoB,EAAC,CACvBrO,CAAAA,CACAC,EAAQ,KAAA,CACRuR,CAAAA,CACAC,EAEEC,CAAAA,CAAkC,CACtC,eAAel1B,CAAAA,CAAI3F,CAAAA,CAAY,CAC7B,OAAAkxB,CAAAA,CAAYvrB,CAAE,CAAA,CAAI3F,CAAAA,CACX66B,CACT,CAAA,CAEA,YAAA,CAAal1B,CAAAA,CAAIiR,CAAAA,CAAU,CACzB,OAAA0f,CAAAA,CAAU3wB,CAAE,CAAA,CAAIiR,CAAAA,CACTikB,CACT,CAAA,CAEA,kBAAA,CAAmBC,CAAAA,CAAiBzzB,CAAAA,CAAI,CACtC,OAAI,OAAOyzB,GAAoB,QAAA,EAAYzzB,CAAAA,CACzC8iB,EAAgB,IAAA,CAAK,CAAE,IAAA,CAAM2Q,CAAAA,CAAiB,GAAAzzB,CAAG,CAAC,EACzC,OAAOyzB,CAAAA,EAAoB,UACpC3Q,CAAAA,CAAgB,IAAA,CAAK2Q,CAAe,CAAA,CAE/BD,CACT,CAAA,CAEA,mBAAA,CAAoBC,EAAiBzzB,CAAAA,CAAI,CACvC,OAAI,OAAOyzB,CAAAA,EAAoB,QAAA,EAAYzzB,CAAAA,CACzCizB,EAAiB,IAAA,CAAK,CAAE,KAAMQ,CAAAA,CAAiB,EAAA,CAAAzzB,CAAG,CAAC,CAAA,CAC1C,OAAOyzB,CAAAA,EAAoB,UACpCR,CAAAA,CAAiB,IAAA,CAAKQ,CAAe,CAAA,CAEhCD,CACT,EAEA,qBAAA,CAAsBC,CAAAA,CAAiBzzB,CAAAA,CAAI,CACzC,OAAI,OAAOyzB,CAAAA,EAAoB,UAAYzzB,CAAAA,CACzC8xB,CAAAA,CAAmB,KAAK,CAAE,IAAA,CAAM2B,EAAiB,EAAA,CAAAzzB,CAAG,CAAC,CAAA,CAC5C,OAAOyzB,GAAoB,QAAA,EACpC3B,CAAAA,CAAmB,KAAK2B,CAAe,CAAA,CAElCD,CACT,CAAA,CAEA,WAAWrG,CAAAA,CAAQ,CACjB,OAAAgD,CAAAA,CAAQ,IAAA,CAAKhD,CAAM,CAAA,CACZqG,CACT,CAAA,CAEA,UAAA,CAAWE,EAAK,CACd,OAAAJ,EAAiBI,CAAAA,CACVF,CACT,EAEA,kBAAA,CAAmBG,CAAAA,CAAI,CACrB,OAAAJ,EAAyBI,CAAAA,CAClBH,CACT,EAEA,UAAA,CAAWn9B,CAAAA,CAAW,CACpB,OAAAyrB,CAAAA,CAAiBzrB,EACVm9B,CACT,CAAA,CAEA,UAAUI,CAAAA,CAAU,IAAA,CAAM,CACxB,OAAA7R,CAAAA,CAAQ6R,EACDJ,CACT,CAAA,CAEA,KAAA,CAAM3hC,CAAAA,CAAS,CACb,OAAOkxB,EAAAA,CAA2B,CAChC,MAAA,CAAQlxB,CAAAA,CAAQ,OAChB,oBAAA,CAAsBA,CAAAA,CAAQ,oBAAA,CAC9B,iBAAA,CAAmBA,EAAQ,iBAAA,CAC3B,WAAA,CAAAg4B,EACA,SAAA,CAAAoF,CAAAA,CACA,WAAY,CACV,KAAA,CAAOnM,CAAAA,CACP,MAAA,CAAQmQ,EACR,QAAA,CAAUnB,CACZ,EACA,OAAA,CAAA3B,CAAAA,CACA,eAAArO,CAAAA,CACA,KAAA,CAAAC,EACA,MAAA,CAAQuR,CAAAA,CACR,eAAgBC,CAClB,CAAC,CACH,CACF,CAAA,CAEA,OAAOC,CACT","file":"index.cjs","sourcesContent":["/**\n * Shared types for AI adapter — used by orchestrator, guardrails, helpers, and stack.\n */\n\nimport type { Requirement, ModuleSchema } from \"@directive-run/core\";\nimport { t } from \"@directive-run/core\";\n\n// ============================================================================\n// Agent Types (LLM-agnostic)\n// ============================================================================\n\n/** Simplified Agent interface */\nexport interface AgentLike {\n name: string;\n instructions?: string;\n model?: string;\n tools?: unknown[];\n}\n\n/** Agent run result */\nexport interface RunResult<T = unknown> {\n output: T;\n messages: Message[];\n toolCalls: ToolCall[];\n totalTokens: number;\n /** Breakdown of input vs output tokens, when available from the provider */\n tokenUsage?: TokenUsage;\n /** True when result was served from semantic cache */\n isCached?: boolean;\n}\n\n/** Breakdown of token usage by input/output */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/** Message from agent run */\nexport interface Message {\n role: \"user\" | \"assistant\" | \"tool\" | \"system\";\n content: string;\n toolCallId?: string;\n}\n\n/** Tool call record */\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: string;\n result?: string;\n}\n\n/** Run function type */\nexport type AgentRunner = <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions\n) => Promise<RunResult<T>>;\n\n/** Run options */\nexport interface RunOptions {\n maxTurns?: number;\n signal?: AbortSignal;\n onMessage?: (message: Message) => void;\n onToolCall?: (toolCall: ToolCall) => void;\n}\n\n// ============================================================================\n// Adapter Lifecycle Hooks\n// ============================================================================\n\n/**\n * Lifecycle hooks for adapter-level observability.\n *\n * Attach to any adapter (runner or streaming runner) to trace, log,\n * or measure individual LLM calls without modifying application code.\n *\n * @example\n * ```typescript\n * const runner = createOpenAIRunner({\n * apiKey: process.env.OPENAI_API_KEY!,\n * hooks: {\n * onBeforeCall: ({ agent, input }) => console.log(`→ ${agent.name}`, input.slice(0, 50)),\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * metrics.track('llm_call', { durationMs, ...tokenUsage });\n * },\n * onError: ({ error }) => Sentry.captureException(error),\n * },\n * });\n * ```\n */\nexport interface AdapterHooks {\n /** Fires before each LLM API call. */\n onBeforeCall?: (event: {\n agent: AgentLike;\n input: string;\n timestamp: number;\n }) => void;\n\n /** Fires after a successful LLM API call. */\n onAfterCall?: (event: {\n agent: AgentLike;\n input: string;\n output: string;\n totalTokens: number;\n tokenUsage: TokenUsage;\n durationMs: number;\n timestamp: number;\n }) => void;\n\n /** Fires when an LLM API call fails. */\n onError?: (event: {\n agent: AgentLike;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n}\n\n// ============================================================================\n// Guardrail Types\n// ============================================================================\n\n/** Guardrail function */\nexport type GuardrailFn<T = unknown> = (\n data: T,\n context: GuardrailContext\n) => GuardrailResult | Promise<GuardrailResult>;\n\n/** Guardrail context */\nexport interface GuardrailContext {\n agentName: string;\n input: string;\n facts: Record<string, unknown>;\n}\n\n/** Guardrail result */\nexport interface GuardrailResult {\n passed: boolean;\n reason?: string;\n transformed?: unknown;\n}\n\n/** Input guardrail data */\nexport interface InputGuardrailData {\n input: string;\n agentName: string;\n}\n\n/** Output guardrail data */\nexport interface OutputGuardrailData {\n output: unknown;\n agentName: string;\n input: string;\n messages: Message[];\n}\n\n/** Tool call guardrail data */\nexport interface ToolCallGuardrailData {\n toolCall: ToolCall;\n agentName: string;\n input: string;\n}\n\n/** Retry configuration for guardrails */\nexport interface GuardrailRetryConfig {\n /** @default 1 */\n attempts?: number;\n /** @default \"exponential\" */\n backoff?: \"exponential\" | \"linear\" | \"fixed\";\n /** @default 100 */\n baseDelayMs?: number;\n /** @default 5000 */\n maxDelayMs?: number;\n}\n\n/** Named guardrail for better debugging */\nexport interface NamedGuardrail<T = unknown> {\n name: string;\n fn: GuardrailFn<T>;\n /** @default true */\n critical?: boolean;\n retry?: GuardrailRetryConfig;\n}\n\n/** Guardrails configuration */\nexport interface GuardrailsConfig {\n input?: Array<GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>>;\n output?: Array<GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>>;\n toolCall?: Array<GuardrailFn<ToolCallGuardrailData> | NamedGuardrail<ToolCallGuardrailData>>;\n}\n\n// ============================================================================\n// Retry Configuration\n// ============================================================================\n\n/** Retry configuration for agent runs */\nexport interface AgentRetryConfig {\n /** @default 1 */\n attempts?: number;\n /** @default \"exponential\" */\n backoff?: \"exponential\" | \"linear\" | \"fixed\";\n /** @default 1000 */\n baseDelayMs?: number;\n /** @default 30000 */\n maxDelayMs?: number;\n isRetryable?: (error: Error) => boolean;\n onRetry?: (attempt: number, error: Error, delayMs: number) => void;\n}\n\n// ============================================================================\n// Orchestrator State Types\n// ============================================================================\n\n/** Agent state in facts */\nexport interface AgentState {\n status: \"idle\" | \"running\" | \"paused\" | \"completed\" | \"error\";\n currentAgent: string | null;\n input: string | null;\n output: unknown | null;\n error: string | null;\n tokenUsage: number;\n turnCount: number;\n startedAt: number | null;\n completedAt: number | null;\n}\n\n/** Approval state */\nexport interface ApprovalState {\n pending: ApprovalRequest[];\n approved: string[];\n rejected: RejectedRequest[];\n}\n\n/** Rejected request with tracking information */\nexport interface RejectedRequest {\n id: string;\n reason?: string;\n rejectedAt: number;\n}\n\n/** Approval request */\nexport interface ApprovalRequest {\n id: string;\n type: \"tool_call\" | \"output\" | \"handoff\";\n agentName: string;\n description: string;\n data: unknown;\n requestedAt: number;\n}\n\n/** Combined orchestrator state */\nexport interface OrchestratorState {\n agent: AgentState;\n approval: ApprovalState;\n conversation: Message[];\n toolCalls: ToolCall[];\n}\n\n// ============================================================================\n// Orchestrator Config Types\n// ============================================================================\n\n/** Constraint for orchestrator */\nexport interface OrchestratorConstraint<F extends Record<string, unknown>> {\n when: (facts: F & OrchestratorState) => boolean | Promise<boolean>;\n require: Requirement | ((facts: F & OrchestratorState) => Requirement);\n priority?: number;\n}\n\n/** Resolver context for orchestrator */\nexport interface OrchestratorResolverContext<F extends Record<string, unknown>> {\n facts: F & OrchestratorState;\n runAgent: <T>(agent: AgentLike, input: string, options?: RunOptions) => Promise<RunResult<T>>;\n signal: AbortSignal;\n}\n\n/** Resolver for orchestrator */\nexport interface OrchestratorResolver<\n F extends Record<string, unknown>,\n R extends Requirement = Requirement\n> {\n requirement: (req: Requirement) => req is R;\n key?: (req: R) => string;\n resolve: (req: R, ctx: OrchestratorResolverContext<F>) => void | Promise<void>;\n}\n\n/** Lifecycle hooks for observability */\nexport interface OrchestratorLifecycleHooks {\n onAgentStart?: (event: {\n agentName: string;\n input: string;\n timestamp: number;\n }) => void;\n onAgentComplete?: (event: {\n agentName: string;\n input: string;\n output: unknown;\n tokenUsage: number;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentError?: (event: {\n agentName: string;\n input: string;\n error: Error;\n durationMs: number;\n timestamp: number;\n }) => void;\n onGuardrailCheck?: (event: {\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n passed: boolean;\n reason?: string;\n durationMs: number;\n timestamp: number;\n }) => void;\n onAgentRetry?: (event: {\n agentName: string;\n input: string;\n attempt: number;\n error: Error;\n delayMs: number;\n timestamp: number;\n }) => void;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Error codes for guardrail errors */\nexport type GuardrailErrorCode =\n | \"INPUT_GUARDRAIL_FAILED\"\n | \"OUTPUT_GUARDRAIL_FAILED\"\n | \"TOOL_CALL_GUARDRAIL_FAILED\"\n | \"APPROVAL_REJECTED\"\n | \"BUDGET_EXCEEDED\"\n | \"RATE_LIMIT_EXCEEDED\"\n | \"AGENT_ERROR\";\n\n/**\n * Structured error for guardrail failures.\n *\n * **Security:** The `input` and `data` properties are non-enumerable to prevent\n * accidental leakage of sensitive data via JSON.stringify or console.log.\n */\nexport class GuardrailError extends Error {\n readonly code: GuardrailErrorCode;\n readonly guardrailName: string;\n readonly guardrailType: \"input\" | \"output\" | \"toolCall\";\n readonly userMessage: string;\n declare readonly data: unknown;\n readonly agentName: string;\n declare readonly input: string;\n\n constructor(options: {\n code: GuardrailErrorCode;\n message: string;\n guardrailName: string;\n guardrailType: \"input\" | \"output\" | \"toolCall\";\n userMessage?: string;\n data?: unknown;\n agentName: string;\n input: string;\n cause?: Error;\n }) {\n super(options.message, { cause: options.cause });\n this.name = \"GuardrailError\";\n this.code = options.code;\n this.guardrailName = options.guardrailName;\n this.guardrailType = options.guardrailType;\n this.userMessage = options.userMessage ?? options.message;\n this.agentName = options.agentName;\n\n Object.defineProperty(this, \"input\", {\n value: options.input,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n Object.defineProperty(this, \"data\", {\n value: options.data,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n guardrailName: this.guardrailName,\n guardrailType: this.guardrailType,\n userMessage: this.userMessage,\n agentName: this.agentName,\n };\n }\n}\n\n/** Check if an error is a GuardrailError. */\nexport function isGuardrailError(error: unknown): error is GuardrailError {\n return error instanceof GuardrailError;\n}\n\n// ============================================================================\n// Schema Validation Types (used by built-in guardrails)\n// ============================================================================\n\n/** Schema validation result */\nexport interface SchemaValidationResult {\n valid: boolean;\n errors?: string[];\n}\n\n/** Schema validator function type */\nexport type SchemaValidator<_T = unknown> = (\n value: unknown\n) => SchemaValidationResult | boolean;\n\n// ============================================================================\n// Bridge Schema Constants\n// ============================================================================\n\nexport const AGENT_KEY = \"__agent\" as const;\nexport const APPROVAL_KEY = \"__approval\" as const;\nexport const CONVERSATION_KEY = \"__conversation\" as const;\nexport const TOOL_CALLS_KEY = \"__toolCalls\" as const;\n\n/** Bridge schema for orchestrator */\nexport const orchestratorBridgeSchema = {\n facts: {\n [AGENT_KEY]: t.any<AgentState>(),\n [APPROVAL_KEY]: t.any<ApprovalState>(),\n [CONVERSATION_KEY]: t.any<Message[]>(),\n [TOOL_CALLS_KEY]: t.any<ToolCall[]>(),\n },\n derivations: {},\n events: {},\n requirements: {},\n} satisfies ModuleSchema;\n","/**\n * Built-in guardrails for AI adapter — PII, moderation, rate limiting, tool allowlists, schema validation.\n */\n\nimport type {\n GuardrailFn,\n InputGuardrailData,\n OutputGuardrailData,\n ToolCallGuardrailData,\n SchemaValidator,\n AgentState,\n} from \"./types.js\";\nimport { AGENT_KEY } from \"./types.js\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst MAX_STRINGIFY_LENGTH = 100_000;\n\n/** Safely stringify output, handling circular references and truncating large values */\nfunction safeStringify(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n const seen = new WeakSet();\n const json = JSON.stringify(value, (_key, val) => {\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n }\n return val;\n });\n return json.length > MAX_STRINGIFY_LENGTH\n ? json.slice(0, MAX_STRINGIFY_LENGTH) + \"...[truncated]\"\n : json;\n } catch {\n return String(value);\n }\n}\n\n// ============================================================================\n// PII Guardrail\n// ============================================================================\n\n/**\n * Create a PII detection guardrail.\n *\n * @example\n * ```typescript\n * const piiGuardrail = createPIIGuardrail({\n * patterns: [\n * /\\b\\d{3}-\\d{2}-\\d{4}\\b/, // SSN\n * /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/i, // Email\n * ],\n * redact: true,\n * });\n * ```\n */\nexport function createPIIGuardrail(options: {\n patterns?: RegExp[];\n redact?: boolean;\n redactReplacement?: string;\n}): GuardrailFn<InputGuardrailData> {\n const {\n patterns = [\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/g, // SSN\n /\\b\\d{16}\\b/g, // Credit card\n /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi, // Email\n ],\n redact = false,\n redactReplacement = \"[REDACTED]\",\n } = options;\n\n return (data) => {\n let text = data.input;\n let hasPII = false;\n\n for (const pattern of patterns) {\n pattern.lastIndex = 0;\n if (pattern.test(text)) {\n hasPII = true;\n if (redact) {\n pattern.lastIndex = 0;\n text = text.replace(pattern, redactReplacement);\n }\n }\n }\n\n if (hasPII && !redact) {\n return { passed: false, reason: \"Input contains PII\" };\n }\n\n return { passed: true, transformed: redact && hasPII ? text : undefined };\n };\n}\n\n// ============================================================================\n// Moderation Guardrail\n// ============================================================================\n\n/**\n * Create a content moderation guardrail.\n *\n * @example\n * ```typescript\n * const moderationGuardrail = createModerationGuardrail({\n * checkFn: async (text) => {\n * const result = await openai.moderations.create({ input: text });\n * return result.results[0].flagged;\n * },\n * });\n * ```\n */\nexport function createModerationGuardrail(options: {\n checkFn: (text: string) => boolean | Promise<boolean>;\n message?: string;\n}): GuardrailFn<InputGuardrailData | OutputGuardrailData> {\n const { checkFn, message = \"Content flagged by moderation\" } = options;\n\n return async (data) => {\n const text =\n \"output\" in data\n ? typeof data.output === \"string\"\n ? data.output\n : JSON.stringify(data.output)\n : data.input;\n\n const flagged = await checkFn(text);\n\n return { passed: !flagged, reason: flagged ? message : undefined };\n };\n}\n\n// ============================================================================\n// Rate Limit Guardrail\n// ============================================================================\n\n/** Rate limiter with reset capability for testing */\nexport interface RateLimitGuardrail extends GuardrailFn<InputGuardrailData> {\n reset(): void;\n}\n\n/**\n * Create a rate limit guardrail based on token usage.\n * Returns a guardrail function with an additional `reset()` method for testing.\n */\nexport function createRateLimitGuardrail(options: {\n maxTokensPerMinute?: number;\n maxRequestsPerMinute?: number;\n}): RateLimitGuardrail {\n const { maxTokensPerMinute = 100000, maxRequestsPerMinute = 60 } = options;\n\n const maxEntries = Math.max(maxRequestsPerMinute, 1000);\n let tokenTimestamps: number[] = [];\n let requestTimestamps: number[] = [];\n const windowMs = 60000;\n\n function findCutoffIndex(arr: number[], cutoffTime: number): number {\n let low = 0;\n let high = arr.length;\n while (low < high) {\n const mid = (low + high) >>> 1;\n if ((arr[mid] ?? 0) < cutoffTime) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n }\n\n const guardrail: RateLimitGuardrail = (_data, context) => {\n const now = Date.now();\n const cutoffTime = now - windowMs;\n\n const tokenCutoff = findCutoffIndex(tokenTimestamps, cutoffTime);\n if (tokenCutoff > 0) {\n tokenTimestamps = tokenTimestamps.slice(tokenCutoff);\n }\n\n const requestCutoff = findCutoffIndex(requestTimestamps, cutoffTime);\n if (requestCutoff > 0) {\n requestTimestamps = requestTimestamps.slice(requestCutoff);\n }\n\n const factsObj = context.facts as Record<string, unknown>;\n const agentState = factsObj[AGENT_KEY] as AgentState | undefined;\n const tokenUsage = agentState?.tokenUsage ?? 0;\n const recentTokens = tokenTimestamps.length;\n const recentRequests = requestTimestamps.length;\n\n if (recentTokens + tokenUsage > maxTokensPerMinute) {\n return { passed: false, reason: \"Token rate limit exceeded\" };\n }\n\n if (recentRequests >= maxRequestsPerMinute) {\n return { passed: false, reason: \"Request rate limit exceeded\" };\n }\n\n if (requestTimestamps.length < maxEntries) {\n requestTimestamps.push(now);\n }\n if (tokenTimestamps.length < maxEntries) {\n tokenTimestamps.push(now);\n }\n\n return { passed: true };\n };\n\n guardrail.reset = () => {\n tokenTimestamps = [];\n requestTimestamps = [];\n };\n\n return guardrail;\n}\n\n// ============================================================================\n// Tool Guardrail\n// ============================================================================\n\n/**\n * Create a tool allowlist/denylist guardrail.\n */\nexport function createToolGuardrail(options: {\n allowlist?: string[];\n denylist?: string[];\n /** @default false */\n caseSensitive?: boolean;\n}): GuardrailFn<ToolCallGuardrailData> {\n const { allowlist, denylist, caseSensitive = false } = options;\n\n const normalizedAllowlist = allowlist?.map((t) => caseSensitive ? t : t.toLowerCase());\n const normalizedDenylist = denylist?.map((t) => caseSensitive ? t : t.toLowerCase());\n\n return (data) => {\n const toolName = caseSensitive ? data.toolCall.name : data.toolCall.name.toLowerCase();\n\n if (normalizedAllowlist && !normalizedAllowlist.includes(toolName)) {\n return { passed: false, reason: `Tool \"${data.toolCall.name}\" not in allowlist` };\n }\n\n if (normalizedDenylist && normalizedDenylist.includes(toolName)) {\n return { passed: false, reason: `Tool \"${data.toolCall.name}\" is blocked` };\n }\n\n return { passed: true };\n };\n}\n\n// ============================================================================\n// Output Schema Guardrail\n// ============================================================================\n\n/**\n * Create an output schema validation guardrail.\n */\nexport function createOutputSchemaGuardrail<T = unknown>(options: {\n validate: SchemaValidator<T>;\n errorPrefix?: string;\n}): GuardrailFn<OutputGuardrailData> {\n const { validate, errorPrefix = \"Output schema validation failed\" } = options;\n\n return (data) => {\n const result = validate(data.output);\n\n if (typeof result === \"boolean\") {\n return {\n passed: result,\n reason: result ? undefined : errorPrefix,\n };\n }\n\n if (result.valid) {\n return { passed: true };\n }\n\n const errorMessage = result.errors?.length\n ? `${errorPrefix}: ${result.errors.join(\"; \")}`\n : errorPrefix;\n\n return { passed: false, reason: errorMessage };\n };\n}\n\n// ============================================================================\n// Output Type Guardrail\n// ============================================================================\n\n/**\n * Create a simple type check guardrail for common output types.\n */\nexport function createOutputTypeGuardrail(options: {\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n requiredFields?: string[];\n minLength?: number;\n maxLength?: number;\n minStringLength?: number;\n maxStringLength?: number;\n}): GuardrailFn<OutputGuardrailData> {\n const {\n type,\n requiredFields = [],\n minLength,\n maxLength,\n minStringLength,\n maxStringLength,\n } = options;\n\n return (data) => {\n const output = data.output;\n\n switch (type) {\n case \"string\":\n if (typeof output !== \"string\") {\n return { passed: false, reason: `Expected string, got ${typeof output}` };\n }\n if (minStringLength !== undefined && output.length < minStringLength) {\n return { passed: false, reason: `String too short: ${output.length} < ${minStringLength}` };\n }\n if (maxStringLength !== undefined && output.length > maxStringLength) {\n return { passed: false, reason: `String too long: ${output.length} > ${maxStringLength}` };\n }\n return { passed: true };\n\n case \"number\":\n if (typeof output !== \"number\" || Number.isNaN(output)) {\n return { passed: false, reason: `Expected number, got ${typeof output}` };\n }\n return { passed: true };\n\n case \"boolean\":\n if (typeof output !== \"boolean\") {\n return { passed: false, reason: `Expected boolean, got ${typeof output}` };\n }\n return { passed: true };\n\n case \"object\":\n if (typeof output !== \"object\" || output === null || Array.isArray(output)) {\n return { passed: false, reason: `Expected object, got ${Array.isArray(output) ? \"array\" : typeof output}` };\n }\n for (const field of requiredFields) {\n if (!(field in output)) {\n return { passed: false, reason: `Missing required field: ${field}` };\n }\n }\n return { passed: true };\n\n case \"array\":\n if (!Array.isArray(output)) {\n return { passed: false, reason: `Expected array, got ${typeof output}` };\n }\n if (minLength !== undefined && output.length < minLength) {\n return { passed: false, reason: `Array too short: ${output.length} < ${minLength}` };\n }\n if (maxLength !== undefined && output.length > maxLength) {\n return { passed: false, reason: `Array too long: ${output.length} > ${maxLength}` };\n }\n return { passed: true };\n\n default:\n return { passed: false, reason: `Unknown type: ${type}` };\n }\n };\n}\n\n// ============================================================================\n// Length Guardrail\n// ============================================================================\n\n/**\n * Create a length guardrail that limits output size.\n *\n * @example\n * ```typescript\n * const lengthGuardrail = createLengthGuardrail({\n * maxCharacters: 5000,\n * });\n * ```\n */\nexport function createLengthGuardrail(options: {\n /** Maximum characters in output */\n maxCharacters?: number;\n /** Maximum estimated tokens in output */\n maxTokens?: number;\n /** Custom token estimator (default: chars / 4) */\n estimateTokens?: (text: string) => number;\n}): GuardrailFn<OutputGuardrailData> {\n const {\n maxCharacters,\n maxTokens,\n estimateTokens = (text: string) => Math.ceil(text.length / 4),\n } = options;\n\n return (data) => {\n const text = safeStringify(data.output);\n\n if (maxCharacters !== undefined && text.length > maxCharacters) {\n return {\n passed: false,\n reason: `Output too long: ${text.length} characters (max: ${maxCharacters})`,\n };\n }\n\n if (maxTokens !== undefined) {\n const tokens = estimateTokens(text);\n if (tokens > maxTokens) {\n return {\n passed: false,\n reason: `Output too long: ~${tokens} tokens (max: ${maxTokens})`,\n };\n }\n }\n\n return { passed: true };\n };\n}\n\n// ============================================================================\n// Content Filter Guardrail\n// ============================================================================\n\n/**\n * Create a content filter guardrail that blocks output matching specific patterns.\n *\n * @example\n * ```typescript\n * const contentFilter = createContentFilterGuardrail({\n * blockedPatterns: [\n * /\\bpassword\\b/i,\n * /\\bsecret\\b/i,\n * 'internal-only',\n * ],\n * });\n * ```\n */\nexport function createContentFilterGuardrail(options: {\n /** Patterns to block — strings or RegExp */\n blockedPatterns: Array<string | RegExp>;\n /** Case-sensitive matching for string patterns (default: false) */\n caseSensitive?: boolean;\n}): GuardrailFn<OutputGuardrailData> {\n const { blockedPatterns, caseSensitive = false } = options;\n\n if (blockedPatterns.length === 0) {\n console.warn(\"[Directive] createContentFilterGuardrail: blockedPatterns is empty — no content will be filtered\");\n }\n\n const compiledPatterns = blockedPatterns.map((p) => {\n if (p instanceof RegExp) return p;\n const escaped = p.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(escaped, caseSensitive ? \"g\" : \"gi\");\n });\n\n return (data) => {\n const text = safeStringify(data.output);\n\n for (const pattern of compiledPatterns) {\n pattern.lastIndex = 0; // Reset required for global flags across iterations\n if (pattern.test(text)) {\n return {\n passed: false,\n reason: `Output contains blocked content matching: ${pattern.source}`,\n };\n }\n }\n\n return { passed: true };\n };\n}\n","/**\n * Helper functions for AI adapter — createRunner, estimateCost, state queries, validation.\n */\n\nimport type {\n AdapterHooks,\n AgentLike,\n AgentRunner,\n RunResult,\n RunOptions,\n Message,\n TokenUsage,\n AgentState,\n ApprovalState,\n} from \"./types.js\";\n\n// ============================================================================\n// State Query Helpers\n// ============================================================================\n\n/** Check if agent is currently running. */\nexport function isAgentRunning(state: AgentState): boolean {\n return state.status === \"running\";\n}\n\n/** Check if there are pending approvals. */\nexport function hasPendingApprovals(state: ApprovalState): boolean {\n return state.pending.length > 0;\n}\n\n// ============================================================================\n// Cost Estimation\n// ============================================================================\n\n/**\n * Get total cost estimate based on token usage.\n *\n * @param tokenUsage - Total token count\n * @param ratePerMillionTokens - Cost per million tokens (required, no default to avoid stale pricing)\n * @returns Estimated cost in dollars\n */\nexport function estimateCost(\n tokenUsage: number,\n ratePerMillionTokens: number\n): number {\n return (tokenUsage / 1_000_000) * ratePerMillionTokens;\n}\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\nconst ALLOWED_PROTOCOLS = new Set([\"http:\", \"https:\"]);\n\n/**\n * Validate that a baseURL uses http or https.\n * Throws immediately at adapter creation time (not at call time) to catch config errors early.\n */\nexport function validateBaseURL(baseURL: string): void {\n try {\n const url = new URL(baseURL);\n if (!ALLOWED_PROTOCOLS.has(url.protocol)) {\n throw new Error(\n `[Directive] Invalid baseURL protocol \"${url.protocol}\" – only http: and https: are allowed`,\n );\n }\n } catch (err) {\n if (err instanceof Error && err.message.startsWith(\"[Directive]\")) {\n throw err;\n }\n\n throw new Error(\n `[Directive] Invalid baseURL \"${baseURL}\" – must be a valid URL (e.g. \"https://api.openai.com/v1\")`,\n );\n }\n}\n\n// ============================================================================\n// createRunner Helper\n// ============================================================================\n\n/** Parsed response from an LLM provider */\nexport interface ParsedResponse {\n text: string;\n totalTokens: number;\n /** Input token count, when available from the provider */\n inputTokens?: number;\n /** Output token count, when available from the provider */\n outputTokens?: number;\n}\n\n/** Options for creating an AgentRunner from buildRequest/parseResponse */\nexport interface CreateRunnerOptions {\n fetch?: typeof globalThis.fetch;\n buildRequest: (\n agent: AgentLike,\n input: string,\n messages: Message[]\n ) => { url: string; init: RequestInit };\n parseResponse: (\n response: Response,\n messages: Message[]\n ) => Promise<ParsedResponse>;\n parseOutput?: <T>(text: string) => T;\n /** Lifecycle hooks for tracing, logging, and metrics */\n hooks?: AdapterHooks;\n}\n\n/**\n * Create an AgentRunner from buildRequest/parseResponse helpers.\n * Reduces ~50 lines of fetch boilerplate to ~20 lines of configuration.\n *\n * Supports lifecycle hooks for observability:\n * - `onBeforeCall` fires before each API request\n * - `onAfterCall` fires after a successful response (includes token breakdown)\n * - `onError` fires when the request fails\n *\n * @example\n * ```typescript\n * const runClaude = createRunner({\n * buildRequest: (agent, input) => ({\n * url: \"/api/claude\",\n * init: {\n * method: \"POST\",\n * headers: { \"Content-Type\": \"application/json\" },\n * body: JSON.stringify({\n * model: agent.model ?? \"claude-haiku-4-5-20251001\",\n * system: agent.instructions ?? \"\",\n * messages: [{ role: \"user\", content: input }],\n * }),\n * },\n * }),\n * parseResponse: async (res) => {\n * const data = await res.json();\n * const inputTokens = data.usage?.input_tokens ?? 0;\n * const outputTokens = data.usage?.output_tokens ?? 0;\n * return {\n * text: data.content?.[0]?.text ?? \"\",\n * totalTokens: inputTokens + outputTokens,\n * inputTokens,\n * outputTokens,\n * };\n * },\n * hooks: {\n * onAfterCall: ({ durationMs, tokenUsage }) => {\n * console.log(`LLM call: ${durationMs}ms, ${tokenUsage.inputTokens}in/${tokenUsage.outputTokens}out`);\n * },\n * },\n * });\n * ```\n */\nexport function createRunner(options: CreateRunnerOptions): AgentRunner {\n const {\n fetch: fetchFn = globalThis.fetch,\n buildRequest,\n parseResponse,\n parseOutput,\n hooks,\n } = options;\n\n const defaultParseOutput = <T>(text: string): T => {\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n };\n\n const parse = parseOutput ?? defaultParseOutput;\n\n return async <T = unknown>(\n agent: AgentLike,\n input: string,\n runOptions?: RunOptions\n ): Promise<RunResult<T>> => {\n const startTime = Date.now();\n hooks?.onBeforeCall?.({ agent, input, timestamp: startTime });\n\n const messages: Message[] = [{ role: \"user\", content: input }];\n\n try {\n const { url, init } = buildRequest(agent, input, messages);\n\n const fetchInit: RequestInit = runOptions?.signal\n ? { ...init, signal: runOptions.signal }\n : init;\n\n const response = await fetchFn(url, fetchInit);\n\n if (!response.ok) {\n const errBody = await response.text().catch(() => \"\");\n\n throw new Error(\n `[Directive] AgentRunner request failed: ${response.status} ${response.statusText}${errBody ? ` – ${errBody.slice(0, 300)}` : \"\"}`,\n );\n }\n\n const parsed = await parseResponse(response, messages);\n const tokenUsage: TokenUsage = {\n inputTokens: parsed.inputTokens ?? 0,\n outputTokens: parsed.outputTokens ?? 0,\n };\n\n const assistantMessage: Message = { role: \"assistant\", content: parsed.text };\n const allMessages: Message[] = [...messages, assistantMessage];\n\n runOptions?.onMessage?.(assistantMessage);\n\n const durationMs = Date.now() - startTime;\n hooks?.onAfterCall?.({\n agent,\n input,\n output: parsed.text,\n totalTokens: parsed.totalTokens,\n tokenUsage,\n durationMs,\n timestamp: Date.now(),\n });\n\n return {\n output: parse<T>(parsed.text),\n messages: allMessages,\n toolCalls: [],\n totalTokens: parsed.totalTokens,\n tokenUsage,\n };\n } catch (err) {\n const durationMs = Date.now() - startTime;\n if (err instanceof Error) {\n hooks?.onError?.({\n agent,\n input,\n error: err,\n durationMs,\n timestamp: Date.now(),\n });\n }\n\n throw err;\n }\n };\n}\n","/**\n * Constraint Helper Functions — Ergonomic builders for OrchestratorConstraint\n *\n * @example\n * ```typescript\n * import { constraint, when } from '@directive-run/ai';\n *\n * constraints: {\n * // Builder pattern\n * escalate: constraint<MyFacts>()\n * .when(f => f.confidence < 0.7)\n * .require({ type: 'ESCALATE' })\n * .priority(50)\n * .build(),\n *\n * // Quick shorthand\n * pause: when<MyFacts>(f => f.errors > 3)\n * .require({ type: 'PAUSE' }),\n * }\n * ```\n */\n\nimport type { Requirement } from \"@directive-run/core\";\nimport type { OrchestratorConstraint, OrchestratorState } from \"./types.js\";\n\n// ============================================================================\n// Builder Pattern\n// ============================================================================\n\ninterface ConstraintBuilderWithWhen<F extends Record<string, unknown>> {\n\trequire(\n\t\treq: Requirement | ((facts: F & OrchestratorState) => Requirement),\n\t): ConstraintBuilderWithRequire<F>;\n}\n\ninterface ConstraintBuilderWithRequire<F extends Record<string, unknown>> {\n\tpriority(p: number): ConstraintBuilderWithRequire<F>;\n\tbuild(): OrchestratorConstraint<F>;\n}\n\nexport interface ConstraintBuilder<F extends Record<string, unknown>> {\n\twhen(\n\t\tcondition: (facts: F & OrchestratorState) => boolean | Promise<boolean>,\n\t): ConstraintBuilderWithWhen<F>;\n}\n\n/**\n * Fluent builder for creating orchestrator constraints.\n *\n * @example\n * ```typescript\n * const myConstraint = constraint<MyFacts>()\n * .when(f => f.confidence < 0.7)\n * .require({ type: 'ESCALATE' })\n * .priority(50)\n * .build();\n * ```\n */\nexport function constraint<\n\tF extends Record<string, unknown> = Record<string, never>,\n>(): ConstraintBuilder<F> {\n\treturn {\n\t\twhen(condition) {\n\t\t\treturn {\n\t\t\t\trequire(req) {\n\t\t\t\t\tlet p = 0;\n\t\t\t\t\tconst result: ConstraintBuilderWithRequire<F> = {\n\t\t\t\t\t\tpriority(val) {\n\t\t\t\t\t\t\tp = val;\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuild(): OrchestratorConstraint<F> {\n\t\t\t\t\t\t\treturn { when: condition, require: req, priority: p };\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Quick Shorthand\n// ============================================================================\n\ninterface WhenResult<F extends Record<string, unknown>> {\n\trequire(\n\t\treq: Requirement | ((facts: F & OrchestratorState) => Requirement),\n\t): WhenWithRequire<F>;\n}\n\n/**\n * Result of `when().require()` — a valid `OrchestratorConstraint<F>` directly,\n * or chain `.withPriority(n)` to get a constraint with priority set.\n */\nexport interface WhenWithRequire<F extends Record<string, unknown>>\n\textends OrchestratorConstraint<F> {\n\t/** Return a new constraint with the given priority */\n\twithPriority(p: number): OrchestratorConstraint<F>;\n}\n\n/**\n * Quick shorthand for creating simple constraints.\n * The returned object is a valid `OrchestratorConstraint<F>` — use directly\n * or chain `.withPriority(n)` to set priority.\n *\n * @example\n * ```typescript\n * const myConstraint = when<MyFacts>(f => f.errors > 3)\n * .require({ type: 'PAUSE' });\n *\n * // With priority\n * const urgent = when<MyFacts>(f => f.critical)\n * .require({ type: 'HALT' })\n * .withPriority(100);\n * ```\n */\nexport function when<\n\tF extends Record<string, unknown> = Record<string, never>,\n>(\n\tcondition: (facts: F & OrchestratorState) => boolean | Promise<boolean>,\n): WhenResult<F> {\n\treturn {\n\t\trequire(req) {\n\t\t\treturn {\n\t\t\t\twhen: condition,\n\t\t\t\trequire: req,\n\t\t\t\tpriority: 0,\n\t\t\t\twithPriority(p: number): OrchestratorConstraint<F> {\n\t\t\t\t\treturn { when: condition, require: req, priority: p };\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n","/**\n * Agent Memory System\n *\n * Provides sliding window message management and automatic summarization\n * for long-running agent conversations.\n *\n * @example\n * ```typescript\n * import { createAgentMemory, createSlidingWindowStrategy } from '@directive-run/ai';\n *\n * const memory = createAgentMemory({\n * strategy: createSlidingWindowStrategy({ maxMessages: 50 }),\n * summarizer: async (messages) => {\n * // Call LLM to summarize older messages\n * return await summarizeWithLLM(messages);\n * },\n * });\n *\n * // Use with orchestrator\n * const orchestrator = createAgentOrchestrator({\n * memory,\n * runner: run,\n * });\n * ```\n */\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/**\n * Memory-compatible message type.\n * Extends the standard Message type to include system messages for summaries.\n */\nexport interface MemoryMessage {\n role: \"user\" | \"assistant\" | \"tool\" | \"system\";\n content: string;\n toolCallId?: string;\n}\n\n// Alias for compatibility\nexport type Message = MemoryMessage;\n\n// ============================================================================\n// Memory Strategy Types\n// ============================================================================\n\n/** Configuration for memory management strategies */\nexport interface MemoryStrategyConfig {\n /** Maximum number of messages to keep in active memory */\n maxMessages?: number;\n /** Maximum total tokens to keep in active memory */\n maxTokens?: number;\n /** Number of recent messages to always keep (protected from summarization) */\n preserveRecentCount?: number;\n /** Whether to include system messages in token count */\n countSystemMessages?: boolean;\n}\n\n/** Result of a memory strategy evaluation */\nexport interface MemoryStrategyResult {\n /** Messages to keep in active memory */\n keep: Message[];\n /** Messages to summarize or discard */\n toSummarize: Message[];\n /** Estimated token count of kept messages */\n estimatedTokens: number;\n}\n\n/** Memory management strategy function */\nexport type MemoryStrategy = (\n messages: Message[],\n config: MemoryStrategyConfig\n) => MemoryStrategyResult;\n\n/** Summarizer function to compress older messages */\nexport type MessageSummarizer = (messages: Message[]) => Promise<string>;\n\n// ============================================================================\n// Memory Instance Types\n// ============================================================================\n\n/** Agent memory configuration */\nexport interface AgentMemoryConfig {\n /** Memory management strategy */\n strategy: MemoryStrategy;\n /** Optional summarizer for compressing old messages */\n summarizer?: MessageSummarizer;\n /** Strategy configuration */\n strategyConfig?: MemoryStrategyConfig;\n /** Whether to auto-manage memory after each interaction */\n autoManage?: boolean;\n /** Callback when memory is managed */\n onMemoryManaged?: (result: MemoryManageResult) => void;\n /** Callback when auto-manage encounters an error */\n onManageError?: (error: Error) => void;\n /** Maximum context window tokens (triggers additional summarization if exceeded) */\n maxContextTokens?: number;\n}\n\n/** Result of memory management */\nexport interface MemoryManageResult {\n /** Number of messages before management */\n messagesBefore: number;\n /** Number of messages after management */\n messagesAfter: number;\n /** Number of messages summarized */\n messagesSummarized: number;\n /** The summary that was generated (if any) */\n summary?: string;\n /** Estimated tokens before */\n estimatedTokensBefore: number;\n /** Estimated tokens after */\n estimatedTokensAfter: number;\n}\n\n/** Memory state for a conversation */\nexport interface MemoryState {\n /** Active messages in memory */\n messages: Message[];\n /** Summaries of older messages */\n summaries: Array<{\n content: string;\n messagesCount: number;\n createdAt: number;\n }>;\n /** Total messages ever processed */\n totalMessagesProcessed: number;\n /** Estimated current token count */\n estimatedTokens: number;\n}\n\n/** Agent memory instance */\nexport interface AgentMemory {\n /** Get current memory state */\n getState(): MemoryState;\n /** Add a message to memory */\n addMessage(message: Message): void;\n /** Check if memory management is currently in progress */\n isManaging(): boolean;\n /** Add multiple messages to memory */\n addMessages(messages: Message[]): void;\n /** Get messages for context (includes summaries as system messages) */\n getContextMessages(): Message[];\n /** Manually trigger memory management */\n manage(): Promise<MemoryManageResult>;\n /** Clear all memory */\n clear(): void;\n /** Export memory state for persistence */\n export(): MemoryState;\n /** Import memory state from persistence */\n import(state: MemoryState): void;\n}\n\n// ============================================================================\n// Token Estimation\n// ============================================================================\n\n/** Approximate characters per token (default heuristic) */\nconst APPROX_CHARS_PER_TOKEN = 4;\n\n/**\n * Estimate token count for a message.\n * Uses a simple heuristic: ~4 characters per token.\n * For more accurate counts, use a tokenizer like tiktoken.\n *\n * @example\n * ```typescript\n * // Default heuristic\n * const tokens = estimateTokens({ role: 'user', content: 'Hello world' });\n *\n * // Custom tokenizer (e.g., tiktoken)\n * const tokens = estimateTokens(msg, (text) => tiktoken.encode(text).length);\n * ```\n */\nexport function estimateTokens(\n message: Message,\n tokenizer?: (text: string) => number\n): number {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content);\n\n if (tokenizer) {\n return tokenizer(content);\n }\n\n return Math.ceil(content.length / APPROX_CHARS_PER_TOKEN);\n}\n\n/**\n * Estimate total tokens for an array of messages.\n */\nexport function estimateTotalTokens(\n messages: Message[],\n tokenizer?: (text: string) => number\n): number {\n return messages.reduce((sum, msg) => sum + estimateTokens(msg, tokenizer), 0);\n}\n\n// ============================================================================\n// Built-in Strategies\n// ============================================================================\n\n/**\n * Create a sliding window memory strategy.\n *\n * Keeps the most recent N messages, moving older ones to summarization.\n *\n * @example\n * ```typescript\n * const strategy = createSlidingWindowStrategy({\n * maxMessages: 50,\n * preserveRecentCount: 10,\n * });\n * ```\n */\nexport function createSlidingWindowStrategy(\n defaultConfig: MemoryStrategyConfig = {}\n): MemoryStrategy {\n return (messages: Message[], configOverride: MemoryStrategyConfig = {}) => {\n const config = { ...defaultConfig, ...configOverride };\n const maxMessages = config.maxMessages ?? 100;\n const preserveRecentCount = config.preserveRecentCount ?? 5;\n\n if (messages.length <= maxMessages) {\n return {\n keep: [...messages],\n toSummarize: [],\n estimatedTokens: estimateTotalTokens(messages),\n };\n }\n\n // Always keep the most recent messages\n const recentMessages = messages.slice(-preserveRecentCount);\n const olderMessages = messages.slice(0, -preserveRecentCount);\n\n // Calculate how many older messages we can keep\n const olderToKeep = Math.max(0, maxMessages - preserveRecentCount);\n const keptOlder = olderMessages.slice(-olderToKeep);\n const toSummarize = olderMessages.slice(0, -olderToKeep || undefined);\n\n const keep = [...keptOlder, ...recentMessages];\n\n return {\n keep,\n toSummarize: toSummarize.length > 0 ? toSummarize : [],\n estimatedTokens: estimateTotalTokens(keep),\n };\n };\n}\n\n/**\n * Create a token-based memory strategy.\n *\n * Keeps messages until a token limit is reached, then moves older ones to summarization.\n *\n * @example\n * ```typescript\n * const strategy = createTokenBasedStrategy({\n * maxTokens: 4000,\n * preserveRecentCount: 5,\n * });\n * ```\n */\nexport function createTokenBasedStrategy(\n defaultConfig: MemoryStrategyConfig = {}\n): MemoryStrategy {\n return (messages: Message[], configOverride: MemoryStrategyConfig = {}) => {\n const config = { ...defaultConfig, ...configOverride };\n const maxTokens = config.maxTokens ?? 4000;\n const preserveRecentCount = config.preserveRecentCount ?? 5;\n const countSystemMessages = config.countSystemMessages ?? true;\n\n // Always keep recent messages\n const recentMessages = messages.slice(-preserveRecentCount);\n const olderMessages = messages.slice(0, -preserveRecentCount);\n\n let recentTokens = recentMessages.reduce((sum, msg) => {\n if (!countSystemMessages && msg.role === \"system\") return sum;\n return sum + estimateTokens(msg);\n }, 0);\n\n // Add older messages from newest to oldest until we hit the limit\n const keep: Message[] = [];\n const toSummarize: Message[] = [];\n let currentTokens = recentTokens;\n\n for (let i = olderMessages.length - 1; i >= 0; i--) {\n const msg = olderMessages[i]!; // Safe: i is within bounds\n const msgTokens =\n !countSystemMessages && msg.role === \"system\" ? 0 : estimateTokens(msg);\n\n if (currentTokens + msgTokens <= maxTokens) {\n keep.unshift(msg);\n currentTokens += msgTokens;\n } else {\n // All remaining older messages go to summarization\n toSummarize.push(...olderMessages.slice(0, i + 1));\n break;\n }\n }\n\n return {\n keep: [...keep, ...recentMessages],\n toSummarize,\n estimatedTokens: currentTokens,\n };\n };\n}\n\n/**\n * Create a hybrid strategy that combines message count and token limits.\n *\n * @example\n * ```typescript\n * const strategy = createHybridStrategy({\n * maxMessages: 50,\n * maxTokens: 4000,\n * preserveRecentCount: 5,\n * });\n * ```\n */\nexport function createHybridStrategy(\n defaultConfig: MemoryStrategyConfig = {}\n): MemoryStrategy {\n const slidingWindow = createSlidingWindowStrategy(defaultConfig);\n const tokenBased = createTokenBasedStrategy(defaultConfig);\n\n return (messages: Message[], configOverride: MemoryStrategyConfig = {}) => {\n const config = { ...defaultConfig, ...configOverride };\n\n // Apply both strategies and use the more restrictive result\n const windowResult = slidingWindow(messages, config);\n const tokenResult = tokenBased(messages, config);\n\n // Use the strategy that keeps fewer messages\n if (windowResult.keep.length <= tokenResult.keep.length) {\n return windowResult;\n }\n return tokenResult;\n };\n}\n\n// ============================================================================\n// Agent Memory Factory\n// ============================================================================\n\n/**\n * Create an agent memory instance.\n *\n * @example\n * ```typescript\n * const memory = createAgentMemory({\n * strategy: createSlidingWindowStrategy({ maxMessages: 50 }),\n * summarizer: async (messages) => {\n * const response = await openai.chat.completions.create({\n * model: 'gpt-4o-mini',\n * messages: [\n * { role: 'system', content: 'Summarize the following conversation concisely.' },\n * ...messages.map(m => ({ role: m.role, content: m.content })),\n * ],\n * });\n * return response.choices[0].message.content;\n * },\n * autoManage: true,\n * });\n * ```\n */\nexport function createAgentMemory(config: AgentMemoryConfig): AgentMemory {\n const {\n strategy,\n summarizer,\n strategyConfig = {},\n autoManage = false,\n onMemoryManaged,\n onManageError,\n maxContextTokens,\n } = config;\n\n let state: MemoryState = {\n messages: [],\n summaries: [],\n totalMessagesProcessed: 0,\n estimatedTokens: 0,\n };\n\n // Flag to prevent concurrent management operations\n let isManaging = false;\n\n async function manage(): Promise<MemoryManageResult> {\n // Prevent concurrent management\n if (isManaging) {\n return {\n messagesBefore: state.messages.length,\n messagesAfter: state.messages.length,\n messagesSummarized: 0,\n estimatedTokensBefore: state.estimatedTokens,\n estimatedTokensAfter: state.estimatedTokens,\n };\n }\n\n isManaging = true;\n\n try {\n const messagesBefore = state.messages.length;\n const estimatedTokensBefore = state.estimatedTokens;\n\n const result = strategy(state.messages, strategyConfig);\n\n if (result.toSummarize.length === 0) {\n return {\n messagesBefore,\n messagesAfter: messagesBefore,\n messagesSummarized: 0,\n estimatedTokensBefore,\n estimatedTokensAfter: result.estimatedTokens,\n };\n }\n\n let summary: string | undefined;\n\n if (summarizer && result.toSummarize.length > 0) {\n summary = await summarizer(result.toSummarize);\n state.summaries.push({\n content: summary,\n messagesCount: result.toSummarize.length,\n createdAt: Date.now(),\n });\n }\n\n state.messages = result.keep;\n state.estimatedTokens = result.estimatedTokens;\n\n const manageResult: MemoryManageResult = {\n messagesBefore,\n messagesAfter: state.messages.length,\n messagesSummarized: result.toSummarize.length,\n summary,\n estimatedTokensBefore,\n estimatedTokensAfter: result.estimatedTokens,\n };\n\n onMemoryManaged?.(manageResult);\n\n return manageResult;\n } finally {\n isManaging = false;\n }\n }\n\n // Safe auto-manage that handles errors properly\n function triggerAutoManage(): void {\n if (isManaging) return;\n\n const check = strategy(state.messages, strategyConfig);\n if (check.toSummarize.length > 0) {\n manage().catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onManageError) {\n onManageError(err);\n } else {\n console.error(\"[Directive Memory] Auto-manage error:\", err);\n }\n });\n }\n }\n\n return {\n getState() {\n return { ...state, messages: [...state.messages], summaries: state.summaries.map(s => ({ ...s })) };\n },\n\n addMessage(message: Message) {\n state.messages.push(message);\n state.totalMessagesProcessed++;\n state.estimatedTokens += estimateTokens(message);\n\n if (autoManage) {\n triggerAutoManage();\n }\n },\n\n addMessages(messages: Message[]) {\n for (const message of messages) {\n state.messages.push(message);\n state.totalMessagesProcessed++;\n state.estimatedTokens += estimateTokens(message);\n }\n\n if (autoManage) {\n triggerAutoManage();\n }\n },\n\n getContextMessages(): Message[] {\n const contextMessages: Message[] = [];\n\n // Add summaries as system messages at the beginning\n if (state.summaries.length > 0) {\n const summaryContent = state.summaries\n .map((s) => s.content)\n .join(\"\\n\\n---\\n\\n\");\n\n contextMessages.push({\n role: \"system\",\n content: `[Previous conversation summary]\\n\\n${summaryContent}`,\n });\n }\n\n // Add current messages\n contextMessages.push(...state.messages);\n\n // Check if context exceeds max tokens and warn\n if (maxContextTokens) {\n const totalTokens = estimateTotalTokens(contextMessages);\n if (totalTokens > maxContextTokens) {\n console.warn(\n `[Directive Memory] Context messages (${totalTokens} tokens) exceed maxContextTokens (${maxContextTokens}). ` +\n `Consider calling manage() or reducing message count.`\n );\n }\n }\n\n return contextMessages;\n },\n\n manage,\n\n /** Check if memory management is currently in progress */\n isManaging() {\n return isManaging;\n },\n\n clear() {\n state = {\n messages: [],\n summaries: [],\n totalMessagesProcessed: 0,\n estimatedTokens: 0,\n };\n },\n\n export() {\n return {\n ...state,\n messages: [...state.messages],\n summaries: state.summaries.map((s) => ({ ...s })),\n };\n },\n\n import(importedState: MemoryState) {\n state = {\n ...importedState,\n messages: [...importedState.messages],\n summaries: importedState.summaries.map((s) => ({ ...s })),\n };\n },\n };\n}\n\n// ============================================================================\n// Built-in Summarizers\n// ============================================================================\n\n/**\n * Create a simple truncation \"summarizer\" that just returns key points.\n * Useful for testing or when LLM summarization isn't needed.\n */\nexport function createTruncationSummarizer(maxLength = 500): MessageSummarizer {\n return async (messages: Message[]) => {\n const content = messages\n .filter((m) => m.role !== \"system\")\n .map((m) => {\n const text =\n typeof m.content === \"string\"\n ? m.content\n : JSON.stringify(m.content);\n return `${m.role}: ${text.slice(0, 100)}${text.length > 100 ? \"...\" : \"\"}`;\n })\n .join(\"\\n\");\n\n if (content.length <= maxLength) {\n return content;\n }\n\n return content.slice(0, maxLength) + \"\\n[truncated]\";\n };\n}\n\n/**\n * Create a summarizer that extracts only user questions and key assistant answers.\n */\nexport function createKeyPointsSummarizer(): MessageSummarizer {\n return async (messages: Message[]) => {\n const keyPoints: string[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content);\n // Extract questions (sentences ending with ?)\n const questions = content.match(/[^.!?]*\\?/g);\n if (questions) {\n keyPoints.push(...questions.map((q) => `Q: ${q.trim()}`));\n }\n }\n }\n\n if (keyPoints.length === 0) {\n return `[${messages.length} messages processed - no key questions found]`;\n }\n\n return `Key topics discussed:\\n${keyPoints.join(\"\\n\")}`;\n };\n}\n\n/**\n * Create a summarizer factory for LLM-based summarization.\n * You provide the LLM call function, this handles the prompt.\n *\n * @example\n * ```typescript\n * const summarizer = createLLMSummarizer(async (prompt) => {\n * const response = await openai.chat.completions.create({\n * model: 'gpt-4o-mini',\n * messages: [{ role: 'user', content: prompt }],\n * });\n * return response.choices[0].message.content ?? '';\n * });\n * ```\n */\nexport function createLLMSummarizer(\n llmCall: (prompt: string) => Promise<string>,\n options: {\n maxSummaryLength?: number;\n preserveKeyFacts?: boolean;\n } = {}\n): MessageSummarizer {\n const { maxSummaryLength = 500, preserveKeyFacts = true } = options;\n\n return async (messages: Message[]) => {\n const conversationText = messages\n .filter((m) => m.role !== \"system\")\n .map((m) => {\n const content =\n typeof m.content === \"string\"\n ? m.content\n : JSON.stringify(m.content);\n return `${m.role.toUpperCase()}: ${content}`;\n })\n .join(\"\\n\\n\");\n\n const prompt = `Summarize the following conversation in ${maxSummaryLength} characters or less.\n${preserveKeyFacts ? \"Preserve key facts, decisions, and action items.\" : \"\"}\nFocus on information that would be useful context for continuing the conversation.\n\nCONVERSATION:\n${conversationText}\n\nSUMMARY:`;\n\n return llmCall(prompt);\n };\n}\n","/**\n * OpenAI Agents Streaming - Token-by-token streaming with backpressure support\n *\n * Provides async iterators for streaming agent responses with guardrail evaluation\n * on partial output and configurable backpressure handling.\n *\n * @example\n * ```typescript\n * import { createAgentOrchestrator } from '@directive-run/ai';\n * import { createStreamingRunner } from '@directive-run/ai';\n *\n * const { stream, result } = orchestrator.runStream(agent, input);\n *\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * if (chunk.type === 'guardrail_triggered') handleGuardrail(chunk);\n * }\n *\n * const finalResult = await result;\n * ```\n */\n\nimport type { AgentLike, Message, RunResult, GuardrailFn, OutputGuardrailData } from \"./index.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default buffer size for streaming backpressure */\nexport const DEFAULT_BUFFER_SIZE = 1000;\n\n/** Default interval (in tokens) between guardrail checks during streaming */\nexport const DEFAULT_GUARDRAIL_CHECK_INTERVAL = 50;\n\n/** Default toxicity threshold for toxicity streaming guardrail */\nexport const DEFAULT_TOXICITY_THRESHOLD = 0.8;\n\n/** Maximum number of stream keys to track for warning deduplication */\nexport const MAX_TRACKED_STREAMS = 100;\n\n// ============================================================================\n// Stream Event Types\n// ============================================================================\n\n/** Token chunk from streaming response */\nexport interface TokenChunk {\n type: \"token\";\n data: string;\n /** Running total of tokens received */\n tokenCount: number;\n}\n\n/** Tool execution started */\nexport interface ToolStartChunk {\n type: \"tool_start\";\n tool: string;\n toolCallId: string;\n arguments: string;\n}\n\n/** Tool execution completed */\nexport interface ToolEndChunk {\n type: \"tool_end\";\n tool: string;\n toolCallId: string;\n result: string;\n}\n\n/** Message added to conversation */\nexport interface MessageChunk {\n type: \"message\";\n message: Message;\n}\n\n/** Guardrail was triggered during streaming */\nexport interface GuardrailTriggeredChunk {\n type: \"guardrail_triggered\";\n guardrailName: string;\n reason: string;\n /** Partial output at the time of trigger */\n partialOutput: string;\n /** Whether the stream was stopped */\n stopped: boolean;\n}\n\n/** Progress update for UI feedback */\nexport interface ProgressChunk {\n type: \"progress\";\n phase: \"starting\" | \"generating\" | \"tool_calling\" | \"finishing\";\n /** Percentage complete (0-100), if known */\n percent?: number;\n /** Human-readable status message */\n message?: string;\n}\n\n/** Stream completed */\nexport interface DoneChunk {\n type: \"done\";\n totalTokens: number;\n duration: number;\n /** Number of tokens dropped due to backpressure (only with 'drop' strategy) */\n droppedTokens: number;\n}\n\n/** Error during streaming */\nexport interface ErrorChunk {\n type: \"error\";\n error: Error;\n /** Partial output before error */\n partialOutput?: string;\n}\n\n/** Union of all stream chunk types */\nexport type StreamChunk =\n | TokenChunk\n | ToolStartChunk\n | ToolEndChunk\n | MessageChunk\n | GuardrailTriggeredChunk\n | ProgressChunk\n | DoneChunk\n | ErrorChunk;\n\n// ============================================================================\n// Streaming Run Types\n// ============================================================================\n\n/** Backpressure strategy when consumer is slow */\nexport type BackpressureStrategy =\n /** Drop tokens when buffer is full (lossy, fast) */\n | \"drop\"\n /** Block producer when buffer is full (lossless, may slow response) */\n | \"block\"\n /** Buffer all tokens (lossless, uses memory) */\n | \"buffer\";\n\n/** Streaming run options */\nexport interface StreamRunOptions {\n /** Maximum turns before stopping */\n maxTurns?: number;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Backpressure strategy (default: 'buffer') */\n backpressure?: BackpressureStrategy;\n /** Buffer size for 'drop' and 'block' strategies */\n bufferSize?: number;\n /** Evaluate guardrails every N tokens (default: 50) */\n guardrailCheckInterval?: number;\n /** Stop stream on guardrail trigger (default: true for critical) */\n stopOnGuardrail?: boolean | ((chunk: GuardrailTriggeredChunk) => boolean);\n}\n\n/** Stream run function type (mirrors OpenAI Agents streaming API) */\nexport type StreamRunner = <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: StreamRunOptions\n) => StreamingRunResult<T>;\n\n/** Result from a streaming run */\nexport interface StreamingRunResult<T = unknown> {\n /** Async iterator for streaming chunks */\n stream: AsyncIterable<StreamChunk>;\n /** Promise that resolves to the final result */\n result: Promise<RunResult<T>>;\n /** Abort the stream */\n abort: () => void;\n}\n\n// ============================================================================\n// Streaming Guardrail Types\n// ============================================================================\n\n/** Streaming guardrail that evaluates partial output */\nexport interface StreamingGuardrail {\n /** Unique name for this guardrail */\n name: string;\n /** Check partial output (called every guardrailCheckInterval tokens) */\n check: (partialOutput: string, tokenCount: number) => StreamingGuardrailResult | Promise<StreamingGuardrailResult>;\n /** Whether to stop the stream on failure (default: true) */\n stopOnFail?: boolean;\n}\n\n/** Result from a streaming guardrail check */\nexport interface StreamingGuardrailResult {\n passed: boolean;\n reason?: string;\n /** Severity level for UI display */\n severity?: \"warning\" | \"error\" | \"critical\";\n /** Warning message (guardrail passed but wants to emit a warning) */\n warning?: string;\n}\n\n// ============================================================================\n// Stream Buffer Implementation\n// ============================================================================\n\n/** Internal buffer for managing backpressure */\nclass StreamBuffer<T> {\n private buffer: T[] = [];\n private maxSize: number;\n private strategy: BackpressureStrategy;\n private pullWaiters: Array<(value: T | null) => void> = [];\n private pushWaiters: Array<() => void> = []; // For block strategy - queue-based, not polling\n private closed = false;\n private droppedCount = 0;\n\n constructor(strategy: BackpressureStrategy = \"buffer\", maxSize = DEFAULT_BUFFER_SIZE) {\n this.strategy = strategy;\n this.maxSize = maxSize;\n }\n\n async push(item: T): Promise<boolean> {\n if (this.closed) return false;\n\n // If there's a pull waiter, send directly\n const pullWaiter = this.pullWaiters.shift();\n if (pullWaiter) {\n pullWaiter(item);\n return true;\n }\n\n // Handle based on strategy\n if (this.buffer.length >= this.maxSize) {\n switch (this.strategy) {\n case \"drop\":\n this.droppedCount++;\n return false;\n case \"block\":\n // Queue-based blocking (no polling) - wait for consumer to pull\n await new Promise<void>((resolve) => {\n this.pushWaiters.push(resolve);\n });\n if (this.closed) return false;\n break;\n case \"buffer\":\n // Just push anyway (may use lots of memory)\n break;\n }\n }\n\n this.buffer.push(item);\n return true;\n }\n\n async pull(): Promise<T | null> {\n // Notify a blocked producer that space is available\n const pushWaiter = this.pushWaiters.shift();\n if (pushWaiter) {\n pushWaiter();\n }\n\n if (this.buffer.length > 0) {\n return this.buffer.shift()!;\n }\n\n if (this.closed) {\n return null;\n }\n\n // Wait for next item\n return new Promise<T | null>((resolve) => {\n this.pullWaiters.push(resolve);\n });\n }\n\n close(): void {\n this.closed = true;\n // Resolve all waiting consumers with null\n for (const waiter of this.pullWaiters) {\n waiter(null);\n }\n this.pullWaiters = [];\n // Unblock all waiting producers\n for (const waiter of this.pushWaiters) {\n waiter();\n }\n this.pushWaiters = [];\n }\n\n getDroppedCount(): number {\n return this.droppedCount;\n }\n}\n\n// ============================================================================\n// Streaming Runner Implementation\n// ============================================================================\n\n/**\n * Create a streaming runner that wraps a base run function.\n * This is used internally by the orchestrator but can be used standalone.\n *\n * @param baseRunner - The underlying non-streaming runner\n * @param options - Configuration options\n */\nexport function createStreamingRunner(\n baseRunner: (\n agent: AgentLike,\n input: string,\n callbacks: {\n onToken?: (token: string) => void;\n onToolStart?: (tool: string, id: string, args: string) => void;\n onToolEnd?: (tool: string, id: string, result: string) => void;\n onMessage?: (message: Message) => void;\n signal?: AbortSignal;\n }\n ) => Promise<RunResult<unknown>>,\n options: {\n streamingGuardrails?: StreamingGuardrail[];\n } = {}\n): StreamRunner {\n const { streamingGuardrails = [] } = options;\n\n return <T>(\n agent: AgentLike,\n input: string,\n runOptions: StreamRunOptions = {}\n ): StreamingRunResult<T> => {\n const {\n signal,\n backpressure = \"buffer\",\n bufferSize = DEFAULT_BUFFER_SIZE,\n guardrailCheckInterval = DEFAULT_GUARDRAIL_CHECK_INTERVAL,\n stopOnGuardrail = true,\n } = runOptions;\n\n // Validate configuration\n if (guardrailCheckInterval <= 0 || !Number.isFinite(guardrailCheckInterval)) {\n throw new Error(\n `[Directive Streaming] guardrailCheckInterval must be a positive number, got ${guardrailCheckInterval}`\n );\n }\n\n const buffer = new StreamBuffer<StreamChunk>(backpressure, bufferSize);\n const abortController = new AbortController();\n let partialOutput = \"\";\n let tokenCount = 0;\n let stopped = false;\n const startTime = Date.now();\n\n // Combine external abort signal with internal one (with proper cleanup)\n let abortHandler: (() => void) | undefined;\n if (signal) {\n abortHandler = () => abortController.abort();\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n // Cleanup function to prevent memory leaks\n const cleanup = () => {\n if (abortHandler && signal) {\n signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n // Check streaming guardrails\n async function checkGuardrails(): Promise<GuardrailTriggeredChunk | null> {\n for (const guardrail of streamingGuardrails) {\n try {\n const result = await guardrail.check(partialOutput, tokenCount);\n if (!result.passed) {\n const shouldStop = guardrail.stopOnFail !== false;\n const chunk: GuardrailTriggeredChunk = {\n type: \"guardrail_triggered\",\n guardrailName: guardrail.name,\n reason: result.reason ?? \"Guardrail check failed\",\n partialOutput,\n stopped: shouldStop,\n };\n\n await buffer.push(chunk);\n\n if (shouldStop) {\n const stopFn = typeof stopOnGuardrail === \"function\"\n ? stopOnGuardrail\n : () => stopOnGuardrail;\n if (stopFn(chunk)) {\n stopped = true;\n abortController.abort();\n }\n }\n\n return chunk;\n }\n } catch (error) {\n // Guardrail error - log but continue\n console.error(`Streaming guardrail \"${guardrail.name}\" error:`, error);\n }\n }\n return null;\n }\n\n // Run the agent and pipe to buffer\n const resultPromise = (async (): Promise<RunResult<T>> => {\n await buffer.push({ type: \"progress\", phase: \"starting\", message: \"Starting agent\" });\n\n try {\n const result = await baseRunner(agent, input, {\n signal: abortController.signal,\n onToken: async (token) => {\n if (stopped) return;\n\n tokenCount++;\n partialOutput += token;\n\n await buffer.push({\n type: \"token\",\n data: token,\n tokenCount,\n });\n\n // Check guardrails periodically\n if (tokenCount % guardrailCheckInterval === 0) {\n await checkGuardrails();\n }\n },\n onToolStart: async (tool, id, args) => {\n await buffer.push({ type: \"progress\", phase: \"tool_calling\", message: `Calling ${tool}` });\n await buffer.push({ type: \"tool_start\", tool, toolCallId: id, arguments: args });\n },\n onToolEnd: async (tool, id, result) => {\n await buffer.push({ type: \"tool_end\", tool, toolCallId: id, result });\n await buffer.push({ type: \"progress\", phase: \"generating\", message: \"Continuing generation\" });\n },\n onMessage: async (message) => {\n await buffer.push({ type: \"message\", message });\n },\n });\n\n // Final guardrail check\n await checkGuardrails();\n\n const duration = Date.now() - startTime;\n const droppedTokens = buffer.getDroppedCount();\n await buffer.push({\n type: \"done\",\n totalTokens: result.totalTokens,\n duration,\n droppedTokens,\n });\n\n buffer.close();\n return result as RunResult<T>;\n } catch (error) {\n const errorChunk: ErrorChunk = {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n partialOutput: partialOutput || undefined,\n };\n await buffer.push(errorChunk);\n buffer.close();\n throw error;\n } finally {\n // Always cleanup abort signal listener to prevent memory leaks\n cleanup();\n }\n })();\n\n // Create async iterator\n const stream: AsyncIterable<StreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<StreamChunk> {\n return {\n async next(): Promise<IteratorResult<StreamChunk>> {\n const chunk = await buffer.pull();\n if (chunk === null) {\n return { done: true, value: undefined };\n }\n return { done: false, value: chunk };\n },\n };\n },\n };\n\n return {\n stream,\n result: resultPromise,\n abort: () => abortController.abort(),\n };\n };\n}\n\n// ============================================================================\n// Built-in Streaming Guardrails\n// ============================================================================\n\n/**\n * Create a streaming guardrail that detects toxic content.\n *\n * @example\n * ```typescript\n * const toxicityGuardrail = createToxicityStreamingGuardrail({\n * threshold: 0.9,\n * checkFn: async (text) => myToxicityModel.score(text),\n * });\n * ```\n */\nexport function createToxicityStreamingGuardrail(options: {\n /** Toxicity scoring function (returns 0-1) */\n checkFn: (text: string) => number | Promise<number>;\n /** Threshold above which content is flagged (default: 0.8) */\n threshold?: number;\n /** Stop the stream on detection (default: true) */\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const { checkFn, threshold = DEFAULT_TOXICITY_THRESHOLD, stopOnFail = true } = options;\n\n return {\n name: \"toxicity-streaming\",\n stopOnFail,\n async check(partialOutput) {\n const score = await checkFn(partialOutput);\n if (score > threshold) {\n return {\n passed: false,\n reason: `Toxicity score ${score.toFixed(2)} exceeds threshold ${threshold}`,\n severity: \"critical\",\n };\n }\n return { passed: true };\n },\n };\n}\n\n/**\n * Create a streaming guardrail that limits output length.\n *\n * @example\n * ```typescript\n * const lengthGuardrail = createLengthStreamingGuardrail({\n * maxTokens: 4000,\n * warnAt: 3500,\n * });\n * ```\n */\nexport function createLengthStreamingGuardrail(options: {\n /** Maximum tokens before stopping */\n maxTokens: number;\n /** Warn at this token count (optional) */\n warnAt?: number;\n /** Stop the stream on max (default: true) */\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const { maxTokens, warnAt, stopOnFail = true } = options;\n\n // Track warned state per-stream with bounded size to prevent memory leaks\n // Uses a simple FIFO eviction when max size is reached\n const warnedStreams = new Set<string>();\n\n return {\n name: \"length-streaming\",\n stopOnFail,\n check(_partialOutput, tokenCount) {\n // Generate a unique key for this stream based on content length + token count\n // This allows warning to trigger once per stream when threshold is crossed\n const streamKey = `${_partialOutput.length}-${tokenCount}`;\n\n if (tokenCount >= maxTokens) {\n return {\n passed: false,\n reason: `Output exceeded maximum length of ${maxTokens} tokens`,\n severity: \"error\",\n };\n }\n\n if (warnAt && tokenCount >= warnAt && !warnedStreams.has(streamKey)) {\n // Mark as warned for token counts at or above warnAt threshold\n warnedStreams.add(streamKey);\n // Evict oldest entries if we exceed max tracked streams\n if (warnedStreams.size > MAX_TRACKED_STREAMS) {\n const firstKey = warnedStreams.values().next().value;\n if (firstKey) warnedStreams.delete(firstKey);\n }\n // Emit warning but don't fail\n return {\n passed: true,\n warning: `Approaching maximum length: ${tokenCount}/${maxTokens} tokens`,\n severity: \"warning\",\n };\n }\n\n return { passed: true };\n },\n };\n}\n\n/**\n * Create a streaming guardrail that detects patterns (regex-based).\n *\n * @example\n * ```typescript\n * const piiGuardrail = createPatternStreamingGuardrail({\n * patterns: [\n * { regex: /\\b\\d{3}-\\d{2}-\\d{4}\\b/, name: 'SSN' },\n * { regex: /\\b\\d{16}\\b/, name: 'Credit Card' },\n * ],\n * stopOnFail: true,\n * });\n * ```\n */\nexport function createPatternStreamingGuardrail(options: {\n patterns: Array<{ regex: RegExp; name: string }>;\n stopOnFail?: boolean;\n}): StreamingGuardrail {\n const { patterns, stopOnFail = true } = options;\n\n return {\n name: \"pattern-streaming\",\n stopOnFail,\n check(partialOutput) {\n for (const { regex, name } of patterns) {\n if (regex.test(partialOutput)) {\n return {\n passed: false,\n reason: `Detected ${name} pattern in output`,\n severity: \"error\",\n };\n }\n }\n return { passed: true };\n },\n };\n}\n\n/**\n * Combine multiple streaming guardrails into one.\n *\n * @example\n * ```typescript\n * const combined = combineStreamingGuardrails([\n * createToxicityStreamingGuardrail({ ... }),\n * createLengthStreamingGuardrail({ ... }),\n * ]);\n * ```\n */\nexport function combineStreamingGuardrails(\n guardrails: StreamingGuardrail[],\n options: { name?: string; stopOnFirstFail?: boolean } = {}\n): StreamingGuardrail {\n const { name = \"combined-streaming\", stopOnFirstFail = true } = options;\n\n return {\n name,\n stopOnFail: stopOnFirstFail,\n async check(partialOutput, tokenCount) {\n for (const guardrail of guardrails) {\n const result = await guardrail.check(partialOutput, tokenCount);\n if (!result.passed && stopOnFirstFail) {\n return {\n ...result,\n reason: `[${guardrail.name}] ${result.reason}`,\n };\n }\n }\n return { passed: true };\n },\n };\n}\n\n// ============================================================================\n// Output Guardrail Adapter\n// ============================================================================\n\n/**\n * Convert a regular output guardrail to a streaming guardrail.\n * Useful for reusing existing guardrails in streaming context.\n *\n * @example\n * ```typescript\n * const streamingPII = adaptOutputGuardrail(\n * \"pii-streaming\",\n * createPIIGuardrail({ redact: false }),\n * { checkInterval: 100 }\n * );\n * ```\n */\nexport function adaptOutputGuardrail(\n name: string,\n guardrail: GuardrailFn<OutputGuardrailData>,\n options: {\n /** Only run after this many tokens (optimization) */\n minTokens?: number;\n stopOnFail?: boolean;\n } = {}\n): StreamingGuardrail {\n const { minTokens = 0, stopOnFail = true } = options;\n\n return {\n name,\n stopOnFail,\n async check(partialOutput, tokenCount) {\n if (tokenCount < minTokens) {\n return { passed: true };\n }\n\n const result = await guardrail(\n {\n output: partialOutput,\n agentName: \"streaming\",\n input: \"\",\n messages: [],\n },\n {\n agentName: \"streaming\",\n input: \"\",\n facts: {},\n }\n );\n\n return {\n passed: result.passed,\n reason: result.reason,\n severity: result.passed ? undefined : \"error\",\n };\n },\n };\n}\n\n// ============================================================================\n// Stream Utilities\n// ============================================================================\n\n/**\n * Collect all tokens from a stream into a string.\n *\n * @example\n * ```typescript\n * const { stream, result } = orchestrator.runStream(agent, input);\n * const fullOutput = await collectTokens(stream);\n * ```\n */\nexport async function collectTokens(stream: AsyncIterable<StreamChunk>): Promise<string> {\n let output = \"\";\n for await (const chunk of stream) {\n if (chunk.type === \"token\") {\n output += chunk.data;\n }\n }\n return output;\n}\n\n/**\n * Tap into a stream without consuming it.\n * Useful for logging or side effects.\n *\n * @example\n * ```typescript\n * const { stream } = orchestrator.runStream(agent, input);\n * const tapped = tapStream(stream, (chunk) => console.log(chunk));\n * for await (const chunk of tapped) { ... }\n * ```\n */\nexport async function* tapStream(\n stream: AsyncIterable<StreamChunk>,\n fn: (chunk: StreamChunk) => void | Promise<void>\n): AsyncIterable<StreamChunk> {\n for await (const chunk of stream) {\n await fn(chunk);\n yield chunk;\n }\n}\n\n/**\n * Filter stream chunks by type.\n *\n * @example\n * ```typescript\n * const tokensOnly = filterStream(stream, ['token']);\n * ```\n */\nexport async function* filterStream<T extends StreamChunk[\"type\"]>(\n stream: AsyncIterable<StreamChunk>,\n types: T[]\n): AsyncIterable<Extract<StreamChunk, { type: T }>> {\n const typeSet = new Set(types);\n for await (const chunk of stream) {\n if (typeSet.has(chunk.type as T)) {\n yield chunk as Extract<StreamChunk, { type: T }>;\n }\n }\n}\n\n/**\n * Transform stream chunks.\n *\n * @example\n * ```typescript\n * const upperTokens = mapStream(stream, (chunk) => {\n * if (chunk.type === 'token') return { ...chunk, data: chunk.data.toUpperCase() };\n * return chunk;\n * });\n * ```\n */\nexport async function* mapStream<R>(\n stream: AsyncIterable<StreamChunk>,\n fn: (chunk: StreamChunk) => R | Promise<R>\n): AsyncIterable<R> {\n for await (const chunk of stream) {\n yield await fn(chunk);\n }\n}\n","/**\n * Multi-Agent Orchestration Patterns\n *\n * Provides patterns for coordinating multiple AI agents:\n * - Parallel execution with result merging\n * - Sequential pipelines\n * - Supervisor patterns with worker delegation\n * - Constraint-driven agent selection\n *\n * @example\n * ```typescript\n * import { createMultiAgentOrchestrator } from '@directive-run/ai';\n *\n * const orchestrator = createMultiAgentOrchestrator({\n * agents: {\n * researcher: { agent: researchAgent, maxConcurrent: 3 },\n * writer: { agent: writerAgent, maxConcurrent: 1 },\n * reviewer: { agent: reviewerAgent, maxConcurrent: 1 },\n * },\n * patterns: {\n * parallelResearch: {\n * type: 'parallel',\n * agents: ['researcher', 'researcher', 'researcher'],\n * merge: (results) => combineResearch(results),\n * },\n * },\n * });\n * ```\n */\n\nimport type {\n AgentLike,\n RunResult,\n RunOptions,\n AgentRunner,\n GuardrailFn,\n OutputGuardrailData,\n NamedGuardrail,\n} from \"./index.js\";\nimport type { Requirement } from \"@directive-run/core\";\n\n// ============================================================================\n// Async Semaphore (for slot acquisition without polling)\n// ============================================================================\n\n/**\n * Async semaphore for controlling concurrent access.\n * Uses a queue-based approach instead of polling for efficiency.\n *\n * @example\n * ```typescript\n * import { Semaphore } from '@directive-run/ai';\n *\n * const sem = new Semaphore(3); // Allow 3 concurrent operations\n *\n * async function doWork() {\n * const release = await sem.acquire();\n * try {\n * await performWork();\n * } finally {\n * release();\n * }\n * }\n * ```\n */\nexport class Semaphore {\n private count: number;\n private readonly maxPermits: number;\n private readonly queue: Array<{ resolve: (release: () => void) => void; reject: (error: Error) => void }> = [];\n\n constructor(max: number) {\n this.maxPermits = max;\n this.count = max;\n }\n\n async acquire(): Promise<() => void> {\n if (this.count > 0) {\n this.count--;\n return () => this.release();\n }\n\n return new Promise<() => void>((resolve, reject) => {\n this.queue.push({\n resolve: (releaseFn: () => void) => resolve(releaseFn),\n reject,\n });\n });\n }\n\n private release(): void {\n this.count++;\n const next = this.queue.shift();\n if (next) {\n this.count--;\n next.resolve(() => this.release());\n }\n }\n\n /** Get current available permits */\n get available(): number {\n return this.count;\n }\n\n /** Get number of waiters in queue */\n get waiting(): number {\n return this.queue.length;\n }\n\n /** Get maximum permits */\n get max(): number {\n return this.maxPermits;\n }\n\n /** Reject all pending waiters with an error and reset permits */\n drain(): void {\n const err = new Error(\"[Directive Semaphore] Semaphore drained - all pending acquisitions rejected\");\n const pending = this.queue.splice(0, this.queue.length);\n for (const waiter of pending) {\n waiter.reject(err);\n }\n this.count = this.maxPermits;\n }\n}\n\n// ============================================================================\n// Agent Registry Types\n// ============================================================================\n\n/** Configuration for a registered agent */\nexport interface AgentRegistration {\n /** The agent instance */\n agent: AgentLike;\n /** Maximum concurrent runs for this agent (default: 1) */\n maxConcurrent?: number;\n /** Timeout for agent runs (ms) */\n timeout?: number;\n /** Custom run options */\n runOptions?: Omit<RunOptions, \"signal\">;\n /** Description for constraint-based selection */\n description?: string;\n /** Capabilities this agent has */\n capabilities?: string[];\n /** Per-agent output guardrails (applied in addition to stack-level guardrails) */\n guardrails?: {\n output?: Array<GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>>;\n };\n}\n\n/** Agent registry configuration */\nexport interface AgentRegistry {\n [agentId: string]: AgentRegistration;\n}\n\n/** State of a running agent */\nexport interface AgentRunState {\n agentId: string;\n runId: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\" | \"cancelled\";\n input: string;\n output?: unknown;\n error?: Error;\n startedAt?: number;\n completedAt?: number;\n tokens: number;\n}\n\n// ============================================================================\n// Execution Pattern Types\n// ============================================================================\n\n/** Parallel execution pattern - run agents concurrently and merge results */\nexport interface ParallelPattern<T = unknown> {\n type: \"parallel\";\n /** Agent IDs to run in parallel (can repeat for multiple instances) */\n agents: string[];\n /** Function to merge results from all agents */\n merge: (results: RunResult<unknown>[]) => T | Promise<T>;\n /** Minimum successful results required (default: all) */\n minSuccess?: number;\n /** Overall timeout (ms) */\n timeout?: number;\n}\n\n/** Sequential execution pattern - pipeline of agents */\nexport interface SequentialPattern<T = unknown> {\n type: \"sequential\";\n /** Agent IDs in execution order */\n agents: string[];\n /** Transform output to next input (default: stringify) */\n transform?: (output: unknown, agentId: string, index: number) => string;\n /** Final result extractor */\n extract?: (output: unknown) => T;\n /** Continue on error (default: false) */\n continueOnError?: boolean;\n}\n\n/** Supervisor pattern - one agent directs others */\nexport interface SupervisorPattern<T = unknown> {\n type: \"supervisor\";\n /** Supervisor agent ID */\n supervisor: string;\n /** Worker agent IDs */\n workers: string[];\n /** Maximum delegation rounds */\n maxRounds?: number;\n /** Extract final result */\n extract?: (supervisorOutput: unknown, workerResults: RunResult<unknown>[]) => T;\n}\n\n/** Union of all patterns */\nexport type ExecutionPattern<T = unknown> =\n | ParallelPattern<T>\n | SequentialPattern<T>\n | SupervisorPattern<T>;\n\n// ============================================================================\n// Handoff Types\n// ============================================================================\n\n/** Handoff request between agents */\nexport interface HandoffRequest {\n id: string;\n fromAgent: string;\n toAgent: string;\n input: string;\n context?: Record<string, unknown>;\n requestedAt: number;\n}\n\n/** Handoff result */\nexport interface HandoffResult {\n request: HandoffRequest;\n result: RunResult<unknown>;\n completedAt: number;\n}\n\n// ============================================================================\n// Multi-Agent Orchestrator Types\n// ============================================================================\n\n/** Constraint for agent selection */\nexport interface AgentSelectionConstraint {\n when: (facts: Record<string, unknown>) => boolean | Promise<boolean>;\n select: string | ((facts: Record<string, unknown>) => string);\n input: string | ((facts: Record<string, unknown>) => string);\n priority?: number;\n}\n\n/** Run agent requirement */\nexport interface RunAgentRequirement extends Requirement {\n type: \"RUN_AGENT\";\n agent: string;\n input: string;\n context?: Record<string, unknown>;\n}\n\n/** Multi-agent orchestrator options */\nexport interface MultiAgentOrchestratorOptions {\n /** Base run function */\n runner: AgentRunner;\n /** Registered agents */\n agents: AgentRegistry;\n /** Execution patterns */\n patterns?: Record<string, ExecutionPattern>;\n /** Handoff callbacks */\n onHandoff?: (request: HandoffRequest) => void;\n /** Handoff completion callbacks */\n onHandoffComplete?: (result: HandoffResult) => void;\n /** Maximum number of handoff results to retain (default: 1000) */\n maxHandoffHistory?: number;\n /** Debug mode */\n debug?: boolean;\n}\n\n/** Multi-agent state in facts */\nexport interface MultiAgentState {\n /** Namespace for each agent's state */\n __agents: Record<string, {\n status: \"idle\" | \"running\" | \"completed\" | \"error\";\n lastInput?: string;\n lastOutput?: unknown;\n lastError?: string;\n runCount: number;\n totalTokens: number;\n }>;\n /** Pending handoffs */\n __handoffs: HandoffRequest[];\n /** Completed handoffs */\n __handoffResults: HandoffResult[];\n}\n\n/** Multi-agent orchestrator instance */\nexport interface MultiAgentOrchestrator {\n /** Run a single agent */\n runAgent<T>(agentId: string, input: string, options?: RunOptions): Promise<RunResult<T>>;\n /** Run an execution pattern */\n runPattern<T>(patternId: string, input: string): Promise<T>;\n /** Run agents in parallel */\n runParallel<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>\n ): Promise<T>;\n /** Run agents sequentially */\n runSequential<T>(\n agentIds: string[],\n initialInput: string,\n options?: { transform?: (output: unknown, agentId: string, index: number) => string }\n ): Promise<RunResult<T>[]>;\n /** Request a handoff between agents */\n handoff(fromAgent: string, toAgent: string, input: string, context?: Record<string, unknown>): Promise<RunResult<unknown>>;\n /** Get agent state */\n getAgentState(agentId: string): MultiAgentState[\"__agents\"][string] | undefined;\n /** Get all agent states */\n getAllAgentStates(): Record<string, MultiAgentState[\"__agents\"][string]>;\n /** Get pending handoffs */\n getPendingHandoffs(): HandoffRequest[];\n /** Reset all agent states */\n reset(): void;\n /** Dispose of the orchestrator, resetting all state */\n dispose(): void;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Create a multi-agent orchestrator.\n *\n * @example\n * ```typescript\n * const orchestrator = createMultiAgentOrchestrator({\n * runner,\n * agents: {\n * researcher: { agent: researchAgent, maxConcurrent: 3 },\n * writer: { agent: writerAgent },\n * reviewer: { agent: reviewerAgent },\n * },\n * patterns: {\n * research: {\n * type: 'parallel',\n * agents: ['researcher', 'researcher'],\n * merge: (results) => results.map(r => r.output).join('\\n\\n'),\n * },\n * write: {\n * type: 'sequential',\n * agents: ['writer', 'reviewer'],\n * },\n * },\n * });\n *\n * // Run pattern\n * const research = await orchestrator.runPattern('research', 'What is AI?');\n *\n * // Run parallel\n * const results = await orchestrator.runParallel(\n * ['researcher', 'researcher'],\n * ['Question 1', 'Question 2'],\n * (results) => results.map(r => r.output)\n * );\n *\n * // Handoff\n * const reviewed = await orchestrator.handoff('writer', 'reviewer', draft);\n * ```\n *\n * @throws {Error} If a pattern references an agent that is not in the registry\n */\nexport function createMultiAgentOrchestrator(\n options: MultiAgentOrchestratorOptions\n): MultiAgentOrchestrator {\n const {\n runner,\n agents,\n patterns = {},\n onHandoff,\n onHandoffComplete,\n maxHandoffHistory = 1000,\n } = options;\n\n // Validate that all pattern agents exist in the registry\n const registeredAgentIds = new Set(Object.keys(agents));\n const missingAgents: Array<{ patternId: string; agentId: string }> = [];\n\n for (const [patternId, pattern] of Object.entries(patterns)) {\n const agentsToCheck: string[] = [];\n\n switch (pattern.type) {\n case \"parallel\":\n agentsToCheck.push(...pattern.agents);\n break;\n case \"sequential\":\n agentsToCheck.push(...pattern.agents);\n break;\n case \"supervisor\":\n agentsToCheck.push(pattern.supervisor, ...pattern.workers);\n break;\n }\n\n for (const agentId of agentsToCheck) {\n if (!registeredAgentIds.has(agentId)) {\n missingAgents.push({ patternId, agentId });\n }\n }\n }\n\n if (missingAgents.length > 0) {\n const details = missingAgents\n .map(({ patternId, agentId }) => ` - Pattern \"${patternId}\" references unknown agent \"${agentId}\"`)\n .join(\"\\n\");\n throw new Error(\n `[Directive MultiAgent] Pattern validation failed. The following agents are not registered:\\n${details}\\n\\nRegistered agents: ${[...registeredAgentIds].join(\", \") || \"(none)\"}`\n );\n }\n\n // Semaphores for controlling concurrent access per agent (no polling)\n const semaphores = new Map<string, Semaphore>();\n\n // Agent states\n const agentStates: Record<string, MultiAgentState[\"__agents\"][string]> = {};\n for (const agentId of Object.keys(agents)) {\n const maxConcurrent = agents[agentId]?.maxConcurrent ?? 1;\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n semaphores.set(agentId, new Semaphore(maxConcurrent));\n }\n\n // Handoff tracking with bounded size (configurable)\n const MAX_HANDOFF_RESULTS = maxHandoffHistory;\n const pendingHandoffs: HandoffRequest[] = [];\n const handoffResults: HandoffResult[] = [];\n let handoffCounter = 0;\n\n // Helper to acquire run slot using semaphore (no polling)\n async function acquireSlot(agentId: string): Promise<() => void> {\n const semaphore = semaphores.get(agentId);\n if (!semaphore) {\n throw new Error(`Unknown agent: ${agentId}`);\n }\n\n return semaphore.acquire();\n }\n\n // Helper to add handoff result with bounded size\n function addHandoffResult(result: HandoffResult): void {\n handoffResults.push(result);\n // Evict oldest results if over limit\n while (handoffResults.length > MAX_HANDOFF_RESULTS) {\n handoffResults.shift();\n }\n }\n\n // Run a single agent\n async function runSingleAgent<T>(\n agentId: string,\n input: string,\n opts?: RunOptions\n ): Promise<RunResult<T>> {\n const registration = agents[agentId];\n if (!registration) {\n throw new Error(`Unknown agent: ${agentId}`);\n }\n\n const release = await acquireSlot(agentId);\n const state = agentStates[agentId]!;\n\n state.status = \"running\";\n state.lastInput = input;\n\n // Create timeout if specified\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let abortHandler: (() => void) | undefined;\n\n try {\n if (registration.timeout) {\n timeoutId = setTimeout(() => controller.abort(), registration.timeout);\n }\n\n // Combine signals with proper cleanup to prevent memory leaks\n if (opts?.signal) {\n abortHandler = () => controller.abort();\n opts.signal.addEventListener(\"abort\", abortHandler);\n }\n\n const result = await runner<T>(registration.agent, input, {\n ...registration.runOptions,\n ...opts,\n signal: controller.signal,\n });\n\n state.status = \"completed\";\n state.lastOutput = result.output;\n state.runCount++;\n state.totalTokens += result.totalTokens;\n\n return result;\n } catch (error) {\n state.status = \"error\";\n state.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n // Clean up to prevent memory leaks\n if (timeoutId) clearTimeout(timeoutId);\n if (abortHandler && opts?.signal) {\n opts.signal.removeEventListener(\"abort\", abortHandler);\n }\n release();\n }\n }\n\n // Run parallel pattern\n async function runParallelPattern<T>(\n pattern: ParallelPattern<T>,\n _input: string\n ): Promise<T> {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n if (pattern.timeout) {\n timeoutId = setTimeout(() => controller.abort(), pattern.timeout);\n }\n\n try {\n const promises = pattern.agents.map((agentId) =>\n runSingleAgent(agentId, _input, { signal: controller.signal }).catch(\n (error) => {\n if (pattern.minSuccess === undefined) throw error;\n return null;\n }\n )\n );\n\n const results = await Promise.all(promises);\n const successResults = results.filter((r): r is RunResult<unknown> => r !== null);\n\n if (pattern.minSuccess && successResults.length < pattern.minSuccess) {\n throw new Error(\n `Not enough successful results: ${successResults.length}/${pattern.minSuccess}`\n );\n }\n\n return pattern.merge(successResults);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n }\n\n // Run sequential pattern\n async function runSequentialPattern<T>(\n pattern: SequentialPattern<T>,\n initialInput: string\n ): Promise<T> {\n let currentInput = initialInput;\n let lastResult: RunResult<unknown> | undefined;\n\n for (let i = 0; i < pattern.agents.length; i++) {\n const agentId = pattern.agents[i]!;\n\n try {\n lastResult = await runSingleAgent(agentId, currentInput);\n\n // Transform for next agent\n if (i < pattern.agents.length - 1) {\n if (pattern.transform) {\n currentInput = pattern.transform(lastResult.output, agentId, i);\n } else {\n currentInput =\n typeof lastResult.output === \"string\"\n ? lastResult.output\n : JSON.stringify(lastResult.output);\n }\n }\n } catch (error) {\n if (!pattern.continueOnError) throw error;\n }\n }\n\n if (!lastResult) {\n throw new Error(\"No successful results in sequential pattern\");\n }\n\n return pattern.extract\n ? pattern.extract(lastResult.output)\n : (lastResult.output as T);\n }\n\n // Run supervisor pattern\n async function runSupervisorPattern<T>(\n pattern: SupervisorPattern<T>,\n input: string\n ): Promise<T> {\n const workerResults: RunResult<unknown>[] = [];\n const maxRounds = pattern.maxRounds ?? 5;\n\n // Initial supervisor run\n let supervisorResult = await runSingleAgent<{\n action: \"delegate\" | \"complete\";\n worker?: string;\n workerInput?: string;\n output?: unknown;\n }>(pattern.supervisor, input);\n\n for (let round = 0; round < maxRounds; round++) {\n const action = supervisorResult.output;\n\n if (action.action === \"complete\" || !action.worker) {\n break;\n }\n\n // Validate worker\n if (!pattern.workers.includes(action.worker)) {\n throw new Error(`Invalid worker: ${action.worker}`);\n }\n\n // Run worker\n const workerResult = await runSingleAgent(\n action.worker,\n action.workerInput ?? \"\"\n );\n workerResults.push(workerResult);\n\n // Report back to supervisor\n supervisorResult = await runSingleAgent(\n pattern.supervisor,\n `Worker ${action.worker} completed with result: ${JSON.stringify(workerResult.output)}`\n );\n }\n\n return pattern.extract\n ? pattern.extract(supervisorResult.output, workerResults)\n : (supervisorResult.output as T);\n }\n\n const orchestrator: MultiAgentOrchestrator = {\n runAgent: runSingleAgent,\n\n async runPattern<T>(patternId: string, input: string): Promise<T> {\n const pattern = patterns[patternId];\n if (!pattern) {\n throw new Error(`Unknown pattern: ${patternId}`);\n }\n\n switch (pattern.type) {\n case \"parallel\":\n return runParallelPattern(pattern as ParallelPattern<T>, input);\n case \"sequential\":\n return runSequentialPattern(pattern as SequentialPattern<T>, input);\n case \"supervisor\":\n return runSupervisorPattern(pattern as SupervisorPattern<T>, input);\n default:\n throw new Error(`Unknown pattern type: ${(pattern as { type: string }).type}`);\n }\n },\n\n async runParallel<T>(\n agentIds: string[],\n inputs: string | string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>\n ): Promise<T> {\n const inputArray = Array.isArray(inputs)\n ? inputs\n : agentIds.map(() => inputs);\n\n if (inputArray.length !== agentIds.length) {\n throw new Error(\"Input count must match agent count\");\n }\n\n const promises = agentIds.map((agentId, i) =>\n runSingleAgent(agentId, inputArray[i]!)\n );\n\n const results = await Promise.all(promises);\n return merge(results);\n },\n\n async runSequential<T>(\n agentIds: string[],\n initialInput: string,\n opts?: { transform?: (output: unknown, agentId: string, index: number) => string }\n ): Promise<RunResult<T>[]> {\n const results: RunResult<unknown>[] = [];\n let currentInput = initialInput;\n\n for (let i = 0; i < agentIds.length; i++) {\n const agentId = agentIds[i]!;\n const result = await runSingleAgent(agentId, currentInput);\n results.push(result);\n\n if (i < agentIds.length - 1) {\n if (opts?.transform) {\n currentInput = opts.transform(result.output, agentId, i);\n } else {\n currentInput =\n typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output);\n }\n }\n }\n\n return results as RunResult<T>[];\n },\n\n async handoff(\n fromAgent: string,\n toAgent: string,\n input: string,\n context?: Record<string, unknown>\n ): Promise<RunResult<unknown>> {\n const request: HandoffRequest = {\n id: `handoff-${++handoffCounter}`,\n fromAgent,\n toAgent,\n input,\n context,\n requestedAt: Date.now(),\n };\n\n pendingHandoffs.push(request);\n onHandoff?.(request);\n\n try {\n const result = await runSingleAgent(toAgent, input);\n\n const handoffResult: HandoffResult = {\n request,\n result,\n completedAt: Date.now(),\n };\n\n addHandoffResult(handoffResult);\n onHandoffComplete?.(handoffResult);\n\n // Remove from pending\n const index = pendingHandoffs.indexOf(request);\n if (index >= 0) pendingHandoffs.splice(index, 1);\n\n return result;\n } catch (error) {\n // Remove from pending on error\n const index = pendingHandoffs.indexOf(request);\n if (index >= 0) pendingHandoffs.splice(index, 1);\n throw error;\n }\n },\n\n getAgentState(agentId: string) {\n return agentStates[agentId];\n },\n\n getAllAgentStates() {\n return { ...agentStates };\n },\n\n getPendingHandoffs() {\n return [...pendingHandoffs];\n },\n\n reset() {\n for (const agentId of Object.keys(agents)) {\n const maxConcurrent = agents[agentId]?.maxConcurrent ?? 1;\n agentStates[agentId] = {\n status: \"idle\",\n runCount: 0,\n totalTokens: 0,\n };\n // Drain existing semaphore to reject pending waiters, then recreate\n const existing = semaphores.get(agentId);\n if (existing) {\n existing.drain();\n }\n semaphores.set(agentId, new Semaphore(maxConcurrent));\n }\n pendingHandoffs.length = 0;\n handoffResults.length = 0;\n },\n\n dispose() {\n orchestrator.reset();\n },\n };\n\n return orchestrator;\n}\n\n// ============================================================================\n// Pattern Helpers\n// ============================================================================\n\n/**\n * Create a parallel pattern configuration.\n *\n * @example\n * ```typescript\n * const researchPattern = parallel(\n * ['researcher', 'researcher', 'researcher'],\n * (results) => results.map(r => r.output).join('\\n')\n * );\n * ```\n */\nexport function parallel<T>(\n agents: string[],\n merge: (results: RunResult<unknown>[]) => T | Promise<T>,\n options?: { minSuccess?: number; timeout?: number }\n): ParallelPattern<T> {\n return {\n type: \"parallel\",\n agents,\n merge,\n ...options,\n };\n}\n\n/**\n * Create a sequential pattern configuration.\n *\n * @example\n * ```typescript\n * const writeReviewPattern = sequential(\n * ['writer', 'reviewer'],\n * { transform: (output) => `Review this: ${output}` }\n * );\n * ```\n */\nexport function sequential<T>(\n agents: string[],\n options?: {\n transform?: (output: unknown, agentId: string, index: number) => string;\n extract?: (output: unknown) => T;\n continueOnError?: boolean;\n }\n): SequentialPattern<T> {\n return {\n type: \"sequential\",\n agents,\n ...options,\n };\n}\n\n/**\n * Create a supervisor pattern configuration.\n *\n * @example\n * ```typescript\n * const managedPattern = supervisor(\n * 'manager',\n * ['worker1', 'worker2'],\n * { maxRounds: 3 }\n * );\n * ```\n */\nexport function supervisor<T>(\n supervisorAgent: string,\n workers: string[],\n options?: {\n maxRounds?: number;\n extract?: (supervisorOutput: unknown, workerResults: RunResult<unknown>[]) => T;\n }\n): SupervisorPattern<T> {\n return {\n type: \"supervisor\",\n supervisor: supervisorAgent,\n workers,\n ...options,\n };\n}\n\n// ============================================================================\n// Agent Selection Helpers\n// ============================================================================\n\n/**\n * Create an agent selection constraint.\n *\n * @example\n * ```typescript\n * const constraints = {\n * routeToExpert: selectAgent(\n * (facts) => facts.complexity > 0.8,\n * 'expert',\n * (facts) => facts.query\n * ),\n * };\n * ```\n */\nexport function selectAgent(\n when: (facts: Record<string, unknown>) => boolean | Promise<boolean>,\n agent: string | ((facts: Record<string, unknown>) => string),\n input: string | ((facts: Record<string, unknown>) => string),\n priority?: number\n): AgentSelectionConstraint {\n return { when, select: agent, input, priority };\n}\n\n/**\n * Create a RUN_AGENT requirement.\n *\n * @example\n * ```typescript\n * constraints: {\n * needsResearch: {\n * when: (facts) => facts.hasUnknowns,\n * require: runAgentRequirement('researcher', facts.query),\n * },\n * }\n * ```\n */\nexport function runAgentRequirement(\n agent: string,\n input: string,\n context?: Record<string, unknown>\n): RunAgentRequirement {\n return {\n type: \"RUN_AGENT\",\n agent,\n input,\n context,\n };\n}\n\n// ============================================================================\n// Result Merging Utilities\n// ============================================================================\n\n/**\n * Merge results by concatenating outputs.\n */\nexport function concatResults(\n results: RunResult<unknown>[],\n separator = \"\\n\\n\"\n): string {\n return results\n .map((r) =>\n typeof r.output === \"string\"\n ? r.output\n : JSON.stringify(r.output)\n )\n .join(separator);\n}\n\n/**\n * Merge results by picking the best one based on a scoring function.\n */\nexport function pickBestResult<T>(\n results: RunResult<T>[],\n score: (result: RunResult<T>) => number\n): RunResult<T> {\n if (results.length === 0) {\n throw new Error(\"No results to pick from\");\n }\n\n return results.reduce((best, current) =>\n score(current) > score(best) ? current : best\n );\n}\n\n/**\n * Merge results into an array of outputs.\n */\nexport function collectOutputs<T>(results: RunResult<T>[]): T[] {\n return results.map((r) => r.output);\n}\n\n/**\n * Aggregate token counts from results.\n */\nexport function aggregateTokens(results: RunResult<unknown>[]): number {\n return results.reduce((sum, r) => sum + r.totalTokens, 0);\n}\n","/**\n * Agent-to-Agent Communication Protocol\n *\n * Provides structured communication channels between agents for coordination,\n * delegation, and knowledge sharing without central orchestration.\n *\n * @example\n * ```typescript\n * import { createAgentNetwork, createMessageBus } from '@directive-run/ai';\n *\n * const messageBus = createMessageBus();\n *\n * const network = createAgentNetwork({\n * bus: messageBus,\n * agents: {\n * researcher: { capabilities: ['search', 'analyze'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Agents can send messages to each other\n * await network.send('researcher', 'writer', {\n * type: 'DELEGATION',\n * task: 'Draft an article based on this research',\n * context: { findings: [...] },\n * });\n * ```\n */\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Base message structure */\nexport interface AgentMessage {\n id: string;\n type: AgentMessageType;\n from: string;\n to: string | string[] | \"*\"; // Single agent, multiple agents, or broadcast\n timestamp: number;\n correlationId?: string; // For request-response patterns\n replyTo?: string; // Message ID this is replying to\n priority?: \"low\" | \"normal\" | \"high\" | \"urgent\";\n ttlMs?: number; // Time-to-live\n metadata?: Record<string, unknown>;\n}\n\n/** Message types for agent communication */\nexport type AgentMessageType =\n | \"REQUEST\" // Request another agent to do something\n | \"RESPONSE\" // Response to a request\n | \"DELEGATION\" // Delegate a task to another agent\n | \"DELEGATION_RESULT\" // Result of a delegated task\n | \"QUERY\" // Ask for information\n | \"INFORM\" // Share information without expecting response\n | \"SUBSCRIBE\" // Subscribe to updates\n | \"UNSUBSCRIBE\" // Unsubscribe from updates\n | \"UPDATE\" // Push update to subscribers\n | \"ACK\" // Acknowledgment\n | \"NACK\" // Negative acknowledgment (rejection)\n | \"PING\" // Health check\n | \"PONG\" // Health check response\n | \"CUSTOM\"; // Custom message type\n\n/** Request message */\nexport interface RequestMessage extends AgentMessage {\n type: \"REQUEST\";\n action: string;\n payload: Record<string, unknown>;\n timeout?: number;\n}\n\n/** Response message */\nexport interface ResponseMessage extends AgentMessage {\n type: \"RESPONSE\";\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\n/** Delegation message */\nexport interface DelegationMessage extends AgentMessage {\n type: \"DELEGATION\";\n task: string;\n context: Record<string, unknown>;\n constraints?: {\n deadline?: number;\n maxCost?: number;\n requiredCapabilities?: string[];\n };\n}\n\n/** Delegation result message */\nexport interface DelegationResultMessage extends AgentMessage {\n type: \"DELEGATION_RESULT\";\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: {\n durationMs: number;\n tokensUsed?: number;\n cost?: number;\n };\n}\n\n/** Query message */\nexport interface QueryMessage extends AgentMessage {\n type: \"QUERY\";\n question: string;\n context?: Record<string, unknown>;\n}\n\n/** Inform message */\nexport interface InformMessage extends AgentMessage {\n type: \"INFORM\";\n topic: string;\n content: unknown;\n}\n\n/** Subscribe message */\nexport interface SubscribeMessage extends AgentMessage {\n type: \"SUBSCRIBE\";\n topics: string[];\n}\n\n/** Update message */\nexport interface UpdateMessage extends AgentMessage {\n type: \"UPDATE\";\n topic: string;\n content: unknown;\n}\n\n/** Union of all message types */\nexport type TypedAgentMessage =\n | RequestMessage\n | ResponseMessage\n | DelegationMessage\n | DelegationResultMessage\n | QueryMessage\n | InformMessage\n | SubscribeMessage\n | UpdateMessage\n | (AgentMessage & { type: \"UNSUBSCRIBE\" | \"ACK\" | \"NACK\" | \"PING\" | \"PONG\" | \"CUSTOM\" });\n\n// ============================================================================\n// Message Bus Types\n// ============================================================================\n\n/** Message handler function */\nexport type MessageHandler = (message: TypedAgentMessage) => void | Promise<void>;\n\n/** Subscription to messages */\nexport interface Subscription {\n id: string;\n agentId: string;\n handler: MessageHandler;\n filter?: MessageFilter;\n unsubscribe: () => void;\n}\n\n/** Message filter criteria */\nexport interface MessageFilter {\n types?: AgentMessageType[];\n from?: string | string[];\n topics?: string[];\n priority?: (\"low\" | \"normal\" | \"high\" | \"urgent\")[];\n custom?: (message: TypedAgentMessage) => boolean;\n}\n\n/** Message bus configuration */\nexport interface MessageBusConfig {\n /** Maximum messages to retain in history */\n maxHistory?: number;\n /** Default TTL for messages */\n defaultTtlMs?: number;\n /** Maximum pending messages per offline agent (prevents unbounded queue growth) */\n maxPendingPerAgent?: number;\n /** Enable message persistence */\n persistence?: MessagePersistence;\n /** Callback when message is delivered */\n onDelivery?: (message: TypedAgentMessage, recipients: string[]) => void;\n /** Callback when message delivery fails */\n onDeliveryError?: (message: TypedAgentMessage, error: Error) => void;\n}\n\n/** Message persistence interface */\nexport interface MessagePersistence {\n save(message: TypedAgentMessage): Promise<void>;\n load(agentId: string, since?: number): Promise<TypedAgentMessage[]>;\n delete(messageId: string): Promise<void>;\n clear(agentId?: string): Promise<void>;\n}\n\n/** Message bus instance */\nexport interface MessageBus {\n /** Publish a message */\n publish(message: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string;\n /** Subscribe to messages */\n subscribe(agentId: string, handler: MessageHandler, filter?: MessageFilter): Subscription;\n /** Get message history */\n getHistory(filter?: MessageFilter, limit?: number): TypedAgentMessage[];\n /** Get a specific message by ID */\n getMessage(id: string): TypedAgentMessage | undefined;\n /** Get pending messages for an agent */\n getPending(agentId: string): TypedAgentMessage[];\n /** Clear all messages and data */\n clear(): void;\n /** Dispose of the message bus, clearing all data and subscriptions */\n dispose(): void;\n}\n\n// ============================================================================\n// Message Bus Factory\n// ============================================================================\n\nfunction generateId(): string {\n return globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Create a message bus for agent communication.\n *\n * @example\n * ```typescript\n * const bus = createMessageBus({ maxHistory: 1000 });\n *\n * // Subscribe to messages\n * bus.subscribe('writer', (msg) => {\n * console.log(`Writer received: ${msg.type}`);\n * });\n *\n * // Publish a message\n * bus.publish({\n * type: 'DELEGATION',\n * from: 'researcher',\n * to: 'writer',\n * task: 'Write summary',\n * context: { data: '...' },\n * });\n * ```\n */\n/**\n * Note: `publish()` is fire-and-forget -- it returns the message ID synchronously\n * before delivery completes. Use `onDelivery` / `onDeliveryError` callbacks in\n * config to track delivery status if needed.\n */\nexport function createMessageBus(config: MessageBusConfig = {}): MessageBus {\n const {\n maxHistory = 1000,\n defaultTtlMs = 3600000, // 1 hour\n maxPendingPerAgent = 100,\n persistence,\n onDelivery,\n onDeliveryError,\n } = config;\n\n const subscriptions = new Map<string, Subscription[]>();\n const messageHistory: TypedAgentMessage[] = [];\n const messageIndex = new Map<string, TypedAgentMessage>(); // O(1) lookup by ID\n const pendingMessages = new Map<string, TypedAgentMessage[]>();\n\n function matchesFilter(message: TypedAgentMessage, filter: MessageFilter): boolean {\n if (filter.types && !filter.types.includes(message.type)) {\n return false;\n }\n if (filter.from) {\n const fromList = Array.isArray(filter.from) ? filter.from : [filter.from];\n if (!fromList.includes(message.from)) {\n return false;\n }\n }\n if (filter.topics) {\n const topic = (message as InformMessage | UpdateMessage).topic;\n if (topic && !filter.topics.includes(topic)) {\n return false;\n }\n }\n if (filter.priority && message.priority && !filter.priority.includes(message.priority)) {\n return false;\n }\n if (filter.custom && !filter.custom(message)) {\n return false;\n }\n return true;\n }\n\n function isExpired(message: TypedAgentMessage): boolean {\n if (!message.ttlMs) return false;\n return Date.now() - message.timestamp > message.ttlMs;\n }\n\n function getRecipients(message: TypedAgentMessage): string[] {\n if (message.to === \"*\") {\n return Array.from(subscriptions.keys());\n }\n if (Array.isArray(message.to)) {\n return message.to;\n }\n return [message.to];\n }\n\n async function deliverMessage(message: TypedAgentMessage): Promise<void> {\n // Skip expired messages\n if (isExpired(message)) return;\n\n const recipients = getRecipients(message);\n const deliveredTo: string[] = [];\n\n // Build delivery promises for all recipients in parallel\n const deliveryPromises: Promise<void>[] = [];\n\n for (const recipientId of recipients) {\n const recipientSubs = subscriptions.get(recipientId) ?? [];\n\n if (recipientSubs.length === 0) {\n // Queue message for offline agent (bounded)\n const pending = pendingMessages.get(recipientId) ?? [];\n pending.push(message);\n // Drop oldest if over limit\n while (pending.length > maxPendingPerAgent) {\n pending.shift();\n }\n pendingMessages.set(recipientId, pending);\n continue;\n }\n\n for (const sub of recipientSubs) {\n if (!sub.filter || matchesFilter(message, sub.filter)) {\n deliveryPromises.push(\n Promise.resolve(sub.handler(message)).then(\n () => { deliveredTo.push(recipientId); },\n (error) => { onDeliveryError?.(message, error instanceof Error ? error : new Error(String(error))); }\n )\n );\n }\n }\n }\n\n // Wait for all deliveries to settle in parallel\n if (deliveryPromises.length > 0) {\n await Promise.allSettled(deliveryPromises);\n }\n\n if (deliveredTo.length > 0) {\n onDelivery?.(message, deliveredTo);\n }\n\n // Persist if configured\n if (persistence) {\n await persistence.save(message);\n }\n }\n\n return {\n publish(partial: Omit<TypedAgentMessage, \"id\" | \"timestamp\">): string {\n const message: TypedAgentMessage = {\n ...partial,\n id: generateId(),\n timestamp: Date.now(),\n priority: partial.priority ?? \"normal\",\n ttlMs: partial.ttlMs ?? defaultTtlMs,\n } as TypedAgentMessage;\n\n // Add to history and index\n messageHistory.push(message);\n messageIndex.set(message.id, message);\n\n // Trim old messages (remove from both history and index)\n while (messageHistory.length > maxHistory) {\n const removed = messageHistory.shift();\n if (removed) {\n messageIndex.delete(removed.id);\n }\n }\n\n // Deliver asynchronously\n deliverMessage(message).catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(message, err);\n } else {\n console.error(\"[Directive MessageBus] Delivery error:\", err);\n }\n });\n\n return message.id;\n },\n\n subscribe(agentId: string, handler: MessageHandler, filter?: MessageFilter): Subscription {\n const subId = generateId();\n\n const subscription: Subscription = {\n id: subId,\n agentId,\n handler,\n filter,\n unsubscribe: () => {\n const subs = subscriptions.get(agentId) ?? [];\n const index = subs.findIndex((s) => s.id === subId);\n if (index >= 0) {\n subs.splice(index, 1);\n }\n },\n };\n\n const existing = subscriptions.get(agentId) ?? [];\n existing.push(subscription);\n subscriptions.set(agentId, existing);\n\n // Deliver pending messages\n const pending = pendingMessages.get(agentId) ?? [];\n pendingMessages.delete(agentId);\n for (const msg of pending) {\n if (!filter || matchesFilter(msg, filter)) {\n const result = handler(msg);\n if (result instanceof Promise) {\n result.catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n if (onDeliveryError) {\n onDeliveryError(msg, err);\n } else {\n console.error(\"[Directive MessageBus] Pending delivery error:\", err);\n }\n });\n }\n }\n }\n\n return subscription;\n },\n\n getHistory(filter?: MessageFilter, limit = 100): TypedAgentMessage[] {\n let messages = messageHistory.filter((m) => !isExpired(m));\n\n if (filter) {\n messages = messages.filter((m) => matchesFilter(m, filter));\n }\n\n return messages.slice(-limit);\n },\n\n getMessage(id: string): TypedAgentMessage | undefined {\n const msg = messageIndex.get(id);\n if (msg && isExpired(msg)) return undefined;\n return msg;\n },\n\n getPending(agentId: string): TypedAgentMessage[] {\n const pending = pendingMessages.get(agentId) ?? [];\n return pending.filter((m) => !isExpired(m));\n },\n\n clear(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n },\n\n dispose(): void {\n messageHistory.length = 0;\n messageIndex.clear();\n pendingMessages.clear();\n subscriptions.clear();\n },\n };\n}\n\n// ============================================================================\n// Agent Network Types\n// ============================================================================\n\n/** Agent registration info */\nexport interface AgentInfo {\n id: string;\n capabilities: string[];\n status: \"online\" | \"offline\" | \"busy\";\n lastSeen: number;\n metadata?: Record<string, unknown>;\n}\n\n/** Agent network configuration */\nexport interface AgentNetworkConfig {\n /** Message bus to use */\n bus: MessageBus;\n /** Registered agents */\n agents?: Record<string, Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">>;\n /** Timeout for request-response patterns */\n defaultTimeout?: number;\n /** Callback when agent comes online */\n onAgentOnline?: (agentId: string) => void;\n /** Callback when agent goes offline */\n onAgentOffline?: (agentId: string) => void;\n}\n\n/** Agent network instance */\nexport interface AgentNetwork {\n /** Register an agent */\n register(id: string, info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">): void;\n /** Unregister an agent */\n unregister(id: string): void;\n /** Get agent info */\n getAgent(id: string): AgentInfo | undefined;\n /** Get all agents */\n getAgents(): AgentInfo[];\n /** Find agents by capability */\n findByCapability(capability: string): AgentInfo[];\n /** Send a message */\n send(from: string, to: string | string[], message: Partial<TypedAgentMessage>): string;\n /** Send a request and wait for response */\n request(from: string, to: string, action: string, payload: Record<string, unknown>, timeout?: number): Promise<ResponseMessage>;\n /** Delegate a task */\n delegate(from: string, to: string, task: string, context: Record<string, unknown>): Promise<DelegationResultMessage>;\n /** Query an agent */\n query(from: string, to: string, question: string, context?: Record<string, unknown>): Promise<ResponseMessage>;\n /** Broadcast to all agents */\n broadcast(from: string, message: Partial<TypedAgentMessage>): string;\n /** Subscribe an agent to messages */\n listen(agentId: string, handler: MessageHandler, filter?: MessageFilter): Subscription;\n /** Get the message bus */\n getBus(): MessageBus;\n /** Dispose of the network, clearing pending waiters and timers */\n dispose(): void;\n}\n\n// ============================================================================\n// Agent Network Factory\n// ============================================================================\n\n/**\n * Create an agent network for coordinated communication.\n *\n * @example\n * ```typescript\n * const network = createAgentNetwork({\n * bus: createMessageBus(),\n * agents: {\n * researcher: { capabilities: ['search', 'summarize'] },\n * writer: { capabilities: ['draft', 'edit'] },\n * reviewer: { capabilities: ['review', 'approve'] },\n * },\n * });\n *\n * // Delegate a task\n * const result = await network.delegate(\n * 'researcher',\n * 'writer',\n * 'Write an article about AI safety',\n * { research: findingsData }\n * );\n *\n * // Query for information\n * const answer = await network.query(\n * 'writer',\n * 'reviewer',\n * 'Is this paragraph technically accurate?',\n * { text: '...' }\n * );\n * ```\n */\nexport function createAgentNetwork(config: AgentNetworkConfig): AgentNetwork {\n const {\n bus,\n agents: initialAgents = {},\n defaultTimeout = 30000,\n onAgentOnline,\n onAgentOffline,\n } = config;\n\n const agents = new Map<string, AgentInfo>();\n const responseWaiters = new Map<string, {\n resolve: (msg: ResponseMessage | DelegationResultMessage) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }>();\n\n // Initialize agents\n for (const [id, info] of Object.entries(initialAgents)) {\n agents.set(id, {\n ...info,\n id,\n status: \"offline\",\n lastSeen: Date.now(),\n });\n }\n\n // Handle response messages\n function handleResponse(message: TypedAgentMessage): void {\n if (message.type !== \"RESPONSE\" && message.type !== \"DELEGATION_RESULT\") {\n return;\n }\n\n const correlationId = message.correlationId ?? message.replyTo;\n if (!correlationId) return;\n\n const waiter = responseWaiters.get(correlationId);\n if (waiter) {\n clearTimeout(waiter.timer);\n responseWaiters.delete(correlationId);\n waiter.resolve(message as ResponseMessage | DelegationResultMessage);\n }\n }\n\n return {\n register(id: string, info: Omit<AgentInfo, \"id\" | \"lastSeen\" | \"status\">): void {\n const wasOffline = !agents.has(id) || agents.get(id)?.status === \"offline\";\n\n agents.set(id, {\n ...info,\n id,\n status: \"online\",\n lastSeen: Date.now(),\n });\n\n if (wasOffline) {\n onAgentOnline?.(id);\n }\n },\n\n unregister(id: string): void {\n const agent = agents.get(id);\n if (agent) {\n agent.status = \"offline\";\n onAgentOffline?.(id);\n }\n },\n\n getAgent(id: string): AgentInfo | undefined {\n return agents.get(id);\n },\n\n getAgents(): AgentInfo[] {\n return Array.from(agents.values());\n },\n\n findByCapability(capability: string): AgentInfo[] {\n return Array.from(agents.values()).filter(\n (agent) => agent.capabilities.includes(capability) && agent.status === \"online\"\n );\n },\n\n send(from: string, to: string | string[], message: Partial<TypedAgentMessage>): string {\n // Update sender's lastSeen\n const sender = agents.get(from);\n if (sender) {\n sender.lastSeen = Date.now();\n sender.status = \"online\";\n }\n\n return bus.publish({\n ...message,\n from,\n to,\n type: message.type ?? \"CUSTOM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n async request(\n from: string,\n to: string,\n action: string,\n payload: Record<string, unknown>,\n timeout = defaultTimeout\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n // Generate a correlation ID upfront so subscription can listen before publish\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition with fast responders\n const sub = bus.subscribe(from, (msg) => {\n if (msg.correlationId === correlationId || msg.replyTo === correlationId) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n }, { types: [\"RESPONSE\"] });\n\n const timer = setTimeout(() => {\n sub.unsubscribe(); // Clean up subscription on timeout\n responseWaiters.delete(correlationId);\n reject(new Error(`[Directive Communication] Request timeout after ${timeout}ms`));\n }, timeout);\n\n responseWaiters.set(correlationId, { resolve: resolve as (msg: ResponseMessage | DelegationResultMessage) => void, reject, timer });\n\n bus.publish({\n type: \"REQUEST\",\n from,\n to,\n action,\n payload,\n timeout,\n correlationId,\n } as Omit<RequestMessage, \"id\" | \"timestamp\"> & { correlationId: string });\n });\n },\n\n async delegate(\n from: string,\n to: string,\n task: string,\n context: Record<string, unknown>\n ): Promise<DelegationResultMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(from, (msg) => {\n if (msg.correlationId === correlationId || msg.replyTo === correlationId) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n }, { types: [\"DELEGATION_RESULT\"] });\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(new Error(`[Directive Communication] Delegation timeout after ${defaultTimeout}ms`));\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, { resolve: resolve as (msg: ResponseMessage | DelegationResultMessage) => void, reject, timer });\n\n bus.publish({\n type: \"DELEGATION\",\n from,\n to,\n task,\n context,\n correlationId,\n } as Omit<DelegationMessage, \"id\" | \"timestamp\"> & { correlationId: string });\n });\n },\n\n async query(\n from: string,\n to: string,\n question: string,\n context?: Record<string, unknown>\n ): Promise<ResponseMessage> {\n return new Promise((resolve, reject) => {\n const correlationId = generateId();\n\n // Subscribe BEFORE publishing to avoid race condition\n const sub = bus.subscribe(from, (msg) => {\n if (msg.correlationId === correlationId || msg.replyTo === correlationId) {\n sub.unsubscribe();\n handleResponse(msg);\n }\n }, { types: [\"RESPONSE\"] });\n\n const timer = setTimeout(() => {\n sub.unsubscribe();\n responseWaiters.delete(correlationId);\n reject(new Error(`[Directive Communication] Query timeout after ${defaultTimeout}ms`));\n }, defaultTimeout);\n\n responseWaiters.set(correlationId, { resolve: resolve as (msg: ResponseMessage | DelegationResultMessage) => void, reject, timer });\n\n bus.publish({\n type: \"QUERY\",\n from,\n to,\n question,\n context,\n correlationId,\n } as Omit<QueryMessage, \"id\" | \"timestamp\"> & { correlationId: string });\n });\n },\n\n broadcast(from: string, message: Partial<TypedAgentMessage>): string {\n return bus.publish({\n ...message,\n from,\n to: \"*\",\n type: message.type ?? \"INFORM\",\n } as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n },\n\n listen(agentId: string, handler: MessageHandler, filter?: MessageFilter): Subscription {\n // Mark agent as online\n const agent = agents.get(agentId);\n if (agent) {\n agent.status = \"online\";\n agent.lastSeen = Date.now();\n onAgentOnline?.(agentId);\n }\n\n return bus.subscribe(agentId, handler, filter);\n },\n\n getBus(): MessageBus {\n return bus;\n },\n\n dispose(): void {\n // Clear all pending response waiters and their timers\n for (const [, waiter] of responseWaiters) {\n clearTimeout(waiter.timer);\n }\n responseWaiters.clear();\n agents.clear();\n },\n };\n}\n\n// ============================================================================\n// Communication Patterns\n// ============================================================================\n\n/**\n * Create a request-response helper for handling incoming requests.\n *\n * @example\n * ```typescript\n * const responder = createResponder(network, 'writer');\n *\n * responder.onRequest('draft', async (payload) => {\n * const draft = await generateDraft(payload.topic);\n * return { success: true, result: draft };\n * });\n * ```\n */\nexport function createResponder(network: AgentNetwork, agentId: string) {\n const handlers = new Map<string, (payload: Record<string, unknown>) => Promise<{ success: boolean; result?: unknown; error?: string }>>();\n\n const subscription = network.listen(agentId, async (message) => {\n if (message.type === \"REQUEST\") {\n const request = message as RequestMessage;\n const handler = handlers.get(request.action);\n\n let response: Partial<ResponseMessage>;\n if (handler) {\n try {\n const result = await handler(request.payload);\n response = {\n type: \"RESPONSE\",\n success: result.success,\n result: result.result,\n error: result.error,\n };\n } catch (error) {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n } else {\n response = {\n type: \"RESPONSE\",\n success: false,\n error: `Unknown action: ${request.action}`,\n };\n }\n\n network.send(agentId, message.from, {\n ...response,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n }, { types: [\"REQUEST\"] });\n\n return {\n onRequest(\n action: string,\n handler: (payload: Record<string, unknown>) => Promise<{ success: boolean; result?: unknown; error?: string }>\n ): void {\n handlers.set(action, handler);\n },\n\n /** Remove a request handler */\n offRequest(action: string): void {\n handlers.delete(action);\n },\n\n /** Dispose of this responder, unsubscribing from network */\n dispose(): void {\n subscription.unsubscribe();\n handlers.clear();\n },\n };\n}\n\n/**\n * Create a task delegator for handling incoming delegations.\n *\n * @example\n * ```typescript\n * const delegator = createDelegator(network, 'writer');\n *\n * delegator.onDelegation(async (task, context) => {\n * const result = await executeTask(task, context);\n * return {\n * success: true,\n * result,\n * metrics: { durationMs: 1500, tokensUsed: 500 },\n * };\n * });\n * ```\n */\nexport function createDelegator(network: AgentNetwork, agentId: string) {\n let delegationHandler: ((task: string, context: Record<string, unknown>) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>) | null = null;\n\n const subscription = network.listen(agentId, async (message) => {\n if (message.type === \"DELEGATION\" && delegationHandler) {\n const delegation = message as DelegationMessage;\n const start = Date.now();\n\n let result: Partial<DelegationResultMessage>;\n try {\n const response = await delegationHandler(delegation.task, delegation.context);\n result = {\n type: \"DELEGATION_RESULT\",\n success: response.success,\n result: response.result,\n error: response.error,\n metrics: response.metrics ?? { durationMs: Date.now() - start },\n };\n } catch (error) {\n result = {\n type: \"DELEGATION_RESULT\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n metrics: { durationMs: Date.now() - start },\n };\n }\n\n network.send(agentId, message.from, {\n ...result,\n correlationId: message.correlationId ?? message.id,\n replyTo: message.correlationId ?? message.id,\n });\n }\n }, { types: [\"DELEGATION\"] });\n\n return {\n onDelegation(\n handler: (task: string, context: Record<string, unknown>) => Promise<{\n success: boolean;\n result?: unknown;\n error?: string;\n metrics?: { durationMs: number; tokensUsed?: number; cost?: number };\n }>\n ): void {\n delegationHandler = handler;\n },\n\n /** Remove the delegation handler */\n offDelegation(): void {\n delegationHandler = null;\n },\n\n /** Dispose of this delegator, unsubscribing from network */\n dispose(): void {\n subscription.unsubscribe();\n delegationHandler = null;\n },\n };\n}\n\n/**\n * Create a pub/sub helper for topic-based communication.\n *\n * @example\n * ```typescript\n * const pubsub = createPubSub(network, 'analyst');\n *\n * // Subscribe to topics\n * pubsub.subscribe(['market-updates', 'alerts'], (topic, content) => {\n * console.log(`Received ${topic}:`, content);\n * });\n *\n * // Publish to topics\n * pubsub.publish('market-updates', { price: 100, change: 5 });\n * ```\n */\nexport function createPubSub(network: AgentNetwork, agentId: string) {\n const topicHandlers = new Map<string, Array<(content: unknown) => void>>();\n\n const subscription = network.listen(agentId, (message) => {\n if (message.type === \"UPDATE\") {\n const update = message as UpdateMessage;\n const handlers = topicHandlers.get(update.topic) ?? [];\n for (const handler of handlers) {\n handler(update.content);\n }\n }\n }, { types: [\"UPDATE\"] });\n\n return {\n subscribe(topics: string[], handler: (topic: string, content: unknown) => void): () => void {\n // Track wrapped handlers per-subscribe call for proper cleanup\n const wrappedHandlers = new Map<string, (content: unknown) => void>();\n\n for (const topic of topics) {\n const handlers = topicHandlers.get(topic) ?? [];\n const wrappedHandler = (content: unknown) => handler(topic, content);\n wrappedHandlers.set(topic, wrappedHandler);\n handlers.push(wrappedHandler);\n topicHandlers.set(topic, handlers);\n }\n\n // Announce subscription\n network.broadcast(agentId, {\n type: \"SUBSCRIBE\",\n topics,\n } as Partial<SubscribeMessage>);\n\n return () => {\n // Only remove this subscription's handlers, not all handlers for the topic\n for (const [topic, wrappedHandler] of wrappedHandlers) {\n const handlers = topicHandlers.get(topic);\n if (handlers) {\n const idx = handlers.indexOf(wrappedHandler);\n if (idx >= 0) handlers.splice(idx, 1);\n if (handlers.length === 0) topicHandlers.delete(topic);\n }\n }\n wrappedHandlers.clear();\n network.broadcast(agentId, {\n type: \"UNSUBSCRIBE\",\n topics,\n } as Partial<AgentMessage & { type: \"UNSUBSCRIBE\"; topics: string[] }>);\n };\n },\n\n publish(topic: string, content: unknown): void {\n network.broadcast(agentId, {\n type: \"UPDATE\",\n topic,\n content,\n } as Partial<UpdateMessage>);\n },\n\n /** Dispose of this pub/sub, unsubscribing from network and clearing handlers */\n dispose(): void {\n subscription.unsubscribe();\n topicHandlers.clear();\n },\n };\n}\n","/**\n * Enhanced PII Detection Guardrail\n *\n * Provides comprehensive PII detection beyond basic regex patterns:\n * - Multiple PII types (SSN, credit cards, emails, phones, addresses, names)\n * - Pluggable detection backends (regex, custom, or external services)\n * - Context-aware detection (reduces false positives)\n * - Redaction with reversible or irreversible options\n *\n * @example\n * ```typescript\n * import { createEnhancedPIIGuardrail } from '@directive-run/ai';\n *\n * const guardrail = createEnhancedPIIGuardrail({\n * types: ['ssn', 'credit_card', 'email'],\n * redact: true,\n * detector: 'regex', // or 'custom' with custom detector\n * });\n * ```\n */\n\nimport type { GuardrailFn, InputGuardrailData, OutputGuardrailData, GuardrailResult } from \"../index.js\";\n\n// ============================================================================\n// PII Types\n// ============================================================================\n\n/** Supported PII types */\nexport type PIIType =\n | \"ssn\" // Social Security Number\n | \"credit_card\" // Credit/debit card numbers\n | \"email\" // Email addresses\n | \"phone\" // Phone numbers (various formats)\n | \"address\" // Physical addresses\n | \"name\" // Personal names (requires context)\n | \"date_of_birth\" // Birth dates\n | \"passport\" // Passport numbers\n | \"driver_license\" // Driver's license numbers\n | \"ip_address\" // IP addresses\n | \"bank_account\" // Bank account numbers\n | \"medical_id\" // Medical record numbers\n | \"national_id\"; // Non-US national IDs\n\n/** Detected PII instance */\nexport interface DetectedPII {\n type: PIIType;\n value: string;\n position: { start: number; end: number };\n confidence: number; // 0-1\n context?: string; // Surrounding text for debugging\n}\n\n/** PII detection result */\nexport interface PIIDetectionResult {\n detected: boolean;\n items: DetectedPII[];\n typeCounts: Partial<Record<PIIType, number>>;\n /** Text with PII redacted (if requested) */\n redactedText?: string;\n}\n\n// ============================================================================\n// Regex Patterns\n// ============================================================================\n\n/** PII pattern with validation */\ninterface PIIPattern {\n type: PIIType;\n pattern: RegExp;\n /** Additional validation function (reduces false positives) */\n validate?: (match: string, context: string) => boolean;\n /** Confidence score (0-1) */\n confidence: number;\n}\n\n/** Comprehensive PII patterns */\nconst PII_PATTERNS: PIIPattern[] = [\n // SSN - US Social Security Number\n {\n type: \"ssn\",\n pattern: /\\b(\\d{3}[-\\s]?\\d{2}[-\\s]?\\d{4})\\b/g,\n validate: (match) => {\n // Remove separators and validate format\n const digits = match.replace(/[-\\s]/g, \"\");\n // SSN cannot start with 000, 666, or 9xx\n if (digits.startsWith(\"000\") || digits.startsWith(\"666\") || digits.startsWith(\"9\")) {\n return false;\n }\n // Middle 2 digits cannot be 00\n if (digits.slice(3, 5) === \"00\") {\n return false;\n }\n // Last 4 digits cannot be 0000\n if (digits.slice(5) === \"0000\") {\n return false;\n }\n return true;\n },\n confidence: 0.95,\n },\n\n // Credit Card Numbers (Luhn validated)\n {\n type: \"credit_card\",\n pattern: /\\b(\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4})\\b|\\b(\\d{15,16})\\b/g,\n validate: (match) => {\n const digits = match.replace(/[-\\s]/g, \"\");\n if (digits.length < 13 || digits.length > 19) return false;\n // Luhn algorithm\n let sum = 0;\n let isEven = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n const char = digits[i];\n if (!char) continue;\n let digit = Number.parseInt(char, 10);\n if (isEven) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n sum += digit;\n isEven = !isEven;\n }\n return sum % 10 === 0;\n },\n confidence: 0.95,\n },\n\n // Email addresses\n {\n type: \"email\",\n pattern: /\\b([A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,})\\b/gi,\n confidence: 0.9,\n },\n\n // Phone numbers (US and international formats)\n {\n type: \"phone\",\n // Matches various formats: (555) 555-5555, 555-555-5555, +1 555 555 5555, etc.\n pattern: /\\b(\\+?1?[-.\\s]?\\(?[0-9]{3}\\)?[-.\\s]?[0-9]{3}[-.\\s]?[0-9]{4})\\b/g,\n validate: (match) => {\n const digits = match.replace(/\\D/g, \"\");\n // US numbers should be 10 or 11 digits\n return digits.length >= 10 && digits.length <= 11;\n },\n confidence: 0.8,\n },\n\n // Date of birth patterns\n {\n type: \"date_of_birth\",\n // Various formats: MM/DD/YYYY, YYYY-MM-DD, DD-MM-YYYY\n pattern: /\\b(born|dob|birth.?date|date.?of.?birth)[:.\\s]+(\\d{1,4}[-/]\\d{1,2}[-/]\\d{1,4})\\b/gi,\n confidence: 0.85,\n },\n\n // IP addresses\n {\n type: \"ip_address\",\n pattern: /\\b(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\b/g,\n validate: (match) => {\n const parts = match.split(\".\");\n return parts.every((p) => {\n const num = Number.parseInt(p, 10);\n return num >= 0 && num <= 255;\n });\n },\n confidence: 0.9,\n },\n\n // Bank account numbers (generic)\n {\n type: \"bank_account\",\n // Account number followed by routing or preceded by \"account\"\n pattern: /\\b(account|acct)[\\s#:]+(\\d{8,17})\\b/gi,\n confidence: 0.7,\n },\n\n // Passport numbers (various countries)\n {\n type: \"passport\",\n // US passports: 9 digits, UK: 9 digits, etc.\n pattern: /\\b(passport)[\\s#:]+([A-Z0-9]{6,9})\\b/gi,\n confidence: 0.75,\n },\n\n // Driver's license (US - state specific patterns would be better)\n {\n type: \"driver_license\",\n pattern: /\\b(driver'?s?\\s*licen[cs]e|dl)[\\s#:]+([A-Z0-9]{5,15})\\b/gi,\n confidence: 0.7,\n },\n\n // Medical record numbers\n {\n type: \"medical_id\",\n pattern: /\\b(mrn|medical.?record|patient.?id)[\\s#:]+([A-Z0-9-]{6,15})\\b/gi,\n confidence: 0.7,\n },\n];\n\n// ============================================================================\n// Address Detection\n// ============================================================================\n\n/** Detect US physical addresses */\nfunction detectAddresses(text: string): DetectedPII[] {\n const results: DetectedPII[] = [];\n\n // Simplified US address pattern to avoid ReDoS\n // Matches: \"123 Main Street, City, CA 12345\" or similar\n // Uses possessive-like matching and limits word count to prevent catastrophic backtracking\n const streetTypes = \"street|st|avenue|ave|road|rd|drive|dr|lane|ln|court|ct|way|boulevard|blvd|circle|cir|place|pl\";\n const addressPattern = new RegExp(\n `\\\\b(\\\\d{1,5}\\\\s+(?:\\\\w+\\\\s+){1,4}(?:${streetTypes})\\\\b[^\\\\n]{0,50}\\\\b[A-Z]{2}\\\\s+\\\\d{5}(?:-\\\\d{4})?)\\\\b`,\n \"gi\"\n );\n\n let match: RegExpExecArray | null;\n while ((match = addressPattern.exec(text)) !== null) {\n results.push({\n type: \"address\",\n value: match[0],\n position: { start: match.index, end: match.index + match[0].length },\n confidence: 0.7, // Lower confidence due to simpler pattern\n });\n }\n\n return results;\n}\n\n// ============================================================================\n// Name Detection (Context-Aware)\n// ============================================================================\n\n/** Common prefixes that indicate names */\nconst NAME_PREFIXES = [\n \"mr\", \"mrs\", \"ms\", \"miss\", \"dr\", \"prof\", \"sir\", \"madam\",\n \"name is\", \"called\", \"known as\", \"signed by\", \"from\",\n \"dear\", \"hi\", \"hello\", \"contact\", \"recipient\",\n];\n\n/** Detect personal names (requires context) */\nfunction detectNames(text: string): DetectedPII[] {\n const results: DetectedPII[] = [];\n\n // Simplified name pattern to avoid ReDoS\n // Matches: \"Mr. John Smith\" or \"name is Jane Doe\"\n // Uses non-capturing groups and limits repetition\n const prefixPattern = NAME_PREFIXES.join(\"|\");\n const nameRegex = new RegExp(\n `\\\\b(${prefixPattern})[.,:]?\\\\s+([A-Z][a-z]{1,20}(?:\\\\s[A-Z][a-z]{1,20}){0,2})\\\\b`,\n \"gi\"\n );\n\n let match: RegExpExecArray | null;\n\n while ((match = nameRegex.exec(text)) !== null) {\n const name = match[2];\n const prefix = match[1];\n // Skip if name is undefined\n if (!name) continue;\n // Ignore single-word names that might be common words\n if (name.split(/\\s+/).length >= 2 || (prefix && NAME_PREFIXES.some(p => prefix.toLowerCase().includes(p)))) {\n results.push({\n type: \"name\",\n value: name,\n position: { start: match.index, end: match.index + match[0].length },\n confidence: 0.6,\n context: match[0],\n });\n }\n }\n\n return results;\n}\n\n// ============================================================================\n// Detection Backend Types\n// ============================================================================\n\n/** Maximum input length for PII detection (100KB) */\nconst MAX_PII_INPUT_LENGTH = 100_000;\n\n/** Custom PII detector interface */\nexport interface PIIDetector {\n detect(text: string, types: PIIType[]): Promise<DetectedPII[]>;\n name: string;\n}\n\n/** Built-in regex detector */\nexport const regexDetector: PIIDetector = {\n name: \"regex\",\n async detect(text: string, types: PIIType[]): Promise<DetectedPII[]> {\n // Security: Prevent DoS via extremely large inputs\n if (text.length > MAX_PII_INPUT_LENGTH) {\n throw new Error(\n `[Directive] Input exceeds maximum length of ${MAX_PII_INPUT_LENGTH} characters for PII detection. ` +\n `Truncate input or process in chunks.`\n );\n }\n\n const results: DetectedPII[] = [];\n const typeSet = new Set(types);\n\n // Pattern-based detection\n for (const pattern of PII_PATTERNS) {\n if (!typeSet.has(pattern.type)) continue;\n\n const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const value = match[1] || match[0];\n const context = text.slice(Math.max(0, match.index - 20), match.index + value.length + 20);\n\n // Apply validation if present\n if (pattern.validate && !pattern.validate(value, context)) {\n continue;\n }\n\n results.push({\n type: pattern.type,\n value,\n position: { start: match.index, end: match.index + value.length },\n confidence: pattern.confidence,\n context,\n });\n }\n }\n\n // Address detection (separate logic)\n if (typeSet.has(\"address\")) {\n results.push(...detectAddresses(text));\n }\n\n // Name detection (context-aware)\n if (typeSet.has(\"name\")) {\n results.push(...detectNames(text));\n }\n\n return results;\n },\n};\n\n// ============================================================================\n// Redaction Functions\n// ============================================================================\n\n/** Redaction style */\nexport type RedactionStyle =\n /** Replace with [REDACTED] */\n | \"placeholder\"\n /** Replace with type-specific placeholder like [EMAIL] */\n | \"typed\"\n /** Replace with asterisks preserving length */\n | \"masked\"\n /** Replace with hash for reversible redaction */\n | \"hashed\";\n\n/** Redact detected PII from text */\nexport function redactPII(\n text: string,\n items: DetectedPII[],\n style: RedactionStyle = \"typed\"\n): string {\n // Sort by position descending to avoid offset issues\n const sorted = [...items].sort((a, b) => b.position.start - a.position.start);\n\n let result = text;\n for (const item of sorted) {\n let replacement: string;\n\n switch (style) {\n case \"placeholder\":\n replacement = \"[REDACTED]\";\n break;\n case \"typed\":\n replacement = `[${item.type.toUpperCase()}]`;\n break;\n case \"masked\":\n replacement = \"*\".repeat(item.value.length);\n break;\n case \"hashed\":\n // FNV-1a hash for referential integrity (not for security)\n // Same input always produces same hash, useful for audit trails\n replacement = `[HASH:${fnv1aHash(item.value)}]`;\n break;\n }\n\n result = result.slice(0, item.position.start) + replacement + result.slice(item.position.end);\n }\n\n return result;\n}\n\n/**\n * FNV-1a hash function for referential integrity.\n *\n * **Note:** This is NOT a cryptographic hash. It's designed for:\n * - Consistent redaction references (same PII → same hash)\n * - Audit trail correlation (track redacted values across logs)\n *\n * For security-sensitive hashing, use Web Crypto API externally.\n *\n * @see https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function\n */\nfunction fnv1aHash(str: string): string {\n // FNV-1a 32-bit parameters\n const FNV_PRIME = 0x01000193;\n const FNV_OFFSET = 0x811c9dc5;\n\n let hash = FNV_OFFSET;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, FNV_PRIME);\n }\n\n // Convert to unsigned 32-bit and return as hex\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n// ============================================================================\n// Guardrail Factory\n// ============================================================================\n\n/** Options for enhanced PII guardrail */\nexport interface EnhancedPIIGuardrailOptions {\n /** PII types to detect (default: all) */\n types?: PIIType[];\n /** Detection backend (default: 'regex') */\n detector?: \"regex\" | PIIDetector;\n /** Redact instead of blocking */\n redact?: boolean;\n /** Redaction style (default: 'typed') */\n redactionStyle?: RedactionStyle;\n /** Minimum confidence to flag (0-1, default: 0.7) */\n minConfidence?: number;\n /** Callback when PII is detected */\n onDetected?: (items: DetectedPII[]) => void;\n /** Allow specific values (whitelist) */\n allowlist?: string[];\n /** Block only if count exceeds threshold */\n minItemsToBlock?: number;\n /** Timeout for custom detector in milliseconds (default: 5000) */\n detectorTimeout?: number;\n}\n\n/** Default PII types to detect */\nconst DEFAULT_PII_TYPES: PIIType[] = [\n \"ssn\",\n \"credit_card\",\n \"email\",\n \"phone\",\n \"date_of_birth\",\n \"bank_account\",\n];\n\n/**\n * Create an enhanced PII detection guardrail.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const guardrail = createEnhancedPIIGuardrail();\n *\n * // Redact instead of blocking\n * const redactGuardrail = createEnhancedPIIGuardrail({\n * redact: true,\n * redactionStyle: 'masked',\n * });\n *\n * // Custom detection with external service\n * const customGuardrail = createEnhancedPIIGuardrail({\n * detector: myPresidioDetector,\n * types: ['ssn', 'credit_card', 'medical_id'],\n * });\n * ```\n */\nexport function createEnhancedPIIGuardrail(\n options: EnhancedPIIGuardrailOptions = {}\n): GuardrailFn<InputGuardrailData> {\n const {\n types = DEFAULT_PII_TYPES,\n detector = \"regex\",\n redact = false,\n redactionStyle = \"typed\",\n minConfidence = 0.7,\n onDetected,\n allowlist = [],\n minItemsToBlock = 1,\n detectorTimeout = 5000,\n } = options;\n\n const detectorInstance = detector === \"regex\" ? regexDetector : detector;\n // Normalize allowlist: lowercase and trim for consistent comparison\n const allowSet = new Set(allowlist.map((v) => v.toLowerCase().trim()));\n\n // Wrap detector with timeout to prevent DoS via slow external services\n async function detectWithTimeout(text: string, piiTypes: PIIType[]): Promise<DetectedPII[]> {\n // Built-in regex detector doesn't need timeout (it's synchronous)\n if (detectorInstance === regexDetector) {\n return detectorInstance.detect(text, piiTypes);\n }\n\n // Custom detectors get a timeout\n let timer: ReturnType<typeof setTimeout>;\n try {\n return await Promise.race([\n detectorInstance.detect(text, piiTypes),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`[Directive] PII detector '${detectorInstance.name}' timed out after ${detectorTimeout}ms`)),\n detectorTimeout\n );\n }),\n ]);\n } finally {\n clearTimeout(timer!);\n }\n }\n\n return async (data): Promise<GuardrailResult> => {\n const items = await detectWithTimeout(data.input, types);\n\n // Filter by confidence and allowlist (normalize value for comparison)\n const filtered = items.filter((item) => {\n if (item.confidence < minConfidence) return false;\n // Normalize detected value for allowlist comparison\n if (allowSet.has(item.value.toLowerCase().trim())) return false;\n return true;\n });\n\n if (filtered.length > 0) {\n onDetected?.(filtered);\n }\n\n if (filtered.length >= minItemsToBlock) {\n if (redact) {\n const redactedText = redactPII(data.input, filtered, redactionStyle);\n return {\n passed: true,\n transformed: redactedText,\n };\n }\n\n const typeCounts: Record<string, number> = {};\n for (const item of filtered) {\n typeCounts[item.type] = (typeCounts[item.type] || 0) + 1;\n }\n\n const summary = Object.entries(typeCounts)\n .map(([type, count]) => `${type}: ${count}`)\n .join(\", \");\n\n return {\n passed: false,\n reason: `PII detected (${summary})`,\n };\n }\n\n return { passed: true };\n };\n}\n\n/**\n * Create an output PII guardrail (for checking agent responses).\n *\n * @example\n * ```typescript\n * const outputGuardrail = createOutputPIIGuardrail({\n * types: ['ssn', 'credit_card'],\n * redact: true,\n * });\n * ```\n */\nexport function createOutputPIIGuardrail(\n options: EnhancedPIIGuardrailOptions = {}\n): GuardrailFn<OutputGuardrailData> {\n const inputGuardrail = createEnhancedPIIGuardrail(options);\n\n return async (data, context): Promise<GuardrailResult> => {\n const text = typeof data.output === \"string\" ? data.output : JSON.stringify(data.output);\n\n return inputGuardrail(\n { input: text, agentName: data.agentName },\n context\n );\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Detect PII in text without using as a guardrail.\n * Useful for analysis and logging.\n *\n * @example\n * ```typescript\n * const result = await detectPII('My SSN is 123-45-6789');\n * console.log(result.items); // [{ type: 'ssn', value: '123-45-6789', ... }]\n *\n * // With custom detector and timeout\n * const result = await detectPII(text, {\n * detector: myPresidioDetector,\n * timeout: 10000, // 10 seconds\n * });\n * ```\n */\nexport async function detectPII(\n text: string,\n options: {\n types?: PIIType[];\n detector?: \"regex\" | PIIDetector;\n minConfidence?: number;\n /** Timeout for custom detectors in milliseconds (default: 5000) */\n timeout?: number;\n } = {}\n): Promise<PIIDetectionResult> {\n const {\n types = DEFAULT_PII_TYPES,\n detector = \"regex\",\n minConfidence = 0.7,\n timeout = 5000,\n } = options;\n\n const detectorInstance = detector === \"regex\" ? regexDetector : detector;\n\n // Apply timeout for custom detectors to prevent DoS\n let items: DetectedPII[];\n if (detectorInstance === regexDetector) {\n // Built-in regex detector is synchronous, no timeout needed\n items = await detectorInstance.detect(text, types);\n } else {\n // Custom detectors get a timeout\n let timer: ReturnType<typeof setTimeout>;\n try {\n items = await Promise.race([\n detectorInstance.detect(text, types),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`[Directive] PII detector '${detectorInstance.name}' timed out after ${timeout}ms`)),\n timeout\n );\n }),\n ]);\n } finally {\n clearTimeout(timer!);\n }\n }\n\n const filtered = items.filter((item) => item.confidence >= minConfidence);\n\n const typeCounts: Partial<Record<PIIType, number>> = {};\n for (const item of filtered) {\n typeCounts[item.type] = (typeCounts[item.type] || 0) + 1;\n }\n\n return {\n detected: filtered.length > 0,\n items: filtered,\n typeCounts,\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n detectPII as detect,\n redactPII as redact,\n createEnhancedPIIGuardrail as create,\n createOutputPIIGuardrail as createOutput,\n};\n","/**\n * Audit Plugin - Immutable Audit Trail with Hash Chain\n *\n * Provides enterprise-grade audit logging with:\n * - Cryptographic hash chain for tamper detection\n * - Bounded storage with FIFO eviction\n * - PII masking with configurable redaction\n * - Optional signing for non-repudiation\n * - Async export to external systems\n *\n * @example\n * ```typescript\n * import { createAuditTrail } from '@directive-run/ai';\n *\n * const audit = createAuditTrail({\n * maxEntries: 10000,\n * retentionMs: 7 * 24 * 60 * 60 * 1000, // 7 days\n * piiMasking: {\n * enabled: true,\n * types: ['ssn', 'credit_card', 'email'],\n * redactionStyle: 'typed',\n * },\n * exporter: async (entries) => {\n * await sendToSIEM(entries);\n * },\n * });\n *\n * const system = createSystem({\n * module: myModule,\n * plugins: [audit.createPlugin()],\n * });\n * ```\n */\n\nimport type { Plugin, ModuleSchema } from \"@directive-run/core\";\nimport type { PIIType, RedactionStyle } from \"../guardrails/pii-enhanced.js\";\nimport { detectPII, redactPII } from \"../guardrails/pii-enhanced.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Audit event types - 17 total covering all system operations */\nexport type AuditEventType =\n\t// Agent lifecycle\n\t| \"agent.run.start\"\n\t| \"agent.run.complete\"\n\t| \"agent.run.error\"\n\t// Tool operations\n\t| \"tool.call.start\"\n\t| \"tool.call.complete\"\n\t| \"tool.call.error\"\n\t// Human-in-the-loop\n\t| \"approval.requested\"\n\t| \"approval.granted\"\n\t| \"approval.denied\"\n\t// Requirement lifecycle\n\t| \"requirement.created\"\n\t| \"requirement.met\"\n\t// Resolver operations\n\t| \"resolver.start\"\n\t| \"resolver.complete\"\n\t| \"resolver.error\"\n\t// Fact mutations\n\t| \"fact.set\"\n\t| \"fact.batch\"\n\t// Error handling\n\t| \"error.occurred\"\n\t| \"error.recovery\";\n\n/** Single audit entry with hash chain linking */\nexport interface AuditEntry {\n\t/** Unique identifier for this entry */\n\tid: string;\n\t/** Unix timestamp in milliseconds */\n\ttimestamp: number;\n\t/** Type of event */\n\teventType: AuditEventType;\n\t/** SHA-256 hash of previous entry (empty string for genesis) */\n\tpreviousHash: string;\n\t/** SHA-256 hash of this entry's content */\n\thash: string;\n\t/** Event payload data */\n\tpayload: Record<string, unknown>;\n\t/** PII-redacted version of payload (if masking enabled) */\n\tmaskedPayload?: Record<string, unknown>;\n\t/** Actor identifier (user, agent, or system) */\n\tactorId?: string;\n\t/** Session identifier for correlation */\n\tsessionId?: string;\n\t/** Cryptographic signature (if signing enabled) */\n\tsignature?: string;\n}\n\n/** Filter options for querying audit entries */\nexport interface AuditEntryFilter {\n\t/** Filter by event types */\n\teventTypes?: AuditEventType[];\n\t/** Filter by actor ID */\n\tactorId?: string;\n\t/** Filter by session ID */\n\tsessionId?: string;\n\t/** Start of time range */\n\tsince?: number;\n\t/** End of time range */\n\tuntil?: number;\n\t/** Maximum entries to return */\n\tlimit?: number;\n\t/** Offset for pagination */\n\toffset?: number;\n}\n\n/** Result of chain verification */\nexport interface AuditVerificationResult {\n\t/** Whether the chain is valid */\n\tvalid: boolean;\n\t/** Number of entries verified */\n\tentriesVerified: number;\n\t/** First broken link (if any) */\n\tbrokenAt?: {\n\t\tindex: number;\n\t\tentryId: string;\n\t\texpectedHash: string;\n\t\tactualHash: string;\n\t};\n\t/** Verification timestamp */\n\tverifiedAt: number;\n}\n\n/** Audit statistics */\nexport interface AuditStats {\n\t/** Total entries in trail */\n\ttotalEntries: number;\n\t/** Entries by event type */\n\tbyEventType: Partial<Record<AuditEventType, number>>;\n\t/** Oldest entry timestamp */\n\toldestEntry?: number;\n\t/** Newest entry timestamp */\n\tnewestEntry?: number;\n\t/** Number of entries pruned */\n\tentriesPruned: number;\n\t/** Number of entries exported */\n\tentriesExported: number;\n\t/** Chain integrity (true if verified valid) */\n\tchainIntegrity: boolean;\n}\n\n/** PII masking configuration */\nexport interface PIIMaskingConfig {\n\t/** Enable PII masking */\n\tenabled: boolean;\n\t/** PII types to detect and mask */\n\ttypes: PIIType[];\n\t/** Redaction style */\n\tredactionStyle: RedactionStyle;\n\t/** Custom allowlist (values to skip) */\n\tallowlist?: string[];\n\t/** Minimum confidence threshold */\n\tminConfidence?: number;\n}\n\n/** Signing configuration for non-repudiation */\nexport interface SigningConfig {\n\t/** Function to sign a hash value */\n\tsignFn: (hash: string) => Promise<string>;\n\t/** Function to verify a signature */\n\tverifyFn?: (hash: string, signature: string) => Promise<boolean>;\n}\n\n/** Audit plugin configuration */\nexport interface AuditPluginConfig {\n\t/** Maximum entries to retain (default: 10000) */\n\tmaxEntries?: number;\n\t/** Retention period in milliseconds (default: 7 days) */\n\tretentionMs?: number;\n\t/** Export interval in milliseconds (default: 60000) */\n\texportInterval?: number;\n\t/** Async exporter function */\n\texporter?: (entries: AuditEntry[]) => Promise<void>;\n\t/** PII masking configuration */\n\tpiiMasking?: PIIMaskingConfig;\n\t/** Signing configuration for non-repudiation */\n\tsigning?: SigningConfig;\n\t/** Session ID for all entries */\n\tsessionId?: string;\n\t/** Actor ID for all entries */\n\tactorId?: string;\n\t/** Event callbacks */\n\tevents?: {\n\t\tonEntryAdded?: (entry: AuditEntry) => void;\n\t\tonChainBroken?: (result: AuditVerificationResult) => void;\n\t\tonExportError?: (error: Error, entries: AuditEntry[]) => void;\n\t};\n}\n\n/** Audit trail instance */\nexport interface AuditInstance {\n\t/** Get entries with optional filtering */\n\tgetEntries(filter?: AuditEntryFilter): AuditEntry[];\n\t/** Verify the integrity of the hash chain */\n\tverifyChain(): Promise<AuditVerificationResult>;\n\t/** Export entries since timestamp */\n\texport(since?: number): Promise<AuditEntry[]>;\n\t/** Prune old entries based on retention policy */\n\tprune(): number;\n\t/** Get audit statistics */\n\tgetStats(): AuditStats;\n\t/** Dispose of the instance (clears timers, flushes exports) */\n\tdispose(): Promise<void>;\n\t/** Create a plugin for a directive system */\n\tcreatePlugin<M extends ModuleSchema>(): Plugin<M>;\n\t/** Add a custom audit entry */\n\taddEntry(eventType: AuditEventType, payload: Record<string, unknown>): Promise<AuditEntry>;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default maximum entries */\nconst DEFAULT_MAX_ENTRIES = 10000;\n\n/** Default retention period (7 days) */\nconst DEFAULT_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** Default export interval (60 seconds) */\nconst DEFAULT_EXPORT_INTERVAL = 60000;\n\n/** Genesis block previous hash */\nconst GENESIS_PREVIOUS_HASH = \"0\".repeat(64);\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/** Generate a unique ID */\nfunction generateId(): string {\n\treturn globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/** Convert string to Uint8Array */\nfunction stringToBytes(str: string): Uint8Array {\n\treturn new TextEncoder().encode(str);\n}\n\n/** Convert Uint8Array to hex string */\nfunction bytesToHex(bytes: Uint8Array): string {\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\");\n}\n\n/** Calculate SHA-256 hash of content */\nasync function sha256(content: string): Promise<string> {\n\tconst bytes = stringToBytes(content);\n\tconst hashBuffer = await globalThis.crypto.subtle.digest(\n\t\t\"SHA-256\",\n\t\tbytes as unknown as ArrayBuffer\n\t);\n\treturn bytesToHex(new Uint8Array(hashBuffer));\n}\n\n/** Create hash content from entry (deterministic serialization) */\nfunction createHashContent(entry: Omit<AuditEntry, \"hash\" | \"signature\">): string {\n\tconst { id, timestamp, eventType, previousHash, payload, actorId, sessionId } = entry;\n\treturn JSON.stringify({\n\t\tid,\n\t\ttimestamp,\n\t\teventType,\n\t\tpreviousHash,\n\t\tpayload,\n\t\tactorId,\n\t\tsessionId,\n\t});\n}\n\n/** Deep clone an object */\nfunction deepClone<T>(obj: T): T {\n\treturn JSON.parse(JSON.stringify(obj));\n}\n\n/** Mask PII in a payload object */\nasync function maskPayload(\n\tpayload: Record<string, unknown>,\n\tconfig: PIIMaskingConfig\n): Promise<Record<string, unknown>> {\n\tconst masked = deepClone(payload);\n\n\t// Recursively process all string values\n\tasync function processValue(value: unknown): Promise<unknown> {\n\t\tif (typeof value === \"string\") {\n\t\t\tconst result = await detectPII(value, {\n\t\t\t\ttypes: config.types,\n\t\t\t\tminConfidence: config.minConfidence ?? 0.7,\n\t\t\t});\n\n\t\t\tif (result.detected) {\n\t\t\t\t// Filter by allowlist\n\t\t\t\tconst itemsToRedact = config.allowlist\n\t\t\t\t\t? result.items.filter((item) => !config.allowlist!.includes(item.value.toLowerCase()))\n\t\t\t\t\t: result.items;\n\n\t\t\t\tif (itemsToRedact.length > 0) {\n\t\t\t\t\treturn redactPII(value, itemsToRedact, config.redactionStyle);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\treturn Promise.all(value.map(processValue));\n\t\t}\n\n\t\tif (value && typeof value === \"object\") {\n\t\t\tconst processed: Record<string, unknown> = {};\n\t\t\tfor (const [k, v] of Object.entries(value)) {\n\t\t\t\tprocessed[k] = await processValue(v);\n\t\t\t}\n\t\t\treturn processed;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tfor (const [key, value] of Object.entries(masked)) {\n\t\tmasked[key] = await processValue(value);\n\t}\n\n\treturn masked;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an audit trail instance for enterprise-grade audit logging.\n *\n * Features:\n * - Immutable hash chain for tamper detection\n * - Bounded storage with automatic FIFO eviction\n * - PII masking with configurable redaction styles\n * - Optional cryptographic signing for non-repudiation\n * - Async export to external SIEM/logging systems\n *\n * @example\n * ```typescript\n * const audit = createAuditTrail({\n * maxEntries: 10000,\n * piiMasking: {\n * enabled: true,\n * types: ['ssn', 'credit_card'],\n * redactionStyle: 'typed',\n * },\n * exporter: async (entries) => {\n * await fetch('/api/audit', {\n * method: 'POST',\n * body: JSON.stringify(entries),\n * });\n * },\n * });\n *\n * // Use with directive system\n * const system = createSystem({\n * module: myModule,\n * plugins: [audit.createPlugin()],\n * });\n *\n * // Query audit entries\n * const recentErrors = audit.getEntries({\n * eventTypes: ['error.occurred', 'error.recovery'],\n * since: Date.now() - 3600000, // Last hour\n * });\n *\n * // Verify chain integrity\n * const verification = await audit.verifyChain();\n * if (!verification.valid) {\n * console.error('Audit chain tampered!', verification.brokenAt);\n * }\n * ```\n */\nexport function createAuditTrail(config: AuditPluginConfig = {}): AuditInstance {\n\tconst {\n\t\tmaxEntries = DEFAULT_MAX_ENTRIES,\n\t\tretentionMs = DEFAULT_RETENTION_MS,\n\t\texportInterval = DEFAULT_EXPORT_INTERVAL,\n\t\texporter,\n\t\tpiiMasking,\n\t\tsigning,\n\t\tsessionId,\n\t\tactorId,\n\t\tevents = {},\n\t} = config;\n\n\t// State\n\tconst entries: AuditEntry[] = [];\n\tlet lastExportIndex = 0;\n\tlet entriesPruned = 0;\n\tlet entriesExported = 0;\n\tlet chainVerified = true;\n\tlet exportTimer: ReturnType<typeof setInterval> | undefined;\n\n\t// Get the hash of the last entry (or genesis hash)\n\tfunction getLastHash(): string {\n\t\tif (entries.length === 0) {\n\t\t\treturn GENESIS_PREVIOUS_HASH;\n\t\t}\n\t\treturn entries[entries.length - 1]!.hash;\n\t}\n\n\t// Add a new entry to the trail\n\tasync function addEntry(\n\t\teventType: AuditEventType,\n\t\tpayload: Record<string, unknown>,\n\t\toverrides?: { actorId?: string; sessionId?: string }\n\t): Promise<AuditEntry> {\n\t\tconst entry: Omit<AuditEntry, \"hash\" | \"signature\"> = {\n\t\t\tid: generateId(),\n\t\t\ttimestamp: Date.now(),\n\t\t\teventType,\n\t\t\tpreviousHash: getLastHash(),\n\t\t\tpayload,\n\t\t\tactorId: overrides?.actorId ?? actorId,\n\t\t\tsessionId: overrides?.sessionId ?? sessionId,\n\t\t};\n\n\t\t// Apply PII masking if enabled\n\t\tif (piiMasking?.enabled) {\n\t\t\tentry.maskedPayload = await maskPayload(payload, piiMasking);\n\t\t}\n\n\t\t// Calculate hash\n\t\tconst hashContent = createHashContent(entry);\n\t\tconst hash = await sha256(hashContent);\n\n\t\tconst fullEntry: AuditEntry = {\n\t\t\t...entry,\n\t\t\thash,\n\t\t};\n\n\t\t// Apply signing if configured\n\t\tif (signing) {\n\t\t\tfullEntry.signature = await signing.signFn(hash);\n\t\t}\n\n\t\t// Add to trail\n\t\tentries.push(fullEntry);\n\n\t\t// Enforce max entries (FIFO eviction)\n\t\twhile (entries.length > maxEntries) {\n\t\t\tentries.shift();\n\t\t\tentriesPruned++;\n\t\t\t// Adjust export index if entries were evicted\n\t\t\tif (lastExportIndex > 0) {\n\t\t\t\tlastExportIndex--;\n\t\t\t}\n\t\t}\n\n\t\tevents.onEntryAdded?.(fullEntry);\n\n\t\treturn fullEntry;\n\t}\n\n\t// Start export timer if configured\n\tif (exporter && exportInterval > 0) {\n\t\texportTimer = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tconst toExport = entries.slice(lastExportIndex);\n\t\t\t\tif (toExport.length > 0) {\n\t\t\t\t\tawait exporter(toExport);\n\t\t\t\t\tentriesExported += toExport.length;\n\t\t\t\t\tlastExportIndex = entries.length;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tevents.onExportError?.(\n\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\tentries.slice(lastExportIndex)\n\t\t\t\t);\n\t\t\t}\n\t\t}, exportInterval);\n\t}\n\n\treturn {\n\t\tgetEntries(filter?: AuditEntryFilter): AuditEntry[] {\n\t\t\tlet result = [...entries];\n\n\t\t\tif (filter) {\n\t\t\t\tif (filter.eventTypes?.length) {\n\t\t\t\t\tconst typeSet = new Set(filter.eventTypes);\n\t\t\t\t\tresult = result.filter((e) => typeSet.has(e.eventType));\n\t\t\t\t}\n\n\t\t\t\tif (filter.actorId) {\n\t\t\t\t\tresult = result.filter((e) => e.actorId === filter.actorId);\n\t\t\t\t}\n\n\t\t\t\tif (filter.sessionId) {\n\t\t\t\t\tresult = result.filter((e) => e.sessionId === filter.sessionId);\n\t\t\t\t}\n\n\t\t\t\tif (filter.since !== undefined) {\n\t\t\t\t\tresult = result.filter((e) => e.timestamp >= filter.since!);\n\t\t\t\t}\n\n\t\t\t\tif (filter.until !== undefined) {\n\t\t\t\t\tresult = result.filter((e) => e.timestamp <= filter.until!);\n\t\t\t\t}\n\n\t\t\t\tif (filter.offset !== undefined) {\n\t\t\t\t\tresult = result.slice(filter.offset);\n\t\t\t\t}\n\n\t\t\t\tif (filter.limit !== undefined) {\n\t\t\t\t\tresult = result.slice(0, filter.limit);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\tasync verifyChain(): Promise<AuditVerificationResult> {\n\t\t\tif (entries.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tvalid: true,\n\t\t\t\t\tentriesVerified: 0,\n\t\t\t\t\tverifiedAt: Date.now(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Verify first entry links to genesis\n\t\t\tconst firstEntry = entries[0]!;\n\t\t\tif (firstEntry.previousHash !== GENESIS_PREVIOUS_HASH) {\n\t\t\t\t// First entry doesn't link to genesis - this could happen after pruning\n\t\t\t\t// We verify the chain is internally consistent instead\n\t\t\t}\n\n\t\t\t// Verify each entry's hash and link\n\t\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\t\tconst entry = entries[i]!;\n\n\t\t\t\t// Recalculate hash\n\t\t\t\tconst hashContent = createHashContent({\n\t\t\t\t\tid: entry.id,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t\teventType: entry.eventType,\n\t\t\t\t\tpreviousHash: entry.previousHash,\n\t\t\t\t\tpayload: entry.payload,\n\t\t\t\t\tactorId: entry.actorId,\n\t\t\t\t\tsessionId: entry.sessionId,\n\t\t\t\t});\n\t\t\t\tconst expectedHash = await sha256(hashContent);\n\n\t\t\t\tif (entry.hash !== expectedHash) {\n\t\t\t\t\tchainVerified = false;\n\t\t\t\t\tconst result: AuditVerificationResult = {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\tentriesVerified: i,\n\t\t\t\t\t\tbrokenAt: {\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tentryId: entry.id,\n\t\t\t\t\t\t\texpectedHash,\n\t\t\t\t\t\t\tactualHash: entry.hash,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tverifiedAt: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tevents.onChainBroken?.(result);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\t// Verify chain linkage (except for first entry after pruning)\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tconst prevEntry = entries[i - 1]!;\n\t\t\t\t\tif (entry.previousHash !== prevEntry.hash) {\n\t\t\t\t\t\tchainVerified = false;\n\t\t\t\t\t\tconst result: AuditVerificationResult = {\n\t\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\t\tentriesVerified: i,\n\t\t\t\t\t\t\tbrokenAt: {\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tentryId: entry.id,\n\t\t\t\t\t\t\t\texpectedHash: prevEntry.hash,\n\t\t\t\t\t\t\t\tactualHash: entry.previousHash,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tverifiedAt: Date.now(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tevents.onChainBroken?.(result);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Verify signature if signing is configured\n\t\t\t\tif (signing?.verifyFn && entry.signature) {\n\t\t\t\t\tconst signatureValid = await signing.verifyFn(entry.hash, entry.signature);\n\t\t\t\t\tif (!signatureValid) {\n\t\t\t\t\t\tchainVerified = false;\n\t\t\t\t\t\tconst result: AuditVerificationResult = {\n\t\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\t\tentriesVerified: i,\n\t\t\t\t\t\t\tbrokenAt: {\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tentryId: entry.id,\n\t\t\t\t\t\t\t\texpectedHash: \"signature-invalid\",\n\t\t\t\t\t\t\t\tactualHash: entry.signature,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tverifiedAt: Date.now(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tevents.onChainBroken?.(result);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchainVerified = true;\n\t\t\treturn {\n\t\t\t\tvalid: true,\n\t\t\t\tentriesVerified: entries.length,\n\t\t\t\tverifiedAt: Date.now(),\n\t\t\t};\n\t\t},\n\n\t\tasync export(since?: number): Promise<AuditEntry[]> {\n\t\t\tlet toExport = [...entries];\n\n\t\t\tif (since !== undefined) {\n\t\t\t\ttoExport = toExport.filter((e) => e.timestamp >= since);\n\t\t\t}\n\n\t\t\tif (exporter && toExport.length > 0) {\n\t\t\t\tawait exporter(toExport);\n\t\t\t\tentriesExported += toExport.length;\n\t\t\t}\n\n\t\t\treturn toExport;\n\t\t},\n\n\t\tprune(): number {\n\t\t\tconst cutoff = Date.now() - retentionMs;\n\t\t\tconst initialLength = entries.length;\n\n\t\t\t// Remove entries older than retention period\n\t\t\twhile (entries.length > 0 && entries[0]!.timestamp < cutoff) {\n\t\t\t\tentries.shift();\n\t\t\t\tif (lastExportIndex > 0) {\n\t\t\t\t\tlastExportIndex--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst pruned = initialLength - entries.length;\n\t\t\tentriesPruned += pruned;\n\t\t\treturn pruned;\n\t\t},\n\n\t\tgetStats(): AuditStats {\n\t\t\tconst byEventType: Partial<Record<AuditEventType, number>> = {};\n\n\t\t\tfor (const entry of entries) {\n\t\t\t\tbyEventType[entry.eventType] = (byEventType[entry.eventType] ?? 0) + 1;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttotalEntries: entries.length,\n\t\t\t\tbyEventType,\n\t\t\t\toldestEntry: entries[0]?.timestamp,\n\t\t\t\tnewestEntry: entries[entries.length - 1]?.timestamp,\n\t\t\t\tentriesPruned,\n\t\t\t\tentriesExported,\n\t\t\t\tchainIntegrity: chainVerified,\n\t\t\t};\n\t\t},\n\n\t\tasync dispose(): Promise<void> {\n\t\t\t// Clear export timer\n\t\t\tif (exportTimer) {\n\t\t\t\tclearInterval(exportTimer);\n\t\t\t\texportTimer = undefined;\n\t\t\t}\n\n\t\t\t// Flush remaining entries to exporter\n\t\t\tif (exporter) {\n\t\t\t\ttry {\n\t\t\t\t\tconst toExport = entries.slice(lastExportIndex);\n\t\t\t\t\tif (toExport.length > 0) {\n\t\t\t\t\t\tawait exporter(toExport);\n\t\t\t\t\t\tentriesExported += toExport.length;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tevents.onExportError?.(\n\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t\t\tentries.slice(lastExportIndex)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\taddEntry(eventType: AuditEventType, payload: Record<string, unknown>): Promise<AuditEntry> {\n\t\t\treturn addEntry(eventType, payload);\n\t\t},\n\n\t\tcreatePlugin<M extends ModuleSchema>(): Plugin<M> {\n\t\t\treturn {\n\t\t\t\tname: \"audit-trail\",\n\n\t\t\t\t// Fact operations\n\t\t\t\tonFactSet: (key, value, prev) => {\n\t\t\t\t\taddEntry(\"fact.set\", { key, value, prev }).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\tonFactsBatch: (changes) => {\n\t\t\t\t\taddEntry(\"fact.batch\", {\n\t\t\t\t\t\tchanges: changes.map((c) => ({\n\t\t\t\t\t\t\tkey: c.key,\n\t\t\t\t\t\t\tvalue: c.value,\n\t\t\t\t\t\t\tprev: c.prev,\n\t\t\t\t\t\t})),\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\t// Requirement lifecycle\n\t\t\t\tonRequirementCreated: (req) => {\n\t\t\t\t\taddEntry(\"requirement.created\", {\n\t\t\t\t\t\tid: req.id,\n\t\t\t\t\t\ttype: req.requirement.type,\n\t\t\t\t\t\tpayload: req.requirement,\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\tonRequirementMet: (req, byResolver) => {\n\t\t\t\t\taddEntry(\"requirement.met\", {\n\t\t\t\t\t\tid: req.id,\n\t\t\t\t\t\ttype: req.requirement.type,\n\t\t\t\t\t\tbyResolver,\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\t// Resolver operations\n\t\t\t\tonResolverStart: (resolver, req) => {\n\t\t\t\t\taddEntry(\"resolver.start\", {\n\t\t\t\t\t\tresolver,\n\t\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\t\trequirementType: req.requirement.type,\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\tonResolverComplete: (resolver, req, duration) => {\n\t\t\t\t\taddEntry(\"resolver.complete\", {\n\t\t\t\t\t\tresolver,\n\t\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\t\trequirementType: req.requirement.type,\n\t\t\t\t\t\tduration,\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\tonResolverError: (resolver, req, error) => {\n\t\t\t\t\taddEntry(\"resolver.error\", {\n\t\t\t\t\t\tresolver,\n\t\t\t\t\t\trequirementId: req.id,\n\t\t\t\t\t\trequirementType: req.requirement.type,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\t// Error handling\n\t\t\t\tonError: (error) => {\n\t\t\t\t\taddEntry(\"error.occurred\", {\n\t\t\t\t\t\tsource: error.source,\n\t\t\t\t\t\tsourceId: error.sourceId,\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tcontext: error.context,\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\n\t\t\t\tonErrorRecovery: (error, strategy) => {\n\t\t\t\t\taddEntry(\"error.recovery\", {\n\t\t\t\t\t\tsource: error.source,\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tstrategy,\n\t\t\t\t\t}).catch(console.error);\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Agent Orchestrator Integration\n// ============================================================================\n\n/**\n * Create audit event handlers for agent orchestrator integration.\n * Use this to audit agent operations when using the agent orchestrator.\n *\n * @example\n * ```typescript\n * const audit = createAuditTrail({ ... });\n * const handlers = createAgentAuditHandlers(audit);\n *\n * // Use in orchestrator callbacks\n * orchestrator.run(agent, input, {\n * onStart: handlers.onAgentStart,\n * onComplete: handlers.onAgentComplete,\n * // ...\n * });\n * ```\n */\nexport function createAgentAuditHandlers(audit: AuditInstance) {\n\treturn {\n\t\tonAgentStart: (agentName: string, input: string) => {\n\t\t\taudit.addEntry(\"agent.run.start\", { agentName, input });\n\t\t},\n\n\t\tonAgentComplete: (agentName: string, output: unknown, tokens: number, cost: number) => {\n\t\t\taudit.addEntry(\"agent.run.complete\", { agentName, output, tokens, cost });\n\t\t},\n\n\t\tonAgentError: (agentName: string, error: Error) => {\n\t\t\taudit.addEntry(\"agent.run.error\", { agentName, error: error.message, stack: error.stack });\n\t\t},\n\n\t\tonToolStart: (toolName: string, toolCallId: string, args: unknown) => {\n\t\t\taudit.addEntry(\"tool.call.start\", { toolName, toolCallId, args });\n\t\t},\n\n\t\tonToolComplete: (toolName: string, toolCallId: string, result: unknown) => {\n\t\t\taudit.addEntry(\"tool.call.complete\", { toolName, toolCallId, result });\n\t\t},\n\n\t\tonToolError: (toolName: string, toolCallId: string, error: Error) => {\n\t\t\taudit.addEntry(\"tool.call.error\", { toolName, toolCallId, error: error.message });\n\t\t},\n\n\t\tonApprovalRequested: (toolName: string, toolCallId: string, args: unknown) => {\n\t\t\taudit.addEntry(\"approval.requested\", { toolName, toolCallId, args });\n\t\t},\n\n\t\tonApprovalGranted: (toolName: string, toolCallId: string) => {\n\t\t\taudit.addEntry(\"approval.granted\", { toolName, toolCallId });\n\t\t},\n\n\t\tonApprovalDenied: (toolName: string, toolCallId: string, reason?: string) => {\n\t\t\taudit.addEntry(\"approval.denied\", { toolName, toolCallId, reason });\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n\tcreateAuditTrail as create,\n\tcreateAgentAuditHandlers as createHandlers,\n};\n","/**\n * Prompt Injection Detection Guardrail\n *\n * Detects and blocks prompt injection attacks including:\n * - Direct injection attempts (\"ignore previous instructions\")\n * - Jailbreak patterns (\"DAN mode\", \"pretend you can\")\n * - Indirect injection via external content\n * - Encoding-based evasion attempts\n *\n * @example\n * ```typescript\n * import { createPromptInjectionGuardrail } from '@directive-run/ai';\n *\n * const guardrail = createPromptInjectionGuardrail({\n * strictMode: true,\n * onBlocked: (input, patterns) => logSecurityEvent(input, patterns),\n * });\n * ```\n */\n\nimport type { GuardrailFn, InputGuardrailData, GuardrailResult } from \"../index.js\";\n\n// ============================================================================\n// Pattern Categories\n// ============================================================================\n\n/** Pattern with metadata for better debugging */\nexport interface InjectionPattern {\n pattern: RegExp;\n name: string;\n severity: \"low\" | \"medium\" | \"high\" | \"critical\";\n category: InjectionCategory;\n}\n\n/** Categories of injection attacks */\nexport type InjectionCategory =\n | \"instruction_override\" // \"ignore previous instructions\"\n | \"jailbreak\" // \"DAN mode\", \"pretend you can\"\n | \"role_manipulation\" // \"you are now\", \"act as\"\n | \"encoding_evasion\" // base64, rot13, unicode tricks\n | \"delimiter_injection\" // XML/JSON injection, markdown escape\n | \"context_manipulation\" // \"system:\", \"assistant:\", fake messages\n | \"indirect_injection\"; // URL loading, file inclusion\n\n// ============================================================================\n// Built-in Patterns\n// ============================================================================\n\n/** Default injection patterns - well-tested and low false-positive rate */\nexport const DEFAULT_INJECTION_PATTERNS: InjectionPattern[] = [\n // Instruction override patterns\n {\n pattern: /ignore\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?|rules?|guidelines?)/i,\n name: \"ignore-previous\",\n severity: \"critical\",\n category: \"instruction_override\",\n },\n {\n pattern: /disregard\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?)/i,\n name: \"disregard-previous\",\n severity: \"critical\",\n category: \"instruction_override\",\n },\n {\n pattern: /forget\\s+(all\\s+)?(previous|prior|above|earlier)\\s+(instructions?|prompts?)/i,\n name: \"forget-previous\",\n severity: \"critical\",\n category: \"instruction_override\",\n },\n {\n pattern: /override\\s+(the\\s+)?(system|base)\\s+(prompt|instructions?)/i,\n name: \"override-system\",\n severity: \"critical\",\n category: \"instruction_override\",\n },\n\n // Jailbreak patterns\n {\n pattern: /\\bDAN\\s+(mode|jailbreak)\\b/i,\n name: \"dan-mode\",\n severity: \"critical\",\n category: \"jailbreak\",\n },\n {\n pattern: /\\bjailbreak(ed)?\\s*(mode)?\\b/i,\n name: \"jailbreak-keyword\",\n severity: \"high\",\n category: \"jailbreak\",\n },\n {\n pattern: /developer\\s+mode\\s+(enabled|activated|on)/i,\n name: \"developer-mode\",\n severity: \"critical\",\n category: \"jailbreak\",\n },\n {\n pattern: /pretend\\s+(you\\s+)?(are|can|have)\\s+(no\\s+)?(restrictions?|limits?|boundaries?|ethics)/i,\n name: \"pretend-no-restrictions\",\n severity: \"high\",\n category: \"jailbreak\",\n },\n {\n pattern: /you\\s+(now\\s+)?have\\s+no\\s+(ethical\\s+)?(restrictions?|guidelines?|boundaries?)/i,\n name: \"no-restrictions\",\n severity: \"high\",\n category: \"jailbreak\",\n },\n\n // Role manipulation\n {\n pattern: /you\\s+are\\s+now\\s+(a|an)\\s+\\w+\\s+(that|who)\\s+(can|will|must)/i,\n name: \"role-assignment\",\n severity: \"medium\",\n category: \"role_manipulation\",\n },\n {\n pattern: /from\\s+now\\s+on,?\\s+(you\\s+)?(will|must|should)\\s+(only\\s+)?/i,\n name: \"from-now-on\",\n severity: \"medium\",\n category: \"role_manipulation\",\n },\n\n // Context manipulation (fake message markers)\n {\n pattern: /^(system|assistant|user):\\s*/im,\n name: \"fake-role-marker\",\n severity: \"high\",\n category: \"context_manipulation\",\n },\n {\n pattern: /<\\|?(system|endofprompt|im_start|im_end)\\|?>/i,\n name: \"special-token-injection\",\n severity: \"critical\",\n category: \"context_manipulation\",\n },\n\n // Delimiter injection\n {\n pattern: /```(system|assistant|instructions?)\\n/i,\n name: \"markdown-code-injection\",\n severity: \"medium\",\n category: \"delimiter_injection\",\n },\n {\n pattern: /<system>|<\\/system>|<instructions?>|<\\/instructions?>/i,\n name: \"xml-tag-injection\",\n severity: \"high\",\n category: \"delimiter_injection\",\n },\n\n // Indirect injection indicators\n {\n pattern: /fetch\\s+(content\\s+)?(from|at)\\s+(the\\s+)?url/i,\n name: \"url-fetch-instruction\",\n severity: \"medium\",\n category: \"indirect_injection\",\n },\n {\n pattern: /execute\\s+(the\\s+)?(code|script|command)\\s+(from|in|at)/i,\n name: \"execute-from-source\",\n severity: \"high\",\n category: \"indirect_injection\",\n },\n];\n\n/** Strict patterns - more aggressive, may have higher false positives */\nexport const STRICT_INJECTION_PATTERNS: InjectionPattern[] = [\n ...DEFAULT_INJECTION_PATTERNS,\n\n // Additional strict patterns\n {\n pattern: /act\\s+as\\s+(if\\s+)?(you\\s+)?(were|are|can)/i,\n name: \"act-as\",\n severity: \"low\",\n category: \"role_manipulation\",\n },\n {\n pattern: /new\\s+instructions?:/i,\n name: \"new-instructions\",\n severity: \"medium\",\n category: \"instruction_override\",\n },\n {\n pattern: /\\[system\\]|\\[admin\\]|\\[developer\\]/i,\n name: \"bracket-role-marker\",\n severity: \"medium\",\n category: \"context_manipulation\",\n },\n {\n pattern: /base64|rot13|decode\\s+(this|the)/i,\n name: \"encoding-reference\",\n severity: \"low\",\n category: \"encoding_evasion\",\n },\n {\n pattern: /\\u200b|\\u200c|\\u200d|\\u2060|\\ufeff/,\n name: \"zero-width-chars\",\n severity: \"medium\",\n category: \"encoding_evasion\",\n },\n];\n\n// ============================================================================\n// Detection Result Types\n// ============================================================================\n\n/** Detailed detection result */\nexport interface InjectionDetectionResult {\n detected: boolean;\n patterns: Array<{\n name: string;\n category: InjectionCategory;\n severity: InjectionPattern[\"severity\"];\n match: string;\n position: number;\n }>;\n riskScore: number; // 0-100\n sanitizedInput?: string;\n}\n\n// ============================================================================\n// Core Detection Function\n// ============================================================================\n\n/** Maximum input length for injection detection (100KB) */\nconst MAX_INJECTION_INPUT_LENGTH = 100_000;\n\n/**\n * Detect prompt injection patterns in text.\n * Returns detailed results about what was detected.\n *\n * @throws Error if input exceeds MAX_INJECTION_INPUT_LENGTH (100KB)\n */\nexport function detectPromptInjection(\n text: string,\n patterns: InjectionPattern[] = DEFAULT_INJECTION_PATTERNS\n): InjectionDetectionResult {\n // Security: Prevent DoS via extremely large inputs\n if (text.length > MAX_INJECTION_INPUT_LENGTH) {\n throw new Error(\n `[Directive] Input exceeds maximum length of ${MAX_INJECTION_INPUT_LENGTH} characters for injection detection. ` +\n `Truncate input or process in chunks.`\n );\n }\n\n const matches: InjectionDetectionResult[\"patterns\"] = [];\n\n for (const { pattern, name, severity, category } of patterns) {\n // Reset regex state\n const regex = new RegExp(pattern.source, pattern.flags);\n const match = regex.exec(text);\n\n if (match) {\n matches.push({\n name,\n category,\n severity,\n match: match[0],\n position: match.index,\n });\n }\n }\n\n // Calculate risk score based on severity and number of matches\n const severityScores = {\n low: 10,\n medium: 25,\n high: 50,\n critical: 100,\n };\n\n const totalScore = matches.reduce((sum, m) => sum + severityScores[m.severity], 0);\n const riskScore = Math.min(100, totalScore);\n\n return {\n detected: matches.length > 0,\n patterns: matches,\n riskScore,\n };\n}\n\n/**\n * Sanitize text by removing detected injection patterns.\n * Warning: This is a best-effort sanitization, not a security guarantee.\n *\n * Uses a single-pass approach to prevent infinite loops where a replacement\n * could create a new pattern match.\n */\nexport function sanitizeInjection(\n text: string,\n patterns: InjectionPattern[] = DEFAULT_INJECTION_PATTERNS\n): string {\n // Remove zero-width characters first (always safe)\n let sanitized = text.replace(/[\\u200b\\u200c\\u200d\\u2060\\ufeff]/g, \"\");\n\n // Build a combined regex for single-pass replacement to prevent\n // infinite loops where \"[REDACTED]\" could match another pattern\n const allPatterns = patterns.map((p) => `(${p.pattern.source})`);\n if (allPatterns.length === 0) return sanitized;\n\n // Combine all patterns with alternation, using the most permissive flags\n const hasGlobal = patterns.some((p) => p.pattern.flags.includes(\"g\"));\n const hasIgnoreCase = patterns.some((p) => p.pattern.flags.includes(\"i\"));\n const hasMultiline = patterns.some((p) => p.pattern.flags.includes(\"m\"));\n\n const flags = `${hasGlobal ? \"g\" : \"\"}${hasIgnoreCase ? \"i\" : \"\"}${hasMultiline ? \"m\" : \"\"}`;\n const combinedRegex = new RegExp(allPatterns.join(\"|\"), flags || \"gi\");\n\n // Single-pass replacement prevents cascade issues\n sanitized = sanitized.replace(combinedRegex, \"[REDACTED]\");\n\n return sanitized;\n}\n\n// ============================================================================\n// Guardrail Factory\n// ============================================================================\n\n/** Options for prompt injection guardrail */\nexport interface PromptInjectionGuardrailOptions {\n /** Additional patterns to check (added to defaults) */\n additionalPatterns?: InjectionPattern[];\n /** Replace default patterns entirely */\n replacePatterns?: InjectionPattern[];\n /** Use strict mode with more aggressive detection */\n strictMode?: boolean;\n /** Minimum risk score to block (0-100, default: 50) */\n blockThreshold?: number;\n /** Attempt to sanitize instead of blocking */\n sanitize?: boolean;\n /** Callback when injection is detected */\n onBlocked?: (input: string, result: InjectionDetectionResult) => void;\n /** Categories to ignore (e.g., allow 'role_manipulation' for roleplay apps) */\n ignoreCategories?: InjectionCategory[];\n}\n\n/**\n * Create a prompt injection detection guardrail.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const guardrail = createPromptInjectionGuardrail();\n *\n * // Strict mode for high-security applications\n * const strictGuardrail = createPromptInjectionGuardrail({\n * strictMode: true,\n * blockThreshold: 25,\n * });\n *\n * // Allow role manipulation for roleplay apps\n * const roleplayGuardrail = createPromptInjectionGuardrail({\n * ignoreCategories: ['role_manipulation'],\n * });\n * ```\n */\nexport function createPromptInjectionGuardrail(\n options: PromptInjectionGuardrailOptions = {}\n): GuardrailFn<InputGuardrailData> {\n const {\n additionalPatterns = [],\n replacePatterns,\n strictMode = false,\n blockThreshold = 50,\n sanitize = false,\n onBlocked,\n ignoreCategories = [],\n } = options;\n\n // Build pattern list\n let patterns: InjectionPattern[];\n if (replacePatterns) {\n patterns = replacePatterns;\n } else {\n patterns = strictMode ? [...STRICT_INJECTION_PATTERNS] : [...DEFAULT_INJECTION_PATTERNS];\n }\n patterns = [...patterns, ...additionalPatterns];\n\n // Filter out ignored categories\n if (ignoreCategories.length > 0) {\n const ignoredSet = new Set(ignoreCategories);\n patterns = patterns.filter((p) => !ignoredSet.has(p.category));\n }\n\n return (data): GuardrailResult => {\n const result = detectPromptInjection(data.input, patterns);\n\n if (result.detected && result.riskScore >= blockThreshold) {\n onBlocked?.(data.input, result);\n\n if (sanitize) {\n const sanitized = sanitizeInjection(data.input, patterns);\n return {\n passed: true,\n transformed: sanitized,\n };\n }\n\n const topPatterns = result.patterns\n .sort((a, b) => {\n const order = { critical: 0, high: 1, medium: 2, low: 3 };\n return order[a.severity] - order[b.severity];\n })\n .slice(0, 3)\n .map((p) => p.name)\n .join(\", \");\n\n return {\n passed: false,\n reason: `Prompt injection detected (risk: ${result.riskScore}%, patterns: ${topPatterns})`,\n };\n }\n\n return { passed: true };\n };\n}\n\n// ============================================================================\n// Indirect Injection Defense\n// ============================================================================\n\n/**\n * Mark content as potentially untrusted (from external sources).\n * This wraps the content with markers that injection detection will scrutinize more closely.\n *\n * @example\n * ```typescript\n * const userUpload = await readFile(path);\n * const markedContent = markUntrustedContent(userUpload, 'user-upload');\n * const prompt = `Summarize this document: ${markedContent}`;\n * ```\n */\nexport function markUntrustedContent(content: string, source: string): string {\n // Use a delimiter that's unlikely to appear in normal content\n // and that injection patterns will trigger on\n return `[UNTRUSTED_CONTENT source=\"${source}\"]\\n${content}\\n[/UNTRUSTED_CONTENT]`;\n}\n\n/**\n * Create a guardrail that applies stricter checks to marked untrusted content.\n *\n * @example\n * ```typescript\n * const guardrail = createUntrustedContentGuardrail({\n * baseGuardrail: createPromptInjectionGuardrail({ strictMode: true }),\n * });\n * ```\n */\nexport function createUntrustedContentGuardrail(options: {\n /** Guardrail to apply to untrusted sections */\n baseGuardrail?: GuardrailFn<InputGuardrailData>;\n /** Block if untrusted content contains these patterns */\n additionalPatterns?: InjectionPattern[];\n}): GuardrailFn<InputGuardrailData> {\n const {\n baseGuardrail = createPromptInjectionGuardrail({ strictMode: true, blockThreshold: 25 }),\n additionalPatterns = [],\n } = options;\n\n const untrustedMarkerRegex = /\\[UNTRUSTED_CONTENT source=\"([^\"]+)\"\\]([\\s\\S]*?)\\[\\/UNTRUSTED_CONTENT\\]/g;\n\n return async (data, context): Promise<GuardrailResult> => {\n // First, check the entire input\n const fullResult = await baseGuardrail(data, context);\n if (!fullResult.passed) {\n return fullResult;\n }\n\n // Then, apply additional scrutiny to untrusted sections\n const matches = data.input.matchAll(untrustedMarkerRegex);\n for (const match of matches) {\n const [, source, content] = match;\n\n // Skip if content is undefined\n if (!content) continue;\n\n // Check with stricter patterns\n const strictResult = detectPromptInjection(content, [\n ...STRICT_INJECTION_PATTERNS,\n ...additionalPatterns,\n ]);\n\n if (strictResult.detected && strictResult.riskScore >= 25) {\n return {\n passed: false,\n reason: `Untrusted content from \"${source}\" contains potential injection (risk: ${strictResult.riskScore}%)`,\n };\n }\n }\n\n return { passed: true };\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n detectPromptInjection as detect,\n sanitizeInjection as sanitize,\n createPromptInjectionGuardrail as create,\n};\n","/**\n * Compliance Plugin - GDPR/CCPA Data Subject Rights\n *\n * Provides enterprise-grade compliance features:\n * - Data Export (DSR) - Export all data for a subject\n * - Data Deletion - Soft/hard delete with certificates\n * - Consent Tracking - Track and enforce consent\n * - Retention Policies - Automatic data retention enforcement\n *\n * @example\n * ```typescript\n * import { createCompliance } from '@directive-run/ai';\n *\n * const compliance = createCompliance({\n * storage: myStorageAdapter,\n * retention: {\n * defaultRetentionMs: 365 * 24 * 60 * 60 * 1000, // 1 year\n * categoryRetention: {\n * audit: 7 * 365 * 24 * 60 * 60 * 1000, // 7 years for audit\n * sessions: 30 * 24 * 60 * 60 * 1000, // 30 days for sessions\n * },\n * },\n * });\n *\n * // Handle data subject request\n * const exportResult = await compliance.exportData({\n * subjectId: 'user-123',\n * format: 'json',\n * includeAudit: true,\n * });\n *\n * // Delete user data\n * const deleteResult = await compliance.deleteData({\n * subjectId: 'user-123',\n * scope: 'all',\n * });\n * ```\n */\n\nimport type { GuardrailFn, InputGuardrailData, GuardrailResult } from \"../index.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Data export request (GDPR Article 20) */\nexport interface DataExportRequest {\n\t/** Subject identifier (user ID) */\n\tsubjectId: string;\n\t/** Export format */\n\tformat: \"json\" | \"csv\";\n\t/** Include audit trail entries */\n\tincludeAudit?: boolean;\n\t/** Include derived data */\n\tincludeDerived?: boolean;\n\t/** Specific data categories to export */\n\tcategories?: string[];\n\t/** Request metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/** Result of data export */\nexport interface DataExportResult {\n\t/** Whether export was successful */\n\tsuccess: boolean;\n\t/** Subject identifier */\n\tsubjectId: string;\n\t/** Export format used */\n\tformat: \"json\" | \"csv\";\n\t/** Exported data */\n\tdata: string;\n\t/** Data categories included */\n\tcategories: string[];\n\t/** Number of records exported */\n\trecordCount: number;\n\t/** SHA-256 checksum of exported data */\n\tchecksum: string;\n\t/** Export timestamp */\n\texportedAt: number;\n\t/** Expiration timestamp for download link (if applicable) */\n\texpiresAt?: number;\n\t/** Error message if failed */\n\terror?: string;\n}\n\n/** Data deletion scope */\nexport type DeletionScope = \"all\" | \"facts\" | \"audit\" | \"specific\";\n\n/** Data deletion request (GDPR Article 17) */\nexport interface DataDeletionRequest {\n\t/** Subject identifier (user ID) */\n\tsubjectId: string;\n\t/** Scope of deletion */\n\tscope: DeletionScope;\n\t/** Anonymize instead of delete (retain structure, remove PII) */\n\tanonymize?: boolean;\n\t/** Specific data categories to delete (when scope is 'specific') */\n\tcategories?: string[];\n\t/** Reason for deletion */\n\treason?: string;\n\t/** Request metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/** Result of data deletion */\nexport interface DataDeletionResult {\n\t/** Whether deletion was successful */\n\tsuccess: boolean;\n\t/** Subject identifier */\n\tsubjectId: string;\n\t/** Scope of deletion performed */\n\tscope: DeletionScope;\n\t/** Whether data was anonymized vs deleted */\n\tanonymized: boolean;\n\t/** Number of records deleted/anonymized */\n\trecordsAffected: number;\n\t/** Data categories affected */\n\tcategoriesAffected: string[];\n\t/** Deletion certificate (for compliance records) */\n\tcertificate: DeletionCertificate;\n\t/** Deletion timestamp */\n\tdeletedAt: number;\n\t/** Error message if failed */\n\terror?: string;\n}\n\n/** Deletion certificate for compliance records */\nexport interface DeletionCertificate {\n\t/** Certificate ID */\n\tid: string;\n\t/** Subject identifier */\n\tsubjectId: string;\n\t/** Type of deletion */\n\ttype: \"soft\" | \"hard\" | \"anonymization\";\n\t/** Scope of deletion */\n\tscope: DeletionScope;\n\t/** Categories deleted */\n\tcategories: string[];\n\t/** Record count */\n\trecordCount: number;\n\t/** Deletion timestamp */\n\tdeletedAt: number;\n\t/** Reason for deletion */\n\treason?: string;\n\t/** SHA-256 hash of certificate content */\n\thash: string;\n}\n\n/** Consent record for a subject */\nexport interface ConsentRecord {\n\t/** Subject identifier */\n\tsubjectId: string;\n\t/** Consent purpose (e.g., 'marketing', 'analytics', 'personalization') */\n\tpurpose: string;\n\t/** Whether consent is granted */\n\tgranted: boolean;\n\t/** When consent was granted (if granted) */\n\tgrantedAt?: number;\n\t/** When consent expires (if applicable) */\n\texpiresAt?: number;\n\t/** When consent was revoked (if revoked) */\n\trevokedAt?: number;\n\t/** Source of consent (e.g., 'signup_form', 'settings_page') */\n\tsource?: string;\n\t/** Consent version/hash (for tracking which T&C version was accepted) */\n\tversion?: string;\n}\n\n/** Consent tracker interface */\nexport interface ConsentTracker {\n\t/** Record consent grant */\n\tgrant(subjectId: string, purpose: string, options?: {\n\t\texpiresAt?: number;\n\t\tsource?: string;\n\t\tversion?: string;\n\t}): Promise<ConsentRecord>;\n\t/** Revoke consent */\n\trevoke(subjectId: string, purpose: string): Promise<ConsentRecord | null>;\n\t/** Check if consent is granted */\n\tcheck(subjectId: string, purpose: string): Promise<boolean>;\n\t/** Get all consents for a subject */\n\tgetForSubject(subjectId: string): Promise<ConsentRecord[]>;\n\t/** Get all subjects with consent for a purpose */\n\tgetForPurpose(purpose: string): Promise<ConsentRecord[]>;\n}\n\n/** Retention policy */\nexport interface RetentionPolicy {\n\t/** Policy name */\n\tname: string;\n\t/** Default retention period in milliseconds */\n\tdefaultRetentionMs: number;\n\t/** Category-specific retention periods */\n\tcategoryRetention?: Record<string, number>;\n\t/** Callback before data is deleted */\n\tonBeforeDelete?: (data: { category: string; count: number }) => Promise<void>;\n\t/** Callback after data is deleted */\n\tonAfterDelete?: (data: { category: string; count: number }) => void;\n}\n\n/** Storage adapter for compliance data */\nexport interface ComplianceStorage {\n\t/** Get all data for a subject */\n\tgetSubjectData(subjectId: string, categories?: string[]): Promise<{\n\t\tcategory: string;\n\t\trecords: Array<{ id: string; data: Record<string, unknown>; createdAt: number }>;\n\t}[]>;\n\t/** Delete data for a subject */\n\tdeleteSubjectData(subjectId: string, categories?: string[]): Promise<number>;\n\t/** Anonymize data for a subject */\n\tanonymizeSubjectData(subjectId: string, categories?: string[]): Promise<number>;\n\t/** Get audit entries for a subject */\n\tgetAuditEntries?(subjectId: string): Promise<Array<{\n\t\tid: string;\n\t\ttimestamp: number;\n\t\teventType: string;\n\t\tpayload: Record<string, unknown>;\n\t}>>;\n\t/** Get data older than timestamp by category */\n\tgetExpiredData(category: string, olderThan: number): Promise<Array<{ id: string; createdAt: number }>>;\n\t/** Delete records by IDs */\n\tdeleteByIds(ids: string[]): Promise<number>;\n\t/** Store consent record */\n\tstoreConsent(record: ConsentRecord): Promise<void>;\n\t/** Get consent record */\n\tgetConsent(subjectId: string, purpose: string): Promise<ConsentRecord | null>;\n\t/** Get consents by subject */\n\tgetConsentsBySubject(subjectId: string): Promise<ConsentRecord[]>;\n\t/** Get consents by purpose */\n\tgetConsentsByPurpose(purpose: string): Promise<ConsentRecord[]>;\n\t/** Store deletion certificate */\n\tstoreDeletionCertificate(certificate: DeletionCertificate): Promise<void>;\n}\n\n/** Compliance configuration */\nexport interface ComplianceConfig {\n\t/** Storage adapter */\n\tstorage: ComplianceStorage;\n\t/** Retention policy */\n\tretention?: RetentionPolicy;\n\t/** Consent purposes to track */\n\tconsentPurposes?: string[];\n\t/** Export link expiration (default: 24 hours) */\n\texportExpirationMs?: number;\n\t/** Audit all compliance operations */\n\tauditOperations?: boolean;\n\t/** Event callbacks */\n\tevents?: {\n\t\tonExport?: (result: DataExportResult) => void;\n\t\tonDelete?: (result: DataDeletionResult) => void;\n\t\tonConsentChange?: (record: ConsentRecord) => void;\n\t\tonRetentionEnforced?: (category: string, count: number) => void;\n\t};\n}\n\n/** Compliance instance */\nexport interface ComplianceInstance {\n\t/** Export data for a subject (GDPR Article 20) */\n\texportData(request: DataExportRequest): Promise<DataExportResult>;\n\t/** Delete data for a subject (GDPR Article 17) */\n\tdeleteData(request: DataDeletionRequest): Promise<DataDeletionResult>;\n\t/** Consent tracker */\n\tconsent: ConsentTracker;\n\t/** Enforce retention policy */\n\tenforceRetention(): Promise<number>;\n\t/** Create a guardrail that checks consent before processing */\n\tcreateConsentGuardrail(purpose: string): GuardrailFn<InputGuardrailData>;\n\t/** Get deletion certificate by ID */\n\tgetDeletionCertificate(subjectId: string): Promise<DeletionCertificate | null>;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default export link expiration (24 hours) */\nconst DEFAULT_EXPORT_EXPIRATION_MS = 24 * 60 * 60 * 1000;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/** Generate a unique ID */\nfunction generateId(): string {\n\treturn globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/** Convert string to Uint8Array */\nfunction stringToBytes(str: string): Uint8Array {\n\treturn new TextEncoder().encode(str);\n}\n\n/** Convert Uint8Array to hex string */\nfunction bytesToHex(bytes: Uint8Array): string {\n\treturn Array.from(bytes)\n\t\t.map((b) => b.toString(16).padStart(2, \"0\"))\n\t\t.join(\"\");\n}\n\n/** Calculate SHA-256 hash of content */\nasync function sha256(content: string): Promise<string> {\n\tconst bytes = stringToBytes(content);\n\tconst hashBuffer = await globalThis.crypto.subtle.digest(\n\t\t\"SHA-256\",\n\t\tbytes as unknown as ArrayBuffer\n\t);\n\treturn bytesToHex(new Uint8Array(hashBuffer));\n}\n\n/** Convert data to CSV format */\nfunction toCSV(data: Array<Record<string, unknown>>): string {\n\tif (data.length === 0) return \"\";\n\n\t// Get all unique keys\n\tconst keys = new Set<string>();\n\tfor (const record of data) {\n\t\tfor (const key of Object.keys(record)) {\n\t\t\tkeys.add(key);\n\t\t}\n\t}\n\n\tconst headers = Array.from(keys);\n\n\t// Build CSV\n\tconst lines: string[] = [headers.join(\",\")];\n\n\tfor (const record of data) {\n\t\tconst values = headers.map((key) => {\n\t\t\tconst value = record[key];\n\t\t\tif (value === null || value === undefined) return \"\";\n\t\t\tif (typeof value === \"object\") return JSON.stringify(value).replace(/\"/g, '\"\"');\n\t\t\tconst str = String(value);\n\t\t\t// Escape quotes and wrap in quotes if contains comma or newline\n\t\t\tif (str.includes(\",\") || str.includes(\"\\n\") || str.includes('\"')) {\n\t\t\t\treturn `\"${str.replace(/\"/g, '\"\"')}\"`;\n\t\t\t}\n\t\t\treturn str;\n\t\t});\n\t\tlines.push(values.join(\",\"));\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n// ============================================================================\n// In-Memory Storage (for testing/development)\n// ============================================================================\n\n/** Create an in-memory compliance storage adapter */\nexport function createInMemoryComplianceStorage(): ComplianceStorage {\n\tconst data = new Map<string, Map<string, Array<{\n\t\tid: string;\n\t\tdata: Record<string, unknown>;\n\t\tcreatedAt: number;\n\t}>>>();\n\tconst consents = new Map<string, ConsentRecord>();\n\tconst certificates = new Map<string, DeletionCertificate>();\n\n\treturn {\n\t\tasync getSubjectData(subjectId, categories) {\n\t\t\tconst result: Array<{\n\t\t\t\tcategory: string;\n\t\t\t\trecords: Array<{ id: string; data: Record<string, unknown>; createdAt: number }>;\n\t\t\t}> = [];\n\n\t\t\tfor (const [category, subjectMap] of data) {\n\t\t\t\tif (categories && !categories.includes(category)) continue;\n\n\t\t\t\tconst records = subjectMap.get(subjectId);\n\t\t\t\tif (records && records.length > 0) {\n\t\t\t\t\tresult.push({ category, records: [...records] });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\tasync deleteSubjectData(subjectId, categories) {\n\t\t\tlet count = 0;\n\n\t\t\tfor (const [category, subjectMap] of data) {\n\t\t\t\tif (categories && !categories.includes(category)) continue;\n\n\t\t\t\tconst records = subjectMap.get(subjectId);\n\t\t\t\tif (records) {\n\t\t\t\t\tcount += records.length;\n\t\t\t\t\tsubjectMap.delete(subjectId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn count;\n\t\t},\n\n\t\tasync anonymizeSubjectData(subjectId, categories) {\n\t\t\tlet count = 0;\n\n\t\t\tfor (const [category, subjectMap] of data) {\n\t\t\t\tif (categories && !categories.includes(category)) continue;\n\n\t\t\t\tconst records = subjectMap.get(subjectId);\n\t\t\t\tif (records) {\n\t\t\t\t\tfor (const record of records) {\n\t\t\t\t\t\t// Replace PII with anonymized values\n\t\t\t\t\t\trecord.data = {\n\t\t\t\t\t\t\t...record.data,\n\t\t\t\t\t\t\t_anonymized: true,\n\t\t\t\t\t\t\t_anonymizedAt: Date.now(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn count;\n\t\t},\n\n\t\tasync getExpiredData(category, olderThan) {\n\t\t\tconst result: Array<{ id: string; createdAt: number }> = [];\n\t\t\tconst categoryData = data.get(category);\n\n\t\t\tif (categoryData) {\n\t\t\t\tfor (const records of categoryData.values()) {\n\t\t\t\t\tfor (const record of records) {\n\t\t\t\t\t\tif (record.createdAt < olderThan) {\n\t\t\t\t\t\t\tresult.push({ id: record.id, createdAt: record.createdAt });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\tasync deleteByIds(ids) {\n\t\t\tconst idSet = new Set(ids);\n\t\t\tlet count = 0;\n\n\t\t\tfor (const categoryData of data.values()) {\n\t\t\t\tfor (const [subjectId, records] of categoryData) {\n\t\t\t\t\tconst filtered = records.filter((r) => !idSet.has(r.id));\n\t\t\t\t\tif (filtered.length !== records.length) {\n\t\t\t\t\t\tcount += records.length - filtered.length;\n\t\t\t\t\t\tif (filtered.length === 0) {\n\t\t\t\t\t\t\tcategoryData.delete(subjectId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcategoryData.set(subjectId, filtered);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn count;\n\t\t},\n\n\t\tasync storeConsent(record) {\n\t\t\tconsents.set(`${record.subjectId}:${record.purpose}`, record);\n\t\t},\n\n\t\tasync getConsent(subjectId, purpose) {\n\t\t\treturn consents.get(`${subjectId}:${purpose}`) ?? null;\n\t\t},\n\n\t\tasync getConsentsBySubject(subjectId) {\n\t\t\tconst result: ConsentRecord[] = [];\n\t\t\tfor (const [key, record] of consents) {\n\t\t\t\tif (key.startsWith(`${subjectId}:`)) {\n\t\t\t\t\tresult.push(record);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\tasync getConsentsByPurpose(purpose) {\n\t\t\tconst result: ConsentRecord[] = [];\n\t\t\tfor (const [key, record] of consents) {\n\t\t\t\tif (key.endsWith(`:${purpose}`)) {\n\t\t\t\t\tresult.push(record);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\tasync storeDeletionCertificate(certificate) {\n\t\t\tcertificates.set(certificate.subjectId, certificate);\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a compliance instance for GDPR/CCPA data subject rights.\n *\n * Features:\n * - Data Export (GDPR Article 20) - Portable data export\n * - Data Deletion (GDPR Article 17) - Right to erasure\n * - Consent Tracking - Track and verify consent\n * - Retention Policies - Automatic data retention\n *\n * @example\n * ```typescript\n * const compliance = createCompliance({\n * storage: myStorageAdapter,\n * retention: {\n * name: 'default',\n * defaultRetentionMs: 365 * 24 * 60 * 60 * 1000, // 1 year\n * categoryRetention: {\n * audit: 7 * 365 * 24 * 60 * 60 * 1000, // 7 years\n * },\n * },\n * consentPurposes: ['marketing', 'analytics', 'personalization'],\n * });\n *\n * // Export user data\n * const exportResult = await compliance.exportData({\n * subjectId: 'user-123',\n * format: 'json',\n * });\n *\n * // Check consent\n * const hasConsent = await compliance.consent.check('user-123', 'marketing');\n * ```\n */\nexport function createCompliance(config: ComplianceConfig): ComplianceInstance {\n\tconst {\n\t\tstorage,\n\t\tretention,\n\t\texportExpirationMs = DEFAULT_EXPORT_EXPIRATION_MS,\n\t\tevents = {},\n\t} = config;\n\n\t// Consent tracker implementation\n\tconst consent: ConsentTracker = {\n\t\tasync grant(subjectId, purpose, options = {}) {\n\t\t\tconst record: ConsentRecord = {\n\t\t\t\tsubjectId,\n\t\t\t\tpurpose,\n\t\t\t\tgranted: true,\n\t\t\t\tgrantedAt: Date.now(),\n\t\t\t\texpiresAt: options.expiresAt,\n\t\t\t\tsource: options.source,\n\t\t\t\tversion: options.version,\n\t\t\t};\n\n\t\t\tawait storage.storeConsent(record);\n\t\t\tevents.onConsentChange?.(record);\n\n\t\t\treturn record;\n\t\t},\n\n\t\tasync revoke(subjectId, purpose) {\n\t\t\tconst existing = await storage.getConsent(subjectId, purpose);\n\t\t\tif (!existing) return null;\n\n\t\t\tconst record: ConsentRecord = {\n\t\t\t\t...existing,\n\t\t\t\tgranted: false,\n\t\t\t\trevokedAt: Date.now(),\n\t\t\t};\n\n\t\t\tawait storage.storeConsent(record);\n\t\t\tevents.onConsentChange?.(record);\n\n\t\t\treturn record;\n\t\t},\n\n\t\tasync check(subjectId, purpose) {\n\t\t\tconst record = await storage.getConsent(subjectId, purpose);\n\t\t\tif (!record) return false;\n\t\t\tif (!record.granted) return false;\n\t\t\tif (record.expiresAt && record.expiresAt < Date.now()) return false;\n\t\t\treturn true;\n\t\t},\n\n\t\tasync getForSubject(subjectId) {\n\t\t\treturn storage.getConsentsBySubject(subjectId);\n\t\t},\n\n\t\tasync getForPurpose(purpose) {\n\t\t\treturn storage.getConsentsByPurpose(purpose);\n\t\t},\n\t};\n\n\treturn {\n\t\tasync exportData(request) {\n\t\t\ttry {\n\t\t\t\tconst subjectData = await storage.getSubjectData(\n\t\t\t\t\trequest.subjectId,\n\t\t\t\t\trequest.categories\n\t\t\t\t);\n\n\t\t\t\t// Flatten records for export\n\t\t\t\tconst allRecords: Array<{\n\t\t\t\t\tcategory: string;\n\t\t\t\t\tid: string;\n\t\t\t\t\tdata: Record<string, unknown>;\n\t\t\t\t\tcreatedAt: number;\n\t\t\t\t}> = [];\n\n\t\t\t\tconst categories: string[] = [];\n\n\t\t\t\tfor (const { category, records } of subjectData) {\n\t\t\t\t\tcategories.push(category);\n\t\t\t\t\tfor (const record of records) {\n\t\t\t\t\t\tallRecords.push({ category, ...record });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Include audit entries if requested\n\t\t\t\tif (request.includeAudit && storage.getAuditEntries) {\n\t\t\t\t\tconst auditEntries = await storage.getAuditEntries(request.subjectId);\n\t\t\t\t\tcategories.push(\"audit\");\n\t\t\t\t\tfor (const entry of auditEntries) {\n\t\t\t\t\t\tallRecords.push({\n\t\t\t\t\t\t\tcategory: \"audit\",\n\t\t\t\t\t\t\tid: entry.id,\n\t\t\t\t\t\t\tdata: entry.payload,\n\t\t\t\t\t\t\tcreatedAt: entry.timestamp,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Format data\n\t\t\t\tlet data: string;\n\t\t\t\tif (request.format === \"csv\") {\n\t\t\t\t\tdata = toCSV(allRecords.map((r) => ({\n\t\t\t\t\t\tcategory: r.category,\n\t\t\t\t\t\tid: r.id,\n\t\t\t\t\t\tcreatedAt: new Date(r.createdAt).toISOString(),\n\t\t\t\t\t\t...r.data,\n\t\t\t\t\t})));\n\t\t\t\t} else {\n\t\t\t\t\tdata = JSON.stringify({\n\t\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\t\texportedAt: new Date().toISOString(),\n\t\t\t\t\t\trecordCount: allRecords.length,\n\t\t\t\t\t\tcategories,\n\t\t\t\t\t\trecords: allRecords,\n\t\t\t\t\t}, null, 2);\n\t\t\t\t}\n\n\t\t\t\t// Calculate checksum\n\t\t\t\tconst checksum = await sha256(data);\n\n\t\t\t\tconst result: DataExportResult = {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\tformat: request.format,\n\t\t\t\t\tdata,\n\t\t\t\t\tcategories,\n\t\t\t\t\trecordCount: allRecords.length,\n\t\t\t\t\tchecksum,\n\t\t\t\t\texportedAt: Date.now(),\n\t\t\t\t\texpiresAt: Date.now() + exportExpirationMs,\n\t\t\t\t};\n\n\t\t\t\tevents.onExport?.(result);\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\tformat: request.format,\n\t\t\t\t\tdata: \"\",\n\t\t\t\t\tcategories: [],\n\t\t\t\t\trecordCount: 0,\n\t\t\t\t\tchecksum: \"\",\n\t\t\t\t\texportedAt: Date.now(),\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tasync deleteData(request) {\n\t\t\ttry {\n\t\t\t\tlet recordsAffected = 0;\n\t\t\t\tconst categoriesAffected: string[] = [];\n\n\t\t\t\tif (request.anonymize) {\n\t\t\t\t\trecordsAffected = await storage.anonymizeSubjectData(\n\t\t\t\t\t\trequest.subjectId,\n\t\t\t\t\t\trequest.categories\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\trecordsAffected = await storage.deleteSubjectData(\n\t\t\t\t\t\trequest.subjectId,\n\t\t\t\t\t\trequest.categories\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Track affected categories\n\t\t\t\tif (request.categories) {\n\t\t\t\t\tcategoriesAffected.push(...request.categories);\n\t\t\t\t} else if (request.scope === \"all\") {\n\t\t\t\t\tcategoriesAffected.push(\"all\");\n\t\t\t\t}\n\n\t\t\t\t// Create deletion certificate\n\t\t\t\tconst certificateContent = JSON.stringify({\n\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\ttype: request.anonymize ? \"anonymization\" : \"hard\",\n\t\t\t\t\tscope: request.scope,\n\t\t\t\t\tcategories: categoriesAffected,\n\t\t\t\t\trecordCount: recordsAffected,\n\t\t\t\t\tdeletedAt: Date.now(),\n\t\t\t\t\treason: request.reason,\n\t\t\t\t});\n\n\t\t\t\tconst certificate: DeletionCertificate = {\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\ttype: request.anonymize ? \"anonymization\" : \"hard\",\n\t\t\t\t\tscope: request.scope,\n\t\t\t\t\tcategories: categoriesAffected,\n\t\t\t\t\trecordCount: recordsAffected,\n\t\t\t\t\tdeletedAt: Date.now(),\n\t\t\t\t\treason: request.reason,\n\t\t\t\t\thash: await sha256(certificateContent),\n\t\t\t\t};\n\n\t\t\t\tawait storage.storeDeletionCertificate(certificate);\n\n\t\t\t\tconst result: DataDeletionResult = {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\tscope: request.scope,\n\t\t\t\t\tanonymized: request.anonymize ?? false,\n\t\t\t\t\trecordsAffected,\n\t\t\t\t\tcategoriesAffected,\n\t\t\t\t\tcertificate,\n\t\t\t\t\tdeletedAt: Date.now(),\n\t\t\t\t};\n\n\t\t\t\tevents.onDelete?.(result);\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\tscope: request.scope,\n\t\t\t\t\tanonymized: request.anonymize ?? false,\n\t\t\t\t\trecordsAffected: 0,\n\t\t\t\t\tcategoriesAffected: [],\n\t\t\t\t\tcertificate: {\n\t\t\t\t\t\tid: \"error\",\n\t\t\t\t\t\tsubjectId: request.subjectId,\n\t\t\t\t\t\ttype: \"hard\",\n\t\t\t\t\t\tscope: request.scope,\n\t\t\t\t\t\tcategories: [],\n\t\t\t\t\t\trecordCount: 0,\n\t\t\t\t\t\tdeletedAt: Date.now(),\n\t\t\t\t\t\thash: \"\",\n\t\t\t\t\t},\n\t\t\t\t\tdeletedAt: Date.now(),\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tconsent,\n\n\t\tasync enforceRetention() {\n\t\t\tif (!retention) return 0;\n\n\t\t\tlet totalDeleted = 0;\n\t\t\tconst now = Date.now();\n\n\t\t\t// Get all categories to check\n\t\t\tconst categories = new Set<string>();\n\t\t\tif (retention.categoryRetention) {\n\t\t\t\tfor (const category of Object.keys(retention.categoryRetention)) {\n\t\t\t\t\tcategories.add(category);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Default category for anything not specified\n\t\t\tcategories.add(\"default\");\n\n\t\t\tfor (const category of categories) {\n\t\t\t\tconst retentionMs = retention.categoryRetention?.[category] ?? retention.defaultRetentionMs;\n\t\t\t\tconst cutoff = now - retentionMs;\n\n\t\t\t\tconst expired = await storage.getExpiredData(category, cutoff);\n\n\t\t\t\tif (expired.length > 0) {\n\t\t\t\t\tawait retention.onBeforeDelete?.({ category, count: expired.length });\n\n\t\t\t\t\tconst deleted = await storage.deleteByIds(expired.map((e) => e.id));\n\t\t\t\t\ttotalDeleted += deleted;\n\n\t\t\t\t\tretention.onAfterDelete?.({ category, count: deleted });\n\t\t\t\t\tevents.onRetentionEnforced?.(category, deleted);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn totalDeleted;\n\t\t},\n\n\t\tcreateConsentGuardrail(purpose: string): GuardrailFn<InputGuardrailData> {\n\t\t\treturn async (data): Promise<GuardrailResult> => {\n\t\t\t\t// Extract subject ID from input or context\n\t\t\t\t// This is a simple implementation - in practice you'd extract from context\n\t\t\t\tconst subjectIdMatch = data.input.match(/user[_-]?id[:\\s]*([a-zA-Z0-9-]+)/i);\n\t\t\t\tconst subjectId = subjectIdMatch?.[1];\n\n\t\t\t\tif (!subjectId) {\n\t\t\t\t\t// No subject ID found - allow (fail open) or block (fail closed)\n\t\t\t\t\t// Default to fail open for better UX\n\t\t\t\t\treturn { passed: true };\n\t\t\t\t}\n\n\t\t\t\tconst hasConsent = await consent.check(subjectId, purpose);\n\n\t\t\t\tif (!hasConsent) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpassed: false,\n\t\t\t\t\t\treason: `No consent for '${purpose}' from subject ${subjectId}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn { passed: true };\n\t\t\t};\n\t\t},\n\n\t\tasync getDeletionCertificate(_subjectId) {\n\t\t\t// This would need to be implemented in the storage adapter\n\t\t\t// For now, return null as the interface doesn't expose get\n\t\t\treturn null;\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n\tcreateCompliance as create,\n\tcreateInMemoryComplianceStorage as createInMemoryStorage,\n};\n","/**\n * Semantic Caching Guardrail\n *\n * Caches agent responses based on semantic similarity to reduce redundant LLM calls.\n * Uses vector embeddings to find semantically similar previous queries.\n *\n * @example\n * ```typescript\n * import { createSemanticCacheGuardrail } from '@directive-run/ai';\n *\n * const cacheGuardrail = createSemanticCacheGuardrail({\n * embedder: async (text) => {\n * // Use your embedding model (OpenAI, local model, etc.)\n * return await getEmbedding(text);\n * },\n * similarityThreshold: 0.95,\n * maxCacheSize: 1000,\n * ttlMs: 3600000, // 1 hour\n * });\n *\n * const orchestrator = createAgentOrchestrator({\n * guardrails: {\n * input: [cacheGuardrail],\n * },\n * runner: run,\n * });\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Vector embedding (array of numbers) */\nexport type Embedding = number[];\n\n/** Function to generate embeddings for text */\nexport type EmbedderFn = (text: string) => Promise<Embedding>;\n\n/** Cached response entry */\nexport interface CacheEntry {\n id: string;\n query: string;\n queryEmbedding: Embedding;\n response: string;\n metadata: Record<string, unknown>;\n createdAt: number;\n accessedAt: number;\n accessCount: number;\n agentName?: string;\n}\n\n/** Cache lookup result */\nexport interface CacheLookupResult {\n hit: boolean;\n entry?: CacheEntry;\n similarity?: number;\n latencyMs: number;\n}\n\n/** Semantic cache configuration */\nexport interface SemanticCacheConfig {\n /** Function to generate embeddings */\n embedder: EmbedderFn;\n /** Similarity threshold (0.0 to 1.0) for cache hits */\n similarityThreshold?: number;\n /** Maximum number of entries to cache */\n maxCacheSize?: number;\n /** Time-to-live in milliseconds for cache entries */\n ttlMs?: number;\n /** Cache namespace for multi-tenant scenarios */\n namespace?: string;\n /** Custom storage backend (defaults to in-memory) */\n storage?: SemanticCacheStorage;\n /** Callback when cache hit occurs */\n onHit?: (entry: CacheEntry, similarity: number) => void;\n /** Callback when cache miss occurs */\n onMiss?: (query: string) => void;\n /** Callback when cache lookup encounters an error */\n onError?: (error: Error) => void;\n /** Whether to include agent name in cache key */\n perAgent?: boolean;\n}\n\n/** Storage interface for cache backends */\nexport interface SemanticCacheStorage {\n /** Get all entries for a namespace */\n getEntries(namespace: string): Promise<CacheEntry[]>;\n /** Add an entry to the cache */\n addEntry(namespace: string, entry: CacheEntry): Promise<void>;\n /** Update an entry (e.g., access count) */\n updateEntry(namespace: string, id: string, updates: Partial<CacheEntry>): Promise<void>;\n /** Remove an entry */\n removeEntry(namespace: string, id: string): Promise<void>;\n /** Clear all entries in a namespace */\n clear(namespace: string): Promise<void>;\n}\n\n/** Semantic cache instance */\nexport interface SemanticCache {\n /** Look up a query in the cache */\n lookup(query: string, agentName?: string): Promise<CacheLookupResult>;\n /** Store a response in the cache */\n store(query: string, response: string, agentName?: string, metadata?: Record<string, unknown>): Promise<void>;\n /** Invalidate cache entries matching a predicate */\n invalidate(predicate: (entry: CacheEntry) => boolean): Promise<number>;\n /** Clear all cache entries */\n clear(): Promise<void>;\n /** Get cache statistics */\n getStats(): CacheStats;\n /** Export cache entries (for persistence) */\n export(): Promise<CacheEntry[]>;\n /** Import cache entries (from persistence) */\n import(entries: CacheEntry[]): Promise<void>;\n}\n\n/** Cache statistics */\nexport interface CacheStats {\n totalEntries: number;\n totalHits: number;\n totalMisses: number;\n hitRate: number;\n avgSimilarityOnHit: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n}\n\n// ============================================================================\n// Vector Math Utilities\n// ============================================================================\n\n/**\n * Calculate cosine similarity between two vectors.\n */\nexport function cosineSimilarity(a: Embedding, b: Embedding): number {\n if (a.length !== b.length) {\n throw new Error(`Vector dimensions must match: ${a.length} vs ${b.length}`);\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n const ai = a[i]!; // Safe: i is within bounds\n const bi = b[i]!; // Safe: dimensions match and i is within bounds\n dotProduct += ai * bi;\n normA += ai * ai;\n normB += bi * bi;\n }\n\n normA = Math.sqrt(normA);\n normB = Math.sqrt(normB);\n\n if (normA === 0 || normB === 0) {\n return 0;\n }\n\n return dotProduct / (normA * normB);\n}\n\n/**\n * Find the most similar entries to a query embedding.\n */\nfunction findSimilar(\n queryEmbedding: Embedding,\n entries: CacheEntry[],\n threshold: number,\n agentName?: string\n): { entry: CacheEntry; similarity: number } | null {\n let bestMatch: { entry: CacheEntry; similarity: number } | null = null;\n\n for (const entry of entries) {\n // Filter by agent if specified\n if (agentName && entry.agentName && entry.agentName !== agentName) {\n continue;\n }\n\n const similarity = cosineSimilarity(queryEmbedding, entry.queryEmbedding);\n\n if (similarity >= threshold) {\n if (!bestMatch || similarity > bestMatch.similarity) {\n bestMatch = { entry, similarity };\n }\n }\n }\n\n return bestMatch;\n}\n\n// ============================================================================\n// In-Memory Storage\n// ============================================================================\n\n/**\n * Create an in-memory cache storage backend.\n */\nexport function createInMemoryStorage(): SemanticCacheStorage {\n const storage = new Map<string, Map<string, CacheEntry>>();\n\n function getNamespace(namespace: string): Map<string, CacheEntry> {\n let ns = storage.get(namespace);\n if (!ns) {\n ns = new Map();\n storage.set(namespace, ns);\n }\n return ns;\n }\n\n return {\n async getEntries(namespace: string): Promise<CacheEntry[]> {\n return Array.from(getNamespace(namespace).values());\n },\n\n async addEntry(namespace: string, entry: CacheEntry): Promise<void> {\n getNamespace(namespace).set(entry.id, entry);\n },\n\n async updateEntry(namespace: string, id: string, updates: Partial<CacheEntry>): Promise<void> {\n const ns = getNamespace(namespace);\n const entry = ns.get(id);\n if (entry) {\n ns.set(id, { ...entry, ...updates });\n }\n },\n\n async removeEntry(namespace: string, id: string): Promise<void> {\n getNamespace(namespace).delete(id);\n },\n\n async clear(namespace: string): Promise<void> {\n storage.delete(namespace);\n },\n };\n}\n\n// ============================================================================\n// Semantic Cache Factory\n// ============================================================================\n\n/**\n * Create a semantic cache instance.\n *\n * @example\n * ```typescript\n * const cache = createSemanticCache({\n * embedder: async (text) => {\n * const response = await openai.embeddings.create({\n * model: 'text-embedding-3-small',\n * input: text,\n * });\n * return response.data[0].embedding;\n * },\n * similarityThreshold: 0.92,\n * maxCacheSize: 500,\n * ttlMs: 3600000, // 1 hour\n * });\n *\n * // Check cache before calling agent\n * const result = await cache.lookup(userQuery);\n * if (result.hit) {\n * return result.entry!.response;\n * }\n *\n * // Call agent and cache response\n * const response = await runAgent(userQuery);\n * await cache.store(userQuery, response);\n * ```\n */\nexport function createSemanticCache(config: SemanticCacheConfig): SemanticCache {\n const {\n embedder,\n similarityThreshold = 0.9,\n maxCacheSize = 1000,\n ttlMs = 3600000, // 1 hour default\n namespace = \"default\",\n storage = createInMemoryStorage(),\n onHit,\n onMiss,\n onError,\n perAgent = false,\n } = config;\n\n // Statistics\n let stats: CacheStats = {\n totalEntries: 0,\n totalHits: 0,\n totalMisses: 0,\n hitRate: 0,\n avgSimilarityOnHit: 0,\n oldestEntry: null,\n newestEntry: null,\n };\n\n let totalSimilaritySum = 0;\n\n function updateStats(entries: CacheEntry[]): void {\n stats.totalEntries = entries.length;\n stats.hitRate =\n stats.totalHits + stats.totalMisses > 0\n ? stats.totalHits / (stats.totalHits + stats.totalMisses)\n : 0;\n stats.avgSimilarityOnHit =\n stats.totalHits > 0 ? totalSimilaritySum / stats.totalHits : 0;\n\n if (entries.length > 0) {\n const times = entries.map((e) => e.createdAt);\n stats.oldestEntry = Math.min(...times);\n stats.newestEntry = Math.max(...times);\n } else {\n stats.oldestEntry = null;\n stats.newestEntry = null;\n }\n }\n\n async function evictExpiredAndExcess(): Promise<void> {\n const entries = await storage.getEntries(namespace);\n const now = Date.now();\n\n // Remove expired entries\n for (const entry of entries) {\n if (now - entry.createdAt > ttlMs) {\n await storage.removeEntry(namespace, entry.id);\n }\n }\n\n // Get fresh list after expiration\n const remainingEntries = await storage.getEntries(namespace);\n\n // Remove oldest entries if over max size (LRU based on accessedAt)\n if (remainingEntries.length > maxCacheSize) {\n const sorted = remainingEntries.sort((a, b) => a.accessedAt - b.accessedAt);\n const toRemove = sorted.slice(0, remainingEntries.length - maxCacheSize);\n for (const entry of toRemove) {\n await storage.removeEntry(namespace, entry.id);\n }\n }\n }\n\n return {\n async lookup(query: string, agentName?: string): Promise<CacheLookupResult> {\n const start = Date.now();\n\n try {\n // Generate embedding for query\n const queryEmbedding = await embedder(query);\n\n // Get all entries\n const entries = await storage.getEntries(namespace);\n\n // Find similar entry\n const match = findSimilar(\n queryEmbedding,\n entries,\n similarityThreshold,\n perAgent ? agentName : undefined\n );\n\n if (match) {\n // Update access stats\n await storage.updateEntry(namespace, match.entry.id, {\n accessedAt: Date.now(),\n accessCount: match.entry.accessCount + 1,\n });\n\n stats.totalHits++;\n totalSimilaritySum += match.similarity;\n updateStats(entries);\n\n onHit?.(match.entry, match.similarity);\n\n return {\n hit: true,\n entry: match.entry,\n similarity: match.similarity,\n latencyMs: Date.now() - start,\n };\n }\n\n stats.totalMisses++;\n updateStats(entries);\n\n onMiss?.(query);\n\n return {\n hit: false,\n latencyMs: Date.now() - start,\n };\n } catch (error) {\n // On error, treat as cache miss\n stats.totalMisses++;\n onError?.(error instanceof Error ? error : new Error(String(error)));\n return {\n hit: false,\n latencyMs: Date.now() - start,\n };\n }\n },\n\n async store(\n query: string,\n response: string,\n agentName?: string,\n metadata: Record<string, unknown> = {}\n ): Promise<void> {\n // Generate embedding\n const queryEmbedding = await embedder(query);\n\n const entry: CacheEntry = {\n id: globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,\n query,\n queryEmbedding,\n response,\n metadata,\n createdAt: Date.now(),\n accessedAt: Date.now(),\n accessCount: 0,\n agentName: perAgent ? agentName : undefined,\n };\n\n await storage.addEntry(namespace, entry);\n\n // Evict if necessary\n await evictExpiredAndExcess();\n\n const entries = await storage.getEntries(namespace);\n updateStats(entries);\n },\n\n async invalidate(predicate: (entry: CacheEntry) => boolean): Promise<number> {\n const entries = await storage.getEntries(namespace);\n let removed = 0;\n\n for (const entry of entries) {\n if (predicate(entry)) {\n await storage.removeEntry(namespace, entry.id);\n removed++;\n }\n }\n\n const remainingEntries = await storage.getEntries(namespace);\n updateStats(remainingEntries);\n\n return removed;\n },\n\n async clear(): Promise<void> {\n await storage.clear(namespace);\n stats = {\n totalEntries: 0,\n totalHits: 0,\n totalMisses: 0,\n hitRate: 0,\n avgSimilarityOnHit: 0,\n oldestEntry: null,\n newestEntry: null,\n };\n totalSimilaritySum = 0;\n },\n\n getStats(): CacheStats {\n return { ...stats };\n },\n\n async export(): Promise<CacheEntry[]> {\n return storage.getEntries(namespace);\n },\n\n async import(entries: CacheEntry[]): Promise<void> {\n for (const entry of entries) {\n await storage.addEntry(namespace, entry);\n }\n await evictExpiredAndExcess();\n const allEntries = await storage.getEntries(namespace);\n updateStats(allEntries);\n },\n };\n}\n\n// ============================================================================\n// Guardrail Integration\n// ============================================================================\n\n/** Input guardrail data for semantic cache */\nexport interface SemanticCacheGuardrailData {\n input: string;\n agentName?: string;\n}\n\n/**\n * Result of semantic cache guardrail.\n *\n * **Important semantics:**\n * - `passed: false` + `cacheHit: true` = Short-circuit with cached response (not an error!)\n * - `passed: true` + `cacheHit: false` = No cache hit, proceed with agent call\n *\n * The `passed: false` follows guardrail convention where \"not passing\" stops the flow,\n * but in this case stopping is desirable (returning cached data is good).\n */\nexport interface SemanticCacheGuardrailResult {\n /**\n * Whether to proceed with the agent call.\n * `false` means short-circuit with cached response (this is good, not an error).\n * `true` means no cache hit, proceed with agent.\n */\n passed: boolean;\n /** Indicates whether this was a cache hit */\n cacheHit: boolean;\n /** Reason for the result */\n reason?: string;\n /** The cached response (only present on cache hit) */\n cachedResponse?: string;\n /** Similarity score (0-1) of the cache hit */\n similarity?: number;\n}\n\n/**\n * Create a semantic caching input guardrail.\n *\n * **How it works:**\n * - On cache HIT: Returns `{ passed: false, cacheHit: true, cachedResponse: \"...\" }`\n * The orchestrator should detect `cacheHit: true` and return the cached response.\n * - On cache MISS: Returns `{ passed: true, cacheHit: false }`\n * Proceed with normal agent execution.\n *\n * **Important:** `passed: false` with `cacheHit: true` is SUCCESS, not failure.\n * The guardrail \"short-circuits\" the flow to return cached data efficiently.\n *\n * @example\n * ```typescript\n * const cacheGuardrail = createSemanticCacheGuardrail({\n * cache: mySemanticCache,\n * });\n *\n * const orchestrator = createAgentOrchestrator({\n * guardrails: {\n * input: [\n * {\n * name: 'semantic-cache',\n * fn: cacheGuardrail,\n * },\n * ],\n * },\n * runner: run,\n * });\n *\n * // In your orchestrator wrapper, check for cache hits:\n * const guardrailResult = await cacheGuardrail({ input: userQuery });\n * if (guardrailResult.cacheHit) {\n * return guardrailResult.cachedResponse; // Fast path!\n * }\n * // Otherwise proceed with agent call...\n * ```\n */\nexport function createSemanticCacheGuardrail(config: {\n cache: SemanticCache;\n}): (data: SemanticCacheGuardrailData) => Promise<SemanticCacheGuardrailResult> {\n const { cache } = config;\n\n return async (data: SemanticCacheGuardrailData): Promise<SemanticCacheGuardrailResult> => {\n const result = await cache.lookup(data.input, data.agentName);\n\n if (result.hit && result.entry) {\n return {\n passed: false, // Short-circuit: don't proceed to agent\n cacheHit: true,\n reason: `Cache hit (similarity: ${(result.similarity! * 100).toFixed(1)}%)`,\n cachedResponse: result.entry.response,\n similarity: result.similarity,\n };\n }\n\n return {\n passed: true, // No cache hit, proceed with agent call\n cacheHit: false,\n };\n };\n}\n\n// ============================================================================\n// Embedding Utilities\n// ============================================================================\n\n/**\n * Create a simple hash-based \"embedder\" for testing.\n * NOT suitable for production - use a real embedding model.\n */\nexport function createTestEmbedder(dimensions = 128): EmbedderFn {\n return async (text: string): Promise<Embedding> => {\n const embedding = new Array(dimensions).fill(0);\n\n // Simple hash-based embedding for testing\n for (let i = 0; i < text.length; i++) {\n const charCode = text.charCodeAt(i);\n embedding[i % dimensions] += charCode / 256;\n }\n\n // Normalize\n const norm = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));\n if (norm > 0) {\n for (let i = 0; i < dimensions; i++) {\n embedding[i] /= norm;\n }\n }\n\n return embedding;\n };\n}\n\n/** Batched embedder instance with dispose capability */\nexport interface BatchedEmbedder {\n /** Embed a single text (batched internally) */\n embed: EmbedderFn;\n /** Flush any pending batch immediately */\n flush(): Promise<void>;\n /** Dispose of the embedder, clearing timers and rejecting pending requests */\n dispose(): void;\n}\n\n/**\n * Create a batched embedder that groups multiple texts into single API calls.\n *\n * **BREAKING CHANGE:** Previously returned `EmbedderFn` directly. Now returns\n * a `BatchedEmbedder` object with `embed`, `flush`, and `dispose` methods.\n *\n * To migrate: `const embed = createBatchedEmbedder(...)` becomes\n * `const { embed } = createBatchedEmbedder(...)`.\n *\n * @example\n * ```typescript\n * const batchedEmbedder = createBatchedEmbedder({\n * batchSize: 20,\n * embedBatch: async (texts) => {\n * const response = await openai.embeddings.create({\n * model: 'text-embedding-3-small',\n * input: texts,\n * });\n * return response.data.map(d => d.embedding);\n * },\n * maxWaitMs: 50,\n * });\n *\n * // Use the embedder\n * const embedding = await batchedEmbedder.embed(\"Hello world\");\n *\n * // Clean up when done\n * batchedEmbedder.dispose();\n * ```\n */\nexport function createBatchedEmbedder(config: {\n batchSize?: number;\n embedBatch: (texts: string[]) => Promise<Embedding[]>;\n maxWaitMs?: number;\n}): BatchedEmbedder {\n const { batchSize = 20, embedBatch, maxWaitMs = 50 } = config;\n\n if (batchSize < 1 || !Number.isFinite(batchSize)) {\n throw new Error(`[Directive SemanticCache] batchSize must be >= 1, got ${batchSize}`);\n }\n\n let pendingBatch: Array<{\n text: string;\n resolve: (embedding: Embedding) => void;\n reject: (error: Error) => void;\n }> = [];\n let batchTimer: ReturnType<typeof setTimeout> | null = null;\n let isDisposed = false;\n\n async function flushBatch(): Promise<void> {\n if (pendingBatch.length === 0) return;\n\n const batch = pendingBatch;\n pendingBatch = [];\n\n if (batchTimer) {\n clearTimeout(batchTimer);\n batchTimer = null;\n }\n\n try {\n const texts = batch.map((item) => item.text);\n const embeddings = await embedBatch(texts);\n\n if (embeddings.length !== batch.length) {\n throw new Error(\n `[Directive SemanticCache] embedBatch returned ${embeddings.length} embeddings for ${batch.length} texts. ` +\n `The embedBatch function must return exactly one embedding per input text.`\n );\n }\n\n for (let i = 0; i < batch.length; i++) {\n batch[i]!.resolve(embeddings[i]!);\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n for (const item of batch) {\n item.reject(err);\n }\n }\n }\n\n return {\n async embed(text: string): Promise<Embedding> {\n if (isDisposed) {\n throw new Error(\"BatchedEmbedder has been disposed\");\n }\n\n return new Promise((resolve, reject) => {\n pendingBatch.push({ text, resolve, reject });\n\n if (pendingBatch.length >= batchSize) {\n flushBatch();\n } else if (!batchTimer) {\n batchTimer = setTimeout(flushBatch, maxWaitMs);\n }\n });\n },\n\n async flush(): Promise<void> {\n await flushBatch();\n },\n\n dispose(): void {\n isDisposed = true;\n\n // Clear timer\n if (batchTimer) {\n clearTimeout(batchTimer);\n batchTimer = null;\n }\n\n // Reject pending requests\n const batch = pendingBatch;\n pendingBatch = [];\n const err = new Error(\"BatchedEmbedder disposed\");\n for (const item of batch) {\n item.reject(err);\n }\n },\n };\n}\n","/**\n * Approximate Nearest Neighbor (ANN) Index for Semantic Cache\n *\n * Provides pluggable vector search backends for efficient similarity lookups.\n * Includes a brute-force exact search and a VP-tree (Vantage Point Tree) for\n * fast approximate nearest neighbor queries.\n *\n * @example\n * ```typescript\n * import { createSemanticCache } from '@directive-run/ai';\n * import { createVPTreeIndex } from '@directive-run/ai';\n *\n * const index = createVPTreeIndex();\n *\n * const cache = createSemanticCache({\n * embedder: myEmbedder,\n * annIndex: index,\n * });\n * ```\n */\n\nimport type { Embedding } from \"./semantic-cache.js\";\nimport { cosineSimilarity } from \"./semantic-cache.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Search result from an ANN index */\nexport interface ANNSearchResult {\n\t/** ID of the matched item */\n\tid: number;\n\t/** Similarity score (0-1, higher is more similar) */\n\tsimilarity: number;\n}\n\n/** ANN Index interface - pluggable vector search backend */\nexport interface ANNIndex {\n\t/** Add a vector to the index */\n\tadd(id: number, embedding: Embedding): void;\n\t/** Remove a vector from the index */\n\tremove(id: number): void;\n\t/** Search for the k nearest neighbors */\n\tsearch(query: Embedding, k: number, threshold?: number): ANNSearchResult[];\n\t/** Rebuild the index (call after batch additions) */\n\trebuild(): void;\n\t/** Get the number of indexed vectors */\n\tsize(): number;\n\t/** Clear the index */\n\tclear(): void;\n\t/** Check if the index needs to be rebuilt (e.g., after additions/removals) */\n\tneedsRebuild(): boolean;\n}\n\n// ============================================================================\n// Brute Force Index (Exact Search)\n// ============================================================================\n\n/**\n * Create a brute-force exact search index.\n *\n * O(n) search, O(1) add/remove. Best for small collections (< 10,000 vectors).\n *\n * @example\n * ```typescript\n * const index = createBruteForceIndex();\n * index.add(0, [0.1, 0.2, 0.3]);\n * index.add(1, [0.4, 0.5, 0.6]);\n *\n * const results = index.search([0.1, 0.2, 0.3], 1);\n * // [{ id: 0, similarity: 1.0 }]\n * ```\n */\nexport function createBruteForceIndex(): ANNIndex {\n\tconst vectors = new Map<number, Embedding>();\n\tlet expectedDimension: number | null = null;\n\n\tfunction validateDimension(embedding: Embedding): void {\n\t\tif (expectedDimension === null) {\n\t\t\texpectedDimension = embedding.length;\n\t\t} else if (embedding.length !== expectedDimension) {\n\t\t\tthrow new Error(\n\t\t\t\t`[Directive ANNIndex] Dimension mismatch: expected ${expectedDimension}, got ${embedding.length}`\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tadd(id: number, embedding: Embedding): void {\n\t\t\tvalidateDimension(embedding);\n\t\t\tvectors.set(id, embedding);\n\t\t},\n\n\t\tremove(id: number): void {\n\t\t\tvectors.delete(id);\n\t\t},\n\n\t\tsearch(query: Embedding, k: number, threshold = 0): ANNSearchResult[] {\n\t\t\tif (expectedDimension !== null && query.length !== expectedDimension) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive ANNIndex] Query dimension mismatch: expected ${expectedDimension}, got ${query.length}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst results: ANNSearchResult[] = [];\n\n\t\t\tfor (const [id, embedding] of vectors) {\n\t\t\t\tconst similarity = cosineSimilarity(query, embedding);\n\t\t\t\tif (similarity >= threshold) {\n\t\t\t\t\tresults.push({ id, similarity });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Sort by similarity descending, take top k\n\t\t\tresults.sort((a, b) => b.similarity - a.similarity);\n\t\t\treturn results.slice(0, k);\n\t\t},\n\n\t\trebuild(): void {\n\t\t\t// No-op for brute force\n\t\t},\n\n\t\tsize(): number {\n\t\t\treturn vectors.size;\n\t\t},\n\n\t\tclear(): void {\n\t\t\tvectors.clear();\n\t\t\texpectedDimension = null;\n\t\t},\n\n\t\tneedsRebuild(): boolean {\n\t\t\treturn false; // Brute force doesn't need rebuilding\n\t\t},\n\t};\n}\n\n// ============================================================================\n// VP-Tree Index (Approximate Search)\n// ============================================================================\n\ninterface VPNode {\n\tid: number;\n\tembedding: Embedding;\n\tmu: number; // Median distance\n\tleft: VPNode | null;\n\tright: VPNode | null;\n}\n\nfunction cosineDistance(a: Embedding, b: Embedding): number {\n\treturn 1 - cosineSimilarity(a, b);\n}\n\n/** VP-Tree index configuration */\nexport interface VPTreeIndexConfig {\n\t/** Optional random number generator for deterministic builds. Returns a number in [0, 1). */\n\trandom?: () => number;\n}\n\nfunction buildVPTree(\n\titems: Array<{ id: number; embedding: Embedding }>,\n\trandom: () => number,\n): VPNode | null {\n\tif (items.length === 0) return null;\n\n\t// Pick a random vantage point\n\tconst vpIdx = Math.floor(random() * items.length);\n\tconst vp = items[vpIdx]!;\n\tconst rest = items.filter((_, i) => i !== vpIdx);\n\n\tif (rest.length === 0) {\n\t\treturn {\n\t\t\tid: vp.id,\n\t\t\tembedding: vp.embedding,\n\t\t\tmu: 0,\n\t\t\tleft: null,\n\t\t\tright: null,\n\t\t};\n\t}\n\n\t// Calculate distances from vantage point\n\tconst distances = rest.map((item) => ({\n\t\titem,\n\t\tdistance: cosineDistance(vp.embedding, item.embedding),\n\t}));\n\n\t// Find median distance\n\tdistances.sort((a, b) => a.distance - b.distance);\n\tconst medianIdx = Math.floor(distances.length / 2);\n\tconst mu = distances[medianIdx]!.distance;\n\n\tconst leftItems = distances.slice(0, medianIdx).map((d) => d.item);\n\tconst rightItems = distances.slice(medianIdx).map((d) => d.item);\n\n\treturn {\n\t\tid: vp.id,\n\t\tembedding: vp.embedding,\n\t\tmu,\n\t\tleft: buildVPTree(leftItems, random),\n\t\tright: buildVPTree(rightItems, random),\n\t};\n}\n\nfunction searchVPTree(\n\tnode: VPNode | null,\n\tquery: Embedding,\n\tk: number,\n\tthreshold: number,\n\tresults: ANNSearchResult[],\n\tmaxDist: { value: number },\n): void {\n\tif (!node) return;\n\n\tconst dist = cosineDistance(query, node.embedding);\n\tconst similarity = 1 - dist;\n\n\tif (similarity >= threshold) {\n\t\tresults.push({ id: node.id, similarity });\n\t\tresults.sort((a, b) => b.similarity - a.similarity);\n\n\t\tif (results.length > k) {\n\t\t\tresults.pop();\n\t\t}\n\n\t\tif (results.length === k) {\n\t\t\tmaxDist.value = 1 - results[results.length - 1]!.similarity;\n\t\t}\n\t}\n\n\t// Determine which subtrees to search\n\tif (dist < node.mu) {\n\t\t// Query is inside the ball: search left (inside) first\n\t\tsearchVPTree(node.left, query, k, threshold, results, maxDist);\n\t\t// Only search right if the distance boundary overlaps\n\t\tif (dist + maxDist.value >= node.mu) {\n\t\t\tsearchVPTree(node.right, query, k, threshold, results, maxDist);\n\t\t}\n\t} else {\n\t\t// Query is outside the ball: search right (outside) first\n\t\tsearchVPTree(node.right, query, k, threshold, results, maxDist);\n\t\t// Only search left if the distance boundary overlaps\n\t\tif (dist - maxDist.value <= node.mu) {\n\t\t\tsearchVPTree(node.left, query, k, threshold, results, maxDist);\n\t\t}\n\t}\n}\n\n/**\n * Create a VP-Tree (Vantage Point Tree) index for efficient approximate nearest neighbor search.\n *\n * O(log n) search on average, requires rebuild after batch additions.\n * Best for medium collections (1,000 - 100,000 vectors).\n *\n * @example\n * ```typescript\n * const index = createVPTreeIndex();\n *\n * // Add vectors\n * for (let i = 0; i < embeddings.length; i++) {\n * index.add(i, embeddings[i]);\n * }\n *\n * // Build the tree\n * index.rebuild();\n *\n * // Search\n * const results = index.search(queryEmbedding, 5, 0.9);\n * ```\n */\nexport function createVPTreeIndex(vpConfig: VPTreeIndexConfig = {}): ANNIndex {\n\tconst { random = Math.random } = vpConfig;\n\tconst items = new Map<number, Embedding>();\n\tlet root: VPNode | null = null;\n\tlet needsRebuild = false;\n\tlet expectedDimension: number | null = null;\n\n\tfunction validateDimension(embedding: Embedding): void {\n\t\tif (expectedDimension === null) {\n\t\t\texpectedDimension = embedding.length;\n\t\t} else if (embedding.length !== expectedDimension) {\n\t\t\tthrow new Error(\n\t\t\t\t`[Directive ANNIndex] Dimension mismatch: expected ${expectedDimension}, got ${embedding.length}`\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tadd(id: number, embedding: Embedding): void {\n\t\t\tvalidateDimension(embedding);\n\t\t\titems.set(id, embedding);\n\t\t\tneedsRebuild = true;\n\t\t},\n\n\t\tremove(id: number): void {\n\t\t\titems.delete(id);\n\t\t\tneedsRebuild = true;\n\t\t},\n\n\t\tsearch(query: Embedding, k: number, threshold = 0): ANNSearchResult[] {\n\t\t\tif (expectedDimension !== null && query.length !== expectedDimension) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive ANNIndex] Query dimension mismatch: expected ${expectedDimension}, got ${query.length}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (needsRebuild || !root) {\n\t\t\t\t// Fall back to brute force if tree is stale\n\t\t\t\tconst results: ANNSearchResult[] = [];\n\t\t\t\tfor (const [id, embedding] of items) {\n\t\t\t\t\tconst similarity = cosineSimilarity(query, embedding);\n\t\t\t\t\tif (similarity >= threshold) {\n\t\t\t\t\t\tresults.push({ id, similarity });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresults.sort((a, b) => b.similarity - a.similarity);\n\t\t\t\treturn results.slice(0, k);\n\t\t\t}\n\n\t\t\tconst results: ANNSearchResult[] = [];\n\t\t\tconst maxDist = { value: Number.POSITIVE_INFINITY };\n\t\t\tsearchVPTree(root, query, k, threshold, results, maxDist);\n\t\t\treturn results;\n\t\t},\n\n\t\trebuild(): void {\n\t\t\tconst itemArray = Array.from(items.entries()).map(([id, embedding]) => ({ id, embedding }));\n\t\t\troot = buildVPTree(itemArray, random);\n\t\t\tneedsRebuild = false;\n\t\t},\n\n\t\tsize(): number {\n\t\t\treturn items.size;\n\t\t},\n\n\t\tclear(): void {\n\t\t\titems.clear();\n\t\t\troot = null;\n\t\t\tneedsRebuild = false;\n\t\t\texpectedDimension = null;\n\t\t},\n\n\t\tneedsRebuild(): boolean {\n\t\t\treturn needsRebuild;\n\t\t},\n\t};\n}\n","/**\n * Streaming Channel for Agent-to-Agent Communication\n *\n * Provides AsyncIterable-based streaming for large data transfers between agents.\n * Supports backpressure, buffering, and graceful termination.\n *\n * @example\n * ```typescript\n * import { createStreamChannel } from '@directive-run/ai';\n *\n * // Producer side\n * const channel = createStreamChannel<string>({ bufferSize: 100 });\n *\n * // Send data\n * await channel.send('chunk 1');\n * await channel.send('chunk 2');\n * channel.end(); // Signal completion\n *\n * // Consumer side (async iteration)\n * for await (const chunk of channel) {\n * console.log(chunk);\n * }\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Stream channel configuration */\nexport interface StreamChannelConfig {\n\t/** Maximum buffer size before backpressure is applied (default: 100) */\n\tbufferSize?: number;\n\t/** Channel name for debugging */\n\tname?: string;\n}\n\n/** Stream channel state */\nexport type StreamChannelState = \"open\" | \"closed\" | \"error\";\n\n/** Stream channel instance */\nexport interface StreamChannel<T> extends AsyncIterable<T> {\n\t/** Send a value to the channel. Resolves when consumed or buffered. */\n\tsend(value: T): Promise<void>;\n\t/** Signal that no more values will be sent */\n\tend(): void;\n\t/** Signal an error and terminate the stream */\n\terror(err: Error): void;\n\t/** Get the current state */\n\tgetState(): StreamChannelState;\n\t/** Get the number of buffered items */\n\tbufferedCount(): number;\n}\n\n/** Bidirectional stream between two agents */\nexport interface BidirectionalStream<TSend, TReceive> {\n\t/** Send a value to the remote end */\n\tsend(value: TSend): Promise<void>;\n\t/** Iterate over received values */\n\treceive: AsyncIterable<TReceive>;\n\t/** Close both directions */\n\tclose(): void;\n}\n\n// ============================================================================\n// Stream Channel Factory\n// ============================================================================\n\n/**\n * Create a stream channel for async data transfer.\n *\n * Implements proper backpressure: `send()` will pause when the buffer is full\n * and resume when the consumer catches up.\n *\n * @example\n * ```typescript\n * const channel = createStreamChannel<{ token: string }>();\n *\n * // Producer (e.g., LLM streaming response)\n * (async () => {\n * for (const token of tokens) {\n * await channel.send({ token });\n * }\n * channel.end();\n * })();\n *\n * // Consumer (e.g., downstream agent)\n * for await (const chunk of channel) {\n * process.stdout.write(chunk.token);\n * }\n * ```\n */\nexport function createStreamChannel<T>(config: StreamChannelConfig = {}): StreamChannel<T> {\n\tconst { bufferSize = 100 } = config;\n\n\tif (bufferSize < 1 || !Number.isFinite(bufferSize)) {\n\t\tthrow new Error(`[Directive StreamChannel] bufferSize must be >= 1, got ${bufferSize}`);\n\t}\n\n\tconst buffer: T[] = [];\n\tlet state: StreamChannelState = \"open\";\n\tlet streamError: Error | null = null;\n\n\t// Waiters for the consumer (when buffer is empty, consumer waits)\n\tlet consumerWaiter: { resolve: (value: IteratorResult<T>) => void; reject: (err: Error) => void } | null = null;\n\n\t// Waiters for the producer (when buffer is full, producer waits)\n\tlet producerWaiter: (() => void) | null = null;\n\n\t// Single-consumer guard\n\tlet hasConsumer = false;\n\n\tfunction resolveConsumer(value: T): void {\n\t\tif (consumerWaiter) {\n\t\t\tconst waiter = consumerWaiter;\n\t\t\tconsumerWaiter = null;\n\t\t\twaiter.resolve({ value, done: false });\n\t\t}\n\t}\n\n\tfunction endConsumer(): void {\n\t\tif (consumerWaiter) {\n\t\t\tconst waiter = consumerWaiter;\n\t\t\tconsumerWaiter = null;\n\t\t\twaiter.resolve({ value: undefined as unknown as T, done: true });\n\t\t}\n\t}\n\n\tfunction errorConsumer(err: Error): void {\n\t\tif (consumerWaiter) {\n\t\t\tconst waiter = consumerWaiter;\n\t\t\tconsumerWaiter = null;\n\t\t\thasConsumer = false;\n\t\t\twaiter.reject(err);\n\t\t}\n\t}\n\n\tfunction resolveProducer(): void {\n\t\tif (producerWaiter) {\n\t\t\tconst waiter = producerWaiter;\n\t\t\tproducerWaiter = null;\n\t\t\twaiter();\n\t\t}\n\t}\n\n\tconst channel: StreamChannel<T> = {\n\t\tasync send(value: T): Promise<void> {\n\t\t\tif (state !== \"open\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[Directive StreamChannel] Cannot send to ${state} channel${config.name ? ` \"${config.name}\"` : \"\"}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If consumer is waiting, deliver directly\n\t\t\tif (consumerWaiter) {\n\t\t\t\tresolveConsumer(value);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Apply backpressure if buffer is full (wait before adding)\n\t\t\tif (buffer.length >= bufferSize) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tproducerWaiter = resolve;\n\t\t\t\t});\n\t\t\t\t// Re-check state after backpressure wait\n\t\t\t\tif (state !== \"open\") {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`[Directive StreamChannel] Cannot send to ${state} channel${config.name ? ` \"${config.name}\"` : \"\"}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// If consumer became available during wait, deliver directly\n\t\t\t\tif (consumerWaiter) {\n\t\t\t\t\tresolveConsumer(value);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Buffer the value\n\t\t\tbuffer.push(value);\n\t\t},\n\n\t\tend(): void {\n\t\t\tif (state !== \"open\") return;\n\t\t\tstate = \"closed\";\n\t\t\tendConsumer();\n\t\t},\n\n\t\terror(err: Error): void {\n\t\t\tif (state !== \"open\") return;\n\t\t\tstate = \"error\";\n\t\t\tstreamError = err;\n\t\t\terrorConsumer(err);\n\t\t\tresolveProducer(); // Unblock any waiting producer\n\t\t},\n\n\t\tgetState(): StreamChannelState {\n\t\t\treturn state;\n\t\t},\n\n\t\tbufferedCount(): number {\n\t\t\treturn buffer.length;\n\t\t},\n\n\t\t[Symbol.asyncIterator](): AsyncIterator<T> {\n\t\t\tif (hasConsumer) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"[Directive StreamChannel] Channel only supports a single consumer. \" +\n\t\t\t\t\t\"Create a separate channel for each consumer.\"\n\t\t\t\t);\n\t\t\t}\n\t\t\thasConsumer = true;\n\n\t\t\treturn {\n\t\t\t\tnext(): Promise<IteratorResult<T>> {\n\t\t\t\t\t// Check for error\n\t\t\t\t\tif (state === \"error\" && streamError) {\n\t\t\t\t\t\thasConsumer = false;\n\t\t\t\t\t\treturn Promise.reject(streamError);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check buffer first\n\t\t\t\t\tif (buffer.length > 0) {\n\t\t\t\t\t\tconst value = buffer.shift()!;\n\t\t\t\t\t\tresolveProducer(); // Unblock producer if waiting\n\t\t\t\t\t\treturn Promise.resolve({ value, done: false });\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if stream is closed\n\t\t\t\t\tif (state === \"closed\") {\n\t\t\t\t\t\thasConsumer = false;\n\t\t\t\t\t\treturn Promise.resolve({ value: undefined as unknown as T, done: true });\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next value\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tconsumerWaiter = { resolve, reject };\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\treturn(): Promise<IteratorResult<T>> {\n\t\t\t\t\tstate = \"closed\";\n\t\t\t\t\tbuffer.length = 0;\n\t\t\t\t\thasConsumer = false;\n\t\t\t\t\tresolveProducer();\n\t\t\t\t\treturn Promise.resolve({ value: undefined as unknown as T, done: true });\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n\n\treturn channel;\n}\n\n// ============================================================================\n// Bidirectional Stream\n// ============================================================================\n\n/**\n * Create a bidirectional stream channel for two-way communication between agents.\n *\n * @example\n * ```typescript\n * const { sideA, sideB } = createBidirectionalStream<string, string>();\n *\n * // Agent A sends and receives\n * await sideA.send('question?');\n * for await (const reply of sideA.receive) {\n * console.log('A got:', reply);\n * }\n *\n * // Agent B receives and responds\n * for await (const msg of sideB.receive) {\n * await sideB.send(`reply to: ${msg}`);\n * }\n * ```\n */\nexport function createBidirectionalStream<TA, TB>(\n\tconfig?: StreamChannelConfig\n): { sideA: BidirectionalStream<TA, TB>; sideB: BidirectionalStream<TB, TA> } {\n\tconst channelAtoB = createStreamChannel<TA>(config);\n\tconst channelBtoA = createStreamChannel<TB>(config);\n\n\treturn {\n\t\tsideA: {\n\t\t\tsend: (value: TA) => channelAtoB.send(value),\n\t\t\treceive: channelBtoA,\n\t\t\tclose() {\n\t\t\t\tchannelAtoB.end();\n\t\t\t\tchannelBtoA.end();\n\t\t\t},\n\t\t},\n\t\tsideB: {\n\t\t\tsend: (value: TB) => channelBtoA.send(value),\n\t\t\treceive: channelAtoB,\n\t\t\tclose() {\n\t\t\t\tchannelAtoB.end();\n\t\t\t\tchannelBtoA.end();\n\t\t\t},\n\t\t},\n\t};\n}\n\n// ============================================================================\n// Stream Utilities\n// ============================================================================\n\n/**\n * Pipe one stream channel through a transform function into another.\n *\n * @example\n * ```typescript\n * const input = createStreamChannel<string>();\n * const output = createStreamChannel<number>();\n *\n * pipeThrough(input, output, (chunk) => chunk.length);\n * ```\n */\nexport async function pipeThrough<TIn, TOut>(\n\tsource: AsyncIterable<TIn>,\n\tdestination: StreamChannel<TOut>,\n\ttransform: (value: TIn) => TOut | Promise<TOut>,\n): Promise<void> {\n\ttry {\n\t\tfor await (const value of source) {\n\t\t\tconst transformed = await transform(value);\n\t\t\tawait destination.send(transformed);\n\t\t}\n\t\tdestination.end();\n\t} catch (error) {\n\t\tdestination.error(error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n\n/**\n * Merge multiple async iterables into a single stream.\n * Values are emitted as soon as they arrive from any source.\n *\n * Note: The internal buffer is capped at 10,000 items. Values exceeding this\n * limit are dropped. For high-throughput scenarios, ensure the consumer keeps up\n * or use bounded `StreamChannel` sources.\n *\n * @example\n * ```typescript\n * const merged = mergeStreams(channel1, channel2, channel3);\n * for await (const value of merged) {\n * console.log(value);\n * }\n * ```\n */\nexport function mergeStreams<T>(...sources: AsyncIterable<T>[]): AsyncIterable<T> {\n\tconst MAX_BUFFER = 10000;\n\n\treturn {\n\t\t[Symbol.asyncIterator](): AsyncIterator<T> {\n\t\t\tconst buffer: T[] = [];\n\t\t\tlet doneCount = 0;\n\t\t\tlet waiter: ((value: IteratorResult<T>) => void) | null = null;\n\t\t\tlet errorState: Error | null = null;\n\t\t\tlet stopped = false;\n\t\t\tlet hasWarnedDrop = false;\n\t\t\tconst sourceIterators: AsyncIterator<T>[] = [];\n\n\t\t\tfunction notifyWaiter(result: IteratorResult<T>): boolean {\n\t\t\t\tif (waiter) {\n\t\t\t\t\tconst w = waiter;\n\t\t\t\t\twaiter = null;\n\t\t\t\t\tw(result);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Start consuming all sources\n\t\t\tfor (const source of sources) {\n\t\t\t\tconst iter = source[Symbol.asyncIterator]();\n\t\t\t\tsourceIterators.push(iter);\n\t\t\t\t(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twhile (!stopped) {\n\t\t\t\t\t\t\tconst result = await iter.next();\n\t\t\t\t\t\t\tif (result.done || stopped) break;\n\t\t\t\t\t\t\tif (!notifyWaiter({ value: result.value, done: false })) {\n\t\t\t\t\t\t\t\tif (buffer.length < MAX_BUFFER) {\n\t\t\t\t\t\t\t\t\tbuffer.push(result.value);\n\t\t\t\t\t\t\t\t} else if (!hasWarnedDrop) {\n\t\t\t\t\t\t\t\t\thasWarnedDrop = true;\n\t\t\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\t\t`[Directive mergeStreams] Buffer exceeded ${MAX_BUFFER} items. ` +\n\t\t\t\t\t\t\t\t\t\t`Values are being dropped. Ensure the consumer keeps up or use bounded StreamChannel sources.`\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (!stopped) {\n\t\t\t\t\t\t\tstopped = true;\n\t\t\t\t\t\t\terrorState = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\tnotifyWaiter({ value: undefined as unknown as T, done: true });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdoneCount++;\n\t\t\t\t\tif (doneCount >= sources.length && !stopped) {\n\t\t\t\t\t\tnotifyWaiter({ value: undefined as unknown as T, done: true });\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tnext(): Promise<IteratorResult<T>> {\n\t\t\t\t\tif (errorState) {\n\t\t\t\t\t\treturn Promise.reject(errorState);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (buffer.length > 0) {\n\t\t\t\t\t\treturn Promise.resolve({ value: buffer.shift()!, done: false });\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doneCount >= sources.length) {\n\t\t\t\t\t\treturn Promise.resolve({ value: undefined as unknown as T, done: true });\n\t\t\t\t\t}\n\n\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\twaiter = resolve;\n\t\t\t\t\t});\n\t\t\t\t},\n\n\t\t\t\treturn(): Promise<IteratorResult<T>> {\n\t\t\t\t\tstopped = true;\n\t\t\t\t\tbuffer.length = 0;\n\t\t\t\t\tfor (const iter of sourceIterators) {\n\t\t\t\t\t\titer.return?.({ value: undefined as unknown as T, done: true });\n\t\t\t\t\t}\n\t\t\t\t\tif (waiter) {\n\t\t\t\t\t\tconst w = waiter;\n\t\t\t\t\t\twaiter = null;\n\t\t\t\t\t\tw({ value: undefined as unknown as T, done: true });\n\t\t\t\t\t}\n\t\t\t\t\treturn Promise.resolve({ value: undefined as unknown as T, done: true });\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n","/**\n * P2: Intelligent Retry — HTTP-status-aware retry wrapper for AgentRunner.\n *\n * Respects 429 Retry-After headers, uses exponential backoff with jitter for 503,\n * and never retries client errors (400/401/403/404/422).\n *\n * @module\n *\n * @example\n * ```typescript\n * import { withRetry, RetryExhaustedError } from '@directive-run/ai';\n *\n * const runner = withRetry(baseRunner, {\n * maxRetries: 3,\n * baseDelayMs: 1000,\n * maxDelayMs: 30000,\n * onRetry: (attempt, error, delayMs) => {\n * console.log(`Retry ${attempt} in ${delayMs}ms: ${error.message}`);\n * },\n * });\n *\n * try {\n * const result = await runner(agent, input);\n * } catch (err) {\n * if (err instanceof RetryExhaustedError) {\n * console.error(`All ${err.retryCount} retries failed:`, err.lastError);\n * }\n * }\n * ```\n */\n\nimport type { AgentRunner, AgentLike, RunResult, RunOptions } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for the intelligent retry wrapper.\n *\n * @example\n * ```typescript\n * const config: RetryConfig = {\n * maxRetries: 3,\n * baseDelayMs: 1000,\n * maxDelayMs: 30000,\n * isRetryable: (error) => !error.message.includes(\"invalid API key\"),\n * onRetry: (attempt, error, delayMs) => {\n * console.log(`Retry ${attempt} after ${delayMs}ms: ${error.message}`);\n * },\n * };\n * ```\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (not counting the initial call). @default 3 */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff. @default 1000 */\n baseDelayMs?: number;\n /** Maximum delay in ms (caps exponential growth). @default 30000 */\n maxDelayMs?: number;\n /** Custom predicate — return `false` to skip retry for specific errors. Called after the built-in HTTP status check. */\n isRetryable?: (error: Error) => boolean;\n /** Called before each retry wait. Useful for logging or metrics. */\n onRetry?: (attempt: number, error: Error, delayMs: number) => void;\n}\n\n/** Error enriched with retry metadata, thrown when all retries are exhausted. */\nexport class RetryExhaustedError extends Error {\n readonly retryCount: number;\n readonly lastError: Error;\n\n constructor(retryCount: number, lastError: Error) {\n super(`[Directive] All ${retryCount} retries exhausted: ${lastError.message}`);\n this.name = \"RetryExhaustedError\";\n this.retryCount = retryCount;\n this.lastError = lastError;\n this.cause = lastError;\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** HTTP status codes that should never be retried. */\nconst NON_RETRYABLE_STATUSES = new Set([400, 401, 403, 404, 422]);\n\n/**\n * Extract HTTP status code from error message or error properties.\n *\n * Checks `error.status` / `error.statusCode` properties first, then falls back\n * to matching common error message patterns like \"request failed: 429\" or \"HTTP 503\".\n */\nexport function parseHttpStatus(error: Error): number | null {\n // Check error properties first (many HTTP libraries set these)\n const errObj = error as unknown as Record<string, unknown>;\n if (typeof errObj.status === \"number\" && errObj.status >= 100 && errObj.status <= 599) {\n return errObj.status;\n }\n if (typeof errObj.statusCode === \"number\" && errObj.statusCode >= 100 && errObj.statusCode <= 599) {\n return errObj.statusCode;\n }\n\n // Match common error message patterns:\n // \"request failed: 429\", \"HTTP 503\", \"status 401\", \"Error 400\"\n // Guard against scanning very large error messages (ReDoS protection)\n const msg = error.message.length > 1000 ? error.message.slice(0, 1000) : error.message;\n const match = msg.match(/(?:failed|error|status|http)[:\\s]+(\\d{3})\\b/i);\n if (!match) {\n return null;\n }\n\n const status = Number(match[1]);\n if (status >= 100 && status <= 599) {\n return status;\n }\n\n return null;\n}\n\n/**\n * Extract Retry-After value (in ms) from error message.\n *\n * Per HTTP spec, `Retry-After` numeric values are always in seconds.\n * Returns the value converted to milliseconds.\n */\nexport function parseRetryAfter(error: Error): number | null {\n // Check error properties first (many HTTP libraries set these)\n const errObj = error as unknown as Record<string, unknown>;\n if (typeof errObj.retryAfter === \"number\" && errObj.retryAfter > 0) {\n return errObj.retryAfter * 1000;\n }\n\n // Guard against scanning very large error messages (ReDoS protection)\n const msg = error.message.length > 1000 ? error.message.slice(0, 1000) : error.message;\n const match = msg.match(/retry[- ]?after[:\\s]+(\\d+)/i);\n if (!match) {\n return null;\n }\n\n const seconds = Number(match![1]);\n if (seconds > 0) {\n return seconds * 1000;\n }\n\n return null;\n}\n\n/** Calculate delay with exponential backoff and jitter. */\nfunction calculateBackoffDelay(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number,\n): number {\n const exponential = baseDelayMs * Math.pow(2, attempt - 1);\n const jitter = Math.random() * baseDelayMs * 0.5;\n const delay = exponential + jitter;\n\n return Math.min(delay, maxDelayMs);\n}\n\n/** Determine delay for a given error and attempt. */\nfunction getRetryDelay(\n error: Error,\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number,\n): number {\n const status = parseHttpStatus(error);\n\n // 429: Prefer Retry-After header value\n if (status === 429) {\n const retryAfter = parseRetryAfter(error);\n if (retryAfter !== null) {\n return Math.min(retryAfter, maxDelayMs);\n }\n }\n\n // All retryable statuses: exponential backoff with jitter\n return calculateBackoffDelay(attempt, baseDelayMs, maxDelayMs);\n}\n\n/** Check if an error is retryable based on HTTP status. */\nfunction isStatusRetryable(error: Error): boolean {\n const status = parseHttpStatus(error);\n if (status === null) {\n // No HTTP status — default to retryable (network errors, timeouts, etc.)\n return true;\n }\n\n return !NON_RETRYABLE_STATUSES.has(status);\n}\n\n// ============================================================================\n// Wrapper\n// ============================================================================\n\n/**\n * Wrap an AgentRunner with intelligent retry logic.\n *\n * @example\n * ```typescript\n * const runner = withRetry(baseRunner, {\n * maxRetries: 3,\n * baseDelayMs: 1000,\n * onRetry: (attempt, error, delayMs) => {\n * console.log(`Retry ${attempt} after ${delayMs}ms: ${error.message}`);\n * },\n * });\n * ```\n */\nexport function withRetry(runner: AgentRunner, config: RetryConfig = {}): AgentRunner {\n const {\n maxRetries = 3,\n baseDelayMs = 1000,\n maxDelayMs = 30000,\n isRetryable,\n onRetry,\n } = config;\n\n // Validate config\n if (!Number.isFinite(maxRetries) || maxRetries < 0) {\n throw new Error(\"[Directive] withRetry: maxRetries must be a non-negative finite number.\");\n }\n if (!Number.isFinite(baseDelayMs) || baseDelayMs < 0) {\n throw new Error(\"[Directive] withRetry: baseDelayMs must be a non-negative finite number.\");\n }\n if (!Number.isFinite(maxDelayMs) || maxDelayMs < 0) {\n throw new Error(\"[Directive] withRetry: maxDelayMs must be a non-negative finite number.\");\n }\n\n return async <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<T>> => {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await runner<T>(agent, input, options);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Check if we should retry\n if (attempt >= maxRetries) {\n break;\n }\n\n // Check custom retryable predicate\n if (isRetryable) {\n try {\n if (!isRetryable(lastError)) {\n break;\n }\n } catch {\n // isRetryable threw — treat as non-retryable\n break;\n }\n }\n\n // Check HTTP status retryability\n if (!isStatusRetryable(lastError)) {\n break;\n }\n\n // Calculate delay\n const delayMs = getRetryDelay(lastError, attempt + 1, baseDelayMs, maxDelayMs);\n try { onRetry?.(attempt + 1, lastError, delayMs); } catch { /* callback error must not disrupt retry flow */ }\n\n // Wait before retrying (abortable via signal)\n const signal = options?.signal;\n if (signal?.aborted) {\n break;\n }\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n function onAbort() {\n clearTimeout(timer);\n reject(signal!.reason ?? new Error(\"Aborted\"));\n }\n if (signal) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n }\n }\n\n // All retries exhausted\n throw new RetryExhaustedError(maxRetries, lastError!);\n };\n}\n","/**\n * P0: Provider Fallback Chains — Automatic failover across multiple AgentRunners.\n *\n * Tries runners in order, moving to the next on failure.\n * Composes naturally with {@link withRetry} (each runner can have its own retry policy).\n *\n * @module\n *\n * @example\n * ```typescript\n * import { withFallback, withRetry, AllProvidersFailedError } from '@directive-run/ai';\n *\n * const runner = withFallback([\n * withRetry(openaiRunner, { maxRetries: 2 }),\n * withRetry(anthropicRunner, { maxRetries: 2 }),\n * ollamaRunner,\n * ], {\n * onFallback: (from, to, error) => {\n * console.log(`Provider ${from} failed, trying ${to}: ${error.message}`);\n * },\n * });\n *\n * try {\n * const result = await runner(agent, input);\n * } catch (err) {\n * if (err instanceof AllProvidersFailedError) {\n * console.error(`All ${err.errors.length} providers failed`);\n * }\n * }\n * ```\n */\n\nimport type { AgentRunner, AgentLike, RunResult, RunOptions } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FallbackConfig {\n /** Custom predicate to decide whether to fall back on a given error. Default: always fall back. */\n shouldFallback?: (error: Error) => boolean;\n /** Called when falling back from one provider to the next. */\n onFallback?: (fromIndex: number, toIndex: number, error: Error) => void;\n}\n\n/** Error thrown when all providers in the fallback chain have failed. */\nexport class AllProvidersFailedError extends Error {\n readonly errors: Error[];\n\n constructor(errors: Error[]) {\n const summary = errors\n .map((e, i) => ` [${i}] ${e.message}`)\n .join(\"\\n\");\n super(`[Directive] All ${errors.length} providers failed:\\n${summary}`);\n this.name = \"AllProvidersFailedError\";\n this.errors = Object.freeze([...errors]) as Error[];\n // Chain causes for debugging\n if (errors.length > 0) {\n this.cause = errors[errors.length - 1];\n }\n }\n}\n\n// ============================================================================\n// Wrapper\n// ============================================================================\n\n/**\n * Wrap multiple AgentRunners into a fallback chain.\n *\n * @example\n * ```typescript\n * const runner = withFallback([\n * withRetry(openaiRunner, { maxRetries: 2 }),\n * withRetry(anthropicRunner, { maxRetries: 2 }),\n * ollamaRunner,\n * ], {\n * onFallback: (from, to, error) => {\n * console.log(`Falling back from provider ${from} to ${to}: ${error.message}`);\n * },\n * });\n * ```\n */\nexport function withFallback(\n runners: AgentRunner[],\n config: FallbackConfig = {},\n): AgentRunner {\n if (runners.length === 0) {\n throw new Error(\"[Directive] withFallback requires at least one runner.\");\n }\n\n const { shouldFallback, onFallback } = config;\n\n return async <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<T>> => {\n const errors: Error[] = [];\n\n for (let i = 0; i < runners.length; i++) {\n try {\n return await runners[i]!<T>(agent, input, options);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n errors.push(error);\n\n // Check if we should fall back to next provider\n if (i < runners.length - 1) {\n if (shouldFallback) {\n try {\n if (!shouldFallback(error)) {\n break;\n }\n } catch {\n // shouldFallback threw — treat as non-fallbackable\n break;\n }\n }\n try { onFallback?.(i, i + 1, error); } catch { /* callback error must not disrupt fallback flow */ }\n }\n }\n }\n\n throw new AllProvidersFailedError(errors);\n };\n}\n","/**\n * P1: Cost Budget Guards — Pre-call estimation + rolling budget windows.\n *\n * Prevents runaway LLM costs by estimating costs before each call\n * and tracking actual costs after each call. Supports per-call limits\n * and rolling time-window budgets (hourly, daily).\n *\n * @module\n *\n * @example\n * ```typescript\n * import { withBudget, BudgetExceededError } from '@directive-run/ai';\n * import type { BudgetRunner } from '@directive-run/ai';\n *\n * const pricing = { inputPerMillion: 3, outputPerMillion: 15 };\n *\n * const runner = withBudget(baseRunner, {\n * maxCostPerCall: 0.10,\n * pricing,\n * budgets: [\n * { window: \"hour\", maxCost: 5.00, pricing },\n * { window: \"day\", maxCost: 50.00, pricing },\n * ],\n * });\n *\n * // Check spending via escape hatch\n * const spent = (runner as BudgetRunner).getSpent(\"hour\");\n * if (spent > 4.00) {\n * console.warn(\"Approaching hourly budget limit!\");\n * }\n * ```\n */\n\nimport type { AgentRunner, AgentLike, RunResult, RunOptions, TokenUsage } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Token pricing for a specific model or provider.\n *\n * @example\n * ```typescript\n * // GPT-4o pricing (as of 2024)\n * const gpt4oPricing: TokenPricing = {\n * inputPerMillion: 5,\n * outputPerMillion: 15,\n * };\n * ```\n */\nexport interface TokenPricing {\n /** Cost per million input tokens (in dollars). */\n inputPerMillion: number;\n /** Cost per million output tokens (in dollars). */\n outputPerMillion: number;\n}\n\n/**\n * Rolling budget window configuration.\n *\n * Each window tracks cost independently, preventing double-counting\n * when multiple windows are configured.\n *\n * @example\n * ```typescript\n * const hourlyBudget: BudgetWindow = {\n * window: \"hour\",\n * maxCost: 5.00,\n * pricing: { inputPerMillion: 3, outputPerMillion: 15 },\n * };\n * ```\n */\nexport interface BudgetWindow {\n /** Time window for the budget. */\n window: \"hour\" | \"day\";\n /** Maximum cost in dollars for this window. */\n maxCost: number;\n /** Token pricing for cost calculation within this window. */\n pricing: TokenPricing;\n}\n\nexport interface BudgetConfig {\n /** Maximum estimated cost per individual call. */\n maxCostPerCall?: number;\n /** Rolling budget windows. */\n budgets?: BudgetWindow[];\n /** Pricing used for per-call estimation (when maxCostPerCall is set). */\n pricing?: TokenPricing;\n /** Approximate characters per token for input estimation. @default 4 */\n charsPerToken?: number;\n /**\n * Multiplier for estimated output tokens relative to input tokens.\n * For summarization tasks, use a value less than 1 (e.g., 0.3).\n * For generation tasks, use a value greater than 1 (e.g., 3.0).\n * @default 1.0\n */\n estimatedOutputMultiplier?: number;\n /** Called when a budget check fails (before throwing). */\n onBudgetExceeded?: (details: BudgetExceededDetails) => void;\n}\n\nexport interface BudgetExceededDetails {\n estimated: number;\n remaining: number;\n window: \"per-call\" | \"hour\" | \"day\";\n}\n\n/** Error thrown when a budget limit is exceeded. */\nexport class BudgetExceededError extends Error {\n readonly estimated: number;\n readonly remaining: number;\n readonly window: \"per-call\" | \"hour\" | \"day\";\n\n constructor(details: BudgetExceededDetails) {\n super(\n `[Directive] Budget exceeded (${details.window}): estimated $${details.estimated.toFixed(4)}, ` +\n `remaining $${details.remaining.toFixed(4)}`,\n );\n this.name = \"BudgetExceededError\";\n this.estimated = details.estimated;\n this.remaining = details.remaining;\n this.window = details.window;\n }\n}\n\n// ============================================================================\n// Internal: Cost Ledger\n// ============================================================================\n\ninterface CostEntry {\n timestamp: number;\n cost: number;\n}\n\nclass CostLedger {\n private entries: CostEntry[] = [];\n\n record(cost: number): void {\n this.entries.push({ timestamp: Date.now(), cost });\n }\n\n /** Get total cost within a time window. */\n getCostInWindow(windowMs: number): number {\n const cutoff = Date.now() - windowMs;\n this.prune(cutoff);\n\n let total = 0;\n for (const entry of this.entries) {\n if (entry.timestamp >= cutoff) {\n total += entry.cost;\n }\n }\n\n return total;\n }\n\n /** Remove entries older than the cutoff. */\n private prune(cutoff: number): void {\n let pruneIndex = 0;\n while (pruneIndex < this.entries.length && this.entries[pruneIndex]!.timestamp < cutoff) {\n pruneIndex++;\n }\n if (pruneIndex > 0) {\n this.entries.splice(0, pruneIndex);\n }\n }\n\n clear(): void {\n this.entries = [];\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst WINDOW_MS: Record<string, number> = {\n hour: 60 * 60 * 1000,\n day: 24 * 60 * 60 * 1000,\n};\n\nfunction estimateInputTokens(input: string, charsPerToken: number): number {\n return Math.ceil(input.length / charsPerToken);\n}\n\nfunction calculateCost(usage: TokenUsage, pricing: TokenPricing): number {\n return (\n (usage.inputTokens / 1_000_000) * pricing.inputPerMillion +\n (usage.outputTokens / 1_000_000) * pricing.outputPerMillion\n );\n}\n\nfunction estimateCallCost(inputTokens: number, pricing: TokenPricing, outputMultiplier = 1.0): number {\n const estimatedOutputTokens = Math.ceil(inputTokens * outputMultiplier);\n\n return (\n (inputTokens / 1_000_000) * pricing.inputPerMillion +\n (estimatedOutputTokens / 1_000_000) * pricing.outputPerMillion\n );\n}\n\n// ============================================================================\n// Wrapper\n// ============================================================================\n\n/**\n * Wrap an AgentRunner with cost budget guards.\n *\n * @example\n * ```typescript\n * const runner = withBudget(baseRunner, {\n * maxCostPerCall: 0.10,\n * pricing: { inputPerMillion: 3, outputPerMillion: 15 },\n * budgets: [\n * { window: \"hour\", maxCost: 5.00, pricing: { inputPerMillion: 3, outputPerMillion: 15 } },\n * { window: \"day\", maxCost: 50.00, pricing: { inputPerMillion: 3, outputPerMillion: 15 } },\n * ],\n * });\n * ```\n */\nexport function withBudget(runner: AgentRunner, config: BudgetConfig): BudgetRunner {\n const {\n maxCostPerCall,\n budgets = [],\n pricing,\n charsPerToken = 4,\n estimatedOutputMultiplier = 1.0,\n onBudgetExceeded,\n } = config;\n\n // Validate config\n if (!Number.isFinite(charsPerToken) || charsPerToken <= 0) {\n throw new Error(\"[Directive] withBudget: charsPerToken must be a positive finite number.\");\n }\n if (maxCostPerCall != null && (!Number.isFinite(maxCostPerCall) || maxCostPerCall < 0)) {\n throw new Error(\"[Directive] withBudget: maxCostPerCall must be a non-negative finite number.\");\n }\n if (!Number.isFinite(estimatedOutputMultiplier) || estimatedOutputMultiplier < 0) {\n throw new Error(\"[Directive] withBudget: estimatedOutputMultiplier must be a non-negative finite number.\");\n }\n if (maxCostPerCall != null && !pricing) {\n console.warn(\"[Directive] withBudget: maxCostPerCall has no effect without pricing. Provide a pricing config to enable per-call cost estimation.\");\n }\n for (const budget of budgets) {\n if (!Number.isFinite(budget.maxCost) || budget.maxCost < 0) {\n throw new Error(`[Directive] withBudget: budgets[${budget.window}].maxCost must be a non-negative finite number.`);\n }\n }\n\n // Per-window ledgers to avoid double-counting (H3 fix)\n const windowLedgers = new Map<string, CostLedger>();\n for (const budget of budgets) {\n windowLedgers.set(budget.window, new CostLedger());\n }\n // Base pricing ledger (used when no budget windows are configured)\n const baseLedger = new CostLedger();\n\n const budgetRunner: AgentRunner = async <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<T>> => {\n const inputTokens = estimateInputTokens(input, charsPerToken);\n\n // Pre-call: Check per-call budget\n if (maxCostPerCall != null && pricing) {\n const estimated = estimateCallCost(inputTokens, pricing, estimatedOutputMultiplier);\n if (estimated > maxCostPerCall) {\n const details: BudgetExceededDetails = {\n estimated,\n remaining: maxCostPerCall,\n window: \"per-call\",\n };\n try { onBudgetExceeded?.(details); } catch { /* callback error must not disrupt budget flow */ }\n throw new BudgetExceededError(details);\n }\n }\n\n // Pre-call: Check rolling window budgets\n for (const budget of budgets) {\n const windowMs = WINDOW_MS[budget.window]!;\n const ledger = windowLedgers.get(budget.window)!;\n const spent = ledger.getCostInWindow(windowMs);\n const remaining = budget.maxCost - spent;\n const estimated = estimateCallCost(inputTokens, budget.pricing, estimatedOutputMultiplier);\n\n if (estimated > remaining) {\n const details: BudgetExceededDetails = {\n estimated,\n remaining: Math.max(0, remaining),\n window: budget.window,\n };\n try { onBudgetExceeded?.(details); } catch { /* callback error must not disrupt budget flow */ }\n throw new BudgetExceededError(details);\n }\n }\n\n // Execute the call\n const result = await runner<T>(agent, input, options);\n\n // Post-call: Record actual costs in per-window ledgers\n if (result.tokenUsage) {\n for (const budget of budgets) {\n const ledger = windowLedgers.get(budget.window)!;\n const actualCost = calculateCost(result.tokenUsage, budget.pricing);\n ledger.record(actualCost);\n }\n // Record in base ledger when no windows configured\n if (pricing && budgets.length === 0) {\n const actualCost = calculateCost(result.tokenUsage, pricing);\n baseLedger.record(actualCost);\n }\n }\n\n return result;\n };\n\n /**\n * Get cost spent within a given window. Useful for dashboards and preemptive alerts.\n *\n * @example\n * ```typescript\n * const runner = withBudget(baseRunner, { budgets: [{ window: \"hour\", maxCost: 10, pricing }] });\n * const spent = (runner as BudgetRunner).getSpent(\"hour\");\n * if (spent > 8) console.warn(\"Approaching hourly budget limit!\");\n * ```\n */\n function getSpent(window: \"hour\" | \"day\"): number {\n const ledger = windowLedgers.get(window);\n if (!ledger) {\n return 0;\n }\n const windowMs = WINDOW_MS[window]!;\n\n return ledger.getCostInWindow(windowMs);\n }\n\n // Attach getSpent as a direct property for type-safe access without casting\n (budgetRunner as unknown as Record<string, unknown>).getSpent = getSpent;\n\n return budgetRunner as unknown as BudgetRunner;\n}\n\n/** Helper type for accessing budget runner's getSpent method. */\nexport type BudgetRunner = AgentRunner & {\n /** Get cost spent within a rolling window. */\n getSpent(window: \"hour\" | \"day\"): number;\n};\n","/**\n * P3: Smart Model Selection — Rule-based model routing for AgentRunner.\n *\n * Route simple tasks to cheaper models and complex tasks to expensive ones,\n * reducing cost without sacrificing quality where it matters.\n *\n * Rules are evaluated in order; the first match wins. If no rule matches,\n * the agent's original model is used unchanged.\n *\n * Accepts either a {@link ModelSelectionConfig} object (recommended) or\n * a bare `ModelRule[]` array for convenience.\n *\n * @module\n *\n * @example Config object (recommended)\n * ```typescript\n * import { withModelSelection, byInputLength, byAgentName, byPattern } from '@directive-run/ai';\n *\n * const runner = withModelSelection(baseRunner, {\n * rules: [\n * byInputLength(200, \"gpt-4o-mini\"),\n * byAgentName(\"summarizer\", \"gpt-4o-mini\"),\n * byPattern(/classify|categorize/i, \"gpt-4o-mini\"),\n * ],\n * onModelSelected: (original, selected) => {\n * if (original !== selected) console.log(`Routed ${original} → ${selected}`);\n * },\n * });\n * ```\n *\n * @example Shorthand (rules array)\n * ```typescript\n * const runner = withModelSelection(baseRunner, [\n * byInputLength(200, \"gpt-4o-mini\"),\n * ]);\n * ```\n */\n\nimport type { AgentRunner, AgentLike, RunResult, RunOptions } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A single model selection rule. First match wins. */\nexport interface ModelRule {\n /** Predicate that determines if this rule applies. */\n match: (agent: AgentLike, input: string) => boolean;\n /** The model to use when this rule matches. */\n model: string;\n}\n\n/** Configuration for model selection. */\nexport interface ModelSelectionConfig {\n /** Rules evaluated in order. First match wins. */\n rules: ModelRule[];\n /** Called when a model is selected (even if it matches the original). */\n onModelSelected?: (originalModel: string | undefined, selectedModel: string | undefined) => void;\n}\n\n// ============================================================================\n// Convenience Matchers\n// ============================================================================\n\n/**\n * Match when input character length is at most `maxLength`.\n *\n * @example\n * ```typescript\n * byInputLength(500, \"gpt-4o-mini\") // inputs up to 500 chars use mini\n * ```\n */\nexport function byInputLength(maxLength: number, model: string): ModelRule {\n return {\n match: (_agent, input) => input.length <= maxLength,\n model,\n };\n}\n\n/**\n * Match by agent name (exact string match).\n *\n * @example\n * ```typescript\n * byAgentName(\"classifier\", \"gpt-4o-mini\")\n * ```\n */\nexport function byAgentName(name: string, model: string): ModelRule {\n return {\n match: (agent) => agent.name === name,\n model,\n };\n}\n\n/**\n * Match by regex pattern on the input text.\n *\n * @example\n * ```typescript\n * byPattern(/classify|categorize/i, \"gpt-4o-mini\") // classification prompts use mini\n * ```\n */\nexport function byPattern(pattern: RegExp, model: string): ModelRule {\n return {\n match: (_agent, input) => {\n // Reset lastIndex for stateful regexes (e.g., /g flag)\n pattern.lastIndex = 0;\n\n return pattern.test(input);\n },\n model,\n };\n}\n\n// ============================================================================\n// Wrapper\n// ============================================================================\n\n/**\n * Wrap an AgentRunner with rule-based model selection.\n *\n * Rules are evaluated in order. The first match wins and overrides `agent.model`.\n * If no rule matches, the agent's original model is used.\n *\n * Accepts either a config object or a bare `ModelRule[]` for convenience.\n *\n * @example\n * ```typescript\n * // Config object (recommended)\n * const runner = withModelSelection(baseRunner, {\n * rules: [\n * byInputLength(200, \"gpt-4o-mini\"),\n * byAgentName(\"summarizer\", \"gpt-4o-mini\"),\n * byPattern(/classify|categorize/i, \"gpt-4o-mini\"),\n * ],\n * onModelSelected: (original, selected) => {\n * console.log(`Model: ${original} → ${selected}`);\n * },\n * });\n *\n * // Shorthand (rules array)\n * const runner = withModelSelection(baseRunner, [\n * byInputLength(200, \"gpt-4o-mini\"),\n * ]);\n * ```\n */\nexport function withModelSelection(\n runner: AgentRunner,\n configOrRules: ModelSelectionConfig | ModelRule[],\n): AgentRunner {\n const config = Array.isArray(configOrRules)\n ? { rules: configOrRules }\n : configOrRules;\n const { rules, onModelSelected } = config;\n\n return async <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<T>> => {\n let selectedModel = agent.model;\n\n for (const rule of rules) {\n try {\n if (rule.match(agent, input)) {\n selectedModel = rule.model;\n break;\n }\n } catch {\n // Throwing match function is skipped — do not crash model selection\n }\n }\n\n try { onModelSelected?.(agent.model, selectedModel); } catch { /* callback error must not disrupt model selection flow */ }\n\n // Override model if a rule matched and model is different\n const effectiveAgent = selectedModel !== agent.model\n ? { ...agent, model: selectedModel }\n : agent;\n\n return runner<T>(effectiveAgent, input, options);\n };\n}\n","/**\n * P6: Structured Outputs — Schema validation with auto-retry for LLM responses.\n *\n * Turns unreliable text output into typed, validated data. Appends JSON schema\n * instructions to the system prompt and retries with error feedback on parse failure.\n *\n * Works with any Zod-compatible schema (any object with a `safeParse` method).\n *\n * @module\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n * import { withStructuredOutput, StructuredOutputError } from '@directive-run/ai';\n *\n * const SentimentSchema = z.object({\n * sentiment: z.enum([\"positive\", \"negative\", \"neutral\"]),\n * confidence: z.number().min(0).max(1),\n * });\n *\n * const runner = withStructuredOutput(baseRunner, {\n * schema: SentimentSchema,\n * maxRetries: 2,\n * });\n *\n * const result = await runner(agent, \"Analyze: I love this product!\");\n * // result.output is typed as { sentiment: string; confidence: number }\n * ```\n */\n\nimport type { AgentRunner, AgentLike, RunResult, RunOptions } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Zod-compatible schema duck type — any object with a `safeParse` method.\n *\n * This interface allows structured outputs to work with Zod, Valibot,\n * or any validation library that implements this pattern.\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n *\n * // Zod schemas implement SafeParseable automatically\n * const schema = z.object({ name: z.string() });\n *\n * // Custom schema\n * const custom: SafeParseable<{ name: string }> = {\n * safeParse(value) {\n * if (typeof value === \"object\" && value && \"name\" in value) {\n * return { success: true, data: value as { name: string } };\n * }\n * return { success: false, error: { message: \"Missing name field\" } };\n * },\n * };\n * ```\n */\nexport interface SafeParseable<T = unknown> {\n safeParse(value: unknown): SafeParseResult<T>;\n /** Optional: schema description injected into the system prompt. */\n description?: string;\n}\n\nexport interface SafeParseResult<T> {\n success: boolean;\n data?: T;\n error?: { message?: string; issues?: Array<{ message: string }> };\n}\n\nexport interface StructuredOutputConfig<T = unknown> {\n /** Zod-compatible schema with safeParse. */\n schema: SafeParseable<T>;\n /** Max retries on parse/validation failure. @default 2 */\n maxRetries?: number;\n /** Custom JSON extractor. Default: finds first `{...}` or `[...]` in output. */\n extractJson?: (output: string) => unknown;\n /** Schema description to inject into system prompt. Auto-derived from schema.description if available. */\n schemaDescription?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Maximum output length to process (1MB). */\nconst MAX_EXTRACT_LENGTH = 1_048_576;\n\n/** Default JSON extractor — finds the first `{...}` or `[...]` in output. */\nexport function extractJsonFromOutput(output: string): unknown {\n if (output.length > MAX_EXTRACT_LENGTH) {\n throw new Error(`[Directive] Output too large for JSON extraction (${output.length} chars, max ${MAX_EXTRACT_LENGTH}).`);\n }\n\n const trimmed = output.trim();\n\n // Try direct parse first\n try {\n return JSON.parse(trimmed);\n } catch {\n // Continue to extraction\n }\n\n // Try to find JSON object or array\n const objectStart = trimmed.indexOf(\"{\");\n const arrayStart = trimmed.indexOf(\"[\");\n\n let start: number;\n let openChar: string;\n let closeChar: string;\n\n if (objectStart === -1 && arrayStart === -1) {\n throw new Error(\"[Directive] No JSON object or array found in output\");\n }\n\n if (objectStart === -1) {\n start = arrayStart;\n openChar = \"[\";\n closeChar = \"]\";\n } else if (arrayStart === -1) {\n start = objectStart;\n openChar = \"{\";\n closeChar = \"}\";\n } else {\n start = Math.min(objectStart, arrayStart);\n openChar = start === objectStart ? \"{\" : \"[\";\n closeChar = start === objectStart ? \"}\" : \"]\";\n }\n\n // Find matching closing bracket\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let i = start; i < trimmed.length; i++) {\n const char = trimmed[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) {\n continue;\n }\n\n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n const jsonStr = trimmed.slice(start, i + 1);\n\n return JSON.parse(jsonStr);\n }\n }\n }\n\n throw new Error(\"[Directive] No valid JSON found in output\");\n}\n\n/** Format validation errors for feedback. */\nfunction formatValidationError(error: SafeParseResult<unknown>[\"error\"]): string {\n if (!error) {\n return \"Validation failed\";\n }\n\n if (error.issues && error.issues.length > 0) {\n return error.issues.map((issue) => issue.message).join(\"; \");\n }\n\n return error.message ?? \"Validation failed\";\n}\n\n// ============================================================================\n// Wrapper\n// ============================================================================\n\n/**\n * Wrap an AgentRunner with structured output parsing and validation.\n *\n * @example\n * ```typescript\n * import { z } from \"zod\";\n *\n * const SentimentSchema = z.object({\n * sentiment: z.enum([\"positive\", \"negative\", \"neutral\"]),\n * confidence: z.number().min(0).max(1),\n * });\n *\n * const runner = withStructuredOutput(baseRunner, {\n * schema: SentimentSchema,\n * maxRetries: 2,\n * });\n *\n * const result = await runner(agent, \"Analyze: I love this product!\");\n * // result.output is typed as { sentiment: string; confidence: number }\n * ```\n */\nexport function withStructuredOutput<T = unknown>(\n runner: AgentRunner,\n config: StructuredOutputConfig<T>,\n): AgentRunner {\n const {\n schema,\n maxRetries = 2,\n extractJson = extractJsonFromOutput,\n schemaDescription,\n } = config;\n\n // Validate config\n if (!Number.isFinite(maxRetries) || maxRetries < 0) {\n throw new Error(\"[Directive] withStructuredOutput: maxRetries must be a non-negative finite number.\");\n }\n\n const schemaPrompt = schemaDescription ?? schema.description ?? \"the specified JSON schema\";\n\n // The returned runner produces `T` from the schema. We cast at the\n // boundary to satisfy the `AgentRunner` generic while keeping output type-safe.\n return async <_T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<_T>> => {\n // Append JSON instruction to agent's system prompt\n const structuredAgent: AgentLike = {\n ...agent,\n instructions: (agent.instructions ?? \"\") +\n \"\\n\\nIMPORTANT: Respond with valid JSON matching \" + schemaPrompt + \". \" +\n \"Output ONLY the JSON object, no additional text or markdown formatting.\",\n };\n\n let lastResult: RunResult<unknown> | undefined;\n let lastError: string | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // On retries, append error feedback as additional input\n const effectiveInput = attempt === 0\n ? input\n : `${input}\\n\\nYour previous response was not valid JSON. Error: ${lastError}\\nPlease try again with valid JSON only.`;\n\n const result = await runner(structuredAgent, effectiveInput, options);\n lastResult = result;\n\n // Try to extract and validate JSON\n const outputStr = typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output);\n\n try {\n const extracted = extractJson(outputStr);\n const parsed = schema.safeParse(extracted);\n\n if (parsed.success) {\n return {\n ...result,\n output: parsed.data as _T,\n };\n }\n\n lastError = formatValidationError(parsed.error);\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n }\n\n // All retries exhausted — throw with context\n throw new StructuredOutputError(\n `[Directive] Failed to get valid structured output after ${maxRetries + 1} attempts: ${lastError}`,\n lastResult,\n );\n };\n}\n\n/** Error thrown when structured output parsing fails after all retries. */\nexport class StructuredOutputError extends Error {\n readonly lastResult: RunResult<unknown> | undefined;\n\n constructor(message: string, lastResult?: RunResult<unknown>) {\n super(message);\n this.name = \"StructuredOutputError\";\n this.lastResult = lastResult;\n }\n}\n","/**\n * Agent Stack — Composition API for AI Adapters\n *\n * One factory that wires orchestrator, memory, circuit breaker, rate limiter,\n * streaming, multi-agent patterns, semantic cache, observability, OTLP export,\n * and communication bus with sensible defaults.\n *\n * @example Basic usage\n * ```typescript\n * import { createAgentStack, parallel } from '@directive-run/ai';\n *\n * const stack = createAgentStack({\n * runner: myAgentRunner,\n * agents: { move: { agent: moveAgent, capabilities: [\"move\"] } },\n * memory: { maxMessages: 30 },\n * circuitBreaker: { failureThreshold: 3 },\n * cache: { threshold: 0.98, maxSize: 200, ttlMs: 600_000 },\n * observability: { serviceName: \"my-app\" },\n * });\n *\n * const result = await stack.run(\"move\", input);\n * ```\n *\n * @example Streaming\n * ```typescript\n * const stack = createAgentStack({\n * runner: myAgentRunner,\n * streaming: { runner: myStreamingAgentRunner },\n * agents: { chat: { agent: chatAgent, capabilities: [\"chat\"] } },\n * });\n *\n * const tokenStream = stack.stream(\"chat\", \"Hello!\");\n * for await (const token of tokenStream) { process.stdout.write(token); }\n * const finalResult = await tokenStream.result;\n * ```\n */\n\nimport type {\n AgentRunner,\n RunResult,\n AgentLike,\n Message,\n GuardrailFn,\n InputGuardrailData,\n OutputGuardrailData,\n NamedGuardrail,\n OrchestratorConstraint,\n OrchestratorResolver,\n OrchestratorLifecycleHooks,\n AgentRetryConfig,\n ApprovalRequest,\n} from \"./types.js\";\nimport type { RunCallOptions, AgentOrchestrator } from \"./index.js\";\nimport type { Requirement } from \"@directive-run/core\";\nimport type { StreamingGuardrail, StreamChunk, StreamRunner, StreamingRunResult } from \"./streaming.js\";\nimport type { AgentMemory, MemoryStrategyConfig } from \"./memory.js\";\nimport type { CircuitBreaker, CircuitState, CircuitBreakerConfig } from \"@directive-run/core/plugins\";\nimport type { ObservabilityInstance, AlertConfig, TraceSpan, AggregatedMetric } from \"@directive-run/core/plugins\";\nimport type { OTLPExporter } from \"@directive-run/core/plugins\";\nimport type { SemanticCache, CacheStats, EmbedderFn } from \"./guardrails/semantic-cache.js\";\nimport type { MessageBus, TypedAgentMessage } from \"./communication.js\";\nimport type { AgentRegistry, ExecutionPattern, MultiAgentOrchestrator } from \"./multi.js\";\nimport type { StreamChannel } from \"./stream-channel.js\";\nimport type { RetryConfig } from \"./retry.js\";\nimport type { FallbackConfig } from \"./fallback.js\";\nimport type { BudgetConfig } from \"./budget.js\";\nimport type { ModelRule } from \"./model-selector.js\";\nimport type { StructuredOutputConfig } from \"./structured-output.js\";\n\nimport { createAgentOrchestrator } from \"./index.js\";\nimport { estimateCost } from \"./helpers.js\";\nimport { GuardrailError } from \"./types.js\";\nimport { createAgentMemory, createSlidingWindowStrategy } from \"./memory.js\";\nimport { createCircuitBreaker as createCB } from \"@directive-run/core/plugins\";\nimport { createObservability as createObs, createAgentMetrics } from \"@directive-run/core/plugins\";\nimport { createOTLPExporter } from \"@directive-run/core/plugins\";\nimport { createSemanticCache, createTestEmbedder } from \"./guardrails/semantic-cache.js\";\nimport { createMessageBus as createBus } from \"./communication.js\";\nimport { createMultiAgentOrchestrator } from \"./multi.js\";\nimport { createStreamingRunner } from \"./streaming.js\";\nimport { createStreamChannel, pipeThrough } from \"./stream-channel.js\";\nimport { withRetry } from \"./retry.js\";\nimport { withFallback } from \"./fallback.js\";\nimport { withBudget } from \"./budget.js\";\nimport { withModelSelection } from \"./model-selector.js\";\nimport { withStructuredOutput } from \"./structured-output.js\";\n\n// ============================================================================\n// Config Types\n// ============================================================================\n\n/** Callback-based streaming run function (e.g. for SSE-based LLM APIs) */\nexport type StreamingCallbackRunner = (\n\tagent: AgentLike,\n\tinput: string,\n\tcallbacks: {\n\t\tonToken?: (token: string) => void;\n\t\tonToolStart?: (tool: string, id: string, args: string) => void;\n\t\tonToolEnd?: (tool: string, id: string, result: string) => void;\n\t\tonMessage?: (message: Message) => void;\n\t\tsignal?: AbortSignal;\n\t},\n) => Promise<RunResult<unknown>>;\n\nexport interface AgentStackConfig {\n\t/** Required: base runner for agent execution */\n\trunner: AgentRunner;\n\t/** Enables stack.stream() when provided */\n\tstreaming?: { runner: StreamingCallbackRunner };\n\t/** Agent registry — required for multi-agent patterns */\n\tagents?: AgentRegistry;\n\t/** Named execution patterns (parallel, sequential, supervisor) */\n\tpatterns?: Record<string, ExecutionPattern>;\n\n\t// Features — each auto-wires when present. Accepts shorthand config OR pre-built instance.\n\tmemory?: { maxMessages?: number; preserveRecentCount?: number } | AgentMemory;\n\tcircuitBreaker?: CircuitBreakerConfig | CircuitBreaker;\n\trateLimit?: { maxPerMinute: number };\n\tcache?:\n\t\t| { threshold?: number; maxSize?: number; ttlMs?: number; embedder?: EmbedderFn }\n\t\t| SemanticCache;\n\tobservability?: { serviceName: string; alerts?: AlertConfig[] } | ObservabilityInstance;\n\totlp?: {\n\t\tendpoint: string;\n\t\tintervalMs?: number;\n\t\tonError?: (err: Error, type: \"metrics\" | \"traces\") => void;\n\t};\n\t/** @deprecated Use `messageBus` instead */\n\tbus?: { maxHistory?: number } | MessageBus;\n\t/** Message bus for agent communication */\n\tmessageBus?: { maxHistory?: number } | MessageBus;\n\n\tguardrails?: {\n\t\tinput?: Array<GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>>;\n\t\toutput?: Array<GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>>;\n\t\tstreaming?: StreamingGuardrail[];\n\t};\n\tmaxTokenBudget?: number;\n\t/** Cost per million tokens for cost estimation */\n\tcostPerMillionTokens?: number;\n\t/** @deprecated Use `costPerMillionTokens` */\n\tcostRatePerMillion?: number;\n\tdebug?: boolean;\n\n\t// Directive constraint-driven orchestration\n\tconstraints?: Record<string, OrchestratorConstraint<Record<string, unknown>>>;\n\tresolvers?: Record<string, OrchestratorResolver<Record<string, unknown>, Requirement>>;\n\n\t// Approval workflows\n\tapprovals?: {\n\t\t/** @default true */\n\t\tautoApproveToolCalls?: boolean;\n\t\tonRequest?: (request: ApprovalRequest) => void;\n\t\t/** @default 300_000 */\n\t\ttimeoutMs?: number;\n\t};\n\n\t// Agent retry policy\n\tretry?: AgentRetryConfig;\n\n\t// Lifecycle hooks for observability\n\thooks?: OrchestratorLifecycleHooks;\n\n\t// --- Advanced AI features (P0–P6) ---\n\n\t/** P2: Intelligent retry config for the base runner. */\n\tintelligentRetry?: RetryConfig;\n\t/** P0: Fallback runners (tried in order on failure). */\n\tfallback?: { runners: AgentRunner[]; config?: FallbackConfig };\n\t/** P1: Cost budget guards. */\n\tbudget?: BudgetConfig;\n\t/** P3: Model selection rules (first match wins). */\n\tmodelSelection?: ModelRule[];\n\t/** P6: Structured output config (applied per-agent via agents map, or globally here). */\n\tstructuredOutput?: StructuredOutputConfig;\n}\n\n// ============================================================================\n// Return Types\n// ============================================================================\n\nexport interface StackRunOptions {\n\t/** Override output guardrails for this call */\n\tguardrails?: {\n\t\toutput?: Array<GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>>;\n\t};\n\t/** Set to false to skip cache for this call */\n\tcache?: false;\n\t/** AbortSignal for cancellation */\n\tsignal?: AbortSignal;\n}\n\nexport interface StackStreamOptions {\n\tsignal?: AbortSignal;\n}\n\nexport interface TokenStream<T = string> extends AsyncIterable<string> {\n\t/** Resolves to the final run result after the stream completes */\n\tresult: Promise<RunResult<T>>;\n\t/** Abort the stream */\n\tabort: () => void;\n}\n\nexport interface AgentStackState {\n\ttotalTokens: number;\n\testimatedCost: number;\n\tcircuitState: CircuitState;\n\tcacheStats: CacheStats;\n\tmemoryMessageCount: number;\n\tbusMessageCount: number;\n\trateLimitRemaining: number | null;\n}\n\n/** Options for runStructured() */\nexport interface StructuredRunOptions<_T = unknown> extends StackRunOptions {\n\t/** Validate the output. Return `true` or `{ valid: true }` on success. */\n\tvalidate: (value: unknown) => boolean | { valid: boolean; errors?: string[] };\n\t/** Number of retry attempts on validation failure @default 1 */\n\tretries?: number;\n}\n\nexport interface AgentStack {\n\t/** Run a single registered agent by ID */\n\trun<T = unknown>(agentId: string, input: string, options?: StackRunOptions): Promise<RunResult<T>>;\n\t/** Run and validate output against a schema, retrying on failure */\n\trunStructured<T>(agentId: string, input: string, options: StructuredRunOptions<T>): Promise<RunResult<T>>;\n\t/** Run a named execution pattern */\n\trunPattern<T = unknown>(patternId: string, input: string, options?: StackRunOptions): Promise<T>;\n\t/** Stream tokens from a single agent */\n\tstream<T = string>(agentId: string, input: string, options?: StackStreamOptions): TokenStream<T>;\n\t/** Stream full rich chunks (token, tool_start, tool_end, etc.) from a single agent */\n\tstreamChunks<T = unknown>(agentId: string, input: string, options?: StackStreamOptions): StreamingRunResult<T>;\n\t/** Approve a pending approval request */\n\tapprove(requestId: string): void;\n\t/** Reject a pending approval request */\n\treject(requestId: string, reason?: string): void;\n\t/** Aggregate state across all features */\n\tgetState(): AgentStackState;\n\t/** Reset all feature state */\n\treset(): void;\n\t/** Dispose all resources */\n\tdispose(): Promise<void>;\n\n\t// Escape hatches\n\treadonly orchestrator: AgentOrchestrator<Record<string, unknown>>;\n\treadonly observability: ObservabilityInstance | null;\n\treadonly messageBus: MessageBus | null;\n\treadonly coordinator: MultiAgentOrchestrator | null;\n\treadonly cache: SemanticCache | null;\n\treadonly memory: AgentMemory | null;\n\n\t/** Get observability timeline (spans + metrics) for debugging */\n\tgetTimeline(limit?: number): { spans: readonly TraceSpan[]; metrics: Record<string, AggregatedMetric> };\n\n\t/** @deprecated Use `observability` */\n\treadonly obs: ObservabilityInstance | null;\n\t/** @deprecated Use `messageBus` */\n\treadonly bus: MessageBus | null;\n\t/** @deprecated Use `coordinator` */\n\treadonly multi: MultiAgentOrchestrator | null;\n}\n\n// ============================================================================\n// Expand Helpers — detect pre-built instances vs shorthand config\n// ============================================================================\n\nfunction isPreBuiltMemory(v: unknown): v is AgentMemory {\n\tif (v == null || typeof v !== \"object\") return false;\n\tconst obj = v as Record<string, unknown>;\n\treturn typeof obj.getState === \"function\" && typeof obj.addMessage === \"function\" && typeof obj.clear === \"function\";\n}\n\nfunction expandMemory(\n\tcfg: AgentStackConfig[\"memory\"],\n): AgentMemory | null {\n\tif (!cfg) return null;\n\tif (isPreBuiltMemory(cfg)) return cfg;\n\treturn createAgentMemory({\n\t\tstrategy: createSlidingWindowStrategy(),\n\t\tstrategyConfig: {\n\t\t\tmaxMessages: cfg.maxMessages ?? 50,\n\t\t\tpreserveRecentCount: cfg.preserveRecentCount ?? 6,\n\t\t} as MemoryStrategyConfig,\n\t\tautoManage: true,\n\t});\n}\n\nfunction isPreBuiltCircuitBreaker(v: unknown): v is CircuitBreaker {\n\tif (v == null || typeof v !== \"object\") return false;\n\tconst obj = v as Record<string, unknown>;\n\treturn typeof obj.execute === \"function\" && typeof obj.getState === \"function\" && typeof obj.reset === \"function\";\n}\n\nfunction expandCircuitBreaker(\n\tcfg: AgentStackConfig[\"circuitBreaker\"],\n): CircuitBreaker | null {\n\tif (!cfg) return null;\n\tif (isPreBuiltCircuitBreaker(cfg)) return cfg;\n\tconst castCfg = cfg as CircuitBreakerConfig;\n\tif (castCfg.failureThreshold != null && castCfg.failureThreshold < 1) {\n\t\tthrow new Error(\"[AgentStack] circuitBreaker.failureThreshold must be at least 1.\");\n\t}\n\tif (castCfg.recoveryTimeMs != null && castCfg.recoveryTimeMs < 0) {\n\t\tthrow new Error(\"[AgentStack] circuitBreaker.recoveryTimeMs must be non-negative.\");\n\t}\n\treturn createCB(castCfg);\n}\n\nfunction isPreBuiltObs(v: unknown): v is ObservabilityInstance {\n\tif (v == null || typeof v !== \"object\") return false;\n\tconst obj = v as Record<string, unknown>;\n\treturn typeof obj.startSpan === \"function\" && typeof obj.endSpan === \"function\" && typeof obj.getDashboard === \"function\";\n}\n\nfunction expandObservability(\n\tcfg: AgentStackConfig[\"observability\"],\n): ObservabilityInstance | null {\n\tif (!cfg) return null;\n\tif (isPreBuiltObs(cfg)) return cfg;\n\treturn createObs({\n\t\tserviceName: cfg.serviceName,\n\t\tmetrics: { enabled: true },\n\t\ttracing: { enabled: true, sampleRate: 1.0 },\n\t\talerts: cfg.alerts,\n\t});\n}\n\nfunction isPreBuiltCache(v: unknown): v is SemanticCache {\n\tif (v == null || typeof v !== \"object\") return false;\n\tconst obj = v as Record<string, unknown>;\n\treturn typeof obj.lookup === \"function\" && typeof obj.store === \"function\" && typeof obj.getStats === \"function\";\n}\n\nfunction expandCache(\n\tcfg: AgentStackConfig[\"cache\"],\n): SemanticCache | null {\n\tif (!cfg) return null;\n\tif (isPreBuiltCache(cfg)) return cfg;\n\tif (cfg.threshold != null && (cfg.threshold < 0 || cfg.threshold > 1)) {\n\t\tthrow new Error(\"[AgentStack] cache.threshold must be between 0 and 1.\");\n\t}\n\tif (cfg.maxSize != null && cfg.maxSize < 1) {\n\t\tthrow new Error(\"[AgentStack] cache.maxSize must be at least 1.\");\n\t}\n\tif (!cfg.embedder) {\n\t\tconsole.warn(\"[AgentStack] No cache embedder provided — using test embedder (character frequency). Provide a real embedder for production use.\");\n\t}\n\treturn createSemanticCache({\n\t\tembedder: cfg.embedder ?? createTestEmbedder(),\n\t\tsimilarityThreshold: cfg.threshold ?? 0.95,\n\t\tmaxCacheSize: cfg.maxSize ?? 500,\n\t\tttlMs: cfg.ttlMs ?? 300_000,\n\t});\n}\n\nfunction isPreBuiltBus(v: unknown): v is MessageBus {\n\tif (v == null || typeof v !== \"object\") return false;\n\tconst obj = v as Record<string, unknown>;\n\treturn typeof obj.publish === \"function\" && typeof obj.getHistory === \"function\" && typeof obj.clear === \"function\";\n}\n\nfunction expandBus(cfg: AgentStackConfig[\"bus\"]): MessageBus | null {\n\tif (!cfg) return null;\n\tif (isPreBuiltBus(cfg)) return cfg;\n\treturn createBus({ maxHistory: cfg.maxHistory ?? 100 });\n}\n\n// ============================================================================\n// TokenStreamImpl\n// ============================================================================\n\nclass TokenStreamImpl<T = string> implements TokenStream<T> {\n\tresult: Promise<RunResult<T>>;\n\tabort: () => void;\n\n\tprivate _channel: StreamChannel<string>;\n\n\tconstructor(\n\t\tchannel: StreamChannel<string>,\n\t\tresult: Promise<RunResult<T>>,\n\t\tabort: () => void,\n\t) {\n\t\tthis._channel = channel;\n\t\tthis.result = result;\n\t\tthis.abort = abort;\n\t}\n\n\t[Symbol.asyncIterator](): AsyncIterator<string> {\n\t\treturn this._channel[Symbol.asyncIterator]();\n\t}\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an agent stack that composes all AI adapter features.\n *\n * Only `runner` is required. Every other feature activates when its config key\n * is present. Pass a pre-built instance to reuse existing objects, or pass\n * shorthand config to let the stack create them.\n */\nexport function createAgentStack(config: AgentStackConfig): AgentStack {\n\tconst {\n\t\tstreaming: streamingConfig,\n\t\tagents: agentRegistry,\n\t\tpatterns,\n\t\tguardrails = {},\n\t\tmaxTokenBudget,\n\t\tdebug = false,\n\t} = config;\n\tconst costRatePerMillion = config.costPerMillionTokens ?? config.costRatePerMillion ?? 0;\n\n\t// Warn when both retry systems are configured\n\tif (config.retry && config.intelligentRetry) {\n\t\tconsole.warn(\n\t\t\t\"[AgentStack] Both 'retry' (orchestrator-level) and 'intelligentRetry' (HTTP-aware) are configured. \" +\n\t\t\t\"This causes double-retry behavior. Use 'intelligentRetry' for HTTP status-aware retry, or 'retry' for orchestrator-level retry, but not both.\",\n\t\t);\n\t}\n\n\t// --- Compose runner pipeline (innermost → outermost) ---\n\t// Order: Model Selection → Fallback → Retry → Budget → Structured Output\n\t// The outermost wrapper executes first on each call.\n\tlet runner: AgentRunner = config.runner;\n\n\t// P3: Model Selection (innermost — runs just before the provider)\n\tif (config.modelSelection && config.modelSelection.length > 0) {\n\t\trunner = withModelSelection(runner, config.modelSelection);\n\t}\n\n\t// P0: Fallback (wraps model-selected runner)\n\tif (config.fallback) {\n\t\trunner = withFallback([runner, ...config.fallback.runners], config.fallback.config);\n\t}\n\n\t// P2: Intelligent Retry (wraps fallback chain)\n\tif (config.intelligentRetry) {\n\t\trunner = withRetry(runner, config.intelligentRetry);\n\t}\n\n\t// P1: Budget (wraps retry — budget check happens before any retries)\n\tif (config.budget) {\n\t\trunner = withBudget(runner, config.budget);\n\t}\n\n\t// P6: Structured Output (outermost — validates after everything else)\n\tif (config.structuredOutput) {\n\t\trunner = withStructuredOutput(runner, config.structuredOutput);\n\t}\n\n\t// --- Expand features ---\n\tconst memory = expandMemory(config.memory);\n\tconst circuitBreaker = expandCircuitBreaker(config.circuitBreaker);\n\tconst obsInstance = expandObservability(config.observability);\n\tconst cacheInstance = expandCache(config.cache);\n\tconst busInstance = expandBus(config.messageBus ?? config.bus);\n\n\t// --- Agent metrics helper ---\n\tconst metrics = obsInstance ? createAgentMetrics(obsInstance) : null;\n\n\t// --- Rate limiter (built into orchestrator guardrails) ---\n\tlet rateLimitGuardrail: NamedGuardrail<InputGuardrailData> | null = null;\n\tlet rateLimitTimestamps: number[] | null = null;\n\tlet rateLimitStartIdx = 0;\n\tif (config.rateLimit) {\n\t\tconst { maxPerMinute } = config.rateLimit;\n\t\tif (maxPerMinute < 1 || !Number.isFinite(maxPerMinute)) {\n\t\t\tthrow new Error(\"[AgentStack] rateLimit.maxPerMinute must be a positive finite number.\");\n\t\t}\n\t\trateLimitTimestamps = [];\n\t\tconst timestamps = rateLimitTimestamps;\n\t\trateLimitGuardrail = {\n\t\t\tname: \"rate-limit\",\n\t\t\tfn: () => {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst windowStart = now - 60_000;\n\t\t\t\t// Advance start index past expired entries (O(1) amortized)\n\t\t\t\twhile (rateLimitStartIdx < timestamps.length && timestamps[rateLimitStartIdx]! < windowStart) {\n\t\t\t\t\trateLimitStartIdx++;\n\t\t\t\t}\n\t\t\t\t// Compact when half the array is dead entries\n\t\t\t\tif (rateLimitStartIdx > timestamps.length / 2 && rateLimitStartIdx > 100) {\n\t\t\t\t\ttimestamps.splice(0, rateLimitStartIdx);\n\t\t\t\t\trateLimitStartIdx = 0;\n\t\t\t\t}\n\t\t\t\tconst active = timestamps.length - rateLimitStartIdx;\n\t\t\t\tif (active >= maxPerMinute) {\n\t\t\t\t\treturn { passed: false, reason: `Rate limit exceeded (${maxPerMinute}/min)` };\n\t\t\t\t}\n\t\t\t\ttimestamps.push(now);\n\t\t\t\treturn { passed: true };\n\t\t\t},\n\t\t};\n\t}\n\n\t// --- Build orchestrator input guardrails ---\n\tconst inputGuardrails: Array<GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>> = [\n\t\t...(rateLimitGuardrail ? [rateLimitGuardrail] : []),\n\t\t...(guardrails.input ?? []),\n\t];\n\n\t// --- Core orchestrator ---\n\tconst orchestrator = createAgentOrchestrator({\n\t\trunner,\n\t\tmaxTokenBudget,\n\t\tmemory: memory ?? undefined,\n\t\tcircuitBreaker: circuitBreaker ?? undefined,\n\t\tguardrails: {\n\t\t\tinput: inputGuardrails.length > 0 ? inputGuardrails : undefined,\n\t\t\toutput: guardrails.output,\n\t\t},\n\t\tconstraints: config.constraints,\n\t\tresolvers: config.resolvers,\n\t\tautoApproveToolCalls: config.approvals?.autoApproveToolCalls,\n\t\tonApprovalRequest: config.approvals?.onRequest,\n\t\tapprovalTimeoutMs: config.approvals?.timeoutMs,\n\t\tagentRetry: config.retry,\n\t\thooks: config.hooks,\n\t\tdebug,\n\t});\n\n\t// --- Multi-agent (only when agents are registered) ---\n\tlet multi: MultiAgentOrchestrator | null = null;\n\tif (agentRegistry) {\n\t\tmulti = createMultiAgentOrchestrator({\n\t\t\trunner,\n\t\t\tagents: agentRegistry,\n\t\t\tpatterns,\n\t\t\tdebug,\n\t\t});\n\t}\n\n\t// --- Streaming runner (only when streaming config is provided) ---\n\tlet streamingAgentRunner: StreamRunner | null = null;\n\tif (streamingConfig) {\n\t\tstreamingAgentRunner = createStreamingRunner(streamingConfig.runner, {\n\t\t\tstreamingGuardrails: guardrails.streaming,\n\t\t});\n\t}\n\n\t// --- OTLP export interval ---\n\tlet otlpExporter: OTLPExporter | null = null;\n\tlet otlpInterval: ReturnType<typeof setInterval> | null = null;\n\tif (config.otlp && obsInstance) {\n\t\tif (config.otlp.intervalMs != null && (!Number.isFinite(config.otlp.intervalMs) || config.otlp.intervalMs < 1000)) {\n\t\t\tthrow new Error(\"[AgentStack] otlp.intervalMs must be at least 1000ms.\");\n\t\t}\n\t\totlpExporter = createOTLPExporter({\n\t\t\tendpoint: config.otlp.endpoint,\n\t\t\tserviceName:\n\t\t\t\t(config.observability && !isPreBuiltObs(config.observability))\n\t\t\t\t\t? (config.observability as { serviceName: string }).serviceName\n\t\t\t\t\t: \"directive-agents\",\n\t\t\tonError: config.otlp.onError,\n\t\t});\n\t\tconst otlpOnError = config.otlp.onError;\n\t\tconst intervalMs = config.otlp.intervalMs ?? 15_000;\n\t\totlpInterval = setInterval(() => {\n\t\t\tif (!obsInstance || !otlpExporter) return;\n\t\t\ttry {\n\t\t\t\tconst data = obsInstance.export();\n\t\t\t\tif (data.metrics.length > 0) otlpExporter.exportMetrics(data.metrics);\n\t\t\t\tif (data.traces.length > 0) otlpExporter.exportTraces(data.traces);\n\t\t\t} catch (err) {\n\t\t\t\totlpOnError?.(err instanceof Error ? err : new Error(String(err)), \"metrics\");\n\t\t\t}\n\t\t}, intervalMs);\n\t}\n\n\t// --- Internal token counter ---\n\tlet totalTokens = 0;\n\n\t// --- Resolve agent from registry ---\n\tfunction resolveAgent(agentId: string): AgentLike {\n\t\tif (!agentRegistry) {\n\t\t\tthrow new Error(\n\t\t\t`[AgentStack] No agents registered.\\n` +\n\t\t\t`Add to config: agents: { myAgent: { agent: myAgentDef, description: '...' } }`,\n\t\t);\n\t\t}\n\t\tconst reg = agentRegistry[agentId];\n\t\tif (!reg) {\n\t\t\tconst available = Object.keys(agentRegistry).join(\", \");\n\t\t\tthrow new Error(`[AgentStack] Agent \"${agentId}\" not found in registry. Available: ${available}`);\n\t\t}\n\t\treturn reg.agent;\n\t}\n\n\t// ============================================================================\n\t// run()\n\t// ============================================================================\n\n\tasync function run<T = unknown>(\n\t\tagentId: string,\n\t\tinput: string,\n\t\toptions: StackRunOptions = {},\n\t): Promise<RunResult<T>> {\n\t\tconst agent = resolveAgent(agentId);\n\t\tconst skipCache = options.cache === false;\n\n\t\t// 1. Cache check\n\t\tif (cacheInstance && !skipCache) {\n\t\t\ttry {\n\t\t\t\tconst cached = await cacheInstance.lookup(input, agentId);\n\t\t\t\tif (cached.hit && cached.entry) {\n\t\t\t\t\tobsInstance?.incrementCounter(\"cache.hits\");\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = JSON.parse(cached.entry.response) as T;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\toutput: parsed,\n\t\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t\t\ttoolCalls: [],\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tisCached: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tif (debug) console.debug(`[AgentStack] Cache hit for \"${agentId}\" contained invalid JSON — falling through to fresh run.`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobsInstance?.incrementCounter(\"cache.misses\");\n\t\t\t} catch {\n\t\t\t\t// Cache lookup failed (e.g., embedder error) — treat as miss\n\t\t\t\tobsInstance?.incrementCounter(\"cache.lookup.errors\");\n\t\t\t}\n\t\t}\n\n\t\t// 2. Start span\n\t\tconst span = obsInstance?.startSpan(`agent.${agentId}`);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\t// 3. Run agent — merge per-call overrides with per-agent guardrails\n\t\t\tconst callOpts: RunCallOptions = {};\n\t\t\tif (options.guardrails?.output) {\n\t\t\t\t// Per-call overrides replace stack-level guardrails\n\t\t\t\tcallOpts.outputGuardrails = options.guardrails.output;\n\t\t\t} else if (agentRegistry?.[agentId]?.guardrails?.output) {\n\t\t\t\t// Per-agent guardrails supplement stack-level guardrails\n\t\t\t\tcallOpts.outputGuardrails = [\n\t\t\t\t\t...(guardrails.output ?? []),\n\t\t\t\t\t...agentRegistry[agentId]!.guardrails!.output!,\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (options.signal) {\n\t\t\t\tcallOpts.signal = options.signal;\n\t\t\t}\n\n\t\t\tconst result = await orchestrator.run<T>(agent, input, callOpts);\n\t\t\tconst latencyMs = Date.now() - startTime;\n\t\t\ttotalTokens += result.totalTokens;\n\n\t\t\t// 4. Cache store\n\t\t\tif (cacheInstance && !skipCache && result.output != null) {\n\t\t\t\ttry {\n\t\t\t\t\tconst serialized = typeof result.output === \"string\"\n\t\t\t\t\t\t? result.output\n\t\t\t\t\t\t: JSON.stringify(result.output);\n\t\t\t\t\tawait cacheInstance.store(input, serialized, agentId);\n\t\t\t\t} catch {\n\t\t\t\t\t// Cache store failed (e.g., circular ref in JSON) — non-fatal\n\t\t\t\t\tobsInstance?.incrementCounter(\"cache.store.errors\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 5. Bus publish\n\t\t\tif (busInstance) {\n\t\t\t\tbusInstance.publish({\n\t\t\t\t\ttype: \"INFORM\",\n\t\t\t\t\tfrom: agentId,\n\t\t\t\t\tto: \"*\",\n\t\t\t\t\ttopic: `${agentId}.completed`,\n\t\t\t\t\tcontent: { tokenCount: result.totalTokens },\n\t\t\t\t} as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n\t\t\t}\n\n\t\t\t// 6. Track metrics\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.trackRun(agentId, {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tlatencyMs,\n\t\t\t\t\tcost: costRatePerMillion > 0 ? estimateCost(result.totalTokens, costRatePerMillion) : undefined,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// 7. End span\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"ok\");\n\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tconst latencyMs = Date.now() - startTime;\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"error\");\n\t\t\tif (metrics) metrics.trackRun(agentId, { success: false, latencyMs });\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t// ============================================================================\n\t// runStructured()\n\t// ============================================================================\n\n\tasync function runStructured<T>(\n\t\tagentId: string,\n\t\tinput: string,\n\t\toptions: StructuredRunOptions<T>,\n\t): Promise<RunResult<T>> {\n\t\tconst { validate, retries = 1, ...runOpts } = options;\n\t\tlet lastError: Error | null = null;\n\n\t\tfor (let attempt = 0; attempt <= retries; attempt++) {\n\t\t\t// Skip cache on retries to get a fresh result\n\t\t\tconst attemptOpts = attempt > 0 ? { ...runOpts, cache: false as const } : runOpts;\n\t\t\tconst result = await run<T>(agentId, input, attemptOpts);\n\t\t\tconst validation = validate(result.output);\n\t\t\tconst isValid = typeof validation === \"boolean\" ? validation : validation.valid;\n\n\t\t\tif (isValid) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst errors = typeof validation === \"object\" && validation.errors\n\t\t\t\t? validation.errors.join(\"; \")\n\t\t\t\t: \"Validation failed\";\n\t\t\tlastError = new GuardrailError({\n\t\t\t\tmessage: `Output validation failed (attempt ${attempt + 1}/${retries + 1}): ${errors}`,\n\t\t\t\tcode: \"OUTPUT_GUARDRAIL_FAILED\",\n\t\t\t\tguardrailName: \"runStructured\",\n\t\t\t\tguardrailType: \"output\",\n\t\t\t\tagentName: agentId,\n\t\t\t\tinput,\n\t\t\t\tdata: result.output,\n\t\t\t});\n\n\t\t\tif (debug) console.debug(`[AgentStack] runStructured validation failed (attempt ${attempt + 1}):`, errors);\n\t\t}\n\n\t\tthrow lastError;\n\t}\n\n\t// ============================================================================\n\t// runPattern()\n\t// ============================================================================\n\n\tasync function runPattern<T = unknown>(\n\t\tpatternId: string,\n\t\tinput: string,\n\t\toptions: StackRunOptions = {},\n\t): Promise<T> {\n\t\tif (!multi) {\n\t\t\tthrow new Error(\"[AgentStack] No agents/patterns configured. Provide 'agents' and 'patterns' config.\");\n\t\t}\n\n\t\tconst skipCache = options.cache === false;\n\n\t\t// Cache check\n\t\tif (cacheInstance && !skipCache) {\n\t\t\ttry {\n\t\t\t\tconst cached = await cacheInstance.lookup(input, patternId);\n\t\t\t\tif (cached.hit && cached.entry) {\n\t\t\t\t\tobsInstance?.incrementCounter(\"cache.hits\");\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(cached.entry.response) as T;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tif (debug) console.debug(`[AgentStack] Cache hit for pattern \"${patternId}\" contained invalid JSON — falling through to fresh run.`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tobsInstance?.incrementCounter(\"cache.misses\");\n\t\t\t} catch {\n\t\t\t\t// Cache lookup failed (e.g., embedder error) — treat as miss\n\t\t\t\tobsInstance?.incrementCounter(\"cache.lookup.errors\");\n\t\t\t}\n\t\t}\n\n\t\t// Run input guardrails (same ones wired into orchestrator for run())\n\t\tfor (const guard of inputGuardrails) {\n\t\t\tconst fn = typeof guard === \"function\" ? guard : guard.fn;\n\t\t\tconst name = typeof guard === \"function\" ? \"input-guardrail\" : guard.name;\n\t\t\tconst guardResult = await fn({ input, agentName: patternId }, { agentName: patternId, input, facts: {} as Record<string, unknown> });\n\t\t\tif (guardResult && !guardResult.passed) {\n\t\t\t\tthrow new GuardrailError({\n\t\t\t\t\tmessage: `Input guardrail \"${name}\" failed: ${guardResult.reason ?? \"unknown\"}`,\n\t\t\t\t\tcode: \"INPUT_GUARDRAIL_FAILED\",\n\t\t\t\t\tguardrailName: name,\n\t\t\t\t\tguardrailType: \"input\",\n\t\t\t\t\tagentName: patternId,\n\t\t\t\t\tinput,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst span = obsInstance?.startSpan(`pattern.${patternId}`);\n\t\tconst startTime = Date.now();\n\n\t\t// Snapshot token counts before pattern execution\n\t\tconst statesBefore = multi.getAllAgentStates();\n\t\tlet tokensBefore = 0;\n\t\tfor (const s of Object.values(statesBefore)) tokensBefore += s.totalTokens;\n\n\t\ttry {\n\t\t\tconst result = await multi.runPattern<T>(patternId, input);\n\t\t\tconst latencyMs = Date.now() - startTime;\n\n\t\t\t// Compute delta (tokens from this pattern only)\n\t\t\tconst statesAfter = multi.getAllAgentStates();\n\t\t\tlet tokensAfter = 0;\n\t\t\tfor (const s of Object.values(statesAfter)) tokensAfter += s.totalTokens;\n\t\t\tconst patternTokens = tokensAfter - tokensBefore;\n\t\t\ttotalTokens += patternTokens;\n\n\t\t\t// Cache store\n\t\t\tif (cacheInstance && !skipCache && result != null) {\n\t\t\t\ttry {\n\t\t\t\t\tconst serialized = typeof result === \"string\" ? result : JSON.stringify(result);\n\t\t\t\t\tawait cacheInstance.store(input, serialized, patternId);\n\t\t\t\t} catch {\n\t\t\t\t\t// Cache store failed — non-fatal\n\t\t\t\t\tobsInstance?.incrementCounter(\"cache.store.errors\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Bus publish\n\t\t\tif (busInstance) {\n\t\t\t\tbusInstance.publish({\n\t\t\t\t\ttype: \"INFORM\",\n\t\t\t\t\tfrom: patternId,\n\t\t\t\t\tto: \"*\",\n\t\t\t\t\ttopic: `${patternId}.completed`,\n\t\t\t\t\tcontent: { patternTokens },\n\t\t\t\t} as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n\t\t\t}\n\n\t\t\t// Metrics\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.trackRun(patternId, {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tlatencyMs,\n\t\t\t\t\tcost: costRatePerMillion > 0 ? estimateCost(patternTokens, costRatePerMillion) : undefined,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"ok\");\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tconst latencyMs = Date.now() - startTime;\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"error\");\n\t\t\tif (metrics) metrics.trackRun(patternId, { success: false, latencyMs });\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t// ============================================================================\n\t// stream()\n\t// ============================================================================\n\n\tfunction stream<T = string>(\n\t\tagentId: string,\n\t\tinput: string,\n\t\toptions: StackStreamOptions = {},\n\t): TokenStream<T> {\n\t\tif (!streamingAgentRunner) {\n\t\t\tthrow new Error(\n\t\t\t`[AgentStack] Streaming not configured.\\n` +\n\t\t\t`Add to config: streaming: { runner: createStreamingCallbackRunner(...) }`,\n\t\t);\n\t\t}\n\n\t\t// Circuit breaker check\n\t\tif (circuitBreaker?.getState() === \"OPEN\") {\n\t\t\t// Import is already available via the orchestrator, but we throw directly here\n\t\t\tthrow new Error(\"[AgentStack] Circuit breaker is OPEN. Streaming call rejected.\");\n\t\t}\n\n\t\tconst agent = resolveAgent(agentId);\n\t\tconst channel = createStreamChannel<string>({ bufferSize: 100 });\n\t\tconst abortController = new AbortController();\n\n\t\t// Combine signals — clean up listener on completion\n\t\tconst onAbort = () => abortController.abort();\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t}\n\n\t\tconst span = obsInstance?.startSpan(`stream.${agentId}`);\n\t\tconst startTime = Date.now();\n\n\t\tconst { stream: chunkStream, result, abort: streamAbort } = streamingAgentRunner<T>(agent, input, {\n\t\t\tsignal: abortController.signal,\n\t\t});\n\n\t\t// Pipe chunks through channel, extracting token strings\n\t\tconst pipePromise = pipeThrough<StreamChunk, string>(\n\t\t\tchunkStream,\n\t\t\tchannel,\n\t\t\t(chunk: StreamChunk) => (chunk.type === \"token\" ? chunk.data : \"\"),\n\t\t);\n\n\t\t// Track tokens + obs + metrics + bus from result\n\t\tconst trackedResult = result.then((r) => {\n\t\t\tconst latencyMs = Date.now() - startTime;\n\t\t\ttotalTokens += r.totalTokens;\n\n\t\t\t// Clean up abort listener\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\n\t\t\t// Observability span\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"ok\");\n\n\t\t\t// Bus publish\n\t\t\tif (busInstance) {\n\t\t\t\tbusInstance.publish({\n\t\t\t\t\ttype: \"INFORM\",\n\t\t\t\t\tfrom: agentId,\n\t\t\t\t\tto: \"*\",\n\t\t\t\t\ttopic: `${agentId}.stream.completed`,\n\t\t\t\t\tcontent: { tokenCount: r.totalTokens },\n\t\t\t\t} as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n\t\t\t}\n\n\t\t\t// Metrics\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.trackRun(agentId, {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tlatencyMs,\n\t\t\t\t\tcost: costRatePerMillion > 0 ? estimateCost(r.totalTokens, costRatePerMillion) : undefined,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn r;\n\t\t}).catch((err) => {\n\t\t\tconst latencyMs = Date.now() - startTime;\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"error\");\n\t\t\tif (metrics) metrics.trackRun(agentId, { success: false, latencyMs });\n\t\t\tthrow err;\n\t\t});\n\n\t\t// Ensure pipe errors close channel gracefully\n\t\tpipePromise.catch((err) => {\n\t\t\tif (debug) console.debug(\"[AgentStack] Pipe error:\", err);\n\t\t});\n\n\t\treturn new TokenStreamImpl<T>(\n\t\t\tchannel,\n\t\t\ttrackedResult,\n\t\t\t() => {\n\t\t\t\tstreamAbort();\n\t\t\t\tabortController.abort();\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t);\n\t}\n\n\t// ============================================================================\n\t// streamChunks()\n\t// ============================================================================\n\n\tfunction streamChunks<T = unknown>(\n\t\tagentId: string,\n\t\tinput: string,\n\t\toptions: StackStreamOptions = {},\n\t): StreamingRunResult<T> {\n\t\tif (!streamingAgentRunner) {\n\t\t\tthrow new Error(\n\t\t\t\t`[AgentStack] Streaming not configured.\\n` +\n\t\t\t\t`Add to config: streaming: { runner: createStreamingCallbackRunner(...) }`,\n\t\t\t);\n\t\t}\n\n\t\tif (circuitBreaker?.getState() === \"OPEN\") {\n\t\t\tthrow new Error(\"[AgentStack] Circuit breaker is OPEN. Streaming call rejected.\");\n\t\t}\n\n\t\tconst agent = resolveAgent(agentId);\n\t\tconst abortController = new AbortController();\n\n\t\tconst onAbort = () => abortController.abort();\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t}\n\n\t\tconst span = obsInstance?.startSpan(`streamChunks.${agentId}`);\n\t\tconst startTime = Date.now();\n\n\t\tconst { stream: chunkStream, result, abort: streamAbort } = streamingAgentRunner<T>(agent, input, {\n\t\t\tsignal: abortController.signal,\n\t\t});\n\n\t\t// Track result for observability, metrics, and bus\n\t\tconst trackedResult = result.then((r) => {\n\t\t\tconst latencyMs = Date.now() - startTime;\n\t\t\ttotalTokens += r.totalTokens;\n\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"ok\");\n\t\t\tif (busInstance) {\n\t\t\t\tbusInstance.publish({\n\t\t\t\t\ttype: \"INFORM\",\n\t\t\t\t\tfrom: agentId,\n\t\t\t\t\tto: \"*\",\n\t\t\t\t\ttopic: `${agentId}.streamChunks.completed`,\n\t\t\t\t\tcontent: { tokenCount: r.totalTokens },\n\t\t\t\t} as Omit<TypedAgentMessage, \"id\" | \"timestamp\">);\n\t\t\t}\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.trackRun(agentId, {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tlatencyMs,\n\t\t\t\t\tcost: costRatePerMillion > 0 ? estimateCost(r.totalTokens, costRatePerMillion) : undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn r;\n\t\t}).catch((err) => {\n\t\t\tconst latencyMs = Date.now() - startTime;\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tif (span) obsInstance?.endSpan(span.spanId, \"error\");\n\t\t\tif (metrics) metrics.trackRun(agentId, { success: false, latencyMs });\n\t\t\tthrow err;\n\t\t});\n\n\t\tlet aborted = false;\n\t\treturn {\n\t\t\tstream: chunkStream,\n\t\t\tresult: trackedResult,\n\t\t\tabort: () => {\n\t\t\t\tif (aborted) return;\n\t\t\t\taborted = true;\n\t\t\t\tstreamAbort();\n\t\t\t\tabortController.abort();\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t};\n\t}\n\n\t// ============================================================================\n\t// Lifecycle\n\t// ============================================================================\n\n\tfunction getState(): AgentStackState {\n\t\t// Compute rate limit remaining using index tracking (O(n) worst case on stale window, but avoids allocation)\n\t\tlet rateLimitRemaining: number | null = null;\n\t\tif (config.rateLimit && rateLimitTimestamps) {\n\t\t\tconst now = Date.now();\n\t\t\tconst windowStart = now - 60_000;\n\t\t\t// Advance start index past expired entries\n\t\t\twhile (rateLimitStartIdx < rateLimitTimestamps.length && rateLimitTimestamps[rateLimitStartIdx]! < windowStart) {\n\t\t\t\trateLimitStartIdx++;\n\t\t\t}\n\t\t\tconst active = rateLimitTimestamps.length - rateLimitStartIdx;\n\t\t\trateLimitRemaining = Math.max(0, config.rateLimit.maxPerMinute - active);\n\t\t}\n\n\t\treturn {\n\t\t\ttotalTokens,\n\t\t\testimatedCost: costRatePerMillion > 0 ? estimateCost(totalTokens, costRatePerMillion) : 0,\n\t\t\tcircuitState: circuitBreaker?.getState() ?? \"CLOSED\",\n\t\t\tcacheStats: cacheInstance?.getStats() ?? { totalEntries: 0, totalHits: 0, totalMisses: 0, hitRate: 0, avgSimilarityOnHit: 0, oldestEntry: null, newestEntry: null },\n\t\t\tmemoryMessageCount: memory?.getState()?.messages?.length ?? 0,\n\t\t\tbusMessageCount: busInstance?.getHistory()?.length ?? 0,\n\t\t\trateLimitRemaining,\n\t\t};\n\t}\n\n\tfunction reset(): void {\n\t\tmemory?.clear();\n\t\tcircuitBreaker?.reset();\n\t\tcacheInstance?.clear();\n\t\tobsInstance?.clear();\n\t\tbusInstance?.clear();\n\t\tmulti?.reset();\n\t\tif (rateLimitTimestamps) {\n\t\t\trateLimitTimestamps.length = 0;\n\t\t\trateLimitStartIdx = 0;\n\t\t}\n\t\ttotalTokens = 0;\n\t}\n\n\tlet disposed = false;\n\tasync function dispose(): Promise<void> {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\n\t\t// Flush OTLP one final time before clearing\n\t\tif (otlpInterval && obsInstance && otlpExporter) {\n\t\t\tclearInterval(otlpInterval);\n\t\t\totlpInterval = null;\n\t\t\ttry {\n\t\t\t\tconst data = obsInstance.export();\n\t\t\t\tif (data.metrics.length > 0) otlpExporter.exportMetrics(data.metrics);\n\t\t\t\tif (data.traces.length > 0) otlpExporter.exportTraces(data.traces);\n\t\t\t} catch {\n\t\t\t\t// Best-effort flush on dispose\n\t\t\t}\n\t\t} else if (otlpInterval) {\n\t\t\tclearInterval(otlpInterval);\n\t\t\totlpInterval = null;\n\t\t}\n\t\torchestrator.dispose();\n\t\tmulti?.dispose();\n\t\tawait obsInstance?.dispose();\n\t}\n\n\treturn {\n\t\trun,\n\t\trunStructured,\n\t\trunPattern,\n\t\tstream,\n\t\tstreamChunks,\n\t\tapprove: (requestId: string) => orchestrator.approve(requestId),\n\t\treject: (requestId: string, reason?: string) => orchestrator.reject(requestId, reason),\n\t\tgetState,\n\t\treset,\n\t\tdispose,\n\t\tget orchestrator() { return orchestrator; },\n\t\tget observability() { return obsInstance; },\n\t\tget messageBus() { return busInstance; },\n\t\tget coordinator() { return multi; },\n\t\tget cache() { return cacheInstance; },\n\t\tget memory() { return memory; },\n\t\tgetTimeline(limit = 50) {\n\t\t\treturn {\n\t\t\t\tspans: obsInstance?.getTraces(limit) ?? [],\n\t\t\t\tmetrics: obsInstance?.getDashboard()?.metrics ?? {},\n\t\t\t};\n\t\t},\n\t\t// Deprecated aliases\n\t\tget obs() { return obsInstance; },\n\t\tget bus() { return busInstance; },\n\t\tget multi() { return multi; },\n\t};\n}\n","/**\n * AI Bridge — Syncs AI adapter state into a Directive system.\n *\n * Eliminates manual state sync boilerplate when using createAgentStack()\n * alongside createSystem().\n *\n * @example Using with AgentStack directly\n * ```typescript\n * const syncAI = createAISyncer(stack, (state) => {\n * system.events.chat.updateAIState({\n * totalTokens: state.totalTokens,\n * estimatedCost: state.estimatedCost,\n * circuitState: state.circuitState,\n * });\n * });\n * syncAI();\n * ```\n *\n * @example Using with a wrapper that has getState()\n * ```typescript\n * const syncAI = createAISyncer(myAIWrapper, (state) => {\n * system.events.chat.updateAIState({ ... });\n * });\n * syncAI();\n * ```\n */\n\n/**\n * Any object with a getState() method.\n * Works with AgentStack, or any wrapper that exposes getState().\n */\nexport interface Syncable<S> {\n\tgetState(): S;\n}\n\n/**\n * Create a sync function that reads the latest state from a source and\n * passes it to a callback (typically dispatching events into a Directive system).\n *\n * Call the returned function after any AI operation to push state updates.\n */\nexport function createAISyncer<S>(\n\tsource: Syncable<S>,\n\tsyncFn: (state: S) => void,\n): () => void {\n\treturn function sync() {\n\t\tsyncFn(source.getState());\n\t};\n}\n","/**\n * RAG Enricher — Composable retrieval-augmented generation pipeline.\n *\n * Embeds a query, searches a chunk store by cosine similarity, and assembles\n * an enriched input string (context + history + query) for any agent.\n *\n * @example\n * ```typescript\n * import {\n * createRAGEnricher,\n * createJSONFileStore,\n * } from '@directive-run/ai';\n *\n * const enricher = createRAGEnricher({\n * embedder: myEmbedder, // Provide your own EmbedderFn\n * storage: createJSONFileStore({ filePath: './embeddings.json' }),\n * });\n *\n * const enrichedInput = await enricher.enrich('How do constraints work?', {\n * prefix: 'User is viewing: /docs/constraints',\n * history: [{ role: 'user', content: 'Hello' }],\n * });\n * ```\n */\n\nimport { cosineSimilarity } from \"./guardrails/semantic-cache.js\";\nimport type { Embedding, EmbedderFn } from \"./guardrails/semantic-cache.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A document chunk with embedding and metadata */\nexport interface RAGChunk {\n id: string;\n content: string;\n embedding: Embedding;\n metadata: Record<string, unknown>;\n}\n\n/** Pluggable storage backend */\nexport interface RAGStorage {\n getChunks(): Promise<RAGChunk[]>;\n size(): Promise<number>;\n /** Optional: optimized vector search (bypasses full getChunks scan) */\n search?(\n query: Embedding,\n topK: number,\n minSimilarity: number,\n ): Promise<Array<RAGChunk & { similarity: number }>>;\n /** Reload storage (clear cache, re-read from source) */\n reload?(): Promise<void>;\n /** Dispose of resources */\n dispose?(): void;\n}\n\nexport interface RAGEnricherConfig {\n /** Function to generate query embeddings */\n embedder: EmbedderFn;\n /** Storage backend for document chunks */\n storage: RAGStorage;\n /** Number of top results to return (default: 5) */\n topK?: number;\n /** Minimum similarity score to include, clamped to [0, 1] (default: 0.3) */\n minSimilarity?: number;\n /** Custom chunk formatter */\n formatChunk?: (chunk: RAGChunk, similarity: number) => string;\n /** Custom context block formatter */\n formatContext?: (formattedChunks: string[], query: string) => string;\n /** Error callback — embedder/storage errors are non-fatal by default */\n onError?: (error: Error) => void;\n}\n\nexport interface RAGEnrichOptions {\n /** Prefix line (e.g. \"User is viewing: /docs/constraints\") */\n prefix?: string;\n /** Conversation history */\n history?: Array<{ role: string; content: string }>;\n /** Per-call topK override */\n topK?: number;\n /** Filter chunks before ranking (e.g. by metadata tag or section) */\n filter?: (chunk: RAGChunk) => boolean;\n}\n\nexport interface RAGEnricher {\n /** Retrieve relevant chunks for a query */\n retrieve(\n query: string,\n topK?: number,\n ): Promise<Array<RAGChunk & { similarity: number }>>;\n /** Retrieve + format into an enriched input string */\n enrich(input: string, options?: RAGEnrichOptions): Promise<string>;\n}\n\n// ============================================================================\n// Default Formatters\n// ============================================================================\n\nfunction defaultFormatChunk(chunk: RAGChunk, _similarity: number): string {\n const title = (chunk.metadata.title as string) ?? \"\";\n const section = (chunk.metadata.section as string) ?? \"\";\n const url = (chunk.metadata.url as string) ?? \"\";\n const header =\n title && section && url\n ? `[${title} — ${section}](${url})`\n : title\n ? title\n : chunk.id;\n return `${header}\\n${chunk.content}`;\n}\n\nfunction defaultFormatContext(\n formattedChunks: string[],\n _query: string,\n): string {\n if (formattedChunks.length === 0) return \"\";\n return `Relevant documentation context:\\n\\n${formattedChunks.join(\"\\n\\n\")}`;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/** Clamp a number to [min, max]. */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Create a RAG enricher that retrieves relevant document chunks and\n * assembles enriched input for an agent.\n */\nexport function createRAGEnricher(config: RAGEnricherConfig): RAGEnricher {\n const {\n embedder,\n storage,\n topK: defaultTopK = 5,\n minSimilarity: rawMinSimilarity = 0.3,\n formatChunk = defaultFormatChunk,\n formatContext = defaultFormatContext,\n onError,\n } = config;\n\n const minSimilarity = clamp(rawMinSimilarity, 0, 1);\n\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\" &&\n rawMinSimilarity !== minSimilarity\n ) {\n console.warn(\n `[Directive] RAG: minSimilarity ${rawMinSimilarity} clamped to ${minSimilarity} (valid range: 0-1)`,\n );\n }\n\n async function retrieve(\n query: string,\n topK?: number,\n ): Promise<Array<RAGChunk & { similarity: number }>> {\n const k = Math.max(1, Math.floor(topK ?? defaultTopK));\n\n // Use optimized search() if the storage backend provides it\n if (storage.search) {\n return storage.search(await embedder(query), k, minSimilarity);\n }\n\n const queryEmbedding = await embedder(query);\n const chunks = await storage.getChunks();\n\n const scored = chunks.map((chunk) => ({\n ...chunk,\n similarity: cosineSimilarity(queryEmbedding, chunk.embedding),\n }));\n\n scored.sort((a, b) => b.similarity - a.similarity);\n\n return scored.filter((c) => c.similarity >= minSimilarity).slice(0, k);\n }\n\n async function enrich(\n input: string,\n options: RAGEnrichOptions = {},\n ): Promise<string> {\n const { prefix, history, topK, filter } = options;\n\n let matches: Array<RAGChunk & { similarity: number }> = [];\n try {\n matches = await retrieve(input, topK);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n\n if (filter) {\n matches = matches.filter((m) => filter(m));\n }\n\n const formattedChunks = matches.map((m) => formatChunk(m, m.similarity));\n const contextBlock = formatContext(formattedChunks, input);\n\n const parts: string[] = [];\n if (prefix) parts.push(prefix);\n if (contextBlock) parts.push(contextBlock);\n if (history && history.length > 0) {\n const historyBlock = history\n .map(\n (m) =>\n `${m.role.charAt(0).toUpperCase() + m.role.slice(1)}: ${m.content}`,\n )\n .join(\"\\n\\n\");\n parts.push(`Previous conversation:\\n${historyBlock}`);\n }\n parts.push(input);\n\n return parts.join(\"\\n\\n---\\n\\n\");\n }\n\n return { retrieve, enrich };\n}\n\n// ============================================================================\n// Built-in Storage: JSON File Store\n// ============================================================================\n\nexport interface JSONFileStoreOptions {\n /** Absolute or relative path to the JSON embeddings file */\n filePath: string;\n /** Optional transform from raw JSON entries to RAGChunk */\n mapEntry?: (entry: Record<string, unknown>) => RAGChunk;\n /** Cache TTL in ms. 0 = cache forever (default) */\n ttlMs?: number;\n}\n\n/**\n * Create a RAGStorage backed by a JSON file (lazy-loaded, cached in memory).\n * Uses dynamic `import('node:fs')` for isomorphic safety.\n */\nexport function createJSONFileStore(options: JSONFileStoreOptions): RAGStorage {\n const { filePath, mapEntry, ttlMs = 0 } = options;\n let cached: RAGChunk[] | null = null;\n let cachedAt = 0;\n\n async function load(): Promise<RAGChunk[]> {\n if (cached && (ttlMs === 0 || Date.now() - cachedAt < ttlMs)) {\n return cached;\n }\n\n try {\n const fs = await import(\"node:fs\");\n const data = await fs.promises.readFile(filePath, \"utf-8\");\n const raw = JSON.parse(data) as Record<string, unknown>[];\n\n cached = mapEntry\n ? raw.map(mapEntry)\n : (raw as unknown as RAGChunk[]);\n\n cachedAt = Date.now();\n return cached;\n } catch (err) {\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\"\n ) {\n console.warn(\n `[Directive] JSONFileStore: failed to load ${filePath}:`,\n err,\n );\n }\n cached = [];\n cachedAt = Date.now();\n return cached;\n }\n }\n\n return {\n async getChunks() {\n return load();\n },\n async size() {\n const chunks = await load();\n return chunks.length;\n },\n async reload() {\n cached = null;\n cachedAt = 0;\n await load();\n },\n dispose() {\n cached = null;\n cachedAt = 0;\n },\n };\n}\n\n","/**\n * SSE Transport — Wrap a Directive AgentStack token stream into an HTTP\n * Server-Sent Events response.\n *\n * Framework-agnostic: uses the WinterCG `Response` constructor (Node 18+,\n * Deno, Bun, Cloudflare Workers, Next.js).\n *\n * @example\n * ```typescript\n * import { createSSETransport, createAgentStack } from '@directive-run/ai';\n *\n * const transport = createSSETransport({\n * maxResponseChars: 10_000,\n * errorMessages: {\n * INPUT_GUARDRAIL_FAILED: 'Your message was flagged by our safety filter.',\n * },\n * });\n *\n * // Next.js route handler\n * export async function POST(req: Request) {\n * const { message } = await req.json();\n * return transport.toResponse(stack, 'docs-qa', message);\n * }\n * ```\n */\n\nimport type { AgentStack, TokenStream } from \"./stack.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type SSEEvent =\n | { type: \"text\"; text: string }\n | { type: \"truncated\"; text: string }\n | { type: \"done\" }\n | { type: \"error\"; message: string }\n | { type: \"heartbeat\"; timestamp: number };\n\nexport interface SSETransportConfig {\n /** Truncate response after this many characters (default: Infinity) */\n maxResponseChars?: number;\n /** Message shown when response is truncated */\n truncationMessage?: string;\n /** Heartbeat interval in ms (default: 0 = disabled) */\n heartbeatIntervalMs?: number;\n /** Map error codes/types to user-facing messages */\n errorMessages?: Record<string, string> | ((error: unknown) => string);\n /** Extra headers merged into the SSE response */\n headers?: Record<string, string>;\n}\n\nexport interface SSETransport {\n /** Create a full HTTP Response with SSE headers */\n toResponse(\n stack: AgentStack,\n agentId: string,\n input: string,\n opts?: { signal?: AbortSignal },\n ): Response;\n /** Return just the ReadableStream (for Express/Koa `res.write()`) */\n toStream(\n stack: AgentStack,\n agentId: string,\n input: string,\n opts?: { signal?: AbortSignal },\n ): ReadableStream<Uint8Array>;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nconst DEFAULT_ERROR_MESSAGE =\n \"AI service temporarily unavailable. Please try again.\";\n\n/**\n * Create an SSE transport that converts a Directive AgentStack token stream\n * into Server-Sent Events.\n */\nexport function createSSETransport(\n config: SSETransportConfig = {},\n): SSETransport {\n const {\n maxResponseChars = Number.POSITIVE_INFINITY,\n truncationMessage = \"\\n\\n*[Response truncated]*\",\n heartbeatIntervalMs = 0,\n errorMessages,\n headers: extraHeaders,\n } = config;\n\n if (maxResponseChars < 0) {\n throw new RangeError(\"maxResponseChars must be non-negative\");\n }\n if (heartbeatIntervalMs < 0) {\n throw new RangeError(\"heartbeatIntervalMs must be non-negative\");\n }\n\n function resolveErrorMessage(error: unknown): string {\n if (typeof errorMessages === \"function\") {\n try {\n return errorMessages(error);\n } catch {\n return DEFAULT_ERROR_MESSAGE;\n }\n }\n if (errorMessages && typeof errorMessages === \"object\") {\n const code =\n error != null &&\n typeof error === \"object\" &&\n \"code\" in error &&\n typeof (error as { code: unknown }).code === \"string\"\n ? (error as { code: string }).code\n : undefined;\n if (code && code in errorMessages) {\n return errorMessages[code]!;\n }\n }\n return DEFAULT_ERROR_MESSAGE;\n }\n\n function buildStream(\n stack: AgentStack,\n agentId: string,\n input: string,\n opts?: { signal?: AbortSignal },\n ): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n function frame(event: SSEEvent): Uint8Array {\n return encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`);\n }\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n let heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n let tokenStream: TokenStream | null = null;\n\n try {\n // Heartbeat\n if (heartbeatIntervalMs > 0) {\n heartbeatTimer = setInterval(() => {\n try {\n controller.enqueue(frame({ type: \"heartbeat\", timestamp: Date.now() }));\n } catch {\n // Controller may be closed\n }\n }, heartbeatIntervalMs);\n }\n\n tokenStream = stack.stream(agentId, input, {\n signal: opts?.signal,\n });\n\n let totalChars = 0;\n let sentDone = false;\n\n for await (const token of tokenStream) {\n totalChars += token.length;\n\n if (totalChars > maxResponseChars) {\n controller.enqueue(\n frame({ type: \"truncated\", text: truncationMessage }),\n );\n controller.enqueue(frame({ type: \"done\" }));\n sentDone = true;\n tokenStream.abort();\n break;\n }\n\n controller.enqueue(frame({ type: \"text\", text: token }));\n }\n\n // Wait for final result (tracks tokens, metrics, etc.)\n try {\n await tokenStream.result;\n } catch {\n // May have been aborted due to truncation\n }\n\n if (!sentDone) {\n controller.enqueue(frame({ type: \"done\" }));\n }\n } catch (err: unknown) {\n const message = resolveErrorMessage(err);\n controller.enqueue(frame({ type: \"error\", message }));\n } finally {\n if (heartbeatTimer) clearInterval(heartbeatTimer);\n controller.close();\n }\n },\n });\n }\n\n const sseHeaders: Record<string, string> = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...extraHeaders,\n };\n\n return {\n toResponse(stack, agentId, input, opts) {\n const stream = buildStream(stack, agentId, input, opts);\n return new Response(stream, { headers: sseHeaders });\n },\n toStream(stack, agentId, input, opts) {\n return buildStream(stack, agentId, input, opts);\n },\n };\n}\n","/**\n * P5: Batch Queue — Application-level batching for agent calls.\n *\n * Accumulates calls and flushes them in batches to reduce overhead.\n * Each `submit()` returns a promise that resolves when its individual call completes.\n * Batches execute calls in parallel up to a configurable concurrency limit.\n *\n * @module\n *\n * @example\n * ```typescript\n * import { createBatchQueue } from '@directive-run/ai';\n *\n * const queue = createBatchQueue(runner, {\n * maxBatchSize: 20,\n * maxWaitMs: 5000,\n * concurrency: 5,\n * });\n *\n * // Submit calls — they batch automatically\n * const [r1, r2, r3] = await Promise.all([\n * queue.submit(agent, \"input 1\"),\n * queue.submit(agent, \"input 2\"),\n * queue.submit(agent, \"input 3\"),\n * ]);\n *\n * // Force immediate flush\n * await queue.flush();\n *\n * // Clean up (flushes remaining calls)\n * await queue.dispose();\n * ```\n */\n\nimport type { AgentRunner, AgentLike, RunResult, RunOptions } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BatchQueueConfig {\n /** Maximum number of calls per batch. @default 20 */\n maxBatchSize?: number;\n /** Maximum time to wait before flushing (ms). @default 5000 */\n maxWaitMs?: number;\n /** Number of calls to run in parallel within a batch. @default 5 */\n concurrency?: number;\n}\n\nexport interface BatchQueue {\n /** Submit a call to the queue. Returns a promise that resolves when the call completes. */\n submit<T = unknown>(agent: AgentLike, input: string, options?: RunOptions): Promise<RunResult<T>>;\n /** Flush all pending calls immediately. */\n flush(): Promise<void>;\n /** Get the number of pending calls. */\n readonly pending: number;\n /** Dispose the queue, flushing remaining calls. */\n dispose(): Promise<void>;\n}\n\n// ============================================================================\n// Internal\n// ============================================================================\n\ninterface QueuedCall {\n agent: AgentLike;\n input: string;\n options?: RunOptions;\n resolve: (result: RunResult<unknown>) => void;\n reject: (error: Error) => void;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a batch queue for grouping agent calls.\n *\n * @example\n * ```typescript\n * const queue = createBatchQueue(runner, {\n * maxBatchSize: 20,\n * maxWaitMs: 5000,\n * concurrency: 5,\n * });\n *\n * // Submit multiple calls — they batch automatically\n * const [result1, result2, result3] = await Promise.all([\n * queue.submit(agent, \"input 1\"),\n * queue.submit(agent, \"input 2\"),\n * queue.submit(agent, \"input 3\"),\n * ]);\n *\n * // Clean up\n * await queue.dispose();\n * ```\n */\nexport function createBatchQueue(\n runner: AgentRunner,\n config: BatchQueueConfig = {},\n): BatchQueue {\n const {\n maxBatchSize = 20,\n maxWaitMs = 5000,\n concurrency = 5,\n } = config;\n\n // Validate config\n if (!Number.isFinite(maxBatchSize) || maxBatchSize < 1) {\n throw new Error(\"[Directive] createBatchQueue: maxBatchSize must be a positive finite number (>= 1).\");\n }\n if (!Number.isFinite(maxWaitMs) || maxWaitMs < 0) {\n throw new Error(\"[Directive] createBatchQueue: maxWaitMs must be a non-negative finite number.\");\n }\n if (!Number.isFinite(concurrency) || concurrency < 1) {\n throw new Error(\"[Directive] createBatchQueue: concurrency must be a positive finite number (>= 1).\");\n }\n\n let queue: QueuedCall[] = [];\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n let disposed = false;\n let flushPromise: Promise<void> | null = null;\n\n function scheduleFlush(): void {\n if (flushTimer !== null) {\n return;\n }\n flushTimer = setTimeout(() => {\n flushTimer = null;\n flushInternal().catch(() => {\n // Errors are delivered to individual call promises\n });\n }, maxWaitMs);\n }\n\n function cancelTimer(): void {\n if (flushTimer !== null) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n }\n\n /** Execute calls with concurrency limit. */\n async function executeBatch(batch: QueuedCall[]): Promise<void> {\n let index = 0;\n\n async function runNext(): Promise<void> {\n while (index < batch.length) {\n const current = index++;\n const call = batch[current]!;\n\n try {\n const result = await runner(call.agent, call.input, call.options);\n call.resolve(result);\n } catch (err) {\n call.reject(err instanceof Error ? err : new Error(String(err)));\n }\n }\n }\n\n // Run up to `concurrency` workers\n const workers = Array.from(\n { length: Math.min(concurrency, batch.length) },\n () => runNext(),\n );\n await Promise.all(workers);\n }\n\n async function flushInternal(): Promise<void> {\n // Wait for any in-progress flush to complete first\n if (flushPromise) {\n await flushPromise;\n }\n\n if (queue.length === 0) {\n return;\n }\n\n cancelTimer();\n\n // Drain the queue\n const batch = queue.splice(0);\n\n flushPromise = executeBatch(batch).finally(() => {\n flushPromise = null;\n\n // If more calls came in during flush, schedule another\n if (queue.length > 0) {\n scheduleFlush();\n }\n });\n\n await flushPromise;\n }\n\n return {\n submit<T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<T>> {\n if (disposed) {\n return Promise.reject(new Error(\"[Directive] BatchQueue has been disposed.\"));\n }\n\n return new Promise<RunResult<T>>((resolve, reject) => {\n queue.push({\n agent,\n input,\n options,\n resolve: resolve as (result: RunResult<unknown>) => void,\n reject,\n });\n\n // Flush immediately if batch is full\n if (queue.length >= maxBatchSize) {\n cancelTimer();\n flushInternal().catch(() => {\n // Errors are delivered to individual call promises\n });\n } else {\n scheduleFlush();\n }\n });\n },\n\n async flush(): Promise<void> {\n await flushInternal();\n },\n\n get pending(): number {\n return queue.length;\n },\n\n async dispose(): Promise<void> {\n if (disposed) {\n return;\n }\n disposed = true;\n cancelTimer();\n // Flush remaining calls\n if (queue.length > 0) {\n await flushInternal();\n }\n },\n };\n}\n","/**\n * P4: Constraint-Driven Provider Routing — Directive's unique differentiator.\n *\n * Uses user-supplied constraints to select providers based on runtime state:\n * cost, latency, error rates, and compliance regions.\n *\n * Tracks per-provider stats (call count, error count, cost, latency) and\n * exposes them as {@link RoutingFacts} for constraint evaluation.\n *\n * @module\n *\n * @example\n * ```typescript\n * import { createConstraintRouter } from '@directive-run/ai';\n * import type { ConstraintRouterRunner } from '@directive-run/ai';\n *\n * const router = createConstraintRouter({\n * providers: [\n * { name: \"openai\", runner: openaiRunner, pricing: { inputPerMillion: 5, outputPerMillion: 15 } },\n * { name: \"anthropic\", runner: anthropicRunner, pricing: { inputPerMillion: 3, outputPerMillion: 15 } },\n * { name: \"ollama\", runner: ollamaRunner },\n * ],\n * defaultProvider: \"openai\",\n * constraints: [\n * { when: (facts) => facts.totalCost > 100, provider: \"ollama\", priority: 10 },\n * { when: (facts) => facts.providers[\"openai\"]?.errorCount > 5, provider: \"anthropic\" },\n * ],\n * preferCheapest: true, // opt-in to cheapest-provider heuristic\n * onProviderSelected: (name, reason) => console.log(`Using ${name} (${reason})`),\n * });\n *\n * // Access runtime stats\n * console.log(router.facts.totalCost, router.facts.callCount);\n * ```\n */\n\nimport type { AgentRunner, AgentLike, RunResult, RunOptions, TokenUsage } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Provider definition for the constraint router.\n *\n * Each provider has its own runner, optional pricing (for cost tracking\n * and cheapest-provider heuristic), and optional region tag.\n */\nexport interface RoutingProvider {\n /** Unique name for this provider. */\n name: string;\n /** The runner to use for this provider. */\n runner: AgentRunner;\n /** Token pricing (cost per million tokens). */\n pricing?: { inputPerMillion: number; outputPerMillion: number };\n /** Geographic region (for compliance routing). */\n region?: string;\n}\n\n/**\n * Runtime facts tracked by the router — exposed for user constraints.\n *\n * Access via the `facts` property on the returned {@link ConstraintRouterRunner}.\n */\nexport interface RoutingFacts {\n totalCost: number;\n callCount: number;\n errorCount: number;\n lastProvider: string | null;\n avgLatencyMs: number;\n /** Per-provider stats. */\n providers: Record<string, ProviderStats>;\n}\n\nexport interface ProviderStats {\n callCount: number;\n errorCount: number;\n totalCost: number;\n avgLatencyMs: number;\n lastErrorAt: number | null;\n}\n\n/** User-supplied routing constraint. */\nexport interface RoutingConstraint {\n /** When this constraint is active. */\n when: (facts: RoutingFacts) => boolean;\n /** The provider to route to. */\n provider: string;\n /** Priority — higher wins when multiple constraints match. @default 0 */\n priority?: number;\n}\n\nexport interface ConstraintRouterConfig {\n /** Available providers. */\n providers: RoutingProvider[];\n /** Default provider name. */\n defaultProvider: string;\n /** User-supplied routing constraints. */\n constraints?: RoutingConstraint[];\n /** Called when a provider is selected. */\n onProviderSelected?: (providerName: string, reason: \"constraint\" | \"cheapest\" | \"default\") => void;\n /** Error cooldown — skip a provider for this many ms after an error. @default 30000 */\n errorCooldownMs?: number;\n /**\n * When true, automatically prefer the cheapest available provider\n * (based on pricing) when no user constraint matches.\n * When false, the default provider is used unless a constraint overrides it.\n * @default false\n */\n preferCheapest?: boolean;\n}\n\n// ============================================================================\n// Internal\n// ============================================================================\n\nfunction createEmptyStats(): ProviderStats {\n return {\n callCount: 0,\n errorCount: 0,\n totalCost: 0,\n avgLatencyMs: 0,\n lastErrorAt: null,\n };\n}\n\nfunction calculateCost(usage: TokenUsage | undefined, pricing?: { inputPerMillion: number; outputPerMillion: number }): number {\n if (!usage || !pricing) {\n return 0;\n }\n\n return (\n (usage.inputTokens / 1_000_000) * pricing.inputPerMillion +\n (usage.outputTokens / 1_000_000) * pricing.outputPerMillion\n );\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create a constraint-driven provider router.\n *\n * @example\n * ```typescript\n * const runner = createConstraintRouter({\n * providers: [\n * { name: \"openai\", runner: openaiRunner, pricing: { inputPerMillion: 5, outputPerMillion: 15 } },\n * { name: \"anthropic\", runner: anthropicRunner, pricing: { inputPerMillion: 3, outputPerMillion: 15 } },\n * { name: \"ollama\", runner: ollamaRunner },\n * ],\n * defaultProvider: \"openai\",\n * constraints: [\n * { when: (facts) => facts.totalCost > 100, provider: \"ollama\", priority: 10 },\n * { when: (facts) => facts.providers[\"openai\"]?.errorCount > 5, provider: \"anthropic\" },\n * ],\n * });\n * ```\n */\nexport function createConstraintRouter(config: ConstraintRouterConfig): ConstraintRouterRunner {\n const {\n providers,\n defaultProvider,\n constraints = [],\n onProviderSelected,\n errorCooldownMs = 30000,\n preferCheapest = false,\n } = config;\n\n // Validate config\n if (!Number.isFinite(errorCooldownMs) || errorCooldownMs < 0) {\n throw new Error(\"[Directive] createConstraintRouter: errorCooldownMs must be a non-negative finite number.\");\n }\n\n // Validate\n const providerMap = new Map<string, RoutingProvider>();\n for (const provider of providers) {\n providerMap.set(provider.name, provider);\n }\n\n if (!providerMap.has(defaultProvider)) {\n throw new Error(`[Directive] Default provider \"${defaultProvider}\" not found in providers list.`);\n }\n\n // Initialize facts\n const facts: RoutingFacts = {\n totalCost: 0,\n callCount: 0,\n errorCount: 0,\n lastProvider: null,\n avgLatencyMs: 0,\n providers: Object.create(null) as Record<string, ProviderStats>,\n };\n\n for (const provider of providers) {\n facts.providers[provider.name] = createEmptyStats();\n }\n\n // Total latency for averaging\n let totalLatencyMs = 0;\n\n // Pre-sort constraints at construction time (not per-call)\n const sortedConstraints = [...constraints].sort(\n (a, b) => (b.priority ?? 0) - (a.priority ?? 0),\n );\n\n /** Select provider based on constraints and heuristics. */\n function selectProvider(): { provider: RoutingProvider; reason: \"constraint\" | \"cheapest\" | \"default\" } {\n const now = Date.now();\n\n for (const constraint of sortedConstraints) {\n try {\n if (constraint.when(facts)) {\n const provider = providerMap.get(constraint.provider);\n if (provider) {\n return { provider, reason: \"constraint\" };\n }\n }\n } catch {\n // Throwing constraint is skipped — do not crash the router\n }\n }\n\n // 2. Filter out providers in error cooldown\n const availableProviders = providers.filter((p) => {\n const stats = facts.providers[p.name];\n if (!stats) {\n return true;\n }\n if (stats.lastErrorAt && now - stats.lastErrorAt < errorCooldownMs) {\n return false;\n }\n\n return true;\n });\n\n // 3. Cheapest-provider heuristic (opt-in via preferCheapest)\n if (preferCheapest && availableProviders.length > 0) {\n const sorted = [...availableProviders].sort((a, b) => {\n const aCost = a.pricing ? a.pricing.inputPerMillion + a.pricing.outputPerMillion : Infinity;\n const bCost = b.pricing ? b.pricing.inputPerMillion + b.pricing.outputPerMillion : Infinity;\n if (aCost !== bCost) {\n return aCost - bCost;\n }\n // Tie-break: prefer default provider\n if (a.name === defaultProvider) {\n return -1;\n }\n if (b.name === defaultProvider) {\n return 1;\n }\n\n return 0;\n });\n\n if (sorted[0] !== providerMap.get(defaultProvider)) {\n return { provider: sorted[0]!, reason: \"cheapest\" };\n }\n }\n\n // 4. If default is in cooldown, pick the first available\n if (availableProviders.length > 0 && !availableProviders.some((p) => p.name === defaultProvider)) {\n return { provider: availableProviders[0]!, reason: \"default\" };\n }\n\n // 5. Fallback to default\n return { provider: providerMap.get(defaultProvider)!, reason: \"default\" };\n }\n\n /** Update facts after a call. */\n function recordCall(providerName: string, latencyMs: number, usage: TokenUsage | undefined, pricing?: { inputPerMillion: number; outputPerMillion: number }, error?: Error): void {\n const stats = facts.providers[providerName] ?? createEmptyStats();\n\n stats.callCount++;\n facts.callCount++;\n\n if (error) {\n stats.errorCount++;\n facts.errorCount++;\n stats.lastErrorAt = Date.now();\n } else {\n const cost = calculateCost(usage, pricing);\n stats.totalCost += cost;\n facts.totalCost += cost;\n }\n\n // Update average latency\n totalLatencyMs += latencyMs;\n facts.avgLatencyMs = totalLatencyMs / facts.callCount;\n\n const statsTotal = stats.callCount > 0\n ? ((stats.avgLatencyMs * (stats.callCount - 1)) + latencyMs) / stats.callCount\n : latencyMs;\n stats.avgLatencyMs = statsTotal;\n\n facts.providers[providerName] = stats;\n facts.lastProvider = providerName;\n }\n\n const routerRunner: AgentRunner = async <T = unknown>(\n agent: AgentLike,\n input: string,\n options?: RunOptions,\n ): Promise<RunResult<T>> => {\n const { provider, reason } = selectProvider();\n try { onProviderSelected?.(provider.name, reason); } catch { /* callback error must not disrupt routing flow */ }\n\n const startTime = Date.now();\n\n try {\n const result = await provider.runner<T>(agent, input, options);\n const latencyMs = Date.now() - startTime;\n\n recordCall(provider.name, latencyMs, result.tokenUsage, provider.pricing);\n\n return result;\n } catch (err) {\n const latencyMs = Date.now() - startTime;\n const error = err instanceof Error ? err : new Error(String(err));\n\n recordCall(provider.name, latencyMs, undefined, provider.pricing, error);\n\n throw error;\n }\n };\n\n /** Expose facts for external inspection (deep-cloned to prevent mutation). */\n Object.defineProperty(routerRunner, \"facts\", {\n get: () => {\n const clonedProviders: Record<string, ProviderStats> = Object.create(null) as Record<string, ProviderStats>;\n for (const key of Object.keys(facts.providers)) {\n clonedProviders[key] = { ...facts.providers[key]! };\n }\n\n return { ...facts, providers: clonedProviders };\n },\n enumerable: true,\n });\n\n return routerRunner as ConstraintRouterRunner;\n}\n\n/** Helper type for accessing router facts. */\nexport type ConstraintRouterRunner = AgentRunner & { readonly facts: RoutingFacts };\n","/**\n * MCP Adapter - Model Context Protocol Integration for Directive\n *\n * Provides seamless integration between Directive's constraint system and MCP servers:\n * - MCP tools become Directive resolvers with constraint-driven access control\n * - MCP resources sync to Directive facts\n * - MCP prompts available through requirements\n *\n * @example\n * ```typescript\n * import { createMCPAdapter } from '@directive-run/ai';\n *\n * const mcpAdapter = createMCPAdapter({\n * servers: [\n * { name: 'filesystem', transport: 'stdio', command: 'mcp-server-filesystem' },\n * { name: 'github', transport: 'sse', url: 'https://mcp.github.com' }\n * ],\n * toolConstraints: {\n * 'filesystem.write': { requireApproval: true },\n * 'github.create_pr': { when: (facts) => facts.reviewComplete }\n * }\n * });\n *\n * const system = createSystem({\n * module: myModule,\n * plugins: [mcpAdapter.plugin]\n * });\n * ```\n */\n\nimport type { Plugin } from \"@directive-run/core\";\nimport type {\n MCPAdapterConfig,\n MCPClient,\n MCPServerConfig,\n MCPTool,\n MCPResource,\n MCPToolConstraint,\n MCPToolResult,\n MCPResourceResult,\n MCPResourceMapping,\n MCPCallToolRequirement,\n MCPReadResourceRequirement,\n MCPGetPromptRequirement,\n MCPSyncResourcesRequirement,\n MCPApprovalRequest,\n} from \"./mcp-types.js\";\n\n// ============================================================================\n// MCP Adapter State\n// ============================================================================\n\n/** State of an MCP server connection */\ninterface MCPServerState {\n config: MCPServerConfig;\n client: MCPClient | null;\n tools: MCPTool[];\n resources: MCPResource[];\n status: \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n error?: Error;\n lastSync?: number;\n}\n\n/** Internal state for the adapter */\ninterface MCPAdapterState {\n servers: Map<string, MCPServerState>;\n toolConstraints: Map<string, MCPToolConstraint>;\n resourceMappings: MCPResourceMapping[];\n rateLimiters: Map<string, { count: number; resetTime: number }>;\n /** Pending approval requests */\n pendingApprovals: Map<string, MCPApprovalRequest>;\n /** Approved request IDs */\n approvedRequests: Set<string>;\n /** Rejected request IDs */\n rejectedRequests: Set<string>;\n}\n\n// ============================================================================\n// MCP Adapter Instance\n// ============================================================================\n\n/** MCP Adapter instance */\nexport interface MCPAdapter {\n /** Plugin to add to Directive system */\n plugin: Plugin;\n /** Connect to all configured servers */\n connect(): Promise<void>;\n /** Connect to a specific server */\n connectServer(name: string): Promise<void>;\n /** Disconnect from all servers */\n disconnect(): Promise<void>;\n /** Disconnect from a specific server */\n disconnectServer(name: string): Promise<void>;\n /** Get all available tools across all servers */\n getTools(): Map<string, MCPTool[]>;\n /** Get all available resources across all servers */\n getResources(): Map<string, MCPResource[]>;\n /**\n * Call a tool with constraint checking (recommended).\n * Applies rate limits, argument size limits, approval workflow, and custom constraints.\n * @param server - Server name\n * @param tool - Tool name\n * @param args - Tool arguments\n * @param facts - Current facts for constraint evaluation\n */\n callTool(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n facts: Record<string, unknown>\n ): Promise<MCPToolResult>;\n /**\n * Call a tool directly, bypassing all constraints (rate limits, approvals, etc.).\n * Use only for trusted internal calls where constraint checking is not needed.\n */\n callToolDirect(server: string, tool: string, args: Record<string, unknown>): Promise<MCPToolResult>;\n /** Read a resource directly */\n readResource(server: string, uri: string): Promise<MCPResourceResult>;\n /** Sync resources to facts */\n syncResources(facts: Record<string, unknown>): Promise<void>;\n /** Get server status */\n getServerStatus(name: string): MCPServerState | undefined;\n /** Get all server statuses */\n getAllServerStatuses(): Map<string, MCPServerState>;\n /** Approve a pending tool call request */\n approve(requestId: string): void;\n /** Reject a pending tool call request */\n reject(requestId: string, reason?: string): void;\n /** Get pending approval requests */\n getPendingApprovals(): MCPApprovalRequest[];\n /** Get the rejection reason for a request (if available) */\n getRejectionReason(requestId: string): string | undefined;\n}\n\n// ============================================================================\n// Default MCP Client (Stub)\n// ============================================================================\n\n/**\n * Create a stub MCP client for development/testing.\n *\n * **Important:** This stub is for development only. In production, provide\n * a real MCP client via the `clientFactory` option:\n *\n * @example\n * ```typescript\n * import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n *\n * const adapter = createMCPAdapter({\n * servers: [...],\n * clientFactory: (config) => new Client(config),\n * });\n * ```\n *\n * @param config - Server configuration\n * @param debug - Enable debug logging (default: false)\n */\nfunction createStubClient(config: MCPServerConfig, debug = false): MCPClient {\n let connected = false;\n const tools: MCPTool[] = [];\n const resources: MCPResource[] = [];\n\n const log = debug\n ? (msg: string, ...args: unknown[]) => console.debug(`[MCP Stub] ${msg}`, ...args)\n : () => {};\n\n return {\n async connect() {\n log(`Connecting to ${config.name} (${config.transport})`);\n connected = true;\n },\n async disconnect() {\n connected = false;\n },\n isConnected() {\n return connected;\n },\n getCapabilities() {\n return { tools: true, resources: true, prompts: true };\n },\n async listTools() {\n return tools;\n },\n async callTool(name: string, args: Record<string, unknown>) {\n log(`Calling tool ${name}`, args);\n return {\n content: [{ type: \"text\" as const, text: `Stub result for ${name}` }],\n };\n },\n async listResources() {\n return resources;\n },\n async readResource(uri: string) {\n log(`Reading resource ${uri}`);\n return {\n contents: [{ uri, text: `Stub content for ${uri}` }],\n };\n },\n async listPrompts() {\n return [];\n },\n async getPrompt(name: string) {\n return {\n messages: [{ role: \"user\" as const, content: { type: \"text\" as const, text: `Stub prompt ${name}` } }],\n };\n },\n };\n}\n\n// ============================================================================\n// Rate Limiter\n// ============================================================================\n\nfunction checkRateLimit(\n rateLimiters: Map<string, { count: number; resetTime: number }>,\n key: string,\n limit: number\n): boolean {\n const now = Date.now();\n const limiter = rateLimiters.get(key);\n\n if (!limiter || now > limiter.resetTime) {\n rateLimiters.set(key, { count: 1, resetTime: now + 60000 });\n return true;\n }\n\n if (limiter.count >= limit) {\n return false;\n }\n\n limiter.count++;\n return true;\n}\n\n// ============================================================================\n// MCP Adapter Factory\n// ============================================================================\n\n/**\n * Create an MCP adapter for Directive integration.\n *\n * @example\n * ```typescript\n * const adapter = createMCPAdapter({\n * servers: [\n * { name: 'fs', transport: 'stdio', command: 'mcp-server-filesystem' },\n * ],\n * toolConstraints: {\n * 'fs.write_file': {\n * requireApproval: true,\n * maxArgSize: 10000,\n * timeout: 30000,\n * },\n * },\n * resourceMappings: [\n * {\n * pattern: 'file://*.json',\n * factKey: 'jsonFiles',\n * mode: 'poll',\n * pollInterval: 5000,\n * },\n * ],\n * });\n *\n * // Add to system\n * const system = createSystem({\n * module: myModule,\n * plugins: [adapter.plugin],\n * });\n *\n * // Connect to servers\n * await adapter.connect();\n * ```\n */\nexport function createMCPAdapter(config: MCPAdapterConfig): MCPAdapter {\n const {\n servers,\n toolConstraints = {},\n resourceMappings = [],\n events = {},\n autoConnect = false,\n autoReconnect = true,\n debug = false,\n } = config;\n\n // Warn if using stub client in production\n const usingStubClient = !config.clientFactory;\n if (usingStubClient) {\n const isProduction = typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\";\n if (isProduction) {\n console.warn(\n \"[Directive MCP] WARNING: Using stub MCP client in production!\\n\" +\n \"The stub client returns mock data and does not connect to real MCP servers.\\n\" +\n \"Provide a real 'clientFactory' option to connect to actual MCP servers:\\n\\n\" +\n \" import { Client } from '@modelcontextprotocol/sdk/client/index.js';\\n\\n\" +\n \" const adapter = createMCPAdapter({\\n\" +\n \" servers: [...],\\n\" +\n \" clientFactory: (config) => new Client(config),\\n\" +\n \" });\"\n );\n } else if (debug) {\n console.debug(\n \"[Directive MCP] Using stub client for development. \" +\n \"Provide 'clientFactory' for production use.\"\n );\n }\n }\n\n const clientFactory = config.clientFactory ?? ((serverConfig: MCPServerConfig) => createStubClient(serverConfig, debug));\n const approvalTimeoutMs = config.approvalTimeoutMs ?? 300000;\n\n // Initialize state\n const state: MCPAdapterState = {\n servers: new Map(),\n toolConstraints: new Map(Object.entries(toolConstraints)),\n resourceMappings,\n rateLimiters: new Map(),\n pendingApprovals: new Map(),\n approvedRequests: new Set(),\n rejectedRequests: new Set(),\n };\n\n // Approval ID counter\n let approvalCounter = 0;\n\n // Promise-based approval waiting (no polling)\n const approvalWaiters = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n }>();\n\n // Rejection reasons storage\n const rejectionReasons = new Map<string, string>();\n\n // Wait for approval with timeout - Promise-based, no polling\n function waitForApproval(requestId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if already resolved\n if (state.approvedRequests.has(requestId)) {\n state.approvedRequests.delete(requestId);\n state.pendingApprovals.delete(requestId);\n events.onApprovalResolved?.(requestId, true);\n resolve();\n return;\n }\n if (state.rejectedRequests.has(requestId)) {\n state.rejectedRequests.delete(requestId);\n state.pendingApprovals.delete(requestId);\n const reason = rejectionReasons.get(requestId);\n rejectionReasons.delete(requestId);\n events.onApprovalResolved?.(requestId, false);\n reject(new Error(\n `[Directive MCP] Tool call request ${requestId} was rejected${reason ? `: ${reason}` : \"\"}`\n ));\n return;\n }\n\n // Set up timeout\n const timeoutId = setTimeout(() => {\n approvalWaiters.delete(requestId);\n state.pendingApprovals.delete(requestId);\n reject(new Error(\n `[Directive MCP] Approval timeout: Request ${requestId} was not approved or rejected within ${approvalTimeoutMs}ms. ` +\n `Call adapter.approve(\"${requestId}\") or adapter.reject(\"${requestId}\") to resolve.`\n ));\n }, approvalTimeoutMs);\n\n // Store waiter for later resolution\n approvalWaiters.set(requestId, { resolve, reject, timeoutId });\n });\n }\n\n // Resolve an approval (called by approve/reject)\n function resolveApproval(requestId: string, approved: boolean, reason?: string): void {\n const waiter = approvalWaiters.get(requestId);\n if (waiter) {\n clearTimeout(waiter.timeoutId);\n approvalWaiters.delete(requestId);\n state.pendingApprovals.delete(requestId);\n events.onApprovalResolved?.(requestId, approved);\n\n if (approved) {\n waiter.resolve();\n } else {\n waiter.reject(new Error(\n `[Directive MCP] Tool call request ${requestId} was rejected${reason ? `: ${reason}` : \"\"}`\n ));\n }\n } else {\n // Waiter not yet created, store for immediate resolution with TTL cleanup\n if (approved) {\n state.approvedRequests.add(requestId);\n } else {\n state.rejectedRequests.add(requestId);\n if (reason) {\n rejectionReasons.set(requestId, reason);\n }\n }\n // Auto-cleanup pre-resolved state after approval timeout to prevent memory leaks\n setTimeout(() => {\n state.approvedRequests.delete(requestId);\n state.rejectedRequests.delete(requestId);\n rejectionReasons.delete(requestId);\n state.pendingApprovals.delete(requestId);\n }, approvalTimeoutMs);\n }\n }\n\n // Track reconnect state per server\n const reconnectState = new Map<string, {\n timer: ReturnType<typeof setTimeout> | null;\n attempts: number;\n maxAttempts: number;\n baseDelay: number;\n }>();\n\n // Initialize server states\n for (const serverConfig of servers) {\n state.servers.set(serverConfig.name, {\n config: serverConfig,\n client: null,\n tools: [],\n resources: [],\n status: \"disconnected\",\n });\n reconnectState.set(serverConfig.name, {\n timer: null,\n attempts: 0,\n maxAttempts: serverConfig.retry?.maxAttempts ?? 10,\n baseDelay: serverConfig.retry?.backoffMs ?? 5000,\n });\n }\n\n // Connect to a server\n async function connectServer(name: string): Promise<void> {\n const serverState = state.servers.get(name);\n if (!serverState) {\n throw new Error(`Unknown MCP server: ${name}`);\n }\n\n if (serverState.status === \"connected\") {\n return;\n }\n\n serverState.status = \"connecting\";\n\n try {\n const client = clientFactory(serverState.config);\n await client.connect();\n\n serverState.client = client;\n serverState.status = \"connected\";\n\n // Reset reconnect state on successful connection\n const rState = reconnectState.get(name);\n if (rState) {\n rState.attempts = 0;\n if (rState.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n }\n }\n\n // Fetch available tools and resources\n if (client.getCapabilities().tools) {\n serverState.tools = await client.listTools();\n }\n if (client.getCapabilities().resources) {\n serverState.resources = await client.listResources();\n }\n\n serverState.lastSync = Date.now();\n events.onConnect?.(name);\n } catch (error) {\n serverState.status = \"error\";\n serverState.error = error instanceof Error ? error : new Error(String(error));\n events.onError?.(name, serverState.error);\n\n if (autoReconnect) {\n const rState = reconnectState.get(name);\n if (rState && rState.attempts < rState.maxAttempts) {\n rState.attempts++;\n // Exponential backoff with jitter, capped at 60s\n const delay = Math.min(\n rState.baseDelay * Math.pow(2, rState.attempts - 1) + Math.random() * 1000,\n 60000\n );\n rState.timer = setTimeout(() => {\n rState.timer = null;\n connectServer(name).catch(() => {}); // Error handled in next iteration\n }, delay);\n } else if (rState) {\n console.error(\n `[Directive MCP] Max reconnect attempts (${rState.maxAttempts}) reached for server '${name}'. ` +\n `Call adapter.connectServer(\"${name}\") to retry manually.`\n );\n }\n }\n\n throw serverState.error;\n }\n }\n\n // Disconnect from a server\n async function disconnectServer(name: string): Promise<void> {\n // Clear any pending reconnect timer\n const rState = reconnectState.get(name);\n if (rState?.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n rState.attempts = 0;\n }\n\n const serverState = state.servers.get(name);\n if (!serverState || !serverState.client) {\n return;\n }\n\n try {\n await serverState.client.disconnect();\n } finally {\n serverState.status = \"disconnected\";\n serverState.client = null;\n events.onDisconnect?.(name);\n }\n }\n\n // Call a tool with constraint checking\n async function callToolWithConstraints(\n server: string,\n tool: string,\n args: Record<string, unknown>,\n facts: Record<string, unknown>\n ): Promise<MCPToolResult> {\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`\n );\n }\n\n const constraintKey = `${server}.${tool}`;\n const constraint = state.toolConstraints.get(constraintKey);\n\n // Check constraints\n if (constraint) {\n // Check rate limit\n if (constraint.rateLimit) {\n const limiter = state.rateLimiters.get(constraintKey);\n if (!checkRateLimit(state.rateLimiters, constraintKey, constraint.rateLimit)) {\n const resetAt = limiter?.resetTime ? new Date(limiter.resetTime).toISOString() : \"unknown\";\n throw new Error(\n `[Directive MCP] Rate limit exceeded for '${constraintKey}': ` +\n `${limiter?.count ?? 0}/${constraint.rateLimit} requests per minute. ` +\n `Resets at ${resetAt}.`\n );\n }\n }\n\n // Check max arg size\n if (constraint.maxArgSize) {\n const argSize = JSON.stringify(args).length;\n if (argSize > constraint.maxArgSize) {\n throw new Error(`Arguments exceed max size (${argSize} > ${constraint.maxArgSize})`);\n }\n }\n\n // Check custom constraint\n if (constraint.when) {\n const allowed = await constraint.when(facts, args);\n if (!allowed) {\n throw new Error(`Constraint not satisfied for ${constraintKey}`);\n }\n }\n\n // Check if approval is required\n if (constraint.requireApproval) {\n const requestId = `approval-${++approvalCounter}-${Date.now()}`;\n const approvalRequest: MCPApprovalRequest = {\n id: requestId,\n server,\n tool,\n args,\n requestedAt: Date.now(),\n };\n\n state.pendingApprovals.set(requestId, approvalRequest);\n events.onApprovalRequest?.(approvalRequest);\n\n // Wait for approval or rejection\n await waitForApproval(requestId);\n }\n }\n\n events.onToolCall?.(server, tool, args);\n\n // Call the tool\n const result = await Promise.race([\n serverState.client.callTool(tool, args),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Tool call timeout: ${constraintKey}`)),\n constraint?.timeout ?? 30000\n )\n ),\n ]);\n\n events.onToolResult?.(server, tool, result);\n\n return result;\n }\n\n // Create plugin\n const plugin: Plugin = {\n name: \"mcp-adapter\",\n\n onInit: async () => {\n if (autoConnect) {\n await Promise.all(\n Array.from(state.servers.keys()).map((name) =>\n connectServer(name).catch((e) => console.error(`Failed to connect to ${name}:`, e))\n )\n );\n }\n },\n\n onDestroy: async () => {\n // Clear all reconnect timers\n for (const rState of reconnectState.values()) {\n if (rState.timer) {\n clearTimeout(rState.timer);\n rState.timer = null;\n }\n }\n\n // Reject all pending approval waiters\n for (const [, waiter] of approvalWaiters) {\n clearTimeout(waiter.timeoutId);\n waiter.reject(new Error(\"[Directive MCP] Adapter destroyed while awaiting approval\"));\n }\n approvalWaiters.clear();\n\n await Promise.all(\n Array.from(state.servers.keys()).map((name) =>\n disconnectServer(name).catch((e) => console.error(`Failed to disconnect from ${name}:`, e))\n )\n );\n },\n };\n\n // Sync resources to facts\n async function syncResources(facts: Record<string, unknown>): Promise<void> {\n for (const mapping of resourceMappings) {\n for (const [serverName, serverState] of state.servers) {\n if (!serverState.client) continue;\n\n for (const resource of serverState.resources) {\n // Check if resource matches pattern\n const matches =\n typeof mapping.pattern === \"string\"\n ? matchGlob(resource.uri, mapping.pattern)\n : mapping.pattern.test(resource.uri);\n\n if (matches) {\n try {\n const result = await serverState.client.readResource(resource.uri);\n const content = result.contents[0]?.text ?? \"\";\n const value = mapping.transform ? mapping.transform(content) : content;\n\n facts[mapping.factKey] = value;\n events.onResourceUpdate?.(serverName, resource.uri, result);\n } catch (error) {\n console.error(`Failed to sync resource ${resource.uri}:`, error);\n }\n }\n }\n }\n }\n }\n\n return {\n plugin,\n\n async connect() {\n await Promise.all(Array.from(state.servers.keys()).map(connectServer));\n },\n\n connectServer,\n\n async disconnect() {\n await Promise.all(Array.from(state.servers.keys()).map(disconnectServer));\n },\n\n disconnectServer,\n\n getTools() {\n const tools = new Map<string, MCPTool[]>();\n for (const [name, serverState] of state.servers) {\n tools.set(name, serverState.tools);\n }\n return tools;\n },\n\n getResources() {\n const resources = new Map<string, MCPResource[]>();\n for (const [name, serverState] of state.servers) {\n resources.set(name, serverState.resources);\n }\n return resources;\n },\n\n async callTool(server, tool, args, facts) {\n return callToolWithConstraints(server, tool, args, facts);\n },\n\n async callToolDirect(server, tool, args) {\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`\n );\n }\n events.onToolCall?.(server, tool, args);\n const result = await serverState.client.callTool(tool, args);\n events.onToolResult?.(server, tool, result);\n return result;\n },\n\n async readResource(server, uri) {\n const serverState = state.servers.get(server);\n if (!serverState) {\n throw new Error(\n `[Directive MCP] Unknown server '${server}'. ` +\n `Available servers: ${Array.from(state.servers.keys()).join(\", \") || \"(none)\"}`\n );\n }\n if (!serverState.client) {\n throw new Error(\n `[Directive MCP] Server '${server}' is not connected. ` +\n `Call 'adapter.connect()' or 'adapter.connectServer(\"${server}\")' first.`\n );\n }\n const result = await serverState.client.readResource(uri);\n events.onResourceUpdate?.(server, uri, result);\n return result;\n },\n\n syncResources,\n\n getServerStatus(name) {\n return state.servers.get(name);\n },\n\n getAllServerStatuses() {\n return new Map(state.servers);\n },\n\n approve(requestId: string) {\n const request = state.pendingApprovals.get(requestId);\n if (!request && !approvalWaiters.has(requestId)) {\n throw new Error(\n `[Directive MCP] No pending approval request with ID '${requestId}'. ` +\n `Pending requests: ${Array.from(state.pendingApprovals.keys()).join(\", \") || \"(none)\"}`\n );\n }\n resolveApproval(requestId, true);\n },\n\n reject(requestId: string, reason?: string) {\n const request = state.pendingApprovals.get(requestId);\n if (!request && !approvalWaiters.has(requestId)) {\n throw new Error(\n `[Directive MCP] No pending approval request with ID '${requestId}'. ` +\n `Pending requests: ${Array.from(state.pendingApprovals.keys()).join(\", \") || \"(none)\"}`\n );\n }\n resolveApproval(requestId, false, reason);\n },\n\n getPendingApprovals() {\n return Array.from(state.pendingApprovals.values());\n },\n\n getRejectionReason(requestId: string): string | undefined {\n return rejectionReasons.get(requestId);\n },\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/** Cache for compiled glob patterns to avoid repeated regex compilation */\nconst globCache = new Map<string, RegExp>();\nconst MAX_GLOB_CACHE_SIZE = 200;\n\n/** Simple glob matching (supports * and **) with caching */\nfunction matchGlob(str: string, pattern: string): boolean {\n let regex = globCache.get(pattern);\n if (!regex) {\n // Escape all regex metacharacters first, then convert glob wildcards\n const regexPattern = pattern\n .replace(/\\*\\*/g, \"\\0GLOBSTAR\\0\")\n .replace(/\\*/g, \"\\0STAR\\0\")\n .replace(/\\?/g, \"\\0QUESTION\\0\")\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\0GLOBSTAR\\0/g, \".*\")\n .replace(/\\0STAR\\0/g, \"[^/]*\")\n .replace(/\\0QUESTION\\0/g, \".\");\n regex = new RegExp(`^${regexPattern}$`);\n\n // LRU eviction: delete oldest entry when cache is full\n if (globCache.size >= MAX_GLOB_CACHE_SIZE) {\n const firstKey = globCache.keys().next().value;\n if (firstKey !== undefined) globCache.delete(firstKey);\n }\n globCache.set(pattern, regex);\n }\n return regex.test(str);\n}\n\n/**\n * Convert MCP tools to a format suitable for LLM tool calling.\n *\n * @example\n * ```typescript\n * const adapter = createMCPAdapter({ servers: [...] });\n * await adapter.connect();\n *\n * const tools = adapter.getTools();\n * const llmTools = convertToolsForLLM(tools);\n * // Use with OpenAI/Anthropic/etc.\n * ```\n */\nexport function convertToolsForLLM(\n tools: Map<string, MCPTool[]>\n): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}> {\n const result: Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n }> = [];\n\n for (const [server, serverTools] of tools) {\n for (const tool of serverTools) {\n result.push({\n type: \"function\",\n function: {\n name: `${server}.${tool.name}`,\n description: tool.description ?? `Tool: ${tool.name}`,\n parameters: tool.inputSchema,\n },\n });\n }\n }\n\n return result;\n}\n\n/**\n * Create a requirement to call an MCP tool.\n *\n * @example\n * ```typescript\n * const req = mcpCallTool('filesystem', 'read_file', { path: '/etc/hosts' });\n * // { type: 'MCP_CALL_TOOL', server: 'filesystem', tool: 'read_file', args: { path: '/etc/hosts' } }\n * ```\n */\nexport function mcpCallTool(\n server: string,\n tool: string,\n args: Record<string, unknown>\n): MCPCallToolRequirement {\n return { type: \"MCP_CALL_TOOL\", server, tool, args };\n}\n\n/**\n * Create a requirement to read an MCP resource.\n */\nexport function mcpReadResource(server: string, uri: string): MCPReadResourceRequirement {\n return { type: \"MCP_READ_RESOURCE\", server, uri };\n}\n\n/**\n * Create a requirement to get an MCP prompt.\n */\nexport function mcpGetPrompt(\n server: string,\n prompt: string,\n args?: Record<string, string>\n): MCPGetPromptRequirement {\n return { type: \"MCP_GET_PROMPT\", server, prompt, args };\n}\n\n/**\n * Create a requirement to sync MCP resources.\n */\nexport function mcpSyncResources(\n server?: string,\n pattern?: string | RegExp\n): MCPSyncResourcesRequirement {\n return { type: \"MCP_SYNC_RESOURCES\", server, pattern };\n}\n\n// Re-export types\nexport * from \"./mcp-types.js\";\n","/**\n * AI Adapter – Constraint-driven agent orchestration with guardrails\n *\n * Philosophy: \"Use Directive WITH any LLM agent framework\"\n * - Your framework handles LLM tool execution\n * - Directive adds safety guardrails, approval workflows, state persistence\n *\n * Also available:\n * - `@directive-run/ai/testing` – Mock runners, test orchestrators, assertion helpers\n * - `@directive-run/ai/anthropic` – Anthropic Claude adapter\n * - `@directive-run/ai/openai` – OpenAI / Azure / Together adapter\n * - `@directive-run/ai/ollama` – Local Ollama inference adapter\n *\n * @example\n * ```typescript\n * import { createAgentOrchestrator } from '@directive-run/ai'\n *\n * const orchestrator = createAgentOrchestrator({\n * runner: myAgentRunner,\n * constraints: {\n * needsExpertReview: {\n * when: (facts) => facts.decision.confidence < 0.7,\n * require: { type: 'EXPERT_AGENT', query: facts.userQuery }\n * },\n * budgetLimit: {\n * when: (facts) => facts.tokenUsage > 10000,\n * require: { type: 'PAUSE_AGENTS' }\n * }\n * },\n * guardrails: {\n * input: [(data) => validatePII(data.input)],\n * output: [(data) => checkToxicity(data.output)]\n * }\n * })\n * ```\n */\n\nimport type {\n Requirement,\n ModuleSchema,\n Plugin,\n SingleModuleSystem,\n System,\n} from \"@directive-run/core\";\nimport type { AgentMemory } from \"./memory.js\";\nimport type { CircuitBreaker } from \"@directive-run/core/plugins\";\nimport type { StreamChunk as StreamChunkBase } from \"./streaming.js\";\nimport {\n setBridgeFact,\n getBridgeFact,\n createCallbackPlugin,\n requirementGuard,\n} from \"@directive-run/core/adapter-utils\";\nimport { createModule } from \"@directive-run/core\";\nimport { createSystem } from \"@directive-run/core\";\n\n// ============================================================================\n// Re-export all types from dedicated module\n// ============================================================================\n\nexport type {\n AgentLike,\n RunResult,\n TokenUsage,\n Message,\n ToolCall,\n AgentRunner,\n RunOptions,\n AdapterHooks,\n GuardrailFn,\n GuardrailContext,\n GuardrailResult,\n InputGuardrailData,\n OutputGuardrailData,\n ToolCallGuardrailData,\n GuardrailRetryConfig,\n AgentRetryConfig,\n NamedGuardrail,\n GuardrailsConfig,\n AgentState,\n ApprovalState,\n RejectedRequest,\n ApprovalRequest,\n OrchestratorConstraint,\n OrchestratorResolverContext,\n OrchestratorResolver,\n OrchestratorState,\n OrchestratorLifecycleHooks,\n GuardrailErrorCode,\n SchemaValidationResult,\n SchemaValidator,\n} from \"./types.js\";\n\nexport { GuardrailError, isGuardrailError } from \"./types.js\";\n\nimport type {\n AgentLike,\n RunResult,\n Message,\n ToolCall,\n AgentRunner,\n RunOptions,\n GuardrailFn,\n GuardrailContext,\n GuardrailResult,\n InputGuardrailData,\n OutputGuardrailData,\n ToolCallGuardrailData,\n GuardrailRetryConfig,\n AgentRetryConfig,\n NamedGuardrail,\n GuardrailsConfig,\n AgentState,\n ApprovalState,\n RejectedRequest,\n ApprovalRequest,\n OrchestratorConstraint,\n OrchestratorResolverContext,\n OrchestratorResolver,\n OrchestratorState,\n OrchestratorLifecycleHooks,\n} from \"./types.js\";\n\nimport {\n GuardrailError,\n AGENT_KEY,\n APPROVAL_KEY,\n CONVERSATION_KEY,\n TOOL_CALLS_KEY,\n orchestratorBridgeSchema,\n} from \"./types.js\";\n\n// Re-export built-in guardrails\nexport {\n createPIIGuardrail,\n createModerationGuardrail,\n createRateLimitGuardrail,\n createToolGuardrail,\n createOutputSchemaGuardrail,\n createOutputTypeGuardrail,\n createLengthGuardrail,\n createContentFilterGuardrail,\n type RateLimitGuardrail,\n} from \"./builtin-guardrails.js\";\n\n// Re-export helpers\nexport {\n isAgentRunning,\n hasPendingApprovals,\n estimateCost,\n validateBaseURL,\n createRunner,\n type CreateRunnerOptions,\n type ParsedResponse,\n} from \"./helpers.js\";\n\n// Re-export constraint helpers\nexport {\n constraint,\n when,\n type ConstraintBuilder,\n type WhenWithRequire,\n} from \"./constraint-helpers.js\";\n\n// ============================================================================\n// Bridge Accessors\n// ============================================================================\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction getAgentState(facts: any): AgentState {\n return getBridgeFact<AgentState>(facts, AGENT_KEY);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction setAgentState(facts: any, state: AgentState): void {\n setBridgeFact(facts, AGENT_KEY, state);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction getApprovalState(facts: any): ApprovalState {\n return getBridgeFact<ApprovalState>(facts, APPROVAL_KEY);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction setApprovalState(facts: any, state: ApprovalState): void {\n setBridgeFact(facts, APPROVAL_KEY, state);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction getConversation(facts: any): Message[] {\n return getBridgeFact<Message[]>(facts, CONVERSATION_KEY);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction setConversation(facts: any, messages: Message[]): void {\n setBridgeFact(facts, CONVERSATION_KEY, messages);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction getToolCalls(facts: any): ToolCall[] {\n return getBridgeFact<ToolCall[]>(facts, TOOL_CALLS_KEY);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction setToolCalls(facts: any, toolCalls: ToolCall[]): void {\n setBridgeFact(facts, TOOL_CALLS_KEY, toolCalls);\n}\n\n/** Get full orchestrator state from facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction getOrchestratorState(facts: any): OrchestratorState {\n return {\n agent: getAgentState(facts),\n approval: getApprovalState(facts),\n conversation: getConversation(facts),\n toolCalls: getToolCalls(facts),\n };\n}\n\n// ============================================================================\n// Constraint/Resolver Converters\n// ============================================================================\n\n// biome-ignore lint/suspicious/noExplicitAny: Constraint types are complex\nfunction convertOrchestratorConstraints<F extends Record<string, unknown>>(\n constraints: Record<string, OrchestratorConstraint<F>>,\n): Record<string, any> {\n // biome-ignore lint/suspicious/noExplicitAny: Result type is complex\n const result: Record<string, any> = {};\n\n for (const [id, constraint] of Object.entries(constraints)) {\n result[id] = {\n priority: constraint.priority ?? 0,\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F & OrchestratorState;\n return constraint.when(combinedFacts);\n },\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n require: (facts: any) => {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F & OrchestratorState;\n return typeof constraint.require === \"function\"\n ? constraint.require(combinedFacts)\n : constraint.require;\n },\n };\n }\n\n return result;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Resolver types are complex\nfunction convertOrchestratorResolvers<F extends Record<string, unknown>>(\n resolvers: Record<string, OrchestratorResolver<F, Requirement>>,\n runAgentWithGuardrails: <T>(\n agent: AgentLike,\n input: string,\n currentFacts: F & OrchestratorState,\n opts?: RunOptions\n ) => Promise<RunResult<T>>,\n // biome-ignore lint/suspicious/noExplicitAny: Facts getter type varies\n getSystemFacts: () => any,\n): Record<string, any> {\n // biome-ignore lint/suspicious/noExplicitAny: Result type is complex\n const result: Record<string, any> = {};\n\n for (const [id, resolver] of Object.entries(resolvers)) {\n result[id] = {\n requirement: resolver.requirement,\n key: resolver.key,\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (req: Requirement, ctx: any) => {\n const state = getOrchestratorState(ctx.facts);\n const combinedFacts = { ...ctx.facts, ...state } as unknown as F & OrchestratorState;\n\n const orchestratorCtx: OrchestratorResolverContext<F> = {\n facts: combinedFacts,\n runAgent: async <T>(agent: AgentLike, input: string, opts?: RunOptions) => {\n return runAgentWithGuardrails<T>(\n agent,\n input,\n getCombinedFactsFromSystem(getSystemFacts()) as unknown as F & OrchestratorState,\n opts\n );\n },\n signal: ctx.signal,\n };\n await resolver.resolve(req, orchestratorCtx);\n },\n };\n }\n\n return result;\n}\n\n/** Helper to get combined facts from system facts */\n// biome-ignore lint/suspicious/noExplicitAny: Facts type varies\nfunction getCombinedFactsFromSystem(facts: any): OrchestratorState {\n return getOrchestratorState(facts);\n}\n\n/** Built-in pause requirement type */\ninterface PauseBudgetExceededReq extends Requirement {\n type: \"__PAUSE_BUDGET_EXCEEDED\";\n}\n\n/** Orchestrator options */\nexport interface OrchestratorOptions<F extends Record<string, unknown>> {\n /** Function to run an agent */\n runner: AgentRunner;\n /** Additional facts schema */\n factsSchema?: Record<string, { _type: unknown; _validators: [] }>;\n /** Initialize additional facts */\n init?: (facts: F & OrchestratorState) => void;\n /** Constraints for orchestration */\n constraints?: Record<string, OrchestratorConstraint<F>>;\n /** Resolvers for orchestration */\n resolvers?: Record<string, OrchestratorResolver<F, Requirement>>;\n /** Guardrails */\n guardrails?: GuardrailsConfig;\n /** Callback for approval requests */\n onApprovalRequest?: (request: ApprovalRequest) => void;\n /**\n * Auto-approve tool calls\n * @default true\n */\n autoApproveToolCalls?: boolean;\n /**\n * Maximum token budget across all agent runs.\n *\n * When exceeded, agents are automatically paused with status \"paused\".\n * Check `facts.agent.tokenUsage` to see current usage.\n *\n * For more sophisticated cost management (per-user budgets, tiered pricing,\n * cost alerts), see the Cost Management section in the documentation.\n *\n * @example\n * ```typescript\n * const orchestrator = createAgentOrchestrator({\n * maxTokenBudget: 10000, // Pause after 10K tokens\n * });\n *\n * // Check if paused due to budget\n * if (orchestrator.facts.agent.status === 'paused') {\n * console.log('Budget exceeded:', orchestrator.facts.agent.tokenUsage);\n * }\n * ```\n */\n maxTokenBudget?: number;\n /** Plugins */\n plugins?: Plugin[];\n /**\n * Enable debugging\n * @default false\n */\n debug?: boolean;\n /**\n * Approval timeout in milliseconds\n * @default 300000 (5 minutes)\n */\n approvalTimeoutMs?: number;\n /** Retry configuration for agent runs (no retries if not specified) */\n agentRetry?: AgentRetryConfig;\n /** Lifecycle hooks for observability */\n hooks?: OrchestratorLifecycleHooks;\n /**\n * Optional memory instance. When provided, context messages are auto-injected\n * into agent instructions before each run, and result messages are auto-stored.\n */\n memory?: AgentMemory;\n /**\n * Optional circuit breaker. Wraps every run() call.\n * When OPEN, throws CircuitBreakerOpenError instead of calling the agent.\n */\n circuitBreaker?: CircuitBreaker;\n}\n\n/** Streaming run result from orchestrator */\nexport interface OrchestratorStreamResult<T = unknown> {\n /** Async iterator for streaming chunks */\n stream: AsyncIterable<OrchestratorStreamChunk>;\n /** Promise that resolves to the final result */\n result: Promise<RunResult<T>>;\n /** Abort the stream */\n abort: () => void;\n}\n\n/** Stream chunk types for orchestrator — extends StreamChunk with approval events */\nexport type OrchestratorStreamChunk =\n | StreamChunkBase\n | { type: \"approval_required\"; requestId: string; toolName: string }\n | { type: \"approval_resolved\"; requestId: string; approved: boolean };\n\n/** Per-call options for run() */\nexport interface RunCallOptions {\n /** Override output guardrails for this call only. Set to [] to skip. */\n outputGuardrails?: Array<GuardrailFn<OutputGuardrailData> | NamedGuardrail<OutputGuardrailData>>;\n /** Override input guardrails for this call only. Set to [] to skip. */\n inputGuardrails?: Array<GuardrailFn<InputGuardrailData> | NamedGuardrail<InputGuardrailData>>;\n /** Signal for abort */\n signal?: AbortSignal;\n}\n\n/** Orchestrator instance */\nexport interface AgentOrchestrator<F extends Record<string, unknown>> {\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n system: System<any>;\n facts: F & OrchestratorState;\n /** Run an agent with guardrails. Pass options to override guardrails per-call. */\n run<T>(agent: AgentLike, input: string, options?: RunCallOptions): Promise<RunResult<T>>;\n /**\n * Run an agent with streaming support.\n * Returns an async iterator for chunks and a promise for the final result.\n *\n * @example\n * ```typescript\n * const { stream, result, abort } = orchestrator.runStream(agent, input);\n *\n * for await (const chunk of stream) {\n * if (chunk.type === 'token') process.stdout.write(chunk.data);\n * if (chunk.type === 'approval_required') showApprovalDialog(chunk);\n * if (chunk.type === 'guardrail_triggered') handleGuardrail(chunk);\n * }\n *\n * const finalResult = await result;\n * ```\n */\n runStream<T>(agent: AgentLike, input: string, options?: { signal?: AbortSignal }): OrchestratorStreamResult<T>;\n /** Approve a pending request */\n approve(requestId: string): void;\n /** Reject a pending request */\n reject(requestId: string, reason?: string): void;\n /** Pause all agents */\n pause(): void;\n /** Resume agents */\n resume(): void;\n /** Reset conversation state */\n reset(): void;\n /** Dispose of the orchestrator */\n dispose(): void;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n// ============================================================================\n// Helper: Normalize Guardrail (internal)\n// ============================================================================\n\n/** Normalize a guardrail to a named guardrail */\nfunction normalizeGuardrail<T>(\n guardrail: GuardrailFn<T> | NamedGuardrail<T>,\n index: number,\n type: string\n): NamedGuardrail<T> {\n if (typeof guardrail === \"function\") {\n return {\n name: `${type}-guardrail-${index}`,\n fn: guardrail,\n critical: true,\n };\n }\n return guardrail;\n}\n\n/** Calculate delay for retry with backoff */\nfunction calculateRetryDelay(\n attempt: number,\n config: GuardrailRetryConfig\n): number {\n const { backoff = \"exponential\", baseDelayMs = 100, maxDelayMs = 5000 } = config;\n let delay: number;\n switch (backoff) {\n case \"exponential\":\n delay = baseDelayMs * Math.pow(2, attempt - 1);\n break;\n case \"linear\":\n delay = baseDelayMs * attempt;\n break;\n case \"fixed\":\n default:\n delay = baseDelayMs;\n }\n return Math.min(delay, maxDelayMs);\n}\n\n/** Execute a guardrail with retry support */\nasync function executeGuardrailWithRetry<T>(\n guardrail: NamedGuardrail<T>,\n data: T,\n context: GuardrailContext\n): Promise<GuardrailResult> {\n const { retry } = guardrail;\n const maxAttempts = retry?.attempts ?? 1;\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await guardrail.fn(data, context);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n // Only retry if we have more attempts left\n if (attempt < maxAttempts) {\n const delay = calculateRetryDelay(attempt, retry ?? {});\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n // All retries exhausted, throw the last error\n throw lastError;\n}\n\n/** Calculate delay for agent retry with backoff */\nfunction calculateAgentRetryDelay(\n attempt: number,\n config: AgentRetryConfig\n): number {\n const { backoff = \"exponential\", baseDelayMs = 1000, maxDelayMs = 30000 } = config;\n let delay: number;\n switch (backoff) {\n case \"exponential\":\n delay = baseDelayMs * Math.pow(2, attempt - 1);\n break;\n case \"linear\":\n delay = baseDelayMs * attempt;\n break;\n case \"fixed\":\n default:\n delay = baseDelayMs;\n }\n return Math.min(delay, maxDelayMs);\n}\n\n/** Execute an agent run with retry support */\nasync function executeAgentWithRetry<T>(\n runner: AgentRunner,\n agent: AgentLike,\n input: string,\n options: RunOptions | undefined,\n retryConfig: AgentRetryConfig | undefined\n): Promise<RunResult<T>> {\n const maxAttempts = retryConfig?.attempts ?? 1;\n const isRetryable = retryConfig?.isRetryable ?? (() => true);\n const onRetry = retryConfig?.onRetry;\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await runner<T>(agent, input, options);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Check if error is retryable and we have more attempts\n if (attempt < maxAttempts && isRetryable(lastError)) {\n const delay = calculateAgentRetryDelay(attempt, retryConfig ?? {});\n onRetry?.(attempt, lastError, delay);\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n // Either not retryable or out of attempts\n break;\n }\n }\n }\n // All retries exhausted, throw the last error\n throw lastError;\n}\n\n/**\n * Create an orchestrator for OpenAI agents with Directive constraints.\n *\n * @example\n * ```typescript\n * import { run as runner } from '@openai/agents'\n *\n * const orchestrator = createAgentOrchestrator({\n * runner,\n * constraints: {\n * escalateToExpert: {\n * when: (facts) => facts.agent.output?.confidence < 0.7,\n * require: (facts) => ({\n * type: 'RUN_EXPERT_AGENT',\n * query: facts.agent.input,\n * }),\n * },\n * budgetExceeded: {\n * when: (facts) => facts.agent.tokenUsage > 10000,\n * require: { type: 'PAUSE_AGENTS' },\n * },\n * },\n * guardrails: {\n * input: [\n * async (data) => {\n * const hasPII = await detectPII(data.input);\n * return { passed: !hasPII, reason: hasPII ? 'Contains PII' : undefined };\n * },\n * ],\n * output: [\n * async (data) => {\n * const isToxic = await checkToxicity(data.output);\n * return { passed: !isToxic, reason: isToxic ? 'Toxic content' : undefined };\n * },\n * ],\n * },\n * });\n *\n * // Run with guardrails and constraint-driven orchestration\n * const result = await orchestrator.run(myAgent, 'Hello, can you help me?');\n * ```\n *\n * @throws {Error} If autoApproveToolCalls is false but no onApprovalRequest callback is provided\n */\nexport function createAgentOrchestrator<\n F extends Record<string, unknown> = Record<string, never>\n>(options: OrchestratorOptions<F>): AgentOrchestrator<F> {\n const {\n runner,\n factsSchema = {},\n init,\n constraints = {},\n resolvers = {},\n guardrails = {},\n onApprovalRequest,\n autoApproveToolCalls = true,\n maxTokenBudget,\n plugins = [],\n debug = false,\n approvalTimeoutMs = 300000,\n agentRetry,\n hooks = {},\n memory,\n circuitBreaker,\n } = options;\n\n // Enforce approval workflow configuration - require either auto-approve or callback\n if (!autoApproveToolCalls && !onApprovalRequest) {\n throw new Error(\n \"[Directive] Invalid approval configuration: autoApproveToolCalls is false but no onApprovalRequest callback provided. \" +\n \"Tool calls would wait for approval indefinitely. Either:\\n\" +\n \" - Set autoApproveToolCalls: true to auto-approve all tool calls\\n\" +\n \" - Provide an onApprovalRequest callback to handle approvals programmatically\"\n );\n }\n\n // Build schema by combining bridge schema with user-provided schema\n const combinedSchema = {\n facts: {\n ...orchestratorBridgeSchema.facts,\n ...factsSchema,\n },\n derivations: {},\n events: {},\n requirements: {},\n } satisfies ModuleSchema;\n\n // Forward declaration for runAgentWithGuardrails (used in resolver converter)\n let runAgentWithGuardrailsFn: <T>(\n agent: AgentLike,\n input: string,\n currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions\n ) => Promise<RunResult<T>>;\n\n // Forward declaration for system (used in resolver converter)\n // biome-ignore lint/suspicious/noExplicitAny: System type varies\n let system: SingleModuleSystem<any>;\n\n // Convert user constraints\n // biome-ignore lint/suspicious/noExplicitAny: Constraint types are complex\n const directiveConstraints: Record<string, any> =\n convertOrchestratorConstraints<F>(constraints);\n\n // Add built-in budget limit constraint\n if (maxTokenBudget) {\n directiveConstraints[\"__budgetLimit\"] = {\n priority: 100, // High priority\n // biome-ignore lint/suspicious/noExplicitAny: Facts type varies\n when: (facts: any) => getAgentState(facts).tokenUsage > maxTokenBudget,\n require: { type: \"__PAUSE_BUDGET_EXCEEDED\" } as PauseBudgetExceededReq,\n };\n }\n\n // Convert user resolvers\n // biome-ignore lint/suspicious/noExplicitAny: Resolver types are complex\n const directiveResolvers: Record<string, any> =\n convertOrchestratorResolvers<F>(\n resolvers,\n (agent, input, currentFacts, opts) => runAgentWithGuardrailsFn(agent, input, currentFacts, opts),\n () => system.facts,\n );\n\n // Add built-in pause resolver\n directiveResolvers[\"__pause\"] = {\n requirement: requirementGuard<PauseBudgetExceededReq>(\"__PAUSE_BUDGET_EXCEEDED\"),\n // biome-ignore lint/suspicious/noExplicitAny: Context type varies\n resolve: async (_req: Requirement, ctx: any) => {\n const currentAgent = getAgentState(ctx.facts);\n setAgentState(ctx.facts, {\n ...currentAgent,\n status: \"paused\",\n });\n },\n };\n\n // Create callback plugin for onApprovalRequest\n const callbackPlugin = createCallbackPlugin(\n \"openai-agents-callbacks\",\n {}, // No requirement callbacks needed, approval is handled separately\n );\n\n // Create module\n // biome-ignore lint/suspicious/noExplicitAny: Bridge module uses dynamic constraints/resolvers\n const orchestratorModule = createModule(\"openai-agents-orchestrator\", {\n schema: combinedSchema,\n init: (facts) => {\n setAgentState(facts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(facts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(facts, []);\n setToolCalls(facts, []);\n if (init) {\n const state = getOrchestratorState(facts);\n const combinedFacts = { ...facts, ...state } as unknown as F & OrchestratorState;\n init(combinedFacts);\n }\n },\n constraints: directiveConstraints,\n resolvers: directiveResolvers as any,\n });\n\n // Create system\n system = createSystem({\n module: orchestratorModule,\n plugins: [...plugins, callbackPlugin],\n debug: debug ? { timeTravel: true } : undefined,\n });\n\n system.start();\n\n // Helper to run agent with guardrails\n async function runAgentWithGuardrails<T>(\n agent: AgentLike,\n input: string,\n _currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions\n ): Promise<RunResult<T>> {\n // Wrap in circuit breaker if configured\n if (circuitBreaker) {\n return circuitBreaker.execute(() =>\n runAgentWithGuardrailsInner<T>(agent, input, _currentFacts, opts, callOptions)\n );\n }\n return runAgentWithGuardrailsInner<T>(agent, input, _currentFacts, opts, callOptions);\n }\n\n async function runAgentWithGuardrailsInner<T>(\n agent: AgentLike,\n input: string,\n _currentFacts: F & OrchestratorState,\n opts?: RunOptions,\n callOptions?: RunCallOptions\n ): Promise<RunResult<T>> {\n const startTime = Date.now();\n\n // Inject memory context into agent instructions if memory is configured\n if (memory) {\n const contextMessages = memory.getContextMessages();\n if (contextMessages.length > 0) {\n const contextStr = contextMessages\n .map((m) => `${m.role}: ${m.content}`)\n .join(\"\\n\");\n agent = {\n ...agent,\n instructions: (agent.instructions ?? \"\") + \"\\n\\nConversation context:\\n\" + contextStr,\n };\n }\n }\n\n // Call onAgentStart hook\n hooks.onAgentStart?.({\n agentName: agent.name,\n input,\n timestamp: startTime,\n });\n\n // Resolve which guardrails to use: per-call override > orchestrator defaults\n const effectiveInputGuardrails = callOptions?.inputGuardrails !== undefined\n ? callOptions.inputGuardrails\n : (guardrails.input ?? []);\n const effectiveOutputGuardrails = callOptions?.outputGuardrails !== undefined\n ? callOptions.outputGuardrails\n : (guardrails.output ?? []);\n\n // Run input guardrails with retry support\n const inputGuardrailsList = effectiveInputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"input\")\n );\n for (const guardrail of inputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input, agentName: agent.name },\n context\n );\n // Call onGuardrailCheck hook\n hooks.onGuardrailCheck?.({\n guardrailName: name,\n guardrailType: \"input\",\n passed: result.passed,\n reason: result.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!result.passed) {\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input,\n });\n }\n if (result.transformed !== undefined) {\n input = result.transformed as string;\n }\n }\n\n // Update state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"running\",\n currentAgent: agent.name,\n input,\n startedAt: Date.now(),\n });\n });\n\n // Run the agent with retry support\n const result = await executeAgentWithRetry<T>(runner, agent, input, {\n ...opts,\n signal: opts?.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(system.facts);\n setConversation(system.facts, [...currentConversation, message]);\n opts?.onMessage?.(message);\n },\n onToolCall: async (toolCall) => {\n // Run tool call guardrails with retry support\n const toolCallGuardrails = (guardrails.toolCall ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"toolCall\")\n );\n for (const guardrail of toolCallGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input },\n context\n );\n hooks.onGuardrailCheck?.({\n guardrailName: name,\n guardrailType: \"toolCall\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input,\n });\n }\n }\n\n // Check if approval is needed\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${toolCall.id}`;\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const currentApproval = getApprovalState(system.facts);\n setApprovalState(system.facts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n\n // Wait for approval\n await waitForApproval(approvalId);\n }\n\n const currentToolCalls = getToolCalls(system.facts);\n setToolCalls(system.facts, [...currentToolCalls, toolCall]);\n opts?.onToolCall?.(toolCall);\n },\n }, agentRetry ? {\n ...agentRetry,\n onRetry: (attempt, error, delayMs) => {\n agentRetry.onRetry?.(attempt, error, delayMs);\n hooks.onAgentRetry?.({\n agentName: agent.name,\n input,\n attempt,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n } : undefined);\n\n // Run output guardrails with retry support\n const outputGuardrailsList = effectiveOutputGuardrails.map((g, i) =>\n normalizeGuardrail(g, i, \"output\")\n );\n for (const guardrail of outputGuardrailsList) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input,\n facts: system.facts.$store.toObject(),\n };\n const guardStartTime = Date.now();\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input,\n messages: result.messages,\n },\n context\n );\n hooks.onGuardrailCheck?.({\n guardrailName: name,\n guardrailType: \"output\",\n passed: guardResult.passed,\n reason: guardResult.reason,\n durationMs: Date.now() - guardStartTime,\n timestamp: Date.now(),\n });\n if (!guardResult.passed) {\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: currentAgent.tokenUsage + result.totalTokens,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n });\n\n // Store messages in memory if configured\n if (memory && result.messages.length > 0) {\n memory.addMessages(result.messages);\n }\n\n // Call onAgentComplete hook\n hooks.onAgentComplete?.({\n agentName: agent.name,\n input,\n output: result.output,\n tokenUsage: result.totalTokens,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n return result;\n }\n\n // Assign the function to the forward-declared variable\n runAgentWithGuardrailsFn = runAgentWithGuardrails;\n\n // Wait for approval with configurable timeout\n function waitForApproval(requestId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n const unsubscribe = system.facts.$store.subscribe([APPROVAL_KEY], () => {\n const approval = getApprovalState(system.facts);\n if (approval.approved.includes(requestId)) {\n cleanup();\n unsubscribe();\n resolve();\n } else {\n const rejectedRequest = approval.rejected.find((r) => r.id === requestId);\n if (rejectedRequest) {\n cleanup();\n unsubscribe();\n const errorMsg = rejectedRequest.reason\n ? `Request ${requestId} rejected: ${rejectedRequest.reason}`\n : `Request ${requestId} rejected`;\n reject(new Error(errorMsg));\n }\n }\n });\n\n // Set timeout to prevent indefinite hanging (uses configured approvalTimeoutMs)\n timeoutId = setTimeout(() => {\n unsubscribe();\n const timeoutSeconds = Math.round(approvalTimeoutMs / 1000);\n reject(new Error(\n `[Directive] Approval timeout: Request ${requestId} not resolved within ${timeoutSeconds}s.\\n` +\n `Solutions:\\n` +\n ` 1. Handle via onApprovalRequest callback and call orchestrator.approve()/reject()\\n` +\n ` 2. Set autoApproveToolCalls: true to auto-approve\\n` +\n ` 3. Increase approvalTimeoutMs (current: ${approvalTimeoutMs}ms)\\n` +\n `See: https://directive.run/docs/ai/running-agents`\n ));\n }, approvalTimeoutMs);\n });\n }\n\n /** Get facts as the combined type for external access */\n function getCombinedFacts(): F & OrchestratorState {\n const state = getOrchestratorState(system.facts);\n return { ...state } as unknown as F & OrchestratorState;\n }\n\n const orchestrator: AgentOrchestrator<F> = {\n system: system as unknown as System<any>,\n get facts() {\n return getCombinedFacts();\n },\n\n async run<T>(agent: AgentLike, input: string, options?: RunCallOptions): Promise<RunResult<T>> {\n return runAgentWithGuardrails<T>(agent, input, getCombinedFacts(), undefined, options);\n },\n\n runStream<T>(\n agent: AgentLike,\n input: string,\n options: { signal?: AbortSignal } = {}\n ): OrchestratorStreamResult<T> {\n const abortController = new AbortController();\n const chunks: OrchestratorStreamChunk[] = [];\n const waiters: Array<(chunk: OrchestratorStreamChunk | null) => void> = [];\n let closed = false;\n const startTime = Date.now();\n let tokenCount = 0;\n let accumulatedOutput = \"\";\n\n // Combine external abort signal\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n abortHandler = () => abortController.abort();\n options.signal.addEventListener(\"abort\", abortHandler);\n }\n\n const cleanup = () => {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n // Push a chunk to the stream\n const pushChunk = (chunk: OrchestratorStreamChunk) => {\n if (closed) return;\n const waiter = waiters.shift();\n if (waiter) {\n waiter(chunk);\n } else {\n chunks.push(chunk);\n }\n };\n\n // Close the stream\n const closeStream = () => {\n closed = true;\n cleanup();\n for (const waiter of waiters) {\n waiter(null);\n }\n waiters.length = 0;\n };\n\n // Run the agent with streaming callbacks\n const resultPromise = (async (): Promise<RunResult<T>> => {\n pushChunk({ type: \"progress\", phase: \"starting\", message: \"Running input guardrails\" });\n\n try {\n // Run input guardrails first with retry support\n let processedInput = input;\n const inputGuardrails = (guardrails.input ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"input\")\n );\n for (const guardrail of inputGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const result = await executeGuardrailWithRetry(\n guardrail,\n { input: processedInput, agentName: agent.name },\n context\n );\n if (!result.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: result.reason ?? \"Input validation failed\",\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n throw new GuardrailError({\n code: \"INPUT_GUARDRAIL_FAILED\",\n message: `Input guardrail \"${name}\" failed: ${result.reason}`,\n guardrailName: name,\n guardrailType: \"input\",\n userMessage: result.reason ?? \"Input validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (result.transformed !== undefined) {\n processedInput = result.transformed as string;\n }\n }\n\n pushChunk({ type: \"progress\", phase: \"generating\", message: \"Starting agent\" });\n\n // Update state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"running\",\n currentAgent: agent.name,\n input: processedInput,\n startedAt: Date.now(),\n });\n });\n\n // Run agent with streaming callbacks and retry support\n const result = await executeAgentWithRetry<T>(runner, agent, processedInput, {\n signal: abortController.signal,\n onMessage: (message) => {\n const currentConversation = getConversation(system.facts);\n setConversation(system.facts, [...currentConversation, message]);\n pushChunk({ type: \"message\", message });\n\n // Approximate token counting from content\n if (message.role === \"assistant\" && message.content) {\n const newTokens = Math.ceil(message.content.length / 4);\n tokenCount += newTokens;\n accumulatedOutput += message.content;\n pushChunk({ type: \"token\", data: message.content, tokenCount });\n }\n },\n onToolCall: async (toolCall) => {\n pushChunk({ type: \"tool_start\", tool: toolCall.name, toolCallId: toolCall.id, arguments: toolCall.arguments });\n\n // Run tool call guardrails with retry support\n const toolCallGuardrails = (guardrails.toolCall ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"toolCall\")\n );\n for (const guardrail of toolCallGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n { toolCall, agentName: agent.name, input: processedInput },\n context\n );\n if (!guardResult.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: guardResult.reason ?? \"Tool call blocked\",\n partialOutput: accumulatedOutput,\n stopped: true,\n });\n throw new GuardrailError({\n code: \"TOOL_CALL_GUARDRAIL_FAILED\",\n message: `Tool call guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"toolCall\",\n userMessage: guardResult.reason ?? \"Tool call blocked\",\n data: { toolCall },\n agentName: agent.name,\n input: processedInput,\n });\n }\n }\n\n // Check if approval is needed\n if (!autoApproveToolCalls) {\n const approvalId = `tool-${toolCall.id}`;\n pushChunk({ type: \"approval_required\", requestId: approvalId, toolName: toolCall.name });\n\n const approvalRequest: ApprovalRequest = {\n id: approvalId,\n type: \"tool_call\",\n agentName: agent.name,\n description: `Tool call: ${toolCall.name}`,\n data: toolCall,\n requestedAt: Date.now(),\n };\n\n system.batch(() => {\n const currentApproval = getApprovalState(system.facts);\n setApprovalState(system.facts, {\n ...currentApproval,\n pending: [...currentApproval.pending, approvalRequest],\n });\n });\n\n onApprovalRequest?.(approvalRequest);\n await waitForApproval(approvalId);\n pushChunk({ type: \"approval_resolved\", requestId: approvalId, approved: true });\n }\n\n const currentToolCalls = getToolCalls(system.facts);\n setToolCalls(system.facts, [...currentToolCalls, toolCall]);\n\n if (toolCall.result) {\n pushChunk({ type: \"tool_end\", tool: toolCall.name, toolCallId: toolCall.id, result: toolCall.result });\n }\n },\n }, agentRetry);\n\n // Run output guardrails\n pushChunk({ type: \"progress\", phase: \"finishing\", message: \"Running output guardrails\" });\n\n const outputGuardrails = (guardrails.output ?? []).map((g, i) =>\n normalizeGuardrail(g, i, \"output\")\n );\n for (const guardrail of outputGuardrails) {\n const { name } = guardrail;\n const context = {\n agentName: agent.name,\n input: processedInput,\n facts: system.facts.$store.toObject(),\n };\n const guardResult = await executeGuardrailWithRetry(\n guardrail,\n {\n output: result.output,\n agentName: agent.name,\n input: processedInput,\n messages: result.messages,\n },\n context\n );\n if (!guardResult.passed) {\n pushChunk({\n type: \"guardrail_triggered\",\n guardrailName: name,\n reason: guardResult.reason ?? \"Output validation failed\",\n partialOutput: typeof result.output === \"string\" ? result.output : \"\",\n stopped: true,\n });\n throw new GuardrailError({\n code: \"OUTPUT_GUARDRAIL_FAILED\",\n message: `Output guardrail \"${name}\" failed: ${guardResult.reason}`,\n guardrailName: name,\n guardrailType: \"output\",\n userMessage: guardResult.reason ?? \"Output validation failed\",\n agentName: agent.name,\n input: processedInput,\n });\n }\n if (guardResult.transformed !== undefined) {\n (result as { output: unknown }).output = guardResult.transformed;\n }\n }\n\n // Update final state\n system.batch(() => {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"completed\",\n output: result.output,\n tokenUsage: currentAgent.tokenUsage + result.totalTokens,\n turnCount: currentAgent.turnCount + result.messages.length,\n completedAt: Date.now(),\n });\n });\n\n const duration = Date.now() - startTime;\n pushChunk({ type: \"done\", totalTokens: result.totalTokens, duration, droppedTokens: 0 });\n closeStream();\n\n return result;\n } catch (error) {\n pushChunk({ type: \"error\", error: error instanceof Error ? error : new Error(String(error)) });\n closeStream();\n throw error;\n }\n })();\n\n // Create async iterator\n const stream: AsyncIterable<OrchestratorStreamChunk> = {\n [Symbol.asyncIterator](): AsyncIterator<OrchestratorStreamChunk> {\n return {\n async next(): Promise<IteratorResult<OrchestratorStreamChunk>> {\n if (chunks.length > 0) {\n return { done: false, value: chunks.shift()! };\n }\n if (closed) {\n return { done: true, value: undefined };\n }\n return new Promise<IteratorResult<OrchestratorStreamChunk>>((resolve) => {\n waiters.push((chunk) => {\n if (chunk === null) {\n resolve({ done: true, value: undefined });\n } else {\n resolve({ done: false, value: chunk });\n }\n });\n });\n },\n };\n },\n };\n\n return {\n stream,\n result: resultPromise,\n abort: () => {\n abortController.abort();\n closeStream();\n },\n };\n },\n\n approve(requestId: string): void {\n system.batch(() => {\n const approval = getApprovalState(system.facts);\n if (!approval.pending.some((r) => r.id === requestId)) {\n if (debug) console.debug(`[Directive] approve() ignored: no pending request \"${requestId}\"`);\n return;\n }\n const MAX_APPROVAL_HISTORY = 200;\n const approved = [...approval.approved, requestId];\n setApprovalState(system.facts, {\n ...approval,\n pending: approval.pending.filter((r) => r.id !== requestId),\n approved: approved.length > MAX_APPROVAL_HISTORY ? approved.slice(-MAX_APPROVAL_HISTORY) : approved,\n });\n });\n },\n\n reject(requestId: string, reason?: string): void {\n system.batch(() => {\n const approval = getApprovalState(system.facts);\n if (!approval.pending.some((r) => r.id === requestId)) {\n if (debug) console.debug(`[Directive] reject() ignored: no pending request \"${requestId}\"`);\n return;\n }\n if (reason && debug) {\n console.debug(`[Directive] Request ${requestId} rejected: ${reason}`);\n }\n const rejectedRequest: RejectedRequest = {\n id: requestId,\n reason,\n rejectedAt: Date.now(),\n };\n const MAX_REJECTION_HISTORY = 200;\n const rejected = [...approval.rejected, rejectedRequest];\n setApprovalState(system.facts, {\n ...approval,\n pending: approval.pending.filter((r) => r.id !== requestId),\n rejected: rejected.length > MAX_REJECTION_HISTORY ? rejected.slice(-MAX_REJECTION_HISTORY) : rejected,\n });\n });\n },\n\n pause(): void {\n const currentAgent = getAgentState(system.facts);\n setAgentState(system.facts, {\n ...currentAgent,\n status: \"paused\",\n });\n },\n\n resume(): void {\n const agent = getAgentState(system.facts);\n if (agent.status === \"paused\") {\n setAgentState(system.facts, {\n ...agent,\n status: agent.currentAgent ? \"running\" : \"idle\",\n });\n }\n },\n\n reset(): void {\n system.batch(() => {\n setAgentState(system.facts, {\n status: \"idle\",\n currentAgent: null,\n input: null,\n output: null,\n error: null,\n tokenUsage: 0,\n turnCount: 0,\n startedAt: null,\n completedAt: null,\n });\n setApprovalState(system.facts, {\n pending: [],\n approved: [],\n rejected: [],\n });\n setConversation(system.facts, []);\n setToolCalls(system.facts, []);\n });\n },\n\n dispose(): void {\n system.destroy();\n },\n };\n\n return orchestrator;\n}\n\n// (Built-in guardrails moved to openai-agents-builtin-guardrails.ts)\n\n// (Helper functions moved to openai-agents-helpers.ts)\n\n// (Cost helpers + errors moved to openai-agents-helpers.ts + openai-agents-types.ts)\n\n// ============================================================================\n// Builder Pattern\n// ============================================================================\n\n/** Builder for type-safe orchestrator configuration */\nexport interface OrchestratorBuilder<F extends Record<string, unknown>> {\n /** Add a constraint */\n withConstraint<K extends string>(\n id: K,\n constraint: OrchestratorConstraint<F>\n ): OrchestratorBuilder<F>;\n\n /** Add a resolver */\n withResolver<R extends Requirement>(\n id: string,\n resolver: OrchestratorResolver<F, R>\n ): OrchestratorBuilder<F>;\n\n /** Add an input guardrail */\n withInputGuardrail(\n nameOrGuardrail: string | NamedGuardrail<InputGuardrailData>,\n fn?: GuardrailFn<InputGuardrailData>\n ): OrchestratorBuilder<F>;\n\n /** Add an output guardrail */\n withOutputGuardrail(\n nameOrGuardrail: string | NamedGuardrail<OutputGuardrailData>,\n fn?: GuardrailFn<OutputGuardrailData>\n ): OrchestratorBuilder<F>;\n\n /** Add a tool call guardrail */\n withToolCallGuardrail(\n nameOrGuardrail: string | NamedGuardrail<ToolCallGuardrailData>,\n fn?: GuardrailFn<ToolCallGuardrailData>\n ): OrchestratorBuilder<F>;\n\n /** Add a plugin */\n withPlugin(plugin: Plugin): OrchestratorBuilder<F>;\n\n /** Set memory instance for auto context injection and message storage */\n withMemory(memory: AgentMemory): OrchestratorBuilder<F>;\n\n /** Set circuit breaker to wrap all run() calls */\n withCircuitBreaker(cb: CircuitBreaker): OrchestratorBuilder<F>;\n\n /** Set max token budget */\n withBudget(maxTokens: number): OrchestratorBuilder<F>;\n\n /** Enable debug mode */\n withDebug(enabled?: boolean): OrchestratorBuilder<F>;\n\n /** Build the orchestrator */\n build(options: {\n runner: AgentRunner;\n autoApproveToolCalls?: boolean;\n onApprovalRequest?: (request: ApprovalRequest) => void;\n }): AgentOrchestrator<F>;\n}\n\n/**\n * Create a type-safe orchestrator builder.\n *\n * @example\n * ```typescript\n * const orchestrator = createOrchestratorBuilder<MyFacts>()\n * .withConstraint('budget', {\n * when: (facts) => facts.cost > 100,\n * require: { type: 'PAUSE' },\n * })\n * .withInputGuardrail('pii', createPIIGuardrail())\n * .withOutputGuardrail('toxicity', createModerationGuardrail({ ... }))\n * .withBudget(10000)\n * .withDebug()\n * .build({ runner });\n * ```\n */\nexport function createOrchestratorBuilder<\n F extends Record<string, unknown> = Record<string, never>\n>(): OrchestratorBuilder<F> {\n const constraints: Record<string, OrchestratorConstraint<F>> = {};\n const resolvers: Record<string, OrchestratorResolver<F, Requirement>> = {};\n const inputGuardrails: NamedGuardrail<InputGuardrailData>[] = [];\n const outputGuardrails: NamedGuardrail<OutputGuardrailData>[] = [];\n const toolCallGuardrails: NamedGuardrail<ToolCallGuardrailData>[] = [];\n const plugins: Plugin[] = [];\n let maxTokenBudget: number | undefined;\n let debug = false;\n let memoryInstance: AgentMemory | undefined;\n let circuitBreakerInstance: CircuitBreaker | undefined;\n\n const builder: OrchestratorBuilder<F> = {\n withConstraint(id, constraint) {\n constraints[id] = constraint;\n return builder;\n },\n\n withResolver(id, resolver) {\n resolvers[id] = resolver as unknown as OrchestratorResolver<F, Requirement>;\n return builder;\n },\n\n withInputGuardrail(nameOrGuardrail, fn) {\n if (typeof nameOrGuardrail === \"string\" && fn) {\n inputGuardrails.push({ name: nameOrGuardrail, fn });\n } else if (typeof nameOrGuardrail === \"object\") {\n inputGuardrails.push(nameOrGuardrail);\n }\n return builder;\n },\n\n withOutputGuardrail(nameOrGuardrail, fn) {\n if (typeof nameOrGuardrail === \"string\" && fn) {\n outputGuardrails.push({ name: nameOrGuardrail, fn });\n } else if (typeof nameOrGuardrail === \"object\") {\n outputGuardrails.push(nameOrGuardrail);\n }\n return builder;\n },\n\n withToolCallGuardrail(nameOrGuardrail, fn) {\n if (typeof nameOrGuardrail === \"string\" && fn) {\n toolCallGuardrails.push({ name: nameOrGuardrail, fn });\n } else if (typeof nameOrGuardrail === \"object\") {\n toolCallGuardrails.push(nameOrGuardrail);\n }\n return builder;\n },\n\n withPlugin(plugin) {\n plugins.push(plugin);\n return builder;\n },\n\n withMemory(mem) {\n memoryInstance = mem;\n return builder;\n },\n\n withCircuitBreaker(cb) {\n circuitBreakerInstance = cb;\n return builder;\n },\n\n withBudget(maxTokens) {\n maxTokenBudget = maxTokens;\n return builder;\n },\n\n withDebug(enabled = true) {\n debug = enabled;\n return builder;\n },\n\n build(options) {\n return createAgentOrchestrator<F>({\n runner: options.runner,\n autoApproveToolCalls: options.autoApproveToolCalls,\n onApprovalRequest: options.onApprovalRequest,\n constraints,\n resolvers,\n guardrails: {\n input: inputGuardrails,\n output: outputGuardrails,\n toolCall: toolCallGuardrails,\n },\n plugins,\n maxTokenBudget,\n debug,\n memory: memoryInstance,\n circuitBreaker: circuitBreakerInstance,\n });\n },\n };\n\n return builder;\n}\n\n// (createRunner moved to openai-agents-helpers.ts)\n\n// ============================================================================\n// Re-exports from Sub-modules\n// ============================================================================\n\n// Memory system\nexport {\n createAgentMemory,\n createSlidingWindowStrategy,\n createTokenBasedStrategy,\n createHybridStrategy,\n createTruncationSummarizer,\n createKeyPointsSummarizer,\n createLLMSummarizer,\n type AgentMemory,\n type AgentMemoryConfig,\n type MemoryState,\n type MemoryManageResult,\n type MemoryStrategy,\n type MemoryStrategyConfig,\n type MemoryStrategyResult,\n type MessageSummarizer,\n} from \"./memory.js\";\n\n// Streaming utilities\nexport {\n createStreamingRunner,\n createLengthStreamingGuardrail,\n createPatternStreamingGuardrail,\n createToxicityStreamingGuardrail,\n combineStreamingGuardrails,\n adaptOutputGuardrail,\n collectTokens,\n tapStream,\n filterStream,\n mapStream,\n type TokenChunk,\n type ToolStartChunk,\n type ToolEndChunk,\n type MessageChunk,\n type GuardrailTriggeredChunk,\n type ProgressChunk,\n type DoneChunk,\n type ErrorChunk,\n type StreamChunk,\n type StreamRunOptions,\n type StreamRunner,\n type StreamingRunResult,\n type StreamingGuardrail,\n type StreamingGuardrailResult,\n type BackpressureStrategy,\n} from \"./streaming.js\";\n\n// Multi-agent orchestration\nexport {\n createMultiAgentOrchestrator,\n Semaphore,\n parallel,\n sequential,\n supervisor,\n selectAgent,\n runAgentRequirement,\n concatResults,\n pickBestResult,\n collectOutputs,\n aggregateTokens,\n type MultiAgentOrchestrator,\n type MultiAgentOrchestratorOptions,\n type MultiAgentState,\n type AgentRegistration,\n type AgentRegistry,\n type AgentRunState,\n type ExecutionPattern,\n type ParallelPattern,\n type SequentialPattern,\n type SupervisorPattern,\n type HandoffRequest,\n type HandoffResult,\n type AgentSelectionConstraint,\n type RunAgentRequirement,\n} from \"./multi.js\";\n\n// Agent communication\nexport {\n createMessageBus,\n createAgentNetwork,\n createResponder,\n createDelegator,\n createPubSub,\n type MessageBus,\n type MessageBusConfig,\n type AgentNetwork,\n type AgentNetworkConfig,\n type AgentInfo,\n type AgentMessage,\n type AgentMessageType,\n type TypedAgentMessage,\n type RequestMessage,\n type ResponseMessage,\n type DelegationMessage,\n type DelegationResultMessage,\n type QueryMessage,\n type InformMessage,\n type UpdateMessage,\n type MessageHandler,\n type Subscription,\n type MessageFilter,\n} from \"./communication.js\";\n\n// Observability\nexport {\n createObservability,\n createAgentMetrics,\n type ObservabilityInstance,\n type ObservabilityConfig,\n type MetricType,\n type MetricDataPoint,\n type AggregatedMetric,\n type TraceSpan,\n type AlertConfig,\n type AlertEvent,\n type DashboardData,\n} from \"@directive-run/core/plugins\";\n\n// OTLP Exporter\nexport {\n createOTLPExporter,\n type OTLPExporterConfig,\n type OTLPExporter,\n} from \"@directive-run/core/plugins\";\n\n// Circuit Breaker\nexport {\n createCircuitBreaker,\n CircuitBreakerOpenError,\n type CircuitBreaker,\n type CircuitBreakerConfig,\n type CircuitBreakerStats,\n type CircuitState,\n} from \"@directive-run/core/plugins\";\n\n// Audit Trail\nexport {\n createAuditTrail,\n createAgentAuditHandlers,\n type AuditPluginConfig,\n type AuditInstance,\n} from \"./plugins/audit.js\";\n\n// Prompt Injection Guardrails\nexport {\n createPromptInjectionGuardrail,\n createUntrustedContentGuardrail,\n detectPromptInjection,\n sanitizeInjection,\n markUntrustedContent,\n DEFAULT_INJECTION_PATTERNS,\n STRICT_INJECTION_PATTERNS,\n type PromptInjectionGuardrailOptions,\n} from \"./guardrails/prompt-injection.js\";\n\n// Compliance (GDPR/CCPA)\nexport {\n createCompliance,\n createInMemoryComplianceStorage,\n type ComplianceConfig,\n type ComplianceInstance,\n type ComplianceStorage,\n} from \"./plugins/compliance.js\";\n\n// Enhanced PII Guardrails\nexport {\n createEnhancedPIIGuardrail,\n createOutputPIIGuardrail,\n detectPII,\n redactPII,\n type EnhancedPIIGuardrailOptions,\n} from \"./guardrails/pii-enhanced.js\";\n\n// ANN Index\nexport {\n createBruteForceIndex,\n createVPTreeIndex,\n type ANNIndex,\n type ANNSearchResult,\n type VPTreeIndexConfig,\n} from \"./guardrails/ann-index.js\";\n\nexport {\n createSemanticCache,\n createSemanticCacheGuardrail,\n createBatchedEmbedder,\n createTestEmbedder,\n createInMemoryStorage,\n type Embedding,\n type SemanticCache,\n type SemanticCacheConfig,\n type CacheEntry,\n type CacheLookupResult,\n type CacheStats,\n type SemanticCacheStorage,\n type BatchedEmbedder,\n type EmbedderFn,\n} from \"./guardrails/semantic-cache.js\";\n\n// Stream Channels\nexport {\n createStreamChannel,\n createBidirectionalStream,\n pipeThrough,\n mergeStreams,\n type StreamChannel,\n type StreamChannelConfig,\n type StreamChannelState,\n type BidirectionalStream,\n} from \"./stream-channel.js\";\n\n// Agent Stack — Composition API\nexport {\n createAgentStack,\n type AgentStack,\n type AgentStackConfig,\n type AgentStackState,\n type StackRunOptions,\n type StackStreamOptions,\n type StructuredRunOptions,\n type TokenStream,\n type StreamingCallbackRunner,\n} from \"./stack.js\";\n\n// AI Bridge — Sync AgentStack state into Directive system\nexport { createAISyncer } from \"./bridge.js\";\n\n// RAG Enricher\nexport {\n createRAGEnricher,\n createJSONFileStore,\n type RAGChunk,\n type RAGStorage,\n type RAGEnricherConfig,\n type RAGEnrichOptions,\n type RAGEnricher,\n type JSONFileStoreOptions,\n} from \"./rag.js\";\n\n// SSE Transport\nexport {\n createSSETransport,\n type SSEEvent,\n type SSETransportConfig,\n type SSETransport,\n} from \"./sse-transport.js\";\n\n// P2: Intelligent Retry\nexport {\n withRetry,\n parseHttpStatus,\n parseRetryAfter,\n RetryExhaustedError,\n type RetryConfig,\n} from \"./retry.js\";\n\n// P0: Provider Fallback\nexport {\n withFallback,\n AllProvidersFailedError,\n type FallbackConfig,\n} from \"./fallback.js\";\n\n// P1: Cost Budget Guards\nexport {\n withBudget,\n BudgetExceededError,\n type BudgetConfig,\n type BudgetRunner,\n type BudgetWindow,\n type TokenPricing,\n type BudgetExceededDetails,\n} from \"./budget.js\";\n\n// P3: Smart Model Selection\nexport {\n withModelSelection,\n byInputLength,\n byAgentName,\n byPattern,\n type ModelRule,\n type ModelSelectionConfig,\n} from \"./model-selector.js\";\n\n// P6: Structured Outputs\nexport {\n withStructuredOutput,\n extractJsonFromOutput,\n StructuredOutputError,\n type StructuredOutputConfig,\n type SafeParseable,\n type SafeParseResult,\n} from \"./structured-output.js\";\n\n// P5: Batch Queue\nexport {\n createBatchQueue,\n type BatchQueue,\n type BatchQueueConfig,\n} from \"./batch.js\";\n\n// P4: Constraint-Driven Provider Routing\nexport {\n createConstraintRouter,\n type ConstraintRouterConfig,\n type ConstraintRouterRunner,\n type RoutingProvider,\n type RoutingFacts,\n type ProviderStats,\n type RoutingConstraint,\n} from \"./provider-routing.js\";\n\n// MCP (Model Context Protocol)\nexport {\n createMCPAdapter,\n convertToolsForLLM,\n mcpCallTool,\n mcpReadResource,\n mcpGetPrompt,\n mcpSyncResources,\n type MCPAdapter,\n} from \"./mcp.js\";\nexport type {\n MCPAdapterConfig,\n MCPTool,\n MCPToolResult,\n MCPToolConstraint,\n MCPServerConfig,\n MCPResource,\n MCPApprovalRequest,\n MCPCallToolRequirement,\n MCPReadResourceRequirement,\n MCPGetPromptRequirement,\n MCPSyncResourcesRequirement,\n MCPRequirement,\n} from \"./mcp-types.js\";\n"]}
|