fifony 0.1.22 → 0.1.23
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/README.md +33 -9
- package/app/dist/assets/KeyboardShortcutsHelp-BB5jLK_E.js +1 -0
- package/app/dist/assets/OnboardingWizard-xyM3Okjv.js +1 -0
- package/app/dist/assets/analytics.lazy-CfJXsh6r.js +1 -0
- package/app/dist/assets/index-C1QEwHZG.js +43 -0
- package/app/dist/assets/index-DjmUHXd1.css +1 -0
- package/app/dist/dinofffaur.png +0 -0
- package/app/dist/index.html +2 -2
- package/app/dist/service-worker.js +1 -1
- package/app/public/dinofffaur.png +0 -0
- package/dist/agent/cli-wrapper.js +1 -1
- package/dist/agent/cli-wrapper.js.map +1 -1
- package/dist/agent/run-local.js +163 -33
- package/dist/agent/run-local.js.map +1 -1
- package/dist/{chunk-O665NS5E.js → chunk-DD5BE2W6.js} +40 -43
- package/dist/chunk-DD5BE2W6.js.map +1 -0
- package/dist/chunk-DVU3CXWA.js +75 -0
- package/dist/chunk-DVU3CXWA.js.map +1 -0
- package/dist/chunk-G6CQK2WH.js +2137 -0
- package/dist/chunk-G6CQK2WH.js.map +1 -0
- package/dist/{chunk-VP6TGOMT.js → chunk-KT5V7N5H.js} +5219 -7032
- package/dist/chunk-KT5V7N5H.js.map +1 -0
- package/dist/chunk-NLIVWBNV.js +91 -0
- package/dist/chunk-NLIVWBNV.js.map +1 -0
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/issue-runner-6VFNHYJL.js +13 -0
- package/dist/issue-state-machine-NSDN4MV4.js +39 -0
- package/dist/mcp/server.js +6 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/{queue-workers-LAYOT4E5.js → queue-workers-VHYQYYLG.js} +3 -4
- package/dist/queue-workers-VHYQYYLG.js.map +1 -0
- package/dist/store-FH7L6KR2.js +56 -0
- package/dist/store-FH7L6KR2.js.map +1 -0
- package/package.json +1 -1
- package/FIFONY.md +0 -173
- package/app/dist/assets/KeyboardShortcutsHelp-DFstgyXD.js +0 -1
- package/app/dist/assets/OnboardingWizard-Daehu2Uj.js +0 -1
- package/app/dist/assets/analytics.lazy-C1-iSRM_.js +0 -1
- package/app/dist/assets/index-DbIrs0MK.css +0 -1
- package/app/dist/assets/index-O_FDwkw6.js +0 -43
- package/dist/chunk-F6JEQIP2.js +0 -449
- package/dist/chunk-F6JEQIP2.js.map +0 -1
- package/dist/chunk-O665NS5E.js.map +0 -1
- package/dist/chunk-VP6TGOMT.js.map +0 -1
- package/dist/issue-runner-MDCJ4G26.js +0 -11
- package/src/fixtures/agent-catalog.json +0 -208
- package/src/fixtures/skill-catalog.json +0 -67
- /package/dist/{issue-runner-MDCJ4G26.js.map → issue-runner-6VFNHYJL.js.map} +0 -0
- /package/dist/{queue-workers-LAYOT4E5.js.map → issue-state-machine-NSDN4MV4.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/issue-runner.ts","../src/agent/logger.ts","../src/agent/dirty-tracker.ts","../src/agent/providers.ts","../src/agent/adapters/claude.ts","../src/agent/adapters/shared.ts","../src/agent/adapters/commands.ts","../src/agent/adapters/codex.ts","../src/agent/adapters/gemini.ts","../src/agent/adapters/registry.ts","../src/agent/issues.ts","../src/agent/token-ledger.ts","../src/agent/metrics-cache.ts","../src/agent/issue-state-machine.ts","../src/agent/project-meta.ts","../src/agent/workspace-diff.ts","../src/agent/adapters/index.ts","../src/agent/store.ts","../src/agent/api-runtime-context.ts","../src/agent/api-server.ts","../src/agent/resources/runtime-state.resource.ts","../src/agent/directive-parser.ts","../src/agent/pid-manager.ts","../src/agent/workspace-merge.ts","../src/agent/session-state.ts","../src/agent/prompt-builder.ts","../src/agent/command-executor.ts","../src/agent/workspace-setup.ts","../src/agent/workflow.ts","../src/agent/agent-pipeline.ts","../src/agent/skills.ts","../src/agent/agent.ts","../src/agent/resources/issues.resource.ts","../src/agent/resources/issue-plans.resource.ts","../src/agent/resources/events.resource.ts","../src/agent/resources/settings.resource.ts","../src/agent/resources/agent-sessions.resource.ts","../src/agent/resources/agent-pipelines.resource.ts","../src/agent/resources/index.ts","../src/agent/api-websocket.ts","../src/agent/wake-signal.ts","../src/agent/queue-workers.ts","../src/agent/scheduler.ts","../src/agent/api-helpers.ts","../src/agent/providers-usage.ts","../src/agent/api-routes/state.ts","../src/agent/issue-enhancer.ts","../src/agent/api-routes/plan.ts","../src/agent/settings.ts","../src/agent/api-routes/settings.ts","../src/agent/api-routes/analytics.ts","../src/agent/project-scanner.ts","../src/agent/issue-scanner.ts","../src/agent/github-sync.ts","../src/agent/api-routes/scanning.ts","../src/agent/catalog.ts","../src/agent/api-routes/catalog.ts","../src/agent/api-routes/reference-repositories.ts","../src/agent/api-routes/misc.ts","../src/agent/planning-session.ts","../src/agent/plan-generator.ts","../src/agent/planning-parser.ts","../src/agent/planning-prompts.ts","../src/agent/planning-schema.ts","../src/agent/plan-refiner.ts","../src/agent/planning-background.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type {\n IssueEntry,\n RuntimeState,\n WorkflowConfig,\n} from \"./types.ts\";\nimport { SOURCE_ROOT, TARGET_ROOT, WORKSPACE_ROOT } from \"./constants.ts\";\nimport { now, idToSafePath } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { markIssueDirty, markIssuePlanDirty } from \"./dirty-tracker.ts\";\nimport { getEffectiveAgentProviders } from \"./providers.ts\";\nimport { addEvent, transitionIssueState, computeMetrics, getNextRetryAt } from \"./issues.ts\";\nimport { compileReview, buildExecutionAudit, persistExecutionAudit } from \"./adapters/index.ts\";\nimport { generatePlan } from \"./issue-planner.ts\";\nimport { persistState } from \"./store.ts\";\nimport { addTokenUsage } from \"./directive-parser.ts\";\nimport { runAgentSession, runAgentPipeline } from \"./agent-pipeline.ts\";\nimport { computeDiffStats } from \"./workspace-diff.ts\";\nimport { ensureWorktreeCommitted, hydrateIssuePathsFromWorkspace, describeRoutingSignals } from \"./workspace-merge.ts\";\nimport { prepareWorkspace } from \"./workspace-setup.ts\";\nimport { inferCapabilityPaths } from \"../routing/capability-resolver.ts\";\nimport { getWorkflowConfig, loadRuntimeSettings } from \"./settings.ts\";\nimport { wakeScheduler } from \"./wake-signal.ts\";\n\n/**\n * Run a planning job for an issue in the Planning state within a worker slot.\n * Blocks until plan generation completes, writing versioned artifacts to the workspace.\n */\nexport async function runPlanningJob(\n state: RuntimeState,\n issue: IssueEntry,\n): Promise<void> {\n issue.planningStatus = \"planning\";\n issue.planningStartedAt = now();\n issue.planningError = undefined;\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n\n // Ensure workspace directory exists (no git worktree — planning only needs file storage)\n const safeId = idToSafePath(issue.id);\n const workspaceDir = join(WORKSPACE_ROOT, safeId);\n mkdirSync(workspaceDir, { recursive: true });\n\n addEvent(state, issue.id, \"info\", `Plan generation started for ${issue.identifier} (v${(issue.planVersion ?? 0) + 1}).`);\n\n try {\n const { plan, usage, prompt } = await generatePlan(\n issue.title,\n issue.description,\n state.config,\n null,\n { persistSession: false },\n );\n\n issue.plan = plan;\n markIssuePlanDirty(issue.id);\n issue.planVersion = Math.max((issue.planVersion ?? 0), 1);\n\n // Apply plan suggestions (paths, labels, effort)\n if (plan.suggestedPaths?.length && !(issue.paths?.length)) issue.paths = plan.suggestedPaths;\n if (plan.suggestedLabels?.length && !issue.labels?.length) issue.labels = plan.suggestedLabels;\n if (plan.suggestedEffort && !issue.effort) issue.effort = plan.suggestedEffort;\n\n // Apply token usage\n if (usage.totalTokens > 0) {\n addTokenUsage(issue, {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n model: usage.model,\n }, \"planner\");\n }\n\n // Write versioned artifacts to workspace\n const pv = issue.planVersion;\n try {\n writeFileSync(join(workspaceDir, `plan.v${pv}.json`), JSON.stringify(plan, null, 2), \"utf8\");\n writeFileSync(join(workspaceDir, `plan.v${pv}.prompt.md`), prompt, \"utf8\");\n } catch (artifactErr) {\n logger.warn({ err: String(artifactErr) }, \"[Agent] Failed to write versioned plan artifacts\");\n }\n\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n // Issue remains in Planning state — user must approve before execution\n addEvent(state, issue.id, \"progress\", `Plan v${pv} generated for ${issue.identifier}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}.`);\n if (usage.totalTokens > 0) {\n addEvent(state, issue.id, \"info\", `Plan tokens (${issue.identifier}): ${usage.totalTokens.toLocaleString()} [${usage.model}]`);\n }\n } catch (error) {\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = error instanceof Error ? error.message : String(error);\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n addEvent(state, issue.id, \"error\", `Plan generation failed for ${issue.identifier}: ${issue.planningError}`);\n logger.error({ err: error }, `[Agent] Planning job failed for ${issue.identifier}`);\n }\n}\n\nasync function handleReviewStage(\n state: RuntimeState,\n issue: IssueEntry,\n workspacePath: string,\n startTs: number,\n routedProviders: ReturnType<typeof getEffectiveAgentProviders>,\n): Promise<void> {\n issue.reviewAttempt = (issue.reviewAttempt ?? 0) + 1;\n markIssueDirty(issue.id);\n\n const reviewer = routedProviders.find((p) => p.role === \"reviewer\");\n if (!reviewer) {\n // No reviewer configured → auto-approve\n issue.mergedReason = \"Auto-approved: no reviewer configured.\";\n await transitionIssueState(issue, \"Done\", `No reviewer configured; auto-approved for ${issue.identifier}.`);\n addEvent(state, issue.id, \"runner\", `Issue ${issue.identifier} auto-approved (no reviewer provider).`);\n issue.completedAt = now();\n issue.lastError = undefined;\n return;\n }\n\n addEvent(state, issue.id, \"info\", `Review provider: ${reviewer.role}:${reviewer.provider}${reviewer.model ? `/${reviewer.model}` : \"\"}${reviewer.profile ? `:${reviewer.profile}` : \"\"}.`);\n\n // Get diff summary for the review prompt\n let diffSummary = \"\";\n try {\n if (issue.baseBranch && issue.branchName) {\n const diffResult = execSync(\n `git diff --stat \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { cwd: TARGET_ROOT, encoding: \"utf8\", maxBuffer: 512_000, timeout: 10_000 },\n );\n diffSummary = diffResult.trim();\n } else {\n const diffTarget = issue.worktreePath ?? workspacePath;\n const diffResult = execSync(\n `git diff --no-index --stat -- \"${SOURCE_ROOT}\" \"${diffTarget}\" 2>/dev/null`,\n { encoding: \"utf8\", maxBuffer: 512_000, timeout: 10_000 },\n );\n diffSummary = diffResult.trim();\n }\n } catch (err: any) {\n diffSummary = (err.stdout || \"\").trim();\n }\n\n const compiled = await compileReview(issue, reviewer, workspacePath, diffSummary);\n const effectiveReviewer = { ...reviewer, command: compiled.command || reviewer.command };\n const reviewPromptFile = join(workspacePath, \"review-prompt.md\");\n writeFileSync(reviewPromptFile, `${compiled.prompt}\\n`, \"utf8\");\n const reviewResult = await runAgentSession(state, issue, effectiveReviewer, 1, workspacePath, compiled.prompt, reviewPromptFile);\n issue.durationMs = (issue.durationMs ?? 0) + (Date.now() - startTs);\n issue.commandExitCode = reviewResult.code;\n issue.commandOutputTail = reviewResult.output;\n const reviewAudit = buildExecutionAudit(effectiveReviewer, null, issue, Date.now() - startTs, reviewResult.success ? \"approved\" : reviewResult.continueRequested ? \"rework\" : \"rejected\");\n persistExecutionAudit(workspacePath, reviewAudit);\n try {\n const rpv = issue.planVersion ?? 1;\n const rra = issue.reviewAttempt ?? 1;\n const vReviewPromptSrc = join(workspacePath, \"review-prompt.md\");\n const vReviewAuditSrc = join(workspacePath, \"execution-audit.json\");\n if (existsSync(vReviewPromptSrc)) {\n writeFileSync(join(workspacePath, `review.v${rpv}a${rra}.prompt.md`), readFileSync(vReviewPromptSrc, \"utf8\"), \"utf8\");\n }\n if (existsSync(vReviewAuditSrc)) {\n writeFileSync(join(workspacePath, `review.v${rpv}a${rra}.audit.json`), readFileSync(vReviewAuditSrc, \"utf8\"), \"utf8\");\n }\n } catch (vErr) {\n logger.warn({ err: String(vErr) }, \"[Agent] Failed to write versioned review artifacts\");\n }\n\n if (reviewResult.success) {\n issue.mergedReason = `Auto-approved by reviewer in ${reviewResult.turns} turn(s).`;\n await transitionIssueState(issue, \"Reviewed\", `Reviewer completed for ${issue.identifier}.`);\n await transitionIssueState(issue, \"Done\", `Reviewer approved ${issue.identifier} in ${reviewResult.turns} turn(s).`);\n addEvent(state, issue.id, \"runner\", `Issue ${issue.identifier} approved by reviewer → Done.`);\n issue.completedAt = now();\n issue.lastError = undefined;\n } else if (reviewResult.continueRequested) {\n await transitionIssueState(issue, \"Reviewed\", `Reviewer completed for ${issue.identifier}.`);\n await transitionIssueState(issue, \"Queued\", `Reviewer requested rework for ${issue.identifier}.`);\n issue.nextRetryAt = new Date(Date.now() + 1000).toISOString();\n issue.lastError = undefined;\n addEvent(state, issue.id, \"runner\", `Issue ${issue.identifier} sent back for rework by reviewer.`);\n } else {\n // Reviewer blocked or failed\n issue.lastError = reviewResult.output;\n issue.attempts += 1;\n if (issue.attempts >= issue.maxAttempts) {\n issue.cancelledReason = `Max attempts reached (${issue.attempts}/${issue.maxAttempts}): reviewer failed or blocked.`;\n await transitionIssueState(issue, \"Cancelled\", `Review failed, max attempts reached for ${issue.identifier}.`);\n addEvent(state, issue.id, \"error\", `Issue ${issue.identifier} cancelled after review failure.`);\n } else {\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n await transitionIssueState(issue, \"Blocked\", `Review failed for ${issue.identifier}. Retry at ${issue.nextRetryAt}.`);\n addEvent(state, issue.id, \"error\", `Issue ${issue.identifier} blocked after review failure.`);\n }\n }\n}\n\nasync function handleExecutionStage(\n state: RuntimeState,\n issue: IssueEntry,\n workspacePath: string,\n promptText: string,\n promptFile: string,\n workflowConfig: WorkflowConfig | null,\n workspaceDerivedPaths: string[],\n startTs: number,\n routedProviders: ReturnType<typeof getEffectiveAgentProviders>,\n): Promise<void> {\n issue.executeAttempt = (issue.executeAttempt ?? 0) + 1;\n markIssueDirty(issue.id);\n\n addEvent(state, issue.id, \"info\",\n `Capability routing selected ${routedProviders.map((p) => `${p.role}:${p.provider}${p.model ? `/${p.model}` : \"\"}${p.profile ? `:${p.profile}` : \"\"}${p.reasoningEffort ? ` [${p.reasoningEffort}]` : \"\"}`).join(\", \")}.`);\n\n const routingSignals = describeRoutingSignals(issue, workspaceDerivedPaths);\n if (routingSignals) {\n addEvent(state, issue.id, \"info\", `Capability routing signals: ${routingSignals}.`);\n }\n\n const runResult = await runAgentPipeline(state, issue, workspacePath, promptText, promptFile, workflowConfig);\n\n issue.durationMs = Date.now() - startTs;\n issue.commandExitCode = runResult.code;\n issue.commandOutputTail = runResult.output;\n\n if (runResult.success) {\n ensureWorktreeCommitted(issue);\n\n computeDiffStats(issue);\n if (issue.filesChanged) {\n addEvent(state, issue.id, \"info\", `Diff: ${issue.filesChanged} files, +${issue.linesAdded || 0} -${issue.linesRemoved || 0} lines.`);\n }\n\n addEvent(state, issue.id, \"info\", `Workspace prepared for review on branch ${issue.branchName ?? \"workspace\"}.`);\n\n const executor = routedProviders.find((p) => p.role === \"executor\") || routedProviders[0];\n if (executor && workspacePath) {\n const audit = buildExecutionAudit(executor, null, issue, Date.now() - startTs, \"success\");\n persistExecutionAudit(workspacePath, audit);\n\n try {\n const epv = issue.planVersion ?? 1;\n const eea = issue.executeAttempt ?? 1;\n const vExecPromptSrc = join(workspacePath, \"prompt.md\");\n const vExecAuditSrc = join(workspacePath, \"execution-audit.json\");\n if (existsSync(vExecPromptSrc)) {\n writeFileSync(join(workspacePath, `execute.v${epv}a${eea}.prompt.md`), readFileSync(vExecPromptSrc, \"utf8\"), \"utf8\");\n }\n if (existsSync(vExecAuditSrc)) {\n writeFileSync(join(workspacePath, `execute.v${epv}a${eea}.audit.json`), readFileSync(vExecAuditSrc, \"utf8\"), \"utf8\");\n }\n } catch (vErr) {\n logger.warn({ err: String(vErr) }, \"[Agent] Failed to write versioned execute artifacts\");\n }\n }\n\n await transitionIssueState(issue, \"Reviewing\", `Agent execution finished in ${runResult.turns} turn(s) for ${issue.identifier}. Awaiting review.`);\n issue.lastError = undefined;\n addEvent(state, issue.id, \"runner\", `Issue ${issue.identifier} moved to Reviewing.`);\n } else if (runResult.continueRequested) {\n issue.updatedAt = now();\n issue.commandExitCode = runResult.code;\n issue.commandOutputTail = runResult.output;\n issue.lastError = undefined;\n issue.nextRetryAt = new Date(Date.now() + 1000).toISOString();\n issue.history.push(`[${issue.updatedAt}] Agent requested another turn (${runResult.turns}/${state.config.maxTurns}).`);\n addEvent(state, issue.id, \"runner\", `Issue ${issue.identifier} queued for next turn.`);\n } else {\n issue.lastError = runResult.output;\n issue.attempts += 1;\n\n if (issue.attempts >= issue.maxAttempts) {\n issue.commandExitCode = runResult.code;\n issue.cancelledReason = `Max attempts reached (${issue.attempts}/${issue.maxAttempts}): execution failed repeatedly.`;\n await transitionIssueState(issue, \"Cancelled\", `Max attempts reached (${issue.attempts}/${issue.maxAttempts}).`);\n addEvent(state, issue.id, \"error\", `Issue ${issue.identifier} cancelled after repeated failures.`);\n } else {\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n await transitionIssueState(issue,\n \"Blocked\",\n `${runResult.blocked ? \"Agent requested manual intervention\" : \"Failure\"} on attempt ${issue.attempts}/${issue.maxAttempts}; retry scheduled at ${issue.nextRetryAt}.`);\n addEvent(state, issue.id, \"error\", `Issue ${issue.identifier} blocked waiting for retry.`);\n }\n }\n}\n\nexport async function runIssueOnce(\n state: RuntimeState,\n issue: IssueEntry,\n running: Set<string>,\n): Promise<void> {\n const startTs = Date.now();\n const isReviewing = issue.state === \"Reviewing\";\n const isResuming = issue.state === \"Running\";\n logger.info({ issueId: issue.id, identifier: issue.identifier, state: issue.state, isReviewing, isResuming, attempt: issue.attempts + 1, maxAttempts: issue.maxAttempts }, \"[Agent] Starting issue execution\");\n\n // Planning jobs run in the background without occupying a worker slot.\n // planningStatus=\"planning\" (set immediately by runPlanningJob) acts as the dispatch guard\n // so canRunIssue returns false while planning is in progress, preventing double-dispatch.\n if (issue.state === \"Planning\") {\n issue.startedAt = issue.startedAt ?? now();\n runPlanningJob(state, issue)\n .catch((err) => logger.error({ err, issueId: issue.id, identifier: issue.identifier }, \"[Agent] Unexpected error in background planning job\"))\n .finally(() => {\n state.metrics = computeMetrics(state.issues);\n state.updatedAt = now();\n persistState(state).catch(() => {});\n wakeScheduler();\n });\n return;\n }\n\n running.add(issue.id);\n state.metrics.activeWorkers += 1;\n issue.startedAt = issue.startedAt ?? now();\n\n let workflowConfig: WorkflowConfig | null = null;\n try {\n const settings = await loadRuntimeSettings();\n workflowConfig = getWorkflowConfig(settings);\n } catch {\n // Fall through — use defaults\n }\n\n if (isReviewing) {\n issue.updatedAt = now();\n issue.history.push(`[${issue.updatedAt}] Review stage started for ${issue.identifier}.`);\n addEvent(state, issue.id, \"progress\", `Review started for ${issue.identifier}.`);\n } else if (isResuming) {\n await transitionIssueState(issue, \"Running\", `Resuming runner for ${issue.identifier}.`);\n addEvent(state, issue.id, \"progress\", `Runner resumed for ${issue.identifier}.`);\n } else {\n if (issue.state !== \"Queued\") {\n await transitionIssueState(issue, \"Queued\", `Issue ${issue.identifier} queued for execution.`);\n }\n await transitionIssueState(issue, \"Running\", `Agent started for ${issue.identifier}.`);\n addEvent(state, issue.id, \"progress\", `Runner started for ${issue.identifier}.`);\n }\n\n try {\n const workspaceDerivedPaths = hydrateIssuePathsFromWorkspace(issue);\n if ((issue.paths ?? []).length > 0) {\n issue.inferredPaths = [...new Set([...(issue.inferredPaths ?? []), ...inferCapabilityPaths({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n paths: issue.paths,\n })])];\n }\n\n const { workspacePath, promptText, promptFile } = await prepareWorkspace(issue, state, state.config.defaultBranch);\n addEvent(state, issue.id, \"info\", `Workspace ready at ${workspacePath}.`);\n\n const routedProviders = getEffectiveAgentProviders(state, issue, null, workflowConfig);\n\n if (isReviewing) {\n await handleReviewStage(state, issue, workspacePath, startTs, routedProviders);\n return;\n }\n\n await handleExecutionStage(state, issue, workspacePath, promptText, promptFile, workflowConfig, workspaceDerivedPaths, startTs, routedProviders);\n } catch (error) {\n issue.attempts += 1;\n issue.lastError = String(error);\n\n if (issue.attempts >= issue.maxAttempts) {\n issue.cancelledReason = `Max attempts reached (${issue.attempts}/${issue.maxAttempts}): unexpected failure — ${issue.lastError?.slice(0, 120) ?? \"unknown error\"}.`;\n await transitionIssueState(issue, \"Cancelled\", `Issue failed unexpectedly: ${issue.lastError}`);\n addEvent(state, issue.id, \"error\", `Issue ${issue.identifier} cancelled unexpectedly.`);\n } else {\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n await transitionIssueState(issue, \"Blocked\", `Unexpected failure. Retry scheduled at ${issue.nextRetryAt}.`);\n addEvent(state, issue.id, \"error\", `Issue ${issue.identifier} blocked after unexpected failure.`);\n }\n } finally {\n const elapsedMs = Date.now() - startTs;\n logger.info({ issueId: issue.id, identifier: issue.identifier, finalState: issue.state, elapsedMs, attempts: issue.attempts }, \"[Agent] Issue execution finished\");\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n state.metrics.activeWorkers = Math.max(state.metrics.activeWorkers - 1, 0);\n running.delete(issue.id);\n state.metrics = computeMetrics(state.issues);\n state.metrics.activeWorkers = Math.max(state.metrics.activeWorkers, 0);\n state.updatedAt = now();\n await persistState(state);\n }\n}\n","import pino from \"pino\";\nimport { env, stdout } from \"node:process\";\nimport { join } from \"node:path\";\n\nconst level = env.FIFONY_LOG_LEVEL ?? \"info\";\nconst pretty = env.FIFONY_LOG_PRETTY === \"1\" || (env.FIFONY_LOG_PRETTY !== \"0\" && stdout.isTTY);\n\n// Propagate pretty preference to s3db.js internal logger\n// so its pino output matches ours (must be set before s3db loads)\nif (!env.S3DB_LOG_FORMAT && !env.S3DB_LOG_PRETTY) {\n env.S3DB_LOG_PRETTY = pretty ? \"true\" : \"false\";\n}\nif (!env.S3DB_LOG_LEVEL) {\n env.S3DB_LOG_LEVEL = level;\n}\n\nfunction createTransports(logPath?: string) {\n const targets: pino.TransportTargetOptions[] = [];\n\n if (pretty) {\n targets.push({\n target: \"pino-pretty\",\n options: { colorize: true, translateTime: \"HH:MM:ss.l\", ignore: \"pid,hostname\" },\n level,\n });\n } else {\n targets.push({\n target: \"pino/file\",\n options: { destination: 1 },\n level,\n });\n }\n\n if (logPath) {\n targets.push({\n target: \"pino/file\",\n options: { destination: logPath, mkdir: true },\n level,\n });\n }\n\n return pino.transport({ targets });\n}\n\nlet _logger: pino.Logger | null = null;\nlet _logPath: string | undefined;\n\nexport function initLogger(stateRoot?: string): pino.Logger {\n _logPath = stateRoot ? join(stateRoot, \"fifony-local.log\") : undefined;\n _logger = pino({ name: \"fifony\", level }, createTransports(_logPath));\n return _logger;\n}\n\nexport function getLogger(): pino.Logger {\n if (!_logger) {\n _logger = pino({ name: \"fifony\", level }, createTransports());\n }\n return _logger;\n}\n\nexport const logger = {\n get info() { return getLogger().info.bind(getLogger()); },\n get warn() { return getLogger().warn.bind(getLogger()); },\n get error() { return getLogger().error.bind(getLogger()); },\n get debug() { return getLogger().debug.bind(getLogger()); },\n get fatal() { return getLogger().fatal.bind(getLogger()); },\n get child() { return getLogger().child.bind(getLogger()); },\n};\n","/**\n * Dirty tracking for incremental persistence.\n * Tracks which issue and event IDs have been modified since last persist.\n */\n\nconst dirtyIssueIds = new Set<string>();\nconst dirtyIssuePlanIds = new Set<string>();\nconst dirtyEventIds = new Set<string>();\n\nexport function markIssueDirty(id: string): void {\n dirtyIssueIds.add(id);\n}\n\nexport function markIssuePlanDirty(id: string): void {\n dirtyIssuePlanIds.add(id);\n}\n\nexport function markEventDirty(id: string): void {\n dirtyEventIds.add(id);\n}\n\nexport function hasDirtyState(): boolean {\n return dirtyIssueIds.size > 0 || dirtyEventIds.size > 0;\n}\n\nexport function getDirtyIssueIds(): Set<string> {\n return dirtyIssueIds;\n}\n\nexport function getDirtyIssuePlanIds(): Set<string> {\n return dirtyIssuePlanIds;\n}\n\nexport function getDirtyEventIds(): Set<string> {\n return dirtyEventIds;\n}\n\nexport function clearDirtyIssueIds(): void {\n dirtyIssueIds.clear();\n}\n\nexport function clearDirtyIssuePlanIds(): void {\n dirtyIssuePlanIds.clear();\n}\n\nexport function clearDirtyEventIds(): void {\n dirtyEventIds.clear();\n}\n\nexport function markAllIssuesDirty(ids: string[]): void {\n for (const id of ids) dirtyIssueIds.add(id);\n}\n\nexport function markAllIssuePlansDirty(ids: string[]): void {\n for (const id of ids) dirtyIssuePlanIds.add(id);\n}\n\nexport function markAllEventsDirty(ids: string[]): void {\n for (const id of ids) dirtyEventIds.add(id);\n}\n","import { execFileSync, spawn } from \"node:child_process\";\nimport { existsSync, readFileSync, realpathSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type {\n AgentProviderDefinition,\n AgentProviderRole,\n DetectedProvider,\n EffortConfig,\n IssueEntry,\n JsonRecord,\n PipelineStageConfig,\n ReasoningEffort,\n RuntimeState,\n WorkflowConfig,\n} from \"./types.ts\";\nimport { TARGET_ROOT } from \"./constants.ts\";\nimport {\n toStringValue,\n toStringArray,\n toNumberValue,\n getNestedRecord,\n getNestedString,\n} from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport {\n resolveTaskCapabilities,\n mergeCapabilityProviders,\n type CapabilityResolverOptions,\n} from \"../routing/capability-resolver.ts\";\n\nexport function resolveAgentProfile(name: string): { profilePath: string; instructions: string } {\n const normalized = name.trim();\n if (!normalized) return { profilePath: \"\", instructions: \"\" };\n\n const candidates = [\n join(TARGET_ROOT, \".codex\", \"agents\", `${normalized}.md`),\n join(TARGET_ROOT, \".codex\", \"agents\", normalized, \"AGENT.md\"),\n join(TARGET_ROOT, \"agents\", `${normalized}.md`),\n join(TARGET_ROOT, \"agents\", normalized, \"AGENT.md\"),\n join(homedir(), \".codex\", \"agents\", `${normalized}.md`),\n join(homedir(), \".codex\", \"agents\", normalized, \"AGENT.md\"),\n join(homedir(), \".claude\", \"agents\", `${normalized}.md`),\n join(homedir(), \".claude\", \"agents\", normalized, \"AGENT.md\"),\n ];\n\n for (const candidate of candidates) {\n if (!existsSync(candidate)) continue;\n return {\n profilePath: candidate,\n instructions: readFileSync(candidate, \"utf8\").trim(),\n };\n }\n\n return { profilePath: \"\", instructions: \"\" };\n}\n\nexport function normalizeAgentProvider(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"claude\" || normalized === \"codex\" || normalized === \"gemini\") return normalized;\n if (!normalized) return \"codex\";\n return normalized;\n}\n\nexport function normalizeAgentRole(value: string): AgentProviderRole {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"planner\" || normalized === \"executor\" || normalized === \"reviewer\") {\n return normalized;\n }\n return \"executor\";\n}\n\nexport function resolveAgentCommand(\n provider: string,\n explicitCommand: string,\n codexCommand: string,\n claudeCommand: string,\n reasoningEffort?: string,\n): string {\n if (explicitCommand.trim()) return explicitCommand.trim();\n if (provider === \"claude\" && claudeCommand.trim()) return claudeCommand.trim();\n if (provider === \"codex\" && codexCommand.trim()) return codexCommand.trim();\n return getProviderDefaultCommand(provider, reasoningEffort);\n}\n\n/** Resolve the effective reasoning effort for a given role, considering issue override and global defaults. */\nexport function resolveEffort(\n role: string,\n issueEffort?: EffortConfig,\n globalEffort?: EffortConfig,\n): ReasoningEffort | undefined {\n // Issue-level per-role override takes highest priority\n const roleKey = role as keyof EffortConfig;\n if (issueEffort?.[roleKey]) return issueEffort[roleKey];\n // Issue-level default\n if (issueEffort?.default) return issueEffort.default;\n // Global per-role\n if (globalEffort?.[roleKey]) return globalEffort[roleKey];\n // Global default\n return globalEffort?.default;\n}\n\nimport { ADAPTERS } from \"./adapters/registry.ts\";\nimport { CLAUDE_RESULT_SCHEMA } from \"./adapters/commands.ts\";\n\nexport function getProviderDefaultCommand(provider: string, reasoningEffort?: string, model?: string): string {\n const adapter = ADAPTERS[provider];\n if (!adapter) return \"\";\n // Claude needs a JSON schema in its default command; pass effort for all providers\n const jsonSchema = provider === \"claude\" ? CLAUDE_RESULT_SCHEMA : undefined;\n return adapter.buildCommand({ model, effort: reasoningEffort, jsonSchema });\n}\n\nlet cachedProviders: DetectedProvider[] | null = null;\nlet providersCachedAt = 0;\nconst PROVIDER_CACHE_TTL = 60_000;\n\nexport function detectAvailableProviders(): DetectedProvider[] {\n if (cachedProviders && Date.now() - providersCachedAt < PROVIDER_CACHE_TTL) {\n return cachedProviders;\n }\n\n const providers: DetectedProvider[] = [];\n\n for (const name of [\"claude\", \"codex\", \"gemini\"]) {\n try {\n const path = execFileSync(\"which\", [name], { encoding: \"utf8\", timeout: 5000 }).trim();\n providers.push({ name, available: true, path });\n } catch {\n providers.push({ name, available: false, path: \"\" });\n }\n }\n\n cachedProviders = providers;\n providersCachedAt = Date.now();\n return providers;\n}\n\nexport function invalidateProviderCache(): void {\n cachedProviders = null;\n providersCachedAt = 0;\n}\n\n// ── Model discovery ─────────────────────────────────────────────────────────\n\nexport type DiscoveredModel = {\n id: string;\n provider: string;\n label: string;\n tier: string;\n};\n\n/** Cache: { models, fetchedAt } per provider */\nconst modelCache = new Map<string, { models: DiscoveredModel[]; fetchedAt: number }>();\nconst MODEL_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Fetch models from the OpenAI /v1/models API.\n * Filters to models relevant for Codex CLI usage (chat/reasoning models).\n */\n/**\n * Read Codex CLI's own model list from ~/.codex/models_cache.json.\n *\n * The Codex CLI fetches and caches its supported models locally.\n * This is the authoritative source — same data the /model picker uses.\n * We read it directly: zero hardcoding, always up-to-date with the CLI version.\n *\n * Falls back to OpenAI /v1/models API (filtered to gpt-5.*) if cache doesn't exist.\n */\n/**\n * Read the user's configured default model from ~/.codex/config.toml.\n * Returns the model string (e.g. \"gpt-5.4\") and reasoning effort if present.\n */\nexport function readCodexConfig(): { model?: string; reasoningEffort?: string } {\n try {\n const configPath = join(homedir(), \".codex\", \"config.toml\");\n if (!existsSync(configPath)) return {};\n const raw = readFileSync(configPath, \"utf8\");\n const model = raw.match(/^model\\s*=\\s*\"([^\"]+)\"/m)?.[1];\n const reasoningEffort = raw.match(/^model_reasoning_effort\\s*=\\s*\"([^\"]+)\"/m)?.[1];\n return { model, reasoningEffort };\n } catch {\n return {};\n }\n}\n\n/**\n * Read the user's configured default model from ~/.claude/settings.json.\n * Returns the model alias/ID (e.g. \"sonnet\", \"opus\").\n */\nfunction readClaudeConfig(): { model?: string } {\n try {\n const settingsPath = join(homedir(), \".claude\", \"settings.json\");\n if (!existsSync(settingsPath)) return {};\n const raw = readFileSync(settingsPath, \"utf8\");\n const settings = JSON.parse(raw) as { model?: string };\n return { model: typeof settings.model === \"string\" ? settings.model : undefined };\n } catch {\n return {};\n }\n}\n\n/**\n * Read the user's config from ~/.gemini/settings.json.\n * Returns the configured model (if any) and whether preview features are enabled.\n */\nexport function readGeminiConfig(): { model?: string; previewFeatures?: boolean } {\n try {\n const settingsPath = join(homedir(), \".gemini\", \"settings.json\");\n if (!existsSync(settingsPath)) return {};\n const raw = readFileSync(settingsPath, \"utf8\");\n const settings = JSON.parse(raw) as {\n model?: string;\n general?: { previewFeatures?: boolean };\n };\n return {\n model: typeof settings.model === \"string\" ? settings.model : undefined,\n previewFeatures: settings.general?.previewFeatures === true,\n };\n } catch {\n return {};\n }\n}\n\n/**\n * Find the models.js file from the installed @google/gemini-cli package.\n *\n * Strategy: resolve the `gemini` symlink → get real path of dist/index.js\n * → navigate to node_modules/@google/gemini-cli-core/dist/src/config/models.js\n * This is always in sync with whatever version of the CLI is installed.\n */\nfunction resolveGeminiModelsFile(): string | null {\n try {\n const binPath = execFileSync(\"which\", [\"gemini\"], { encoding: \"utf8\", timeout: 3000 }).trim();\n if (!binPath) return null;\n // Resolve the symlink: bin/gemini → .../node_modules/@google/gemini-cli/dist/index.js\n const realBin = realpathSync(binPath);\n // Go up: dist/index.js → dist → @google/gemini-cli\n const cliRoot = dirname(dirname(realBin));\n const modelsPath = join(cliRoot, \"node_modules\", \"@google\", \"gemini-cli-core\", \"dist\", \"src\", \"config\", \"models.js\");\n return existsSync(modelsPath) ? modelsPath : null;\n } catch {\n return null;\n }\n}\n\nasync function fetchGeminiModels(): Promise<DiscoveredModel[]> {\n const modelsPath = resolveGeminiModelsFile();\n if (!modelsPath) return [];\n\n try {\n const content = readFileSync(modelsPath, \"utf8\");\n\n // Parse `export const SOME_CONST = 'gemini-...'` lines\n const regex = /export const ([A-Z0-9_]+)\\s*=\\s*'(gemini-[^']+)';/g;\n const seen = new Set<string>();\n const stable: DiscoveredModel[] = [];\n const preview: DiscoveredModel[] = [];\n\n let match: RegExpExecArray | null;\n while ((match = regex.exec(content)) !== null) {\n const [, constName, modelId] = match;\n if (seen.has(modelId)) continue;\n if (modelId.includes(\"embedding\")) continue;\n seen.add(modelId);\n\n const isPreview = constName.startsWith(\"PREVIEW_\");\n const tier = isPreview ? \"Preview\" : \"Stable\";\n const model: DiscoveredModel = { id: modelId, provider: \"gemini\", label: modelId, tier };\n if (isPreview) preview.push(model);\n else stable.push(model);\n }\n\n // Stable models first, preview models after\n return [...stable, ...preview];\n } catch {\n return [];\n }\n}\n\nasync function fetchCodexModels(): Promise<DiscoveredModel[]> {\n // 1. Try ~/.codex/models_cache.json (authoritative — from the CLI itself)\n const cachePath = join(homedir(), \".codex\", \"models_cache.json\");\n try {\n if (existsSync(cachePath)) {\n const raw = readFileSync(cachePath, \"utf8\");\n const cache = JSON.parse(raw) as {\n models?: Array<{\n slug: string;\n display_name?: string;\n description?: string;\n visibility?: string;\n priority?: number;\n supported_reasoning_levels?: Array<{ effort: string; description?: string }>;\n }>;\n };\n\n if (Array.isArray(cache.models) && cache.models.length > 0) {\n return cache.models\n // Show \"list\" models first, then \"hide\" (legacy) — sorted by CLI priority\n .sort((a, b) => {\n const visA = a.visibility === \"list\" ? 0 : 1;\n const visB = b.visibility === \"list\" ? 0 : 1;\n if (visA !== visB) return visA - visB;\n return (a.priority ?? 99) - (b.priority ?? 99);\n })\n .map((m) => ({\n id: m.slug,\n provider: \"codex\",\n label: m.slug,\n tier: m.description || (m.visibility === \"list\" ? \"Supported\" : \"Legacy\"),\n }));\n }\n }\n } catch {\n // Cache unreadable\n }\n\n return [];\n}\n\n/**\n * Discover Claude models from the CLI.\n *\n * Strategy: use the stable aliases that the Claude CLI maintains itself\n * (opus → latest opus, sonnet → latest sonnet, haiku → latest haiku).\n *\n * Why aliases instead of version-pinned IDs extracted from the binary:\n * - Aliases always point to the current production model — no stale IDs\n * - No `strings` parsing, no binary inspection, no network calls\n * - When Anthropic releases a new version, the alias updates automatically\n *\n * The actual resolved model ID (e.g. claude-sonnet-4-6) is captured from\n * the `modelUsage` field in the CLI JSON response after each run.\n */\nasync function fetchAnthropicModels(): Promise<DiscoveredModel[]> {\n // Verify the CLI is reachable before returning anything\n try {\n execFileSync(\"which\", [\"claude\"], { encoding: \"utf8\", timeout: 3000 });\n } catch {\n return [];\n }\n\n // These aliases are maintained by Anthropic in the Claude CLI itself.\n // They always resolve to the current production model for each family.\n return [\n { id: \"opus\", provider: \"claude\", label: \"claude/opus (latest)\", tier: \"Most capable\" },\n { id: \"sonnet\", provider: \"claude\", label: \"claude/sonnet (latest)\", tier: \"Balanced\" },\n { id: \"haiku\", provider: \"claude\", label: \"claude/haiku (latest)\", tier: \"Fast\" },\n ];\n}\n\n\n/**\n * Discover available models for all detected providers.\n * Results are cached for 5 minutes.\n */\nexport async function discoverModels(providers: DetectedProvider[]): Promise<Record<string, DiscoveredModel[]>> {\n const result: Record<string, DiscoveredModel[]> = {};\n\n const tasks: Array<{ name: string; fetch: () => Promise<DiscoveredModel[]> }> = [];\n\n for (const p of providers) {\n if (!p.available) continue;\n const cached = modelCache.get(p.name);\n if (cached && Date.now() - cached.fetchedAt < MODEL_CACHE_TTL_MS) {\n result[p.name] = cached.models;\n continue;\n }\n if (p.name === \"codex\") tasks.push({ name: \"codex\", fetch: fetchCodexModels });\n if (p.name === \"claude\") tasks.push({ name: \"claude\", fetch: fetchAnthropicModels });\n if (p.name === \"gemini\") tasks.push({ name: \"gemini\", fetch: fetchGeminiModels });\n }\n\n const settled = await Promise.allSettled(tasks.map((t) => t.fetch()));\n for (let i = 0; i < tasks.length; i++) {\n const res = settled[i];\n let models = res.status === \"fulfilled\" ? res.value : [];\n\n // Promote the user's configured CLI default model to the top of the list\n if (tasks[i].name === \"codex\") {\n const { model: configuredModel } = readCodexConfig();\n if (configuredModel) {\n const idx = models.findIndex((m) => m.id === configuredModel);\n if (idx > 0) {\n // Move to front\n models = [models[idx], ...models.slice(0, idx), ...models.slice(idx + 1)];\n } else if (idx === -1) {\n // Not in list yet — add it\n models = [{ id: configuredModel, provider: \"codex\", label: configuredModel, tier: \"Configured default\" }, ...models];\n }\n }\n }\n\n if (tasks[i].name === \"claude\") {\n const { model: configuredModel } = readClaudeConfig();\n if (configuredModel) {\n // Claude config uses aliases (\"sonnet\", \"opus\") — find matching model by id/prefix\n const idx = models.findIndex((m) => m.id === configuredModel || m.id.includes(configuredModel));\n if (idx > 0) {\n models = [models[idx], ...models.slice(0, idx), ...models.slice(idx + 1)];\n }\n }\n }\n\n if (tasks[i].name === \"gemini\") {\n const { model: configuredModel, previewFeatures } = readGeminiConfig();\n if (configuredModel) {\n // Explicit model configured — promote it to top\n const idx = models.findIndex((m) => m.id === configuredModel);\n if (idx > 0) {\n models = [models[idx], ...models.slice(0, idx), ...models.slice(idx + 1)];\n } else if (idx === -1) {\n models = [{ id: configuredModel, provider: \"gemini\", label: configuredModel, tier: \"Configured default\" }, ...models];\n }\n } else if (previewFeatures) {\n // No explicit model, but preview features enabled → promote the first preview model to top\n const previewIdx = models.findIndex((m) => m.tier === \"Preview\");\n if (previewIdx > 0) {\n models = [models[previewIdx], ...models.slice(0, previewIdx), ...models.slice(previewIdx + 1)];\n }\n }\n }\n\n result[tasks[i].name] = models;\n modelCache.set(tasks[i].name, { models, fetchedAt: Date.now() });\n }\n\n return result;\n}\n\nexport function resolveDefaultProvider(detected: DetectedProvider[]): string {\n const available = detected.filter((p) => p.available);\n if (available.length === 0) return \"\";\n if (available.some((p) => p.name === \"codex\")) return \"codex\";\n return available[0].name;\n}\n\nexport function resolveWorkflowAgentProviders(\n config: JsonRecord,\n fallbackProvider: string,\n fallbackProfile: string,\n explicitCommand: string,\n): AgentProviderDefinition[] {\n const agentConfig = getNestedRecord(config, \"agent\");\n const codexConfig = getNestedRecord(config, \"codex\");\n const claudeConfig = getNestedRecord(config, \"claude\");\n const providersRaw = (agentConfig.providers ?? []) as unknown;\n const providers: AgentProviderDefinition[] = [];\n\n if (Array.isArray(providersRaw)) {\n for (const entry of providersRaw) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\n const record = entry as JsonRecord;\n const provider = normalizeAgentProvider(\n toStringValue(record.provider) || toStringValue(record.name) || fallbackProvider,\n );\n const role = normalizeAgentRole(toStringValue(record.role, \"executor\"));\n const profile = toStringValue(record.profile, role === \"executor\" ? fallbackProfile : \"\");\n const resolvedProfile = resolveAgentProfile(profile);\n const command = resolveAgentCommand(\n provider,\n toStringValue(record.command),\n getNestedString(codexConfig, \"command\"),\n getNestedString(claudeConfig, \"command\"),\n );\n\n providers.push({\n provider,\n role,\n command,\n profile,\n profilePath: resolvedProfile.profilePath,\n profileInstructions: resolvedProfile.instructions,\n });\n }\n }\n\n if (providers.length > 0) return providers;\n\n const resolvedProfile = resolveAgentProfile(fallbackProfile);\n return [\n {\n provider: fallbackProvider,\n role: \"executor\",\n command: resolveAgentCommand(\n fallbackProvider,\n explicitCommand,\n getNestedString(codexConfig, \"command\"),\n getNestedString(claudeConfig, \"command\"),\n ),\n profile: fallbackProfile,\n profilePath: resolvedProfile.profilePath,\n profileInstructions: resolvedProfile.instructions,\n },\n ];\n}\n\nexport function getBaseAgentProviders(\n state: RuntimeState,\n): AgentProviderDefinition[] {\n return [\n {\n provider: state.config.agentProvider,\n role: \"executor\",\n command: state.config.agentCommand,\n profile: \"\",\n profilePath: \"\",\n profileInstructions: \"\",\n },\n ];\n}\n\nexport function getCapabilityRoutingOptions(): CapabilityResolverOptions {\n // Provider/model/effort overrides from user settings are applied via\n // applyWorkflowConfigToProviders after capability classification.\n return { enabled: true, overrides: [] };\n}\n\nexport function getCapabilityPriorityMap(): Record<string, number> {\n return {\n security: 0,\n bugfix: 1,\n backend: 2,\n devops: 3,\n \"frontend-ui\": 4,\n architecture: 5,\n documentation: 6,\n default: 7,\n \"workflow-disabled\": 8,\n };\n}\n\nexport function getIssueCapabilityPriority(\n issue: IssueEntry,\n _workflowDefinition: null,\n): number {\n const category = issue.capabilityCategory?.trim() || \"default\";\n const priorities = getCapabilityPriorityMap();\n return priorities[category] ?? 100;\n}\n\nexport function applyCapabilityMetadata(\n issue: IssueEntry,\n resolution: ReturnType<typeof resolveTaskCapabilities>,\n): void {\n issue.capabilityCategory = resolution.category;\n issue.capabilityOverlays = [...resolution.overlays];\n issue.capabilityRationale = [...resolution.rationale];\n\n const baseLabels = (issue.labels ?? []).filter((label) => !label.startsWith(\"capability:\") && !label.startsWith(\"overlay:\"));\n const derivedLabels = [\n resolution.category ? `capability:${resolution.category}` : \"\",\n ...resolution.overlays.map((overlay) => `overlay:${overlay}`),\n ].filter(Boolean);\n\n issue.labels = [...new Set([...baseLabels, ...derivedLabels])];\n}\n\n/** Map AgentProviderRole to WorkflowConfig stage key */\nfunction roleToStageKey(role: AgentProviderRole): keyof WorkflowConfig {\n switch (role) {\n case \"planner\": return \"plan\";\n case \"executor\": return \"execute\";\n case \"reviewer\": return \"review\";\n }\n}\n\n/**\n * Apply user's WorkflowConfig (from Settings → Workflow) to provider definitions.\n * Overrides provider, model, and effort for each role when a WorkflowConfig is present.\n */\nexport function applyWorkflowConfigToProviders(\n providers: AgentProviderDefinition[],\n workflowConfig: WorkflowConfig | null,\n): AgentProviderDefinition[] {\n if (!workflowConfig) return providers;\n\n return providers.map((provider) => {\n const stageKey = roleToStageKey(provider.role);\n const stageConfig: PipelineStageConfig | undefined = workflowConfig[stageKey];\n if (!stageConfig) return provider;\n\n const newProvider = stageConfig.provider || provider.provider;\n const newModel = stageConfig.model || undefined;\n const newEffort = stageConfig.effort || provider.reasoningEffort;\n\n // Rebuild command with the configured provider, model, and effort\n const command = getProviderDefaultCommand(newProvider, newEffort, newModel);\n\n return {\n ...provider,\n provider: newProvider,\n model: newModel,\n command: command || provider.command,\n reasoningEffort: newEffort,\n };\n });\n}\n\nexport function getEffectiveAgentProviders(\n state: RuntimeState,\n issue: IssueEntry,\n _workflowDefinition: null,\n workflowConfig?: WorkflowConfig | null,\n): AgentProviderDefinition[] {\n const baseProviders = getBaseAgentProviders(state);\n const resolution = resolveTaskCapabilities(\n {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n paths: issue.paths,\n },\n getCapabilityRoutingOptions(),\n );\n applyCapabilityMetadata(issue, resolution);\n\n const merged = mergeCapabilityProviders(baseProviders, resolution).map((provider) => {\n const resolvedProfile = resolveAgentProfile(provider.profile ?? \"\");\n const suggestion = resolution.providers.find(\n (entry) => entry.provider === provider.provider && entry.role === provider.role,\n );\n\n const effort = resolveEffort(provider.role, issue.effort, state.config.defaultEffort);\n\n // Keep existing command (effort is metadata, not a CLI flag)\n const command = provider.command;\n\n return {\n ...provider,\n command,\n profilePath: resolvedProfile.profilePath,\n profileInstructions: resolvedProfile.instructions,\n selectionReason: suggestion?.reason ?? resolution.rationale.join(\" \"),\n overlays: resolution.overlays,\n capabilityCategory: resolution.category,\n reasoningEffort: effort,\n };\n });\n\n // Apply user's WorkflowConfig overrides (Settings → Workflow)\n return applyWorkflowConfigToProviders(merged, workflowConfig ?? null);\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IssueEntry, AgentProviderDefinition, RuntimeConfig, IssuePlan } from \"../types.ts\";\nimport type { CompiledExecution } from \"./types.ts\";\nimport type { ProviderAdapter, ProviderCommandOptions } from \"./registry.ts\";\nimport { renderPrompt } from \"../../prompting.ts\";\nimport { buildFullPlanPrompt, resolveEffortForProvider, extractValidationCommands } from \"./shared.ts\";\nimport { CLAUDE_RESULT_SCHEMA, REVIEW_RESULT_SCHEMA, extractPlanDirs } from \"./commands.ts\";\n\n// ── Command builder ───────────────────────────────────────────────────────────\n\nexport function buildClaudeCommand(options: ProviderCommandOptions): string {\n const parts = [\"claude\", \"--print\"];\n\n if (!options.noToolAccess) {\n parts.push(\"--dangerously-skip-permissions\");\n }\n\n parts.push(\"--no-session-persistence\", \"--output-format json\");\n\n if (options.effort) {\n parts.push(`--effort ${options.effort}`);\n }\n\n if (options.jsonSchema) {\n parts.push(`--json-schema '${options.jsonSchema}'`);\n }\n\n if (options.addDirs?.length) {\n for (const dir of options.addDirs) {\n parts.push(`--add-dir \"${dir}\"`);\n }\n }\n\n if (options.model && options.model !== \"claude\") {\n parts.splice(1, 0, `--model ${options.model}`);\n }\n\n parts.push(\"< \\\"$FIFONY_PROMPT_FILE\\\"\");\n return parts.join(\" \");\n}\n\n// ── Adapter ───────────────────────────────────────────────────────────────────\n\nasync function compile(\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n plan: IssuePlan,\n config: RuntimeConfig,\n workspacePath: string,\n skillContext: string,\n): Promise<CompiledExecution> {\n const effort = resolveEffortForProvider(plan, provider.role, config.defaultEffort);\n\n const prompt = await renderPrompt(\"compile-execution-claude\", {\n isPlanner: provider.role === \"planner\",\n isReviewer: provider.role === \"reviewer\",\n profileInstructions: provider.profileInstructions || \"\",\n skillContext,\n planPrompt: buildFullPlanPrompt(plan),\n subagentsToUse: plan.toolingDecision?.shouldUseSubagents ? (plan.toolingDecision.subagentsToUse ?? []) : [],\n skillsToUse: plan.toolingDecision?.shouldUseSkills ? (plan.toolingDecision.skillsToUse ?? []) : [],\n suggestedPaths: plan.suggestedPaths ?? [],\n workspacePath,\n issueIdentifier: issue.identifier,\n title: issue.title,\n description: issue.description || \"(none)\",\n validationItems: (plan.validation ?? []).map((value) => ({ value })),\n });\n\n const relativeDirs = extractPlanDirs(plan);\n const codePath = existsSync(join(workspacePath, \"worktree\")) ? join(workspacePath, \"worktree\") : workspacePath;\n const absoluteDirs = relativeDirs.map((d) => join(codePath, d));\n\n const command = buildClaudeCommand({\n model: provider.model,\n effort,\n addDirs: absoluteDirs,\n jsonSchema: CLAUDE_RESULT_SCHEMA,\n });\n\n const env: Record<string, string> = {\n FIFONY_PLAN_COMPLEXITY: plan.estimatedComplexity,\n FIFONY_PLAN_STEPS: String(plan.steps.length),\n FIFONY_EXECUTION_PAYLOAD_FILE: \"fifony-execution-payload.json\",\n };\n if (plan.suggestedPaths?.length) env.FIFONY_PLAN_PATHS = plan.suggestedPaths.join(\",\");\n if (plan.toolingDecision?.skillsToUse?.length) {\n env.FIFONY_PLAN_SKILLS = plan.toolingDecision.skillsToUse.map((s) => s.name).join(\",\");\n }\n\n const { pre, post } = extractValidationCommands(plan);\n\n return {\n prompt,\n command,\n env,\n preHooks: pre,\n postHooks: post,\n outputSchema: CLAUDE_RESULT_SCHEMA,\n payload: null,\n meta: {\n adapter: \"claude\",\n reasoningEffort: effort || \"default\",\n model: provider.model || \"default\",\n skillsActivated: plan.toolingDecision?.skillsToUse?.map((s) => s.name) || [],\n subagentsRequested: plan.toolingDecision?.subagentsToUse?.map((a) => a.name) || [],\n phasesCount: plan.phases?.length || 0,\n },\n };\n}\n\nexport const claudeAdapter: ProviderAdapter = {\n buildCommand: buildClaudeCommand,\n buildReviewCommand: (reviewer) => buildClaudeCommand({\n model: reviewer.model,\n effort: reviewer.reasoningEffort,\n jsonSchema: REVIEW_RESULT_SCHEMA,\n }),\n compile,\n};\n","import type { IssuePlan, IssuePlanStep, IssueEntry, AgentProviderDefinition, EffortConfig, AgentProviderRole } from \"../types.ts\";\n\n/** Render plan context (summary, assumptions, constraints, unknowns) */\nexport function buildPlanContextSection(plan: IssuePlan): string {\n const parts: string[] = [\"## Plan Context\", \"\", `**Summary:** ${plan.summary}`];\n\n if (plan.assumptions?.length) {\n parts.push(\"\", \"**Assumptions:**\");\n plan.assumptions.forEach((a) => parts.push(`- ${a}`));\n }\n if (plan.constraints?.length) {\n parts.push(\"\", \"**Constraints:**\");\n plan.constraints.forEach((c) => parts.push(`- ${c}`));\n }\n if (plan.unknowns?.length) {\n parts.push(\"\", \"**Unknowns to investigate:**\");\n plan.unknowns.forEach((u) => {\n parts.push(`- **${u.question}**`);\n if (u.whyItMatters) parts.push(` Why it matters: ${u.whyItMatters}`);\n if (u.howToResolve) parts.push(` How to resolve: ${u.howToResolve}`);\n });\n }\n\n return parts.join(\"\\n\");\n}\n\n/** Render execution steps or phases */\nexport function buildStepsSection(plan: IssuePlan): string {\n const parts: string[] = [\"## Execution Steps\"];\n\n if (plan.phases?.length) {\n for (const phase of plan.phases) {\n parts.push(\"\", `### Phase: ${phase.phaseName}`, `Goal: ${phase.goal}`);\n if (phase.dependencies?.length) parts.push(`Dependencies: ${phase.dependencies.join(\", \")}`);\n for (const task of phase.tasks) {\n parts.push(`${task.step}. **${task.action}**${task.ownerType ? ` [${task.ownerType}]` : \"\"}`);\n if (task.details) parts.push(` ${task.details}`);\n if (task.doneWhen) parts.push(` Done when: ${task.doneWhen}`);\n if (task.files?.length) parts.push(` Files: ${task.files.join(\", \")}`);\n }\n if (phase.outputs?.length) parts.push(`Outputs: ${phase.outputs.join(\", \")}`);\n }\n } else {\n parts.push(\"\");\n for (const step of plan.steps) {\n parts.push(`${step.step}. **${step.action}**${step.ownerType ? ` [${step.ownerType}]` : \"\"}`);\n if (step.details) parts.push(` ${step.details}`);\n if (step.doneWhen) parts.push(` Done when: ${step.doneWhen}`);\n if (step.files?.length) parts.push(` Files: ${step.files.join(\", \")}`);\n }\n }\n\n parts.push(\"\", \"Follow this plan. Complete each step in order.\");\n return parts.join(\"\\n\");\n}\n\n/** Render risks section */\nexport function buildRiskSection(plan: IssuePlan): string {\n if (!plan.risks?.length) return \"\";\n const parts = [\"## Risks\"];\n for (const r of plan.risks) {\n parts.push(`- **${r.risk}** — Impact: ${r.impact}. Mitigation: ${r.mitigation}`);\n }\n return parts.join(\"\\n\");\n}\n\n/** Render validation requirements */\nexport function buildValidationSection(plan: IssuePlan): string {\n const parts: string[] = [];\n\n if (plan.successCriteria?.length) {\n parts.push(\"## Success Criteria\");\n plan.successCriteria.forEach((c) => parts.push(`- ${c}`));\n }\n if (plan.validation?.length) {\n parts.push(\"\", \"## Validation Checks\");\n parts.push(\"Run these before marking as done:\");\n plan.validation.forEach((v) => parts.push(`- ${v}`));\n }\n if (plan.deliverables?.length) {\n parts.push(\"\", \"## Deliverables\");\n plan.deliverables.forEach((d) => parts.push(`- ${d}`));\n }\n\n return parts.join(\"\\n\");\n}\n\n/** Render tooling/delegation decisions */\nexport function buildToolingSection(plan: IssuePlan): string {\n const td = plan.toolingDecision;\n if (!td) return \"\";\n\n const parts = [\"## Tooling & Delegation Strategy\"];\n\n if (td.decisionSummary) parts.push(\"\", td.decisionSummary);\n\n if (td.shouldUseSkills && td.skillsToUse?.length) {\n parts.push(\"\", \"**Skills to activate:**\");\n td.skillsToUse.forEach((s) => parts.push(`- **${s.name}**: ${s.why}`));\n }\n\n if (td.shouldUseSubagents && td.subagentsToUse?.length) {\n parts.push(\"\", \"**Subagents to use:**\");\n td.subagentsToUse.forEach((a) => parts.push(`- **${a.name}** (${a.role}): ${a.why}`));\n }\n\n return parts.join(\"\\n\");\n}\n\n/** Render execution strategy */\nexport function buildStrategySection(plan: IssuePlan): string {\n const es = plan.executionStrategy;\n if (!es) return \"\";\n\n const parts = [\n \"## Execution Strategy\",\n \"\",\n `**Approach:** ${es.approach}`,\n `**Rationale:** ${es.whyThisApproach}`,\n ];\n\n if (es.alternativesConsidered?.length) {\n parts.push(\"\", \"Alternatives considered:\");\n es.alternativesConsidered.forEach((a) => parts.push(`- ${a}`));\n }\n\n return parts.join(\"\\n\");\n}\n\n/** Resolve effort for a given role */\nexport function resolveEffortForProvider(\n plan: IssuePlan | undefined,\n role: AgentProviderRole,\n globalEffort?: EffortConfig,\n): string | undefined {\n const planEffort = plan?.suggestedEffort;\n const roleKey = role as keyof EffortConfig;\n return planEffort?.[roleKey] as string\n || planEffort?.default as string\n || globalEffort?.[roleKey] as string\n || globalEffort?.default as string\n || undefined;\n}\n\n/** Build the complete plan section for any provider */\nexport function buildFullPlanPrompt(plan: IssuePlan): string {\n return [\n buildPlanContextSection(plan),\n buildStrategySection(plan),\n buildToolingSection(plan),\n buildStepsSection(plan),\n buildRiskSection(plan),\n buildValidationSection(plan),\n ].filter(Boolean).join(\"\\n\\n\");\n}\n\n/** Extract validation commands from plan for hooks */\nexport function extractValidationCommands(plan: IssuePlan): { pre: string[]; post: string[] } {\n const pre: string[] = [];\n const post: string[] = [];\n\n for (const v of plan.validation || []) {\n const lower = v.toLowerCase();\n if (lower.includes(\"lint\")) post.push(\"pnpm lint --quiet 2>/dev/null || true\");\n if (lower.includes(\"typecheck\") || lower.includes(\"tsc\")) post.push(\"pnpm tsc --noEmit 2>/dev/null || true\");\n if (lower.includes(\"test\")) post.push(\"pnpm test 2>/dev/null || true\");\n }\n\n // Deduplicate\n return { pre: [...new Set(pre)], post: [...new Set(post)] };\n}\n\n// ── Execution Payload ─────────────────────────────────────────────────────────\n\n/**\n * Canonical structured input for CLI execution.\n * This is the single source of truth that the prompt references.\n * The prompt provides the markdown frame (instructions, role, strategy);\n * the payload carries the structured data (plan, constraints, criteria).\n */\nexport type ExecutionPayload = {\n /** Schema version for forward compat */\n version: 1;\n\n /** Issue identity */\n issue: {\n id: string;\n identifier: string;\n title: string;\n description: string;\n priority: number;\n labels: string[];\n paths: string[];\n };\n\n /** Provider context */\n provider: {\n name: string;\n role: AgentProviderRole;\n model: string;\n effort: string;\n capabilityCategory: string;\n overlays: string[];\n };\n\n /** Execution intent — what to do and how */\n executionIntent: {\n complexity: string;\n approach: string;\n rationale: string;\n workPattern: \"sequential\" | \"phased\" | \"parallel_subtasks\";\n };\n\n /** Structured plan data */\n plan: {\n summary: string;\n steps: Array<{\n step: number;\n action: string;\n files: string[];\n ownerType: string;\n doneWhen: string;\n }>;\n phases: Array<{\n name: string;\n goal: string;\n tasks: number[];\n dependencies: string[];\n outputs: string[];\n }>;\n };\n\n /** Constraints the agent must respect */\n constraints: string[];\n\n /** Success criteria — each must be met for \"done\" */\n successCriteria: string[];\n\n /** Validation commands to run before reporting done */\n validation: string[];\n\n /** Expected deliverables */\n deliverables: string[];\n\n /** Assumptions the plan is built on */\n assumptions: string[];\n\n /** Unknowns that may need resolution */\n unknowns: Array<{ question: string; whyItMatters: string; howToResolve: string }>;\n\n /** Risks with impact and mitigation */\n risks: Array<{ risk: string; impact: string; mitigation: string }>;\n\n /** Tooling decisions */\n tooling: {\n skills: Array<{ name: string; why: string }>;\n subagents: Array<{ name: string; role: string; why: string }>;\n };\n\n /** Target paths for focused changes */\n targetPaths: string[];\n\n /** Workspace location */\n workspacePath: string;\n\n /** Timestamp */\n createdAt: string;\n};\n\n/**\n * Build the canonical execution payload from issue + plan + provider context.\n */\nexport function buildExecutionPayload(\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n plan: IssuePlan,\n workspacePath: string,\n): ExecutionPayload {\n const strategy = plan.executionStrategy;\n const hasPhases = Boolean(plan.phases?.length);\n\n return {\n version: 1,\n\n issue: {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description || \"\",\n priority: issue.priority,\n labels: issue.labels || [],\n paths: issue.paths || [],\n },\n\n provider: {\n name: provider.provider,\n role: provider.role,\n model: provider.model || \"default\",\n effort: provider.reasoningEffort || \"medium\",\n capabilityCategory: provider.capabilityCategory || \"\",\n overlays: provider.overlays || [],\n },\n\n executionIntent: {\n complexity: plan.estimatedComplexity,\n approach: strategy?.approach || \"\",\n rationale: strategy?.whyThisApproach || \"\",\n workPattern: hasPhases\n ? \"phased\"\n : plan.toolingDecision?.shouldUseSubagents\n ? \"parallel_subtasks\"\n : \"sequential\",\n },\n\n plan: {\n summary: plan.summary,\n steps: plan.steps.map((s) => ({\n step: s.step,\n action: s.action,\n files: s.files || [],\n ownerType: s.ownerType || \"agent\",\n doneWhen: s.doneWhen || \"\",\n })),\n phases: (plan.phases || []).map((p) => ({\n name: p.phaseName,\n goal: p.goal,\n tasks: p.tasks.map((t) => t.step),\n dependencies: p.dependencies || [],\n outputs: p.outputs || [],\n })),\n },\n\n constraints: plan.constraints || [],\n successCriteria: plan.successCriteria || [],\n validation: plan.validation || [],\n deliverables: plan.deliverables || [],\n assumptions: plan.assumptions || [],\n unknowns: (plan.unknowns || []).map((u) => ({\n question: u.question,\n whyItMatters: u.whyItMatters || \"\",\n howToResolve: u.howToResolve || \"\",\n })),\n risks: (plan.risks || []).map((r) => ({\n risk: r.risk,\n impact: r.impact || \"\",\n mitigation: r.mitigation || \"\",\n })),\n\n tooling: {\n skills: plan.toolingDecision?.skillsToUse || [],\n subagents: plan.toolingDecision?.subagentsToUse || [],\n },\n\n targetPaths: plan.suggestedPaths || [],\n workspacePath,\n createdAt: new Date().toISOString(),\n };\n}\n","/**\n * Shared schemas and helpers used by all provider adapters.\n *\n * Provider-specific command builders live in their own adapter files:\n * adapters/claude.ts → buildClaudeCommand\n * adapters/codex.ts → buildCodexCommand\n * adapters/gemini.ts → buildGeminiCommand\n */\n\nimport type { IssuePlan } from \"../types.ts\";\n\n// ── Result schemas ────────────────────────────────────────────────────────────\n\nexport const CLAUDE_RESULT_SCHEMA = JSON.stringify({\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"done\", \"continue\", \"blocked\", \"failed\"] },\n summary: { type: \"string\" },\n nextPrompt: { type: \"string\" },\n },\n required: [\"status\"],\n});\n\nexport const REVIEW_RESULT_SCHEMA = JSON.stringify({\n type: \"object\",\n properties: {\n status: { type: \"string\", enum: [\"done\", \"continue\", \"blocked\", \"failed\"] },\n summary: { type: \"string\" },\n nextPrompt: { type: \"string\" },\n criteriaResults: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: { criterion: { type: \"string\" }, met: { type: \"boolean\" }, note: { type: \"string\" } },\n },\n },\n },\n required: [\"status\"],\n});\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Extract unique directory paths from plan suggested paths (for --add-dir / --include-directories). */\nexport function extractPlanDirs(plan: IssuePlan): string[] {\n if (!plan.suggestedPaths?.length) return [];\n const dirs = new Set<string>();\n for (const p of plan.suggestedPaths) {\n const lastSlash = p.lastIndexOf(\"/\");\n if (lastSlash > 0) dirs.add(p.slice(0, lastSlash));\n else if (!p.includes(\".\")) dirs.add(p);\n }\n return [...dirs];\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IssueEntry, AgentProviderDefinition, RuntimeConfig, IssuePlan } from \"../types.ts\";\nimport type { CompiledExecution } from \"./types.ts\";\nimport type { ProviderAdapter, ProviderCommandOptions } from \"./registry.ts\";\nimport { renderPrompt } from \"../../prompting.ts\";\nimport { buildFullPlanPrompt, resolveEffortForProvider, extractValidationCommands } from \"./shared.ts\";\nimport { REVIEW_RESULT_SCHEMA, extractPlanDirs } from \"./commands.ts\";\n\n// ── Result contract (embedded in prompt — no --json-schema flag in codex) ────\n\nconst CODEX_RESULT_CONTRACT = `\nReturn a JSON object with this exact schema when finished:\n{\n \"status\": \"done\" | \"continue\" | \"blocked\" | \"failed\",\n \"summary\": \"one paragraph summary of what was done\",\n \"root_cause\": [\"list of root causes found\"],\n \"changes_made\": [\"list of files/changes\"],\n \"validation\": { \"commands_run\": [\"...\"], \"result\": \"pass\" | \"partial\" | \"fail\" },\n \"open_questions\": [\"...\"],\n \"followups\": [\"...\"],\n \"nextPrompt\": \"guidance for next turn if status is continue\"\n}\n`.trim();\n\n// ── Command builder ───────────────────────────────────────────────────────────\n\nexport function buildCodexCommand(options: ProviderCommandOptions): string {\n const parts = [\"codex\", \"exec\", \"--skip-git-repo-check\", \"--dangerously-bypass-approvals-and-sandbox\"];\n\n if (options.model && options.model !== \"codex\") {\n parts.push(`--model ${options.model}`);\n }\n\n if (options.effort) {\n // Codex uses -c config overrides, not a dedicated --effort flag\n parts.push(`-c reasoning_effort=\"${options.effort}\"`);\n }\n\n if (options.addDirs?.length) {\n for (const dir of options.addDirs) {\n parts.push(`--add-dir \"${dir}\"`);\n }\n }\n\n if (options.imagePaths?.length) {\n for (const img of options.imagePaths) {\n parts.push(`--image \"${img}\"`);\n }\n }\n\n parts.push(\"< \\\"$FIFONY_PROMPT_FILE\\\"\");\n return parts.join(\" \");\n}\n\n// ── Adapter ───────────────────────────────────────────────────────────────────\n\nasync function compile(\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n plan: IssuePlan,\n config: RuntimeConfig,\n workspacePath: string,\n skillContext: string,\n): Promise<CompiledExecution> {\n const effort = resolveEffortForProvider(plan, provider.role, config.defaultEffort) || provider.reasoningEffort;\n\n const prompt = await renderPrompt(\"compile-execution-codex\", {\n isPlanner: provider.role === \"planner\",\n isReviewer: provider.role === \"reviewer\",\n profileInstructions: provider.profileInstructions || \"\",\n skillContext,\n issueIdentifier: issue.identifier,\n title: issue.title,\n description: issue.description || \"(none)\",\n workspacePath,\n planPrompt: buildFullPlanPrompt(plan),\n phases: (plan.phases ?? []).map((phase) => ({\n phaseName: phase.phaseName,\n goal: phase.goal,\n outputs: phase.outputs ?? [],\n })),\n suggestedPaths: plan.suggestedPaths ?? [],\n skillsToUse: plan.toolingDecision?.shouldUseSkills ? (plan.toolingDecision.skillsToUse ?? []) : [],\n validationItems: (plan.validation ?? []).map((value) => ({ value })),\n outputContract: CODEX_RESULT_CONTRACT,\n });\n\n const relativeDirs = extractPlanDirs(plan);\n const codePath = existsSync(join(workspacePath, \"worktree\")) ? join(workspacePath, \"worktree\") : workspacePath;\n const absoluteDirs = relativeDirs.map((d) => join(codePath, d));\n\n const command = buildCodexCommand({\n model: provider.model,\n addDirs: absoluteDirs,\n effort,\n });\n\n const env: Record<string, string> = {\n FIFONY_PLAN_COMPLEXITY: plan.estimatedComplexity,\n FIFONY_PLAN_STEPS: String(plan.steps.length),\n FIFONY_PLAN_PHASES: String(plan.phases?.length || 0),\n FIFONY_EXECUTION_PAYLOAD_FILE: \"execution-payload.json\",\n };\n if (plan.suggestedPaths?.length) env.FIFONY_PLAN_PATHS = plan.suggestedPaths.join(\",\");\n\n const { pre, post } = extractValidationCommands(plan);\n\n return {\n prompt,\n command,\n env,\n preHooks: pre,\n postHooks: post,\n outputSchema: \"\",\n payload: null,\n meta: {\n adapter: \"codex\",\n reasoningEffort: effort || \"default\",\n model: provider.model || \"default\",\n skillsActivated: plan.toolingDecision?.skillsToUse?.map((s) => s.name) || [],\n subagentsRequested: [],\n phasesCount: plan.phases?.length || 0,\n },\n };\n}\n\nexport const codexAdapter: ProviderAdapter = {\n buildCommand: buildCodexCommand,\n buildReviewCommand: (reviewer) => buildCodexCommand({\n model: reviewer.model,\n effort: reviewer.reasoningEffort,\n }),\n compile,\n};\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IssueEntry, AgentProviderDefinition, RuntimeConfig, IssuePlan } from \"../types.ts\";\nimport type { CompiledExecution } from \"./types.ts\";\nimport type { ProviderAdapter, ProviderCommandOptions } from \"./registry.ts\";\nimport { renderPrompt } from \"../../prompting.ts\";\nimport { buildFullPlanPrompt, resolveEffortForProvider, extractValidationCommands } from \"./shared.ts\";\nimport { REVIEW_RESULT_SCHEMA, extractPlanDirs } from \"./commands.ts\";\n\n// ── Result contract (embedded in prompt — Gemini CLI has no --json-schema flag) ─\n\nconst GEMINI_RESULT_CONTRACT = `\nReturn a JSON object with this exact schema when finished:\n{\n \"status\": \"done\" | \"continue\" | \"blocked\" | \"failed\",\n \"summary\": \"one paragraph summary of what was done\",\n \"root_cause\": [\"list of root causes found\"],\n \"changes_made\": [\"list of files/changes\"],\n \"validation\": { \"commands_run\": [\"...\"], \"result\": \"pass\" | \"partial\" | \"fail\" },\n \"open_questions\": [\"...\"],\n \"followups\": [\"...\"],\n \"nextPrompt\": \"guidance for next turn if status is continue\"\n}\n`.trim();\n\n// ── Command builder ───────────────────────────────────────────────────────────\n\nexport function buildGeminiCommand(options: ProviderCommandOptions): string {\n const parts = [\"gemini\", \"--yolo\"];\n\n if (options.model) {\n parts.push(`--model ${options.model}`);\n }\n\n if (options.addDirs?.length) {\n parts.push(`--include-directories ${options.addDirs.map((d) => `\"${d}\"`).join(\",\")}`);\n }\n\n // -p triggers non-interactive (headless) mode; stdin provides the prompt content\n parts.push(\"-p \\\"\\\" < \\\"$FIFONY_PROMPT_FILE\\\"\");\n return parts.join(\" \");\n}\n\n// ── Adapter ───────────────────────────────────────────────────────────────────\n\nasync function compile(\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n plan: IssuePlan,\n config: RuntimeConfig,\n workspacePath: string,\n skillContext: string,\n): Promise<CompiledExecution> {\n const effort = resolveEffortForProvider(plan, provider.role, config.defaultEffort) || provider.reasoningEffort;\n\n const prompt = await renderPrompt(\"compile-execution-codex\", {\n isPlanner: provider.role === \"planner\",\n isReviewer: provider.role === \"reviewer\",\n profileInstructions: provider.profileInstructions || \"\",\n skillContext,\n issueIdentifier: issue.identifier,\n title: issue.title,\n description: issue.description || \"(none)\",\n workspacePath,\n planPrompt: buildFullPlanPrompt(plan),\n phases: (plan.phases ?? []).map((phase) => ({\n phaseName: phase.phaseName,\n goal: phase.goal,\n outputs: phase.outputs ?? [],\n })),\n suggestedPaths: plan.suggestedPaths ?? [],\n skillsToUse: plan.toolingDecision?.shouldUseSkills ? (plan.toolingDecision.skillsToUse ?? []) : [],\n validationItems: (plan.validation ?? []).map((value) => ({ value })),\n outputContract: GEMINI_RESULT_CONTRACT,\n });\n\n const relativeDirs = extractPlanDirs(plan);\n const codePath = existsSync(join(workspacePath, \"worktree\")) ? join(workspacePath, \"worktree\") : workspacePath;\n const absoluteDirs = relativeDirs.map((d) => join(codePath, d));\n\n const command = buildGeminiCommand({\n model: provider.model,\n addDirs: absoluteDirs,\n });\n\n const env: Record<string, string> = {\n FIFONY_PLAN_COMPLEXITY: plan.estimatedComplexity,\n FIFONY_PLAN_STEPS: String(plan.steps.length),\n FIFONY_PLAN_PHASES: String(plan.phases?.length || 0),\n FIFONY_EXECUTION_PAYLOAD_FILE: \"execution-payload.json\",\n };\n if (plan.suggestedPaths?.length) env.FIFONY_PLAN_PATHS = plan.suggestedPaths.join(\",\");\n\n const { pre, post } = extractValidationCommands(plan);\n\n return {\n prompt,\n command,\n env,\n preHooks: pre,\n postHooks: post,\n outputSchema: \"\",\n payload: null,\n meta: {\n adapter: \"gemini\",\n reasoningEffort: effort || \"default\",\n model: provider.model || \"default\",\n skillsActivated: plan.toolingDecision?.skillsToUse?.map((s) => s.name) || [],\n subagentsRequested: [],\n phasesCount: plan.phases?.length || 0,\n },\n };\n}\n\nexport const geminiAdapter: ProviderAdapter = {\n buildCommand: buildGeminiCommand,\n buildReviewCommand: (reviewer) => buildGeminiCommand({\n model: reviewer.model,\n }),\n compile,\n};\n","import type { IssueEntry, AgentProviderDefinition, RuntimeConfig, IssuePlan } from \"../types.ts\";\nimport type { CompiledExecution } from \"./types.ts\";\n\n/** Normalized options passed to every provider's buildCommand. */\nexport type ProviderCommandOptions = {\n model?: string;\n effort?: string;\n addDirs?: string[];\n /** Images to attach (codex only) */\n imagePaths?: string[];\n /** JSON schema for structured output (claude only) */\n jsonSchema?: string;\n /** Disable tool access — for planning runs where tools break --json-schema (claude only) */\n noToolAccess?: boolean;\n};\n\nexport type ProviderAdapter = {\n /** Build the CLI command string for execution/planning */\n buildCommand(options: ProviderCommandOptions): string;\n /** Build the CLI command string for review */\n buildReviewCommand(reviewer: AgentProviderDefinition): string;\n /** Compile full execution payload for the provider */\n compile(\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n plan: IssuePlan,\n config: RuntimeConfig,\n workspacePath: string,\n skillContext: string,\n ): Promise<CompiledExecution>;\n};\n\nimport { claudeAdapter } from \"./claude.ts\";\nimport { codexAdapter } from \"./codex.ts\";\nimport { geminiAdapter } from \"./gemini.ts\";\n\nexport const ADAPTERS: Record<string, ProviderAdapter> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n gemini: geminiAdapter,\n};\n","import { env } from \"node:process\";\nimport { markIssueDirty, markIssuePlanDirty, markEventDirty } from \"./dirty-tracker.ts\";\nimport { recordEvent as recordLedgerEvent } from \"./token-ledger.ts\";\nimport { invalidateMetrics } from \"./metrics-cache.ts\";\nimport type {\n EffortConfig,\n IssueEntry,\n IssueState,\n JsonRecord,\n ReasoningEffort,\n RuntimeConfig,\n RuntimeEvent,\n RuntimeEventType,\n RuntimeMetrics,\n RuntimeState,\n} from \"./types.ts\";\nimport {\n ISSUE_STATE_MACHINE_ID,\n findIssueStateMachineTransitionPath,\n getIssueStateMachineDefinition,\n getIssueStateMachineInitialState,\n getIssueStateMachinePlugin,\n type IssueStateMachinePluginLike,\n} from \"./issue-state-machine.ts\";\nimport {\n ALLOWED_STATES,\n PERSIST_EVENTS_MAX,\n TERMINAL_STATES,\n STATE_ROOT,\n TARGET_ROOT,\n} from \"./constants.ts\";\nimport type { ProjectMetadata } from \"./project-meta.ts\";\nimport { resolveProjectMetadata } from \"./project-meta.ts\";\nimport {\n now,\n isoWeek,\n toStringValue,\n toNumberValue,\n toBooleanValue,\n toStringArray,\n clamp,\n normalizeState,\n parseIssueState,\n parseEnvNumber,\n parseIntArg,\n parsePositiveIntEnv,\n withRetryBackoff,\n getNestedString,\n getNestedNumber,\n fail,\n} from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport {\n normalizeAgentProvider,\n resolveAgentCommand,\n getCapabilityRoutingOptions,\n applyCapabilityMetadata,\n} from \"./providers.ts\";\nimport { resolveTaskCapabilities } from \"../routing/capability-resolver.ts\";\nimport { computeDiffStats } from \"./workspace-diff.ts\";\n\nexport function normalizeIssue(\n raw: JsonRecord,\n): IssueEntry | null {\n const id = toStringValue(raw.id, \"\");\n if (!id) return null;\n\n const createdAt = toStringValue(raw.created_at, now());\n const updatedAt = toStringValue(raw.updated_at, createdAt);\n const issue: IssueEntry = {\n id,\n identifier: toStringValue(raw.identifier, id),\n title: toStringValue(raw.title, `Issue ${id}`),\n description: toStringValue(raw.description, \"\"),\n priority: toNumberValue(raw.priority, 1),\n state: normalizeState(raw.state, raw.plan && typeof raw.plan === \"object\" ? \"Planned\" : \"Planning\"),\n branchName: toStringValue(raw.branchName) || toStringValue(raw.branch_name),\n url: toStringValue(raw.url),\n assigneeId: toStringValue(raw.assignee_id),\n labels: toStringArray(raw.labels),\n paths: toStringArray(raw.paths),\n inferredPaths: toStringArray(raw.inferredPaths),\n capabilityCategory: toStringValue(raw.capabilityCategory),\n capabilityOverlays: toStringArray(raw.capabilityOverlays),\n capabilityRationale: toStringArray(raw.capabilityRationale),\n blockedBy: toStringArray(raw.blockedBy),\n assignedToWorker: toBooleanValue(raw.assigned_to_worker, true),\n createdAt,\n updatedAt,\n history: [],\n attempts: toNumberValue(raw.attempts, 0),\n maxAttempts: toNumberValue(raw.max_attempts, 3),\n nextRetryAt: toStringValue(raw.next_retry_at),\n planVersion: 0,\n executeAttempt: 0,\n reviewAttempt: 0,\n planHistory: [],\n };\n\n if (!issue.capabilityCategory) {\n applyCapabilityMetadata(issue, resolveTaskCapabilities({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n paths: issue.paths,\n }, getCapabilityRoutingOptions()));\n }\n\n return issue;\n}\n\nconst VALID_EFFORTS = new Set([\"low\", \"medium\", \"high\", \"extra-high\"]);\n\nfunction parseEffortValue(value: unknown): ReasoningEffort | undefined {\n const str = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n return VALID_EFFORTS.has(str) ? (str as ReasoningEffort) : undefined;\n}\n\nfunction parseEffortConfig(value: unknown): EffortConfig | undefined {\n if (!value || typeof value !== \"object\") {\n // Simple string → default effort for all roles\n const simple = parseEffortValue(value);\n return simple ? { default: simple } : undefined;\n }\n const obj = value as Record<string, unknown>;\n const config: EffortConfig = {};\n const d = parseEffortValue(obj.default);\n const p = parseEffortValue(obj.planner);\n const e = parseEffortValue(obj.executor);\n const r = parseEffortValue(obj.reviewer);\n if (d) config.default = d;\n if (p) config.planner = p;\n if (e) config.executor = e;\n if (r) config.reviewer = r;\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\nexport function nextLocalIssueId(issues: IssueEntry[]): string {\n const maxId = issues.reduce((current, issue) => {\n const match = issue.identifier.match(/^#(\\d+)$/);\n if (!match) return current;\n const parsed = Number.parseInt(match[1], 10);\n return Number.isFinite(parsed) ? Math.max(current, parsed) : current;\n }, 0);\n\n return `#${maxId + 1}`;\n}\n\nexport function createIssueFromPayload(\n payload: JsonRecord,\n issues: IssueEntry[],\n defaultBranch?: string,\n): IssueEntry {\n const identifier = toStringValue(payload.identifier, nextLocalIssueId(issues));\n const id = toStringValue(payload.id, identifier.replace(/^#/, \"issue-\"));\n logger.info({ id, identifier, title: toStringValue(payload.title, \"\").slice(0, 80) }, \"[Issues] Creating new issue\");\n const createdAt = now();\n const blockedBy = toStringArray(payload.blockedBy);\n const paths = toStringArray(payload.paths);\n const images = toStringArray(payload.images);\n const initialState = parseIssueState(payload.state) ?? (payload.plan ? \"Planned\" : \"Planning\");\n\n const issue: IssueEntry = {\n id,\n identifier,\n title: toStringValue(payload.title, `Issue ${identifier}`),\n description: toStringValue(payload.description, \"\"),\n priority: clamp(toNumberValue(payload.priority, 1), 1, 10),\n state: initialState,\n branchName: toStringValue(payload.branchName),\n baseBranch: toStringValue(payload.baseBranch) || defaultBranch,\n url: toStringValue(payload.url),\n assigneeId: toStringValue(payload.assigneeId),\n labels: toStringArray(payload.labels),\n paths,\n inferredPaths: [],\n capabilityCategory: \"\",\n capabilityOverlays: [],\n capabilityRationale: [],\n blockedBy,\n assignedToWorker: true,\n createdAt,\n updatedAt: createdAt,\n history: [`[${createdAt}] Issue created via API.`],\n attempts: 0,\n maxAttempts: clamp(toNumberValue(payload.maxAttempts, 3), 1, 10),\n terminalWeek: \"\",\n images: images.length ? images : undefined,\n issueType: toStringValue(payload.issueType) || undefined,\n effort: parseEffortConfig(payload.effort),\n plan: payload.plan && typeof payload.plan === \"object\" ? payload.plan as IssueEntry[\"plan\"] : undefined,\n planVersion: payload.plan ? 1 : 0,\n executeAttempt: 0,\n reviewAttempt: 0,\n planHistory: [],\n };\n\n // If plan provides suggestions, apply them\n if (issue.plan) {\n if (issue.plan.suggestedPaths?.length && !issue.paths?.length) {\n issue.paths = issue.plan.suggestedPaths;\n }\n if (issue.plan.suggestedLabels?.length && !issue.labels?.length) {\n issue.labels = issue.plan.suggestedLabels;\n }\n if (issue.plan.suggestedEffort && !issue.effort) {\n issue.effort = issue.plan.suggestedEffort;\n }\n }\n\n applyCapabilityMetadata(issue, resolveTaskCapabilities({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n paths: issue.paths,\n }, getCapabilityRoutingOptions()));\n\n return issue;\n}\n\nexport function deriveConfig(args: string[]): RuntimeConfig {\n const parsedConcurrency = parsePositiveIntEnv(\"FIFONY_WORKER_CONCURRENCY\", 3);\n let pollIntervalMs = parseEnvNumber(\"FIFONY_POLL_INTERVAL_MS\", 1200);\n let workerConcurrency = parsedConcurrency;\n let maxAttemptsDefault = parseEnvNumber(\"FIFONY_MAX_ATTEMPTS\", 3);\n let commandTimeoutMs = parseEnvNumber(\"FIFONY_AGENT_TIMEOUT_MS\", 1_800_000);\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n if (arg === \"--poll\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --poll: ${value}`);\n pollIntervalMs = parseIntArg(value, pollIntervalMs);\n }\n if (arg === \"--concurrency\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --concurrency: ${value}`);\n workerConcurrency = parseIntArg(value, workerConcurrency);\n }\n if (arg === \"--attempts\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --attempts: ${value}`);\n maxAttemptsDefault = parseIntArg(value, maxAttemptsDefault);\n }\n if (arg === \"--timeout\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --timeout: ${value}`);\n commandTimeoutMs = parseIntArg(value, commandTimeoutMs);\n }\n }\n\n return {\n pollIntervalMs: clamp(pollIntervalMs, 200, 10_000),\n workerConcurrency: clamp(workerConcurrency, 1, 16),\n commandTimeoutMs: clamp(commandTimeoutMs, 1_000, 3_600_000),\n maxAttemptsDefault: clamp(maxAttemptsDefault, 1, 10),\n maxTurns: clamp(parseEnvNumber(\"FIFONY_AGENT_MAX_TURNS\", 4), 1, 16),\n retryDelayMs: parseEnvNumber(\"FIFONY_RETRY_DELAY_MS\", 3_000),\n staleInProgressTimeoutMs: parseEnvNumber(\"FIFONY_STALE_IN_PROGRESS_MS\", 2_400_000),\n logLinesTail: parseEnvNumber(\"FIFONY_LOG_TAIL_CHARS\", 12_000),\n maxPreviousOutputChars: parseEnvNumber(\"FIFONY_PREVIOUS_OUTPUT_CHARS\", 20_000),\n agentProvider: normalizeAgentProvider(env.FIFONY_AGENT_PROVIDER ?? \"codex\"),\n agentCommand: toStringValue(env.FIFONY_AGENT_COMMAND, \"\"),\n defaultEffort: {\n default: parseEffortValue(env.FIFONY_REASONING_EFFORT),\n planner: parseEffortValue(env.FIFONY_PLANNER_EFFORT),\n executor: parseEffortValue(env.FIFONY_EXECUTOR_EFFORT),\n reviewer: parseEffortValue(env.FIFONY_REVIEWER_EFFORT),\n },\n maxConcurrentByState: {},\n runMode: \"filesystem\",\n afterCreateHook: env.FIFONY_AFTER_CREATE_HOOK ?? \"\",\n beforeRunHook: env.FIFONY_BEFORE_RUN_HOOK ?? \"\",\n afterRunHook: env.FIFONY_AFTER_RUN_HOOK ?? \"\",\n beforeRemoveHook: env.FIFONY_BEFORE_REMOVE_HOOK ?? \"\",\n };\n}\n\nexport function applyWorkflowConfig(\n config: RuntimeConfig,\n port: number | undefined,\n): RuntimeConfig {\n return {\n ...config,\n dashboardPort: port ? String(port) : config.dashboardPort,\n };\n}\n\nexport function validateConfig(config: RuntimeConfig): string[] {\n const errors: string[] = [];\n if (config.pollIntervalMs < 200) errors.push(`pollIntervalMs too low: ${config.pollIntervalMs} (min 200)`);\n if (config.workerConcurrency < 1 || config.workerConcurrency > 16) errors.push(`workerConcurrency out of range: ${config.workerConcurrency} (1-16)`);\n if (config.maxAttemptsDefault < 1 || config.maxAttemptsDefault > 10) errors.push(`maxAttemptsDefault out of range: ${config.maxAttemptsDefault} (1-10)`);\n if (config.maxTurns < 1 || config.maxTurns > 16) errors.push(`maxTurns out of range: ${config.maxTurns} (1-16)`);\n if (config.commandTimeoutMs < 1000) errors.push(`commandTimeoutMs too low: ${config.commandTimeoutMs} (min 1000)`);\n if (config.retryDelayMs < 0) errors.push(`retryDelayMs negative: ${config.retryDelayMs}`);\n for (const [stateKey, limit] of Object.entries(config.maxConcurrentByState)) {\n if (limit < 1) errors.push(`maxConcurrentByState[${stateKey}] must be >= 1, got ${limit}`);\n }\n return errors;\n}\n\nexport function dedupHistoryEntries(issues: IssueEntry[]): void {\n for (const issue of issues) {\n const seen = new Set<string>();\n issue.history = issue.history.filter((entry) => {\n const key = entry.toLowerCase();\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport function buildRuntimeState(\n previous: RuntimeState | null,\n config: RuntimeConfig,\n projectMetadata: ProjectMetadata = resolveProjectMetadata([], TARGET_ROOT),\n): RuntimeState {\n const mergedIssues = (previous?.issues ?? [])\n .map((rawIssue) => {\n if (!rawIssue || typeof rawIssue !== \"object\") return null;\n\n const existing = rawIssue as IssueEntry;\n return {\n ...existing,\n id: toStringValue(existing.id, \"\"),\n identifier: toStringValue(existing.identifier, existing.id),\n title: toStringValue(existing.title, `Issue ${toStringValue(existing.identifier, existing.id)}`),\n description: toStringValue(existing.description, \"\"),\n state: normalizeState(existing.state, existing.plan ? \"Planned\" : \"Planning\"),\n paths: toStringArray(existing.paths),\n inferredPaths: toStringArray(existing.inferredPaths),\n labels: toStringArray(existing.labels),\n capabilityOverlays: toStringArray(existing.capabilityOverlays),\n capabilityRationale: toStringArray(existing.capabilityRationale),\n blockedBy: toStringArray(existing.blockedBy).length > 0\n ? toStringArray(existing.blockedBy)\n : toStringArray(existing.blocked_by),\n history: Array.isArray(existing.history) ? existing.history : [],\n attempts: clamp(toNumberValue(existing.attempts, 0), 0, config.maxAttemptsDefault),\n maxAttempts: clamp(toNumberValue(existing.maxAttempts, config.maxAttemptsDefault), 1, config.maxAttemptsDefault),\n nextRetryAt: toStringValue(existing.nextRetryAt),\n updatedAt: toStringValue(existing.updatedAt, now()),\n createdAt: toStringValue(existing.createdAt, now()),\n planVersion: toNumberValue(existing.planVersion, existing.plan ? 1 : 0),\n executeAttempt: toNumberValue(existing.executeAttempt, toNumberValue(existing.attempts, 0)),\n reviewAttempt: toNumberValue(existing.reviewAttempt, toNumberValue(existing.attempts, 0)),\n planHistory: Array.isArray(existing.planHistory) ? existing.planHistory : [],\n };\n })\n .filter((issue): issue is IssueEntry => issue !== null)\n .filter((issue) => issue.id);\n\n // Backfill terminalWeek for existing terminal issues that don't have it\n for (const issue of mergedIssues) {\n if (TERMINAL_STATES.has(issue.state) && !issue.terminalWeek) {\n issue.terminalWeek = isoWeek(issue.completedAt || issue.updatedAt);\n } else if (!TERMINAL_STATES.has(issue.state)) {\n issue.terminalWeek = \"\";\n }\n }\n\n dedupHistoryEntries(mergedIssues);\n\n const metrics = computeMetrics(mergedIssues);\n\n return {\n startedAt: previous?.startedAt ?? now(),\n updatedAt: now(),\n trackerKind: \"filesystem\",\n sourceRepoUrl: TARGET_ROOT,\n sourceRef: \"workspace\",\n projectName: projectMetadata.projectName,\n detectedProjectName: projectMetadata.detectedProjectName,\n projectNameSource: projectMetadata.projectNameSource,\n queueTitle: projectMetadata.queueTitle,\n config: {\n ...config,\n dashboardPort: previous?.config.dashboardPort,\n },\n issues: mergedIssues,\n events: previous?.events ?? [],\n metrics,\n notes: previous?.notes ?? [\n \"Local TypeScript runtime bootstrapped.\",\n \"Codex-only execution path enabled.\",\n \"No external tracker dependency (filesystem-backed local mode).\",\n ],\n };\n}\n\nexport function computeMetrics(issues: IssueEntry[]): RuntimeMetrics {\n let planning = 0;\n let queued = 0;\n let inProgress = 0;\n let blocked = 0;\n let done = 0;\n let cancelled = 0;\n const completionTimes: number[] = [];\n\n for (const issue of issues) {\n const duration = issue.durationMs;\n if (issue.state === \"Done\") {\n const candidate = typeof duration === \"number\" && Number.isFinite(duration)\n ? duration\n : Number.isFinite(Date.parse(issue.startedAt ?? \"\")) && Number.isFinite(Date.parse(issue.completedAt ?? \"\"))\n ? Date.parse(issue.completedAt) - Date.parse(issue.startedAt)\n : NaN;\n if (Number.isFinite(candidate) && candidate >= 0) {\n completionTimes.push(candidate);\n }\n }\n\n switch (issue.state) {\n case \"Planning\":\n planning += 1;\n break;\n case \"Planned\":\n queued += 1;\n break;\n case \"Queued\":\n case \"Running\":\n case \"Reviewing\":\n case \"Reviewed\":\n inProgress += 1;\n break;\n case \"Blocked\":\n blocked += 1;\n break;\n case \"Done\":\n done += 1;\n break;\n case \"Cancelled\":\n cancelled += 1;\n break;\n }\n }\n\n if (completionTimes.length === 0) {\n return {\n total: issues.length,\n planning,\n queued,\n inProgress,\n blocked,\n done,\n cancelled,\n activeWorkers: 0,\n };\n }\n\n const sortedCompletionTimes = completionTimes.slice().sort((a, b) => a - b);\n const totalCompletionMs = sortedCompletionTimes.reduce((acc, value) => acc + value, 0);\n const mid = Math.floor(sortedCompletionTimes.length / 2);\n const medianCompletionMs = sortedCompletionTimes.length % 2 === 1\n ? sortedCompletionTimes[mid]\n : Math.round((sortedCompletionTimes[mid - 1] + sortedCompletionTimes[mid]) / 2);\n\n return {\n total: issues.length,\n planning,\n queued,\n inProgress,\n blocked,\n done,\n cancelled,\n activeWorkers: 0,\n avgCompletionMs: Math.round(totalCompletionMs / completionTimes.length),\n medianCompletionMs,\n fastestCompletionMs: sortedCompletionTimes[0]!,\n slowestCompletionMs: sortedCompletionTimes[sortedCompletionTimes.length - 1]!,\n };\n}\n\nexport function computeCapabilityCounts(issues: IssueEntry[]): Record<string, number> {\n return issues.reduce<Record<string, number>>((accumulator, issue) => {\n const key = issue.capabilityCategory?.trim() || \"default\";\n accumulator[key] = (accumulator[key] ?? 0) + 1;\n return accumulator;\n }, {});\n}\n\nexport function addEvent(\n state: RuntimeState,\n issueId: string | undefined,\n kind: RuntimeEventType,\n message: string,\n): void {\n const event: RuntimeEvent = {\n id: `${Date.now()}-${state.events.length + 1}`,\n issueId,\n kind,\n message,\n at: now(),\n };\n\n state.events = [event, ...state.events].slice(0, PERSIST_EVENTS_MAX);\n markEventDirty(event.id);\n\n // Track event in daily ledger for analytics sparkline\n try { recordLedgerEvent(); } catch { /* non-critical */ }\n\n // Increment per-issue event counter (tracked by EventualConsistency plugin for daily analytics)\n if (issueId) {\n const issue = state.issues.find((i) => i.id === issueId);\n if (issue) {\n issue.eventsCount = (issue.eventsCount || 0) + 1;\n markIssueDirty(issue.id);\n }\n }\n\n logger.info({ issueId, kind }, message);\n}\n\nexport function transition(issue: IssueEntry, target: IssueState, note: string): void {\n const previous = issue.state;\n logger.debug({ issueId: issue.id, identifier: issue.identifier, from: previous, to: target, note }, \"[State] Issue transition\");\n\n if (target === \"Blocked\" && !note.trim()) {\n throw new Error(\"Transition to Blocked requires an explicit reason.\");\n }\n if (target === \"Blocked\") {\n issue.lastError = note;\n }\n\n issue.state = target;\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n invalidateMetrics();\n issue.history.push(`[${issue.updatedAt}] ${note}`);\n\n if (previous === \"Blocked\" && target === \"Planned\") {\n issue.lastError = undefined;\n issue.nextRetryAt = undefined;\n }\n\n if (target === \"Reviewing\") {\n issue.reviewingAt = now();\n }\n\n if (TERMINAL_STATES.has(target)) {\n issue.completedAt = now();\n issue.nextRetryAt = undefined;\n issue.terminalWeek = isoWeek();\n }\n\n // Clear terminalWeek when leaving terminal state\n if (TERMINAL_STATES.has(previous) && !TERMINAL_STATES.has(target)) {\n issue.terminalWeek = \"\";\n }\n\n if (target === \"Done\") {\n issue.lastError = undefined;\n // Capture diff stats if not already set (covers auto-approve and reviewer-approve paths)\n if (!issue.linesAdded && !issue.linesRemoved) {\n computeDiffStats(issue);\n }\n }\n}\n\nexport function issueDependenciesResolved(issue: IssueEntry, allIssues: IssueEntry[]): boolean {\n if (issue.blockedBy.length === 0) return true;\n const map = new Map(allIssues.map((entry) => [entry.id, entry]));\n return issue.blockedBy.every((dependencyId) => {\n const dep = map.get(dependencyId);\n return dep?.state === \"Done\";\n });\n}\n\nexport function getNextRetryAt(issue: IssueEntry, baseMs: number): string {\n const nextAttempt = issue.attempts + 1;\n const nextDelay = withRetryBackoff(nextAttempt, baseMs);\n return new Date(Date.now() + nextDelay).toISOString();\n}\n\nasync function syncIssueWithStateMachineIfNeeded(issue: IssueEntry): Promise<void> {\n const plugin = getIssueStateMachinePlugin();\n if (!plugin || !plugin.getState || !plugin.send || !plugin.initializeEntity) {\n return;\n }\n\n let machineDefinition: unknown;\n try {\n machineDefinition = plugin.getMachineDefinition\n ? plugin.getMachineDefinition(ISSUE_STATE_MACHINE_ID)\n : getIssueStateMachineDefinition();\n } catch {\n machineDefinition = getIssueStateMachineDefinition();\n }\n const targetState = normalizeState(issue.state);\n let machineState = await plugin.getState(ISSUE_STATE_MACHINE_ID, issue.id).catch(() => null);\n\n if (!machineState) {\n await plugin.initializeEntity(ISSUE_STATE_MACHINE_ID, issue.id, {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n state: targetState,\n });\n machineState = await plugin.getState(ISSUE_STATE_MACHINE_ID, issue.id).catch(() => {\n return getIssueStateMachineInitialState(machineDefinition);\n });\n }\n\n if (machineState === targetState) {\n return;\n }\n\n const path = findIssueStateMachineTransitionPath(machineDefinition, machineState, targetState);\n if (!path) {\n throw new Error(`State machine cannot synchronize issue ${issue.id} from '${machineState}' to '${targetState}'.`);\n }\n\n for (const event of path) {\n await plugin.send(ISSUE_STATE_MACHINE_ID, issue.id, event, {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n transition: \"sync\",\n targetState,\n });\n }\n}\n\nexport async function syncIssueStateMachineState(issue: IssueEntry): Promise<void> {\n await syncIssueWithStateMachineIfNeeded(issue);\n}\n\nexport async function syncIssueStateMachineStates(issues: IssueEntry[]): Promise<void> {\n for (const issue of issues) {\n try {\n await syncIssueWithStateMachineIfNeeded(issue);\n } catch (error) {\n logger.warn(`State machine sync failed for issue ${issue.id}: ${String(error)}`);\n }\n }\n}\n\nasync function runStateMachineTransition(issue: IssueEntry, targetState: IssueState, note: string): Promise<void> {\n const plugin = getIssueStateMachinePlugin() as IssueStateMachinePluginLike | null;\n if (!plugin?.send || !plugin.getState) {\n transition(issue, targetState, note);\n return;\n }\n\n let machineDefinition: unknown;\n try {\n machineDefinition = plugin.getMachineDefinition\n ? plugin.getMachineDefinition(ISSUE_STATE_MACHINE_ID)\n : getIssueStateMachineDefinition();\n } catch {\n machineDefinition = getIssueStateMachineDefinition();\n }\n const currentRuntimeState = normalizeState(issue.state);\n const target = normalizeState(targetState);\n\n await syncIssueWithStateMachineIfNeeded(issue);\n const machineState = await plugin.getState(ISSUE_STATE_MACHINE_ID, issue.id).catch(() => currentRuntimeState);\n\n if (machineState !== currentRuntimeState) {\n throw new Error(`State machine desync while transitioning issue ${issue.id}: expected ${currentRuntimeState}, machine has ${machineState}.`);\n }\n\n if (currentRuntimeState !== target) {\n const path = findIssueStateMachineTransitionPath(machineDefinition, currentRuntimeState, target);\n if (!path) {\n throw new Error(`State machine does not allow transition from '${currentRuntimeState}' to '${target}' for issue ${issue.id}.`);\n }\n\n for (const event of path) {\n await plugin.send(ISSUE_STATE_MACHINE_ID, issue.id, event, {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n fromState: issue.state,\n toState: target,\n note,\n });\n }\n }\n\n transition(issue, target, note);\n}\n\nexport async function transitionIssueState(\n issue: IssueEntry,\n target: IssueState,\n note: string,\n options?: { fallbackToLocal?: boolean },\n): Promise<void> {\n try {\n await runStateMachineTransition(issue, target, note);\n } catch (error) {\n if (options?.fallbackToLocal || !getIssueStateMachinePlugin()) {\n logger.warn(`State machine transition failed for issue ${issue.id}, falling back to local transition: ${String(error)}`);\n transition(issue, target, note);\n } else {\n throw error;\n }\n }\n\n if (target === \"Planning\") {\n import(\"./queue-workers.ts\").then((m) => m.enqueueForPlanning(issue)).catch((err) => logger.warn({ err }, \"[StateMachine] Failed to enqueue for planning\"));\n } else if (target === \"Queued\") {\n import(\"./queue-workers.ts\").then((m) => m.enqueueForExecution(issue)).catch((err) => logger.warn({ err }, \"[StateMachine] Failed to enqueue for execution\"));\n } else if (target === \"Reviewing\") {\n import(\"./queue-workers.ts\").then((m) => m.enqueueForReview(issue)).catch((err) => logger.warn({ err }, \"[StateMachine] Failed to enqueue for review\"));\n }\n}\n\n/**\n * Archive the current plan, bump planVersion, reset execution/review counters,\n * and return the issue to Planning state. Does NOT reset `attempts` — backoff continues.\n */\nexport function triggerReplan(issue: IssueEntry): void {\n if (issue.plan) {\n if (!Array.isArray(issue.planHistory)) issue.planHistory = [];\n issue.planHistory.push(issue.plan);\n issue.plan = undefined;\n markIssuePlanDirty(issue.id);\n }\n issue.planVersion = (issue.planVersion ?? 0) + 1;\n issue.executeAttempt = 0;\n issue.reviewAttempt = 0;\n transition(issue, \"Planning\", \"Replan requested.\");\n issue.planningStatus = \"idle\";\n issue.planningError = undefined;\n issue.planningStartedAt = undefined;\n markIssueDirty(issue.id);\n}\n\nexport async function handleStatePatch(state: RuntimeState, issue: IssueEntry, payload: JsonRecord): Promise<void> {\n const nextState = parseIssueState(payload.state);\n if (!nextState || !ALLOWED_STATES.includes(nextState)) {\n throw new Error(`Unsupported state: ${String(payload.state)}`);\n }\n\n await transitionIssueState(issue, nextState, `Manual state update: ${nextState}`);\n if (nextState === \"Planned\") {\n issue.nextRetryAt = undefined;\n issue.lastError = undefined;\n }\n if (nextState === \"Cancelled\") {\n issue.lastError = toStringValue(payload.reason);\n }\n\n addEvent(state, issue.id, \"manual\", `Manual state transition to ${nextState}`);\n}\n","/**\n * In-memory token usage ledger.\n *\n * Updated O(1) per turn via `record()`.\n * Queried O(1) for all analytics views — no disk I/O, no scans.\n *\n * Hydrated once at startup from existing issue data,\n * then kept in sync incrementally as turns complete.\n *\n * Event counts (events/day) are tracked via the EventualConsistencyPlugin\n * using the `eventsCount` field on IssueEntry — not here.\n */\n\nimport type { AgentProviderRole, AgentTokenUsage, IssueEntry } from \"./types.ts\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type TokenBucket = {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n};\n\nexport type DailyBucket = TokenBucket & {\n date: string; // \"2026-03-16\"\n events?: number;\n};\n\nexport type HourlyBucket = TokenBucket & {\n hour: string; // \"2026-03-16T14\" (ISO date + hour)\n};\n\nexport type HourlySnapshot = {\n tokensPerHour: HourlyBucket[];\n};\n\nexport type TokenAnalytics = {\n overall: TokenBucket;\n byPhase: Record<string, TokenBucket>;\n byModel: Record<string, TokenBucket>;\n daily: DailyBucket[];\n dailyByPhase: Record<string, DailyBucket[]>;\n dailyByModel: Record<string, DailyBucket[]>;\n topIssues: Array<{ id: string; identifier: string; title: string; totalTokens: number }>;\n};\n\n// ── Internal state ───────────────────────────────────────────────────────────\n\nconst EMPTY: TokenBucket = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n/** Overall aggregate */\nlet overall: TokenBucket = { ...EMPTY };\n\n/** Per-phase aggregate */\nconst byPhase = new Map<string, TokenBucket>();\n\n/** Per-model aggregate */\nconst byModel = new Map<string, TokenBucket>();\n\n/** Daily overall: date → bucket */\nconst daily = new Map<string, TokenBucket>();\n\n/** Daily per-phase: \"phase:date\" → bucket */\nconst dailyByPhase = new Map<string, TokenBucket>();\n\n/** Daily per-model: \"model:date\" → bucket */\nconst dailyByModel = new Map<string, TokenBucket>();\n\n/** Per-issue totals (for top-N) */\nconst byIssue = new Map<string, { identifier: string; title: string; totalTokens: number }>();\n\n/** Daily event counts: date → count */\nconst dailyEvents = new Map<string, number>();\n\n/** Hourly token buckets: \"2026-03-16T14\" → bucket */\nconst hourly = new Map<string, TokenBucket>();\n\nconst HOURLY_RETENTION = 48; // keep last 48 hours\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction todayDate(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nfunction currentHour(): string {\n return new Date().toISOString().slice(0, 13); // \"2026-03-16T14\"\n}\n\nfunction pruneOldHours(): void {\n if (hourly.size <= HOURLY_RETENTION) return;\n const cutoff = new Date(Date.now() - HOURLY_RETENTION * 3600_000).toISOString().slice(0, 13);\n for (const key of hourly.keys()) {\n if (key < cutoff) hourly.delete(key);\n }\n}\n\nfunction addTo(target: TokenBucket, usage: AgentTokenUsage): void {\n target.inputTokens += usage.inputTokens;\n target.outputTokens += usage.outputTokens;\n target.totalTokens += usage.totalTokens;\n}\n\nfunction getOrCreate(map: Map<string, TokenBucket>, key: string): TokenBucket {\n let bucket = map.get(key);\n if (!bucket) {\n bucket = { ...EMPTY };\n map.set(key, bucket);\n }\n return bucket;\n}\n\nfunction mapToDailyArray(map: Map<string, TokenBucket>, prefix: string): DailyBucket[] {\n const result: DailyBucket[] = [];\n for (const [key, bucket] of map) {\n if (!key.startsWith(prefix)) continue;\n const date = key.slice(prefix.length);\n result.push({ ...bucket, date });\n }\n result.sort((a, b) => a.date.localeCompare(b.date));\n return result;\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Record a token usage event. Called once per turn completion.\n * O(1) — just increments counters.\n */\nexport function record(\n issue: IssueEntry,\n usage: AgentTokenUsage,\n role?: AgentProviderRole,\n): void {\n if (!usage || usage.totalTokens === 0) return;\n\n const date = todayDate();\n const hour = currentHour();\n const model = usage.model || \"unknown\";\n\n // Overall\n addTo(overall, usage);\n\n // Daily overall\n addTo(getOrCreate(daily, date), usage);\n\n // Hourly overall\n addTo(getOrCreate(hourly, hour), usage);\n pruneOldHours();\n\n // By phase\n if (role) {\n addTo(getOrCreate(byPhase, role), usage);\n addTo(getOrCreate(dailyByPhase, `${role}:${date}`), usage);\n }\n\n // By model\n addTo(getOrCreate(byModel, model), usage);\n addTo(getOrCreate(dailyByModel, `${model}:${date}`), usage);\n\n // By issue\n const prev = byIssue.get(issue.id);\n if (prev) {\n prev.totalTokens += usage.totalTokens;\n prev.title = issue.title; // keep fresh\n } else {\n byIssue.set(issue.id, {\n identifier: issue.identifier,\n title: issue.title,\n totalTokens: usage.totalTokens,\n });\n }\n}\n\n/**\n * Record a single event occurrence for daily analytics.\n * Called from addEvent() in issues.ts.\n */\nexport function recordEvent(): void {\n const date = todayDate();\n dailyEvents.set(date, (dailyEvents.get(date) || 0) + 1);\n}\n\n/**\n * Get hourly snapshot for sparkline display.\n * Returns last N hours of token usage.\n */\nexport function getHourlySnapshot(hours = 24): HourlySnapshot {\n const now = Date.now();\n const tokensPerHour: HourlyBucket[] = [];\n\n for (let i = hours - 1; i >= 0; i--) {\n const h = new Date(now - i * 3600_000).toISOString().slice(0, 13);\n const tokenBucket = hourly.get(h);\n tokensPerHour.push({\n hour: h,\n inputTokens: tokenBucket?.inputTokens || 0,\n outputTokens: tokenBucket?.outputTokens || 0,\n totalTokens: tokenBucket?.totalTokens || 0,\n });\n }\n\n return { tokensPerHour };\n}\n\n/**\n * Hydrate the ledger from existing issues at startup.\n * Called once. O(n) over issues — amortized at boot, never at query time.\n */\nexport function hydrate(issues: IssueEntry[]): void {\n // Reset\n overall = { ...EMPTY };\n byPhase.clear();\n byModel.clear();\n daily.clear();\n dailyByPhase.clear();\n dailyByModel.clear();\n byIssue.clear();\n dailyEvents.clear();\n\n for (const issue of issues) {\n // Per-issue totals\n if (issue.tokenUsage && issue.tokenUsage.totalTokens > 0) {\n byIssue.set(issue.id, {\n identifier: issue.identifier,\n title: issue.title,\n totalTokens: issue.tokenUsage.totalTokens,\n });\n addTo(overall, issue.tokenUsage);\n }\n\n // Per-phase\n if (issue.tokensByPhase) {\n for (const [phase, pu] of Object.entries(issue.tokensByPhase)) {\n if (pu.totalTokens > 0) addTo(getOrCreate(byPhase, phase), pu);\n }\n }\n\n // Per-model\n if (issue.tokensByModel) {\n for (const [model, mu] of Object.entries(issue.tokensByModel)) {\n if (mu.totalTokens > 0) addTo(getOrCreate(byModel, model), mu);\n }\n }\n\n // Reconstruct daily token buckets from completedAt date\n const date = issue.completedAt?.slice(0, 10);\n if (date && issue.tokenUsage && issue.tokenUsage.totalTokens > 0) {\n addTo(getOrCreate(daily, date), issue.tokenUsage);\n }\n if (date && issue.tokensByPhase) {\n for (const [phase, pu] of Object.entries(issue.tokensByPhase)) {\n if (pu.totalTokens > 0) addTo(getOrCreate(dailyByPhase, `${phase}:${date}`), pu);\n }\n }\n if (date && issue.tokensByModel) {\n for (const [model, mu] of Object.entries(issue.tokensByModel)) {\n if (mu.totalTokens > 0) addTo(getOrCreate(dailyByModel, `${model}:${date}`), mu);\n }\n }\n }\n}\n\n/**\n * Get full analytics snapshot. O(1) — reads from pre-computed maps.\n * Note: daily[].events is populated by the API layer from EventualConsistency.\n */\nexport function getAnalytics(topN = 20): TokenAnalytics {\n // Daily overall (merge token buckets with event counts)\n const allDates = new Set([...daily.keys(), ...dailyEvents.keys()]);\n const dailyArray: DailyBucket[] = [];\n for (const date of allDates) {\n const bucket = daily.get(date) ?? { ...EMPTY };\n const events = dailyEvents.get(date) || 0;\n dailyArray.push({ ...bucket, date, ...(events > 0 ? { events } : {}) });\n }\n dailyArray.sort((a, b) => a.date.localeCompare(b.date));\n\n // Daily by phase\n const dailyByPhaseResult: Record<string, DailyBucket[]> = {};\n for (const phase of byPhase.keys()) {\n dailyByPhaseResult[phase] = mapToDailyArray(dailyByPhase, `${phase}:`);\n }\n\n // Daily by model\n const dailyByModelResult: Record<string, DailyBucket[]> = {};\n for (const model of byModel.keys()) {\n dailyByModelResult[model] = mapToDailyArray(dailyByModel, `${model}:`);\n }\n\n // Top issues\n const topIssues = [...byIssue.entries()]\n .map(([id, data]) => ({ id, ...data }))\n .sort((a, b) => b.totalTokens - a.totalTokens)\n .slice(0, topN);\n\n // Phase/model aggregates\n const byPhaseResult: Record<string, TokenBucket> = {};\n for (const [k, v] of byPhase) byPhaseResult[k] = { ...v };\n\n const byModelResult: Record<string, TokenBucket> = {};\n for (const [k, v] of byModel) byModelResult[k] = { ...v };\n\n return {\n overall: { ...overall },\n byPhase: byPhaseResult,\n byModel: byModelResult,\n daily: dailyArray,\n dailyByPhase: dailyByPhaseResult,\n dailyByModel: dailyByModelResult,\n topIssues,\n };\n}\n","import type { IssueEntry, RuntimeMetrics } from \"./types.ts\";\nimport { computeMetrics } from \"./issues.ts\";\n\nlet cachedMetrics: RuntimeMetrics | null = null;\nlet metricsStale = true;\n\nexport function invalidateMetrics(): void {\n metricsStale = true;\n}\n\nexport function getMetrics(issues: IssueEntry[]): RuntimeMetrics {\n if (!metricsStale && cachedMetrics) return cachedMetrics;\n cachedMetrics = computeMetrics(issues);\n metricsStale = false;\n return cachedMetrics;\n}\n","import type { IssueState } from \"./types.ts\";\n\nexport const ISSUE_STATE_MACHINE_ID = \"issue-lifecycle\";\n\ntype IssueStateTransitionMap = Record<string, string[]>;\n\ntype IssueStateMachineDefinition = {\n initialState: string;\n states?: Record<string, { on?: Record<string, string> } | undefined>;\n};\n\nconst ISSUE_STATE_TRANSITIONS: Record<string, readonly string[]> = {\n Planning: [\"Planned\", \"Cancelled\"],\n Planned: [\"Queued\", \"Planning\", \"Cancelled\"],\n Queued: [\"Running\"],\n Running: [\"Reviewing\", \"Queued\", \"Blocked\"],\n Reviewing: [\"Reviewed\", \"Queued\", \"Blocked\"],\n Reviewed: [\"Done\", \"Queued\", \"Planning\", \"Cancelled\"],\n Blocked: [\"Queued\", \"Planning\", \"Cancelled\"],\n Done: [\"Planning\", \"Queued\"],\n Cancelled: [\"Planning\", \"Planned\"],\n};\n\nexport const ISSUE_STATE_MACHINE_DEFINITION = {\n initialState: \"Planning\",\n states: {\n Planning: {\n on: {\n Planned: \"Planned\",\n Cancelled: \"Cancelled\",\n },\n },\n Planned: {\n on: {\n Queued: \"Queued\",\n Planning: \"Planning\",\n Cancelled: \"Cancelled\",\n },\n },\n Queued: {\n on: {\n Running: \"Running\",\n },\n },\n Running: {\n on: {\n Reviewing: \"Reviewing\",\n Queued: \"Queued\",\n Blocked: \"Blocked\",\n },\n },\n Reviewing: {\n on: {\n Reviewed: \"Reviewed\",\n Queued: \"Queued\",\n Blocked: \"Blocked\",\n },\n },\n Reviewed: {\n on: {\n Done: \"Done\",\n Queued: \"Queued\",\n Planning: \"Planning\",\n Cancelled: \"Cancelled\",\n },\n },\n Blocked: {\n on: {\n Queued: \"Queued\",\n Planning: \"Planning\",\n Cancelled: \"Cancelled\",\n },\n },\n Done: {\n on: {\n Planning: \"Planning\",\n Queued: \"Queued\",\n },\n },\n Cancelled: {\n on: {\n Planning: \"Planning\",\n Planned: \"Planned\",\n },\n },\n },\n} as const;\n\ntype TransitionPayload = {\n event: string;\n context: Record<string, unknown>;\n issueId: string;\n to: string;\n from: string;\n timestamp: string;\n};\n\nexport type IssueStateMachinePluginLike = {\n getMachineDefinition?: (machineId: string) => unknown;\n getState?: (machineId: string, entityId: string) => Promise<string>;\n getValidEvents?: (machineId: string, stateOrEntityId: string) => Promise<string[]>;\n initializeEntity?: (machineId: string, entityId: string, context?: Record<string, unknown>) => Promise<unknown>;\n send?: (machineId: string, entityId: string, event: string, context?: Record<string, unknown>) => Promise<TransitionPayload>;\n};\n\nlet issueStateMachinePlugin: IssueStateMachinePluginLike | null = null;\n\nfunction normalizeMachineDefinition(machineDefinition: unknown): IssueStateMachineDefinition {\n const definition = machineDefinition as Partial<IssueStateMachineDefinition>;\n return {\n initialState: typeof definition?.initialState === \"string\" ? definition.initialState : \"Planned\",\n states: definition?.states && typeof definition.states === \"object\" && !Array.isArray(definition.states)\n ? definition.states\n : (ISSUE_STATE_MACHINE_DEFINITION as IssueStateMachineDefinition).states,\n };\n}\n\nexport function setIssueStateMachinePlugin(plugin: IssueStateMachinePluginLike | null): void {\n issueStateMachinePlugin = plugin;\n}\n\nexport function getIssueStateMachinePlugin(): IssueStateMachinePluginLike | null {\n return issueStateMachinePlugin;\n}\n\nexport function getIssueStateMachineDefinition(): unknown {\n return issueStateMachinePlugin?.getMachineDefinition?.(ISSUE_STATE_MACHINE_ID)\n || ISSUE_STATE_MACHINE_DEFINITION;\n}\n\nexport function getIssueStateMachineInitialState(machineDefinition: unknown = getIssueStateMachineDefinition()): string {\n return normalizeMachineDefinition(machineDefinition).initialState;\n}\n\nfunction getIssueTransitionsFromStateDefinition(\n machineDefinition: unknown,\n state: string,\n): string[] {\n const definition = normalizeMachineDefinition(machineDefinition);\n const direct = definition?.states?.[state]?.on;\n if (!direct || typeof direct !== \"object\") return [...ISSUE_STATE_TRANSITIONS[state as keyof typeof ISSUE_STATE_TRANSITIONS] ?? []];\n\n const next = Object.keys(direct);\n return next.length > 0 ? next : [state];\n}\n\nfunction getIssueTransitionsByState(machineDefinition: unknown): Record<string, string[]> {\n const definition = normalizeMachineDefinition(machineDefinition);\n const fallback = Object.entries(ISSUE_STATE_TRANSITIONS).reduce<Record<string, string[]>>(\n (acc, [state, states]) => {\n acc[state] = [...states];\n return acc;\n },\n {},\n );\n\n if (!definition?.states || typeof definition.states !== \"object\") {\n return fallback;\n }\n\n for (const [state, next] of Object.entries(definition.states)) {\n if (!next || typeof next !== \"object\") continue;\n const transitions = next.on;\n if (transitions && typeof transitions === \"object\") {\n fallback[state] = Object.keys(transitions);\n }\n }\n\n return fallback;\n}\n\nexport function findIssueStateMachineTransitionPath(\n machineDefinition: unknown,\n from: string,\n to: string,\n): string[] | null {\n if (from === to) return [];\n\n const definition = normalizeMachineDefinition(machineDefinition);\n const edges = definition.states || {};\n if (!edges[from] || !edges[to]) return null;\n\n const queue: string[] = [from];\n const previousState = new Map<string, string>();\n const previousEvent = new Map<string, string>();\n previousState.set(from, \"\");\n\n for (let i = 0; i < queue.length; i += 1) {\n const current = queue[i]!;\n const transitions = edges[current]?.on;\n if (!transitions || typeof transitions !== \"object\") continue;\n\n for (const [event, nextRaw] of Object.entries(transitions)) {\n if (typeof nextRaw !== \"string\") continue;\n const next = nextRaw;\n if (previousState.has(next)) continue;\n\n previousState.set(next, current);\n previousEvent.set(next, event);\n\n if (next === to) {\n const events = [];\n let cursor = next;\n while (cursor !== from) {\n const prev = previousState.get(cursor);\n const event = previousEvent.get(cursor);\n if (!prev || !event) return null;\n events.unshift(event);\n cursor = prev;\n }\n return events;\n }\n\n queue.push(next);\n }\n }\n\n return null;\n}\n\n","import { basename } from \"node:path\";\nimport type { ProjectNameSource, RuntimeSettingRecord } from \"./types.ts\";\n\nexport const SETTING_ID_PROJECT_NAME = \"system.projectName\";\nexport const LEGACY_PROJECT_SETTING_IDS = [\n \"runtime.projectName\",\n \"ui.projectName\",\n \"projectName\",\n \"project.name\",\n];\n\nexport type ProjectMetadata = {\n projectName: string;\n detectedProjectName: string;\n projectNameSource: ProjectNameSource;\n queueTitle: string;\n};\n\nexport function normalizeProjectName(value: unknown): string {\n return typeof value === \"string\"\n ? value.trim().replace(/\\s+/g, \" \")\n : \"\";\n}\n\nexport function detectProjectName(targetRoot: string): string {\n const normalizedPath = typeof targetRoot === \"string\"\n ? targetRoot.trim().replace(/[\\\\/]+$/, \"\")\n : \"\";\n if (!normalizedPath) return \"\";\n return normalizeProjectName(basename(normalizedPath));\n}\n\nexport function readSavedProjectName(settings: RuntimeSettingRecord[]): string {\n const settingIds = [SETTING_ID_PROJECT_NAME, ...LEGACY_PROJECT_SETTING_IDS];\n\n for (const id of settingIds) {\n const value = normalizeProjectName(settings.find((setting) => setting.id === id)?.value);\n if (value) {\n return value;\n }\n }\n\n return \"\";\n}\n\nexport function buildQueueTitle(projectName: string): string {\n const normalizedProjectName = normalizeProjectName(projectName);\n return normalizedProjectName ? `fifony: ${normalizedProjectName}` : \"fifony\";\n}\n\nexport function resolveProjectMetadata(\n settings: RuntimeSettingRecord[],\n targetRoot: string,\n): ProjectMetadata {\n const savedProjectName = readSavedProjectName(settings);\n const detectedProjectName = detectProjectName(targetRoot);\n const projectName = savedProjectName || detectedProjectName;\n\n return {\n projectName,\n detectedProjectName,\n projectNameSource: savedProjectName ? \"saved\" : detectedProjectName ? \"detected\" : \"missing\",\n queueTitle: buildQueueTitle(projectName),\n };\n}\n","import { execSync } from \"node:child_process\";\nimport type { IssueEntry } from \"./types.ts\";\nimport { TARGET_ROOT } from \"./constants.ts\";\n\nexport function inferChangedWorkspacePaths(workspacePath: string, limit = 32, issue?: IssueEntry): string[] {\n if (!issue?.baseBranch || !issue.branchName) return [];\n try {\n const output = execSync(\n `git diff --name-only \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { cwd: TARGET_ROOT, encoding: \"utf8\", timeout: 10_000, stdio: \"pipe\" },\n );\n return output.trim().split(\"\\n\").filter(Boolean).slice(0, limit);\n } catch {\n return [];\n }\n}\n\n/** Compute lines added/removed/files changed from workspace diff. */\nexport function computeDiffStats(issue: IssueEntry): void {\n if (!issue.baseBranch || !issue.branchName) return;\n try {\n let raw = \"\";\n try {\n raw = execSync(\n `git diff --stat \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { cwd: TARGET_ROOT, encoding: \"utf8\", maxBuffer: 512_000, timeout: 10_000, stdio: \"pipe\" },\n );\n } catch (err: any) {\n raw = err.stdout || \"\";\n }\n if (raw) parseDiffStats(issue, raw);\n } catch {}\n}\n\nexport function parseDiffStats(issue: IssueEntry, raw: string): void {\n const lines = raw.trim().split(\"\\n\");\n const summary = lines[lines.length - 1] || \"\";\n const filesMatch = summary.match(/(\\d+)\\s+files?\\s+changed/);\n const addMatch = summary.match(/(\\d+)\\s+insertions?\\(\\+\\)/);\n const delMatch = summary.match(/(\\d+)\\s+deletions?\\(-\\)/);\n\n const internalRe = /fifony[-_]|\\.fifony-|WORKFLOW\\.local/;\n const fileLines = lines.slice(0, -1).filter((l) => {\n const name = l.trim().split(\"|\")[0]?.trim().split(\"/\").pop() || \"\";\n return !internalRe.test(name);\n });\n\n issue.filesChanged = fileLines.length || (filesMatch ? parseInt(filesMatch[1], 10) : 0);\n issue.linesAdded = addMatch ? parseInt(addMatch[1], 10) : 0;\n issue.linesRemoved = delMatch ? parseInt(delMatch[1], 10) : 0;\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IssueEntry, AgentProviderDefinition, RuntimeConfig, AgentTokenUsage } from \"../types.ts\";\nimport type { CompiledExecution, CompiledReview, ExecutionAudit } from \"./types.ts\";\nimport { buildExecutionPayload } from \"./shared.ts\";\nimport type { ExecutionPayload } from \"./shared.ts\";\nimport { ADAPTERS } from \"./registry.ts\";\nimport { renderPrompt } from \"../../prompting.ts\";\nimport { buildFullPlanPrompt } from \"./shared.ts\";\n\nexport type { CompiledExecution, CompiledReview, ExecutionAudit };\n\n// ── Compile execution ────────────────────────────────────────────────────────\n\nexport async function compileExecution(\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n config: RuntimeConfig,\n workspacePath: string,\n skillContext: string,\n): Promise<CompiledExecution | null> {\n const plan = issue.plan;\n if (!plan?.steps?.length) return null;\n\n const adapter = ADAPTERS[provider.provider];\n if (!adapter) return null;\n\n const payload = buildExecutionPayload(issue, provider, plan, workspacePath);\n const compiled = await adapter.compile(issue, provider, plan, config, workspacePath, skillContext);\n compiled.payload = payload;\n return compiled;\n}\n\n// ── Compile review ───────────────────────────────────────────────────────────\n\nexport async function compileReview(\n issue: IssueEntry,\n reviewer: AgentProviderDefinition,\n workspacePath: string,\n diffSummary: string,\n): Promise<CompiledReview> {\n const plan = issue.plan;\n const prompt = await renderPrompt(\"compile-review\", {\n issueIdentifier: issue.identifier,\n title: issue.title,\n description: issue.description || \"(none)\",\n workspacePath,\n planPrompt: plan ? buildFullPlanPrompt(plan) : \"\",\n successCriteria: (plan?.successCriteria ?? []).map((value) => ({ value })),\n deliverables: (plan?.deliverables ?? []).map((value) => ({ value })),\n diffSummary,\n });\n\n const adapter = ADAPTERS[reviewer.provider];\n const command = adapter\n ? adapter.buildReviewCommand(reviewer)\n : reviewer.command;\n\n return { prompt, command };\n}\n\n// ── Audit ────────────────────────────────────────────────────────────────────\n\nexport function buildExecutionAudit(\n provider: AgentProviderDefinition,\n compiled: CompiledExecution | null,\n issue: IssueEntry,\n durationMs: number,\n result: string,\n): ExecutionAudit {\n return {\n runtime: provider.provider,\n model: provider.model || compiled?.meta.model || \"default\",\n effort: provider.reasoningEffort || compiled?.meta.reasoningEffort || \"default\",\n role: provider.role,\n skillsActivated: compiled?.meta.skillsActivated || [],\n subagentsRequested: compiled?.meta.subagentsRequested || [],\n durationMs,\n tokenUsage: issue.tokenUsage ?? null,\n diffStats: issue.filesChanged != null\n ? { filesChanged: issue.filesChanged, linesAdded: issue.linesAdded || 0, linesRemoved: issue.linesRemoved || 0 }\n : null,\n result,\n compiledAt: compiled ? new Date().toISOString() : \"\",\n completedAt: new Date().toISOString(),\n };\n}\n\n// ── Persistence ──────────────────────────────────────────────────────────────\n\nexport function persistCompilationArtifacts(workspacePath: string, compiled: CompiledExecution): void {\n try {\n writeFileSync(\n join(workspacePath, \"compiled-execution.json\"),\n JSON.stringify({\n adapter: compiled.meta.adapter,\n model: compiled.meta.model,\n reasoningEffort: compiled.meta.reasoningEffort,\n skillsActivated: compiled.meta.skillsActivated,\n subagentsRequested: compiled.meta.subagentsRequested,\n phasesCount: compiled.meta.phasesCount,\n preHooks: compiled.preHooks,\n postHooks: compiled.postHooks,\n hasOutputSchema: !!compiled.outputSchema,\n hasPayload: !!compiled.payload,\n command: compiled.command,\n promptLength: compiled.prompt.length,\n compiledAt: new Date().toISOString(),\n }, null, 2),\n \"utf8\",\n );\n } catch { /* optional audit data */ }\n\n try {\n writeFileSync(join(workspacePath, \"prompt.md\"), compiled.prompt, \"utf8\");\n } catch { /* optional */ }\n\n if (compiled.payload) {\n try {\n writeFileSync(\n join(workspacePath, \"execution-payload.json\"),\n JSON.stringify(compiled.payload, null, 2),\n \"utf8\",\n );\n } catch { /* optional */ }\n }\n}\n\nexport function persistExecutionAudit(workspacePath: string, audit: ExecutionAudit): void {\n try {\n writeFileSync(\n join(workspacePath, \"execution-audit.json\"),\n JSON.stringify(audit, null, 2),\n \"utf8\",\n );\n } catch { /* optional audit data */ }\n}\n","import { mkdirSync } from \"node:fs\";\nimport type {\n RuntimeState,\n RuntimeStateRecord,\n IssueEntry,\n RuntimeEvent,\n RuntimeSettingRecord,\n S3dbModule,\n S3dbDatabase,\n S3dbResource,\n} from \"./types.ts\";\nimport {\n S3DB_DATABASE_PATH,\n S3DB_BUCKET,\n S3DB_ISSUE_RESOURCE,\n S3DB_KEY_PREFIX,\n S3DB_RUNTIME_RECORD_ID,\n S3DB_RUNTIME_SCHEMA_VERSION,\n} from \"./constants.ts\";\nimport { now, debugBoot, fail } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { computeCapabilityCounts } from \"./issues.ts\";\nimport { getMetrics } from \"./metrics-cache.ts\";\nimport { clearApiRuntimeContext } from \"./api-runtime-context.ts\";\nimport { broadcastToWebSocketClients } from \"./api-server.ts\";\nimport { NATIVE_RESOURCE_CONFIGS, NATIVE_RESOURCE_NAMES } from \"./resources/index.ts\";\nimport {\n setIssueStateMachinePlugin,\n ISSUE_STATE_MACHINE_DEFINITION,\n ISSUE_STATE_MACHINE_ID,\n} from \"./issue-state-machine.ts\";\n\nlet loadedS3dbModule: S3dbModule | null = null;\nlet stateDb: S3dbDatabase | null = null;\nlet runtimeStateResource: S3dbResource | null = null;\nlet issueStateResource: S3dbResource | null = null;\nlet issuePlanResource: S3dbResource | null = null;\nlet eventStateResource: S3dbResource | null = null;\nlet settingStateResource: S3dbResource | null = null;\nlet agentSessionResource: S3dbResource | null = null;\nlet agentPipelineResource: S3dbResource | null = null;\nlet activeApiPlugin: { stop?: () => Promise<void> } | null = null;\nlet activeStateMachinePlugin: { stop?: () => Promise<void> } | null = null;\nlet activeEcPlugin: S3dbModule[\"EventualConsistencyPlugin\"] extends new (...a: never[]) => infer R ? R | null : null = null;\n\nimport {\n markIssueDirty,\n markIssuePlanDirty,\n markEventDirty,\n hasDirtyState,\n getDirtyIssueIds,\n getDirtyIssuePlanIds,\n getDirtyEventIds,\n clearDirtyIssueIds,\n clearDirtyIssuePlanIds,\n clearDirtyEventIds,\n markAllIssuesDirty,\n markAllIssuePlansDirty,\n markAllEventsDirty,\n} from \"./dirty-tracker.ts\";\n\nexport { markIssueDirty, markIssuePlanDirty, markEventDirty, hasDirtyState };\n\nexport function getStateDb(): S3dbDatabase | null { return stateDb; }\nexport function getIssuePlanResource(): S3dbResource | null { return issuePlanResource; }\nexport function getEventStateResource(): S3dbResource | null { return eventStateResource; }\nexport function getSettingStateResource(): S3dbResource | null { return settingStateResource; }\nexport function getAgentSessionResource(): S3dbResource | null { return agentSessionResource; }\nexport function getAgentPipelineResource(): S3dbResource | null { return agentPipelineResource; }\nexport function setActiveApiPlugin(plugin: { stop?: () => Promise<void> } | null): void { activeApiPlugin = plugin; }\nlet activeWebSocketPlugin: { stop?: () => Promise<void> } | null = null;\n\nexport async function loadS3dbModule(): Promise<S3dbModule> {\n if (loadedS3dbModule) return loadedS3dbModule;\n\n try {\n const imported = await import(\"s3db.js/lite\") as unknown as Record<string, unknown>;\n const pluginModule = await import(\"s3db.js/plugins/index\");\n\n let ApiPluginCtor: S3dbModule[\"ApiPlugin\"] | undefined;\n let WebSocketPluginCtor: S3dbModule[\"WebSocketPlugin\"] | undefined;\n let StateMachinePluginCtor: S3dbModule[\"StateMachinePlugin\"] | undefined;\n\n if (typeof (pluginModule as Record<string, unknown>).ApiPlugin === \"function\") {\n ApiPluginCtor = (pluginModule as { ApiPlugin: S3dbModule[\"ApiPlugin\"] }).ApiPlugin;\n } else if (typeof (pluginModule as Record<string, unknown>).loadApiPlugin === \"function\") {\n ApiPluginCtor = await (pluginModule as { loadApiPlugin: () => Promise<S3dbModule[\"ApiPlugin\"]> }).loadApiPlugin();\n }\n\n if (!ApiPluginCtor) {\n throw new Error(\"ApiPlugin export not found.\");\n }\n\n if (typeof (pluginModule as Record<string, unknown>).WebSocketPlugin === \"function\") {\n WebSocketPluginCtor = (pluginModule as { WebSocketPlugin: S3dbModule[\"WebSocketPlugin\"] }).WebSocketPlugin;\n } else if (typeof (pluginModule as Record<string, unknown>).loadWebSocketPlugin === \"function\") {\n WebSocketPluginCtor = await (pluginModule as { loadWebSocketPlugin: () => Promise<S3dbModule[\"WebSocketPlugin\"]> }).loadWebSocketPlugin();\n }\n\n if (typeof (pluginModule as Record<string, unknown>).StateMachinePlugin === \"function\") {\n StateMachinePluginCtor = (pluginModule as { StateMachinePlugin: S3dbModule[\"StateMachinePlugin\"] }).StateMachinePlugin;\n }\n\n let EventualConsistencyPluginCtor: S3dbModule[\"EventualConsistencyPlugin\"] | undefined;\n if (typeof (pluginModule as Record<string, unknown>).EventualConsistencyPlugin === \"function\") {\n EventualConsistencyPluginCtor = (pluginModule as { EventualConsistencyPlugin: S3dbModule[\"EventualConsistencyPlugin\"] }).EventualConsistencyPlugin;\n }\n\n let S3QueuePluginCtor: S3dbModule[\"S3QueuePlugin\"] | undefined;\n if (typeof (pluginModule as Record<string, unknown>).S3QueuePlugin === \"function\") {\n S3QueuePluginCtor = (pluginModule as { S3QueuePlugin: S3dbModule[\"S3QueuePlugin\"] }).S3QueuePlugin;\n }\n\n loadedS3dbModule = {\n S3db: imported.S3db as S3dbModule[\"S3db\"],\n FileSystemClient: imported.FileSystemClient as S3dbModule[\"FileSystemClient\"],\n ApiPlugin: ApiPluginCtor,\n WebSocketPlugin: WebSocketPluginCtor,\n StateMachinePlugin: StateMachinePluginCtor,\n EventualConsistencyPlugin: EventualConsistencyPluginCtor,\n S3QueuePlugin: S3QueuePluginCtor,\n };\n return loadedS3dbModule;\n } catch (error) {\n fail(`Failed to load s3db.js: ${String(error)}`);\n }\n}\n\nexport async function initStateStore(): Promise<void> {\n debugBoot(\"initStateStore:start\");\n const { S3db, FileSystemClient, StateMachinePlugin } = await loadS3dbModule();\n debugBoot(\"initStateStore:module-loaded\");\n\n mkdirSync(S3DB_DATABASE_PATH, { recursive: true });\n\n stateDb = new S3db({\n client: new FileSystemClient({\n basePath: S3DB_DATABASE_PATH,\n bucket: S3DB_BUCKET,\n keyPrefix: S3DB_KEY_PREFIX,\n }),\n });\n\n await stateDb.connect();\n debugBoot(\"initStateStore:connected\");\n\n for (const resourceConfig of NATIVE_RESOURCE_CONFIGS) {\n await stateDb.createResource(resourceConfig);\n }\n\n if (StateMachinePlugin) {\n const stateMachinePlugin = await stateDb.usePlugin(\n new StateMachinePlugin({\n stateMachines: {\n [ISSUE_STATE_MACHINE_ID]: ISSUE_STATE_MACHINE_DEFINITION,\n },\n }) as unknown,\n \"state-machine\",\n ) as Record<string, unknown>;\n\n activeStateMachinePlugin = stateMachinePlugin as { stop?: () => Promise<void> };\n const bindPluginMethod = <T extends (...args: never[]) => unknown>(method: unknown): T | undefined => {\n return typeof method === \"function\" ? method.bind(stateMachinePlugin) as T : undefined;\n };\n setIssueStateMachinePlugin({\n send: bindPluginMethod<S3dbModule[\"StateMachinePlugin\"] extends { send?: infer T } ? T & ((...args: never[]) => unknown) : never>(stateMachinePlugin.send),\n getMachineDefinition: bindPluginMethod<S3dbModule[\"StateMachinePlugin\"] extends { getMachineDefinition?: infer T } ? T & ((...args: never[]) => unknown) : never>(stateMachinePlugin.getMachineDefinition),\n getState: bindPluginMethod<S3dbModule[\"StateMachinePlugin\"] extends { getState?: infer T } ? T & ((...args: never[]) => unknown) : never>(stateMachinePlugin.getState),\n initializeEntity: bindPluginMethod<S3dbModule[\"StateMachinePlugin\"] extends { initializeEntity?: infer T } ? T & ((...args: never[]) => unknown) : never>(stateMachinePlugin.initializeEntity),\n getValidEvents: bindPluginMethod<S3dbModule[\"StateMachinePlugin\"] extends { getValidEvents?: infer T } ? T & ((...args: never[]) => unknown) : never>(stateMachinePlugin.getValidEvents),\n });\n } else {\n logger.warn(\"StateMachinePlugin not available. Issue transitions will use local logic only.\");\n }\n\n // EventualConsistency plugin for token usage analytics\n const { EventualConsistencyPlugin } = await loadS3dbModule();\n if (EventualConsistencyPlugin) {\n try {\n const ecPlugin = new EventualConsistencyPlugin({\n resources: {\n [S3DB_ISSUE_RESOURCE]: [\n // Per-model totals (dynamic keys: { \"claude-sonnet-4-6\": 12345, \"o4-mini\": 6789 })\n { field: \"usage.tokens\", fieldPath: \"usage.tokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Overall volume\n { field: \"tokenUsage.totalTokens\", fieldPath: \"tokenUsage.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokenUsage.inputTokens\", fieldPath: \"tokenUsage.inputTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokenUsage.outputTokens\", fieldPath: \"tokenUsage.outputTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Per-phase volume\n { field: \"tokensByPhase.planner.totalTokens\", fieldPath: \"tokensByPhase.planner.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokensByPhase.executor.totalTokens\", fieldPath: \"tokensByPhase.executor.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokensByPhase.reviewer.totalTokens\", fieldPath: \"tokensByPhase.reviewer.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Event count (incremented on each addEvent call for this issue)\n { field: \"eventsCount\", fieldPath: \"eventsCount\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Code churn (set at merge time, accumulated per day)\n { field: \"linesAdded\", fieldPath: \"linesAdded\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"linesRemoved\", fieldPath: \"linesRemoved\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"filesChanged\", fieldPath: \"filesChanged\", initialValue: 0, cohort: { granularity: \"day\" } },\n ],\n },\n enableAnalytics: true,\n analytics: { enabled: true },\n cohort: { granularity: \"day\", timezone: \"UTC\" },\n analyticsConfig: { rollupStrategy: \"incremental\", retentionDays: 90 },\n autoConsolidate: true,\n consolidationInterval: 30_000,\n });\n await stateDb.usePlugin(ecPlugin as unknown, \"eventual-consistency\");\n activeEcPlugin = ecPlugin as typeof activeEcPlugin;\n logger.info(\"EventualConsistency plugin installed for token usage analytics.\");\n } catch (error) {\n logger.warn(`EventualConsistency plugin failed to install: ${String(error)}`);\n }\n }\n\n const [\n runtimeStateResourceName,\n issueResourceName,\n issuePlanResourceName,\n eventResourceName,\n settingResourceName,\n agentSessionResourceName,\n agentPipelineResourceName,\n ] = NATIVE_RESOURCE_NAMES;\n runtimeStateResource = await stateDb.getResource(runtimeStateResourceName);\n issueStateResource = await stateDb.getResource(issueResourceName);\n issuePlanResource = await stateDb.getResource(issuePlanResourceName);\n eventStateResource = await stateDb.getResource(eventResourceName);\n settingStateResource = await stateDb.getResource(settingResourceName);\n agentSessionResource = await stateDb.getResource(agentSessionResourceName);\n agentPipelineResource = await stateDb.getResource(agentPipelineResourceName);\n debugBoot(\"initStateStore:resources-ready\");\n}\n\nexport function isStateNotFoundError(error: unknown): boolean {\n if (error instanceof Error) {\n return /not found|does not exist|no such key/i.test(error.message);\n }\n if (typeof error === \"string\") {\n return /not found|does not exist|no such key/i.test(error);\n }\n return false;\n}\n\nexport async function loadPersistedState(): Promise<RuntimeState | null> {\n if (!runtimeStateResource) {\n logger.debug(\"[Store] No runtime state resource available, skipping load\");\n return null;\n }\n\n logger.debug(\"[Store] Loading persisted state from s3db\");\n try {\n const record = await runtimeStateResource.get(S3DB_RUNTIME_RECORD_ID);\n if (record?.state && typeof record.state === \"object\") {\n const state = record.state as RuntimeState;\n if (Array.isArray(state.issues) && state.issues.length > 0) {\n return state;\n }\n // State blob has no issues — try recovering from individual issue records\n logger.warn(\"Runtime state blob has no issues, attempting recovery from issue resource...\");\n }\n } catch (error) {\n if (!isStateNotFoundError(error)) {\n logger.warn(`Could not load persisted state from s3db (will attempt issue recovery): ${String(error)}`);\n }\n }\n\n // Fallback: recover issues from individual s3db issue records\n return recoverStateFromIssueResource();\n}\n\nasync function recoverStateFromIssueResource(): Promise<RuntimeState | null> {\n if (!issueStateResource) return null;\n\n try {\n const records = await (issueStateResource as any).list({ limit: 500 });\n if (!Array.isArray(records) || records.length === 0) return null;\n\n const issues = records\n .filter((r: any) => r?.id && r?.identifier && r?.state)\n .map((r: any) => r as RuntimeState[\"issues\"][number]);\n\n if (issues.length === 0) return null;\n\n logger.info(`Recovered ${issues.length} issue(s) from s3db issue resource.`);\n\n if (issuePlanResource) {\n for (const issue of issues) {\n try {\n const planRecord = await issuePlanResource.get(issue.id) as Record<string, unknown> | null | undefined;\n if (planRecord?.plan) issue.plan = planRecord.plan as IssueEntry[\"plan\"];\n if (planRecord?.planHistory) issue.planHistory = planRecord.planHistory as IssueEntry[\"planHistory\"];\n } catch {\n // plan may not exist yet — ok\n }\n }\n }\n\n return {\n startedAt: now(),\n updatedAt: now(),\n trackerKind: \"filesystem\",\n sourceRepoUrl: \"\",\n sourceRef: \"workspace\",\n config: {} as any,\n issues,\n events: [],\n metrics: getMetrics(issues),\n notes: [\"State recovered from individual issue records after corruption.\"],\n };\n } catch (error) {\n logger.warn(`Failed to recover issues from s3db: ${String(error)}`);\n return null;\n }\n}\n\nexport async function persistState(state: RuntimeState): Promise<void> {\n state.metrics = {\n ...getMetrics(state.issues),\n activeWorkers: state.metrics.activeWorkers,\n };\n\n if (!runtimeStateResource) return;\n\n // Only write the runtime state blob if something changed\n const dirty = hasDirtyState();\n const dirtyIssueCount = getDirtyIssueIds().size;\n const dirtyEventCount = getDirtyEventIds().size;\n if (dirty || dirtyIssueCount > 0 || dirtyEventCount > 0) {\n logger.debug({ dirty, dirtyIssues: dirtyIssueCount, dirtyEvents: dirtyEventCount }, \"[Store] Persisting state\");\n }\n\n if (dirty) {\n await runtimeStateResource.replace(S3DB_RUNTIME_RECORD_ID, {\n id: S3DB_RUNTIME_RECORD_ID,\n schemaVersion: S3DB_RUNTIME_SCHEMA_VERSION,\n trackerKind: \"filesystem\",\n runtimeTag: \"local-only\",\n updatedAt: now(),\n state,\n } satisfies RuntimeStateRecord);\n }\n\n const dirtyIssues = getDirtyIssueIds();\n if (issueStateResource && dirtyIssues.size > 0) {\n for (const issue of state.issues) {\n if (!dirtyIssues.has(issue.id)) continue;\n // s3db requires valid datetime or undefined — clean empty strings\n // Exclude plan/planHistory — those live in issue_plans resource\n const { plan: _plan, planHistory: _planHistory, ...issueCore } = issue;\n const clean = {\n ...issueCore,\n nextRetryAt: issue.nextRetryAt || undefined,\n startedAt: issue.startedAt || undefined,\n completedAt: issue.completedAt || undefined,\n workspacePreparedAt: issue.workspacePreparedAt || undefined,\n commandExitCode: typeof issue.commandExitCode === \"number\" ? issue.commandExitCode : undefined,\n };\n try {\n await issueStateResource.replace(issue.id, clean);\n } catch (error) {\n logger.warn(`Failed to persist issue ${issue.id}: ${String(error)}`);\n }\n }\n clearDirtyIssueIds();\n }\n\n const dirtyIssuePlans = getDirtyIssuePlanIds();\n if (issuePlanResource && dirtyIssuePlans.size > 0) {\n for (const issue of state.issues) {\n if (!dirtyIssuePlans.has(issue.id)) continue;\n try {\n await issuePlanResource.replace(issue.id, {\n id: issue.id,\n plan: issue.plan,\n planHistory: issue.planHistory,\n planVersion: issue.planVersion ?? 0,\n });\n } catch (error) {\n logger.warn(`Failed to persist issue plan ${issue.id}: ${String(error)}`);\n }\n }\n clearDirtyIssuePlanIds();\n }\n\n const dirtyEvents = getDirtyEventIds();\n if (eventStateResource && dirtyEvents.size > 0) {\n for (const event of state.events) {\n if (!dirtyEvents.has(event.id)) continue;\n await eventStateResource.replace(event.id, event satisfies RuntimeEvent);\n }\n clearDirtyEventIds();\n }\n\n // Push state to connected WebSocket clients\n broadcastToWebSocketClients({\n type: \"state:update\",\n metrics: state.metrics,\n capabilities: computeCapabilityCounts(state.issues),\n issues: state.issues,\n events: state.events.slice(0, 50),\n updatedAt: state.updatedAt,\n });\n}\n\n/** Force persist all issues (used during boot and shutdown). */\nexport async function persistStateFull(state: RuntimeState): Promise<void> {\n markAllIssuesDirty(state.issues.map((i) => i.id));\n markAllIssuePlansDirty(state.issues.map((i) => i.id));\n markAllEventsDirty(state.events.map((e) => e.id));\n await persistState(state);\n}\n\nexport async function loadPersistedSettings(): Promise<RuntimeSettingRecord[]> {\n if (!settingStateResource?.list) return [];\n\n try {\n const records = await settingStateResource.list({ limit: 500 });\n return Array.isArray(records)\n ? records.filter((record): record is RuntimeSettingRecord =>\n Boolean(\n record &&\n typeof record.id === \"string\" &&\n typeof record.scope === \"string\",\n ),\n )\n : [];\n } catch (error) {\n logger.warn(`Failed to load persisted settings from s3db: ${String(error)}`);\n return [];\n }\n}\n\nexport async function replacePersistedSetting(setting: RuntimeSettingRecord): Promise<void> {\n if (!settingStateResource) return;\n await settingStateResource.replace(setting.id, setting);\n}\n\n/**\n * Query EC plugin for daily event counts (sum of eventsCount deltas per day).\n * Returns last N days as { date: \"2026-03-18\", events: 5 }[].\n */\nexport async function getEcDailyEvents(days = 90): Promise<Array<{ date: string; events: number }>> {\n if (!activeEcPlugin?.getLastNDays) return [];\n try {\n const raw = await activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"eventsCount\", days);\n if (!Array.isArray(raw)) return [];\n return raw\n .map((r: unknown) => {\n const rec = r as Record<string, unknown>;\n const date = (rec.date ?? rec.cohort ?? rec.key ?? \"\") as string;\n const events = Number(rec.total ?? rec.value ?? rec.sum ?? rec.count ?? 0);\n return { date: String(date).slice(0, 10), events };\n })\n .filter((e) => e.date && e.events > 0);\n } catch {\n return [];\n }\n}\n\n/**\n * Query EC plugin for daily code churn (linesAdded + linesRemoved + filesChanged per day).\n */\nexport async function getEcDailyLines(days = 90): Promise<Array<{ date: string; linesAdded: number; linesRemoved: number; filesChanged: number }>> {\n if (!activeEcPlugin?.getLastNDays) return [];\n try {\n const [addedRaw, removedRaw, filesRaw] = await Promise.all([\n activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"linesAdded\", days),\n activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"linesRemoved\", days),\n activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"filesChanged\", days),\n ]);\n\n const toMap = (raw: unknown): Map<string, number> => {\n if (!Array.isArray(raw)) return new Map();\n return new Map(\n raw\n .map((r: unknown) => {\n const rec = r as Record<string, unknown>;\n const date = String(rec.date ?? rec.cohort ?? rec.key ?? \"\").slice(0, 10);\n const value = Number(rec.total ?? rec.value ?? rec.sum ?? rec.count ?? 0);\n return [date, value] as [string, number];\n })\n .filter(([date]) => date.length === 10),\n );\n };\n\n const addedMap = toMap(addedRaw);\n const removedMap = toMap(removedRaw);\n const filesMap = toMap(filesRaw);\n const allDates = new Set([...addedMap.keys(), ...removedMap.keys(), ...filesMap.keys()]);\n\n return Array.from(allDates)\n .map((date) => ({\n date,\n linesAdded: addedMap.get(date) ?? 0,\n linesRemoved: removedMap.get(date) ?? 0,\n filesChanged: filesMap.get(date) ?? 0,\n }))\n .filter((e) => e.linesAdded > 0 || e.linesRemoved > 0)\n .sort((a, b) => a.date.localeCompare(b.date));\n } catch {\n return [];\n }\n}\n\nexport async function closeStateStore(): Promise<void> {\n logger.info(\"[Store] Closing state store and plugins\");\n clearApiRuntimeContext();\n\n try {\n const { stopQueueWorkers } = await import(\"./queue-workers.ts\");\n await stopQueueWorkers();\n } catch (error) {\n logger.warn(`Failed to stop queue workers: ${String(error)}`);\n }\n\n if (activeEcPlugin?.stop) {\n try {\n await activeEcPlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop EventualConsistency plugin: ${String(error)}`);\n } finally {\n activeEcPlugin = null;\n }\n }\n if (activeStateMachinePlugin?.stop) {\n try {\n await activeStateMachinePlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop StateMachine plugin: ${String(error)}`);\n } finally {\n activeStateMachinePlugin = null;\n setIssueStateMachinePlugin(null);\n }\n }\n if (activeWebSocketPlugin?.stop) {\n try {\n await activeWebSocketPlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop WebSocket plugin: ${String(error)}`);\n } finally {\n activeWebSocketPlugin = null;\n }\n }\n if (activeApiPlugin?.stop) {\n try {\n await activeApiPlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop API plugin: ${String(error)}`);\n } finally {\n activeApiPlugin = null;\n }\n }\n\n if (!stateDb) return;\n\n try {\n await stateDb.disconnect();\n } catch (error) {\n logger.warn(`Failed to close s3db runtime store: ${String(error)}`);\n } finally {\n stateDb = null;\n runtimeStateResource = null;\n issueStateResource = null;\n issuePlanResource = null;\n eventStateResource = null;\n settingStateResource = null;\n agentSessionResource = null;\n agentPipelineResource = null;\n }\n}\n","import type { RuntimeState } from \"./types.ts\";\n\ntype RuntimeApiContext = {\n state: RuntimeState;\n};\n\nlet context: RuntimeApiContext | null = null;\n\nexport function setApiRuntimeContext(state: RuntimeState): void {\n context = { state };\n}\n\nexport function clearApiRuntimeContext(): void {\n context = null;\n}\n\nexport function getApiRuntimeContextOrThrow(): RuntimeApiContext {\n if (!context) {\n throw new Error(\"API runtime context was not initialized.\");\n }\n return context;\n}\n","import type {\n RuntimeState,\n} from \"./types.ts\";\nimport {\n existsSync,\n readFileSync,\n} from \"node:fs\";\nimport {\n FRONTEND_DIR,\n FRONTEND_ICON_SVG,\n FRONTEND_INDEX,\n FRONTEND_MANIFEST_JSON,\n FRONTEND_MASKABLE_ICON_SVG,\n FRONTEND_OFFLINE_HTML,\n FRONTEND_SERVICE_WORKER_JS,\n} from \"./constants.ts\";\nimport { NATIVE_RESOURCE_CONFIGS } from \"./resources/index.ts\";\nimport { logger } from \"./logger.ts\";\nimport {\n loadS3dbModule,\n getStateDb,\n setActiveApiPlugin,\n} from \"./store.ts\";\nimport { setApiRuntimeContext } from \"./api-runtime-context.ts\";\nimport { makeWebSocketConfig } from \"./api-websocket.ts\";\nexport { broadcastToWebSocketClients } from \"./api-websocket.ts\";\n\nimport { registerStateRoutes } from \"./api-routes/state.js\";\nimport { registerPlanRoutes } from \"./api-routes/plan.js\";\nimport { registerSettingsRoutes } from \"./api-routes/settings.js\";\nimport { registerAnalyticsRoutes } from \"./api-routes/analytics.js\";\nimport { registerScanningRoutes } from \"./api-routes/scanning.js\";\nimport { registerCatalogRoutes } from \"./api-routes/catalog.js\";\nimport { registerReferenceRepositoryRoutes } from \"./api-routes/reference-repositories.js\";\nimport { registerMiscRoutes } from \"./api-routes/misc.js\";\n\n// ── Route collector ──────────────────────────────────────────────────────────\n// Accumulates routes before ApiPlugin construction (ApiPlugin only accepts routes\n// via constructor config, not via .get()/.post() methods after creation).\n\nclass RouteCollector {\n readonly routes: Record<string, (c: any) => any> = {};\n\n get(path: string, handler: (c: any) => any) { this.routes[`GET ${path}`] = handler; }\n post(path: string, handler: (c: any) => any) { this.routes[`POST ${path}`] = handler; }\n put(path: string, handler: (c: any) => any) { this.routes[`PUT ${path}`] = handler; }\n patch(path: string, handler: (c: any) => any) { this.routes[`PATCH ${path}`] = handler; }\n delete(path: string, handler: (c: any) => any) { this.routes[`DELETE ${path}`] = handler; }\n}\n\n// ── API server ───────────────────────────────────────────────────────────────\n\nexport async function startApiServer(\n state: RuntimeState,\n port: number,\n): Promise<void> {\n logger.info({ port }, \"[API] Starting API server\");\n const stateDb = getStateDb();\n if (!stateDb) {\n throw new Error(\"Cannot start API plugin before the database is initialized.\");\n }\n\n const { ApiPlugin } = await loadS3dbModule();\n\n const resourceConfigs: Record<string, Record<string, unknown>> = Object.fromEntries(\n NATIVE_RESOURCE_CONFIGS.map((resourceConfig) => [\n resourceConfig.name,\n {\n ...(resourceConfig.api ?? {}),\n versionPrefix: \"api\",\n },\n ]),\n );\n const nativeResourceNames = new Set(Object.keys(resourceConfigs));\n\n const existingResources = await (stateDb as { listResources?: () => Promise<Array<{ name: string }>> }).listResources?.();\n for (const item of existingResources || []) {\n if (\n typeof item?.name === \"string\" &&\n item.name.startsWith(\"fifony_\") &&\n !nativeResourceNames.has(item.name)\n ) {\n resourceConfigs[item.name] = { enabled: false };\n }\n }\n\n setApiRuntimeContext(state);\n\n const serveTextFile = (filePath: string, contentType: string, cacheControl = \"no-cache\") => {\n if (!existsSync(filePath)) {\n return new Response(\"Not found\", { status: 404 });\n }\n return new Response(readFileSync(filePath), {\n headers: {\n \"content-type\": contentType,\n \"cache-control\": cacheControl,\n },\n });\n };\n\n const serveAppShell = () => {\n if (!existsSync(FRONTEND_INDEX)) {\n return new Response(\"Not found\", { status: 404 });\n }\n const html = readFileSync(FRONTEND_INDEX, \"utf8\")\n .replace('href=\"/assets/manifest.webmanifest\"', 'href=\"/manifest.webmanifest\"')\n .replaceAll('href=\"/assets/icon.svg\"', 'href=\"/icon.svg\"');\n return new Response(html, {\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n },\n });\n };\n\n // Collect routes from route modules before plugin instantiation\n const collector = new RouteCollector();\n registerStateRoutes(collector, state);\n registerPlanRoutes(collector, state);\n registerSettingsRoutes(collector, state);\n registerAnalyticsRoutes(collector);\n registerScanningRoutes(collector, state);\n registerCatalogRoutes(collector);\n registerReferenceRepositoryRoutes(collector);\n registerMiscRoutes(collector, state);\n\n const apiPlugin = new ApiPlugin({\n port,\n host: \"0.0.0.0\",\n versionPrefix: false,\n // HTTP + WebSocket on the same port via listeners\n listeners: [{\n bind: { host: \"0.0.0.0\", port },\n protocols: {\n http: true,\n websocket: makeWebSocketConfig(state),\n },\n }],\n rootRoute: () => new Response(null, {\n status: 302,\n headers: { location: \"/kanban\" },\n }),\n static: [{\n driver: \"filesystem\",\n path: \"/assets\",\n root: FRONTEND_DIR,\n pwa: false,\n config: { etag: true },\n }],\n docs: { enabled: true, title: \"Fifony API\", version: \"1.0.0\", description: \"Local orchestration API for Fifony\" },\n cors: { enabled: true, origin: \"*\" },\n security: { enabled: false },\n logging: { enabled: true, excludePaths: [\"/health\", \"/status\", \"/**/*.js\", \"/**/*.css\", \"/**/*.svg\"] },\n compression: { enabled: true, threshold: 1024 },\n health: { enabled: true },\n resources: {\n ...resourceConfigs,\n },\n routes: {\n ...collector.routes,\n \"GET /manifest.webmanifest\": () =>\n serveTextFile(FRONTEND_MANIFEST_JSON, \"application/manifest+json; charset=utf-8\"),\n \"GET /service-worker.js\": () =>\n serveTextFile(FRONTEND_SERVICE_WORKER_JS, \"application/javascript; charset=utf-8\", \"no-cache\"),\n \"GET /offline.html\": () =>\n serveTextFile(FRONTEND_OFFLINE_HTML, \"text/html; charset=utf-8\"),\n \"GET /icon.svg\": () =>\n serveTextFile(FRONTEND_ICON_SVG, \"image/svg+xml\", \"public, max-age=604800, immutable\"),\n \"GET /icon-maskable.svg\": () =>\n serveTextFile(FRONTEND_MASKABLE_ICON_SVG, \"image/svg+xml\", \"public, max-age=604800, immutable\"),\n \"GET /onboarding\": () => serveAppShell(),\n \"GET /kanban\": () => serveAppShell(),\n \"GET /issues\": () => serveAppShell(),\n \"GET /discover\": () => serveAppShell(),\n \"GET /agents\": () => serveAppShell(),\n \"GET /settings\": () => serveAppShell(),\n \"GET /settings/general\": () => serveAppShell(),\n \"GET /settings/notifications\": () => serveAppShell(),\n \"GET /settings/workflow\": () => serveAppShell(),\n \"GET /settings/providers\": () => serveAppShell(),\n \"GET /api/health\": (c: any) =>\n c.json({ status: state.booting ? \"booting\" : \"ready\" }),\n },\n });\n\n const plugin = await stateDb.usePlugin(apiPlugin, \"api\") as { stop?: () => Promise<void> };\n setActiveApiPlugin(plugin);\n logger.info(`Local dashboard available at http://localhost:${port}`);\n logger.info(`WebSocket available at ws://localhost:${port}/ws`);\n logger.info(`State API: http://localhost:${port}/api/state`);\n logger.info(`OpenAPI docs available at http://localhost:${port}/docs`);\n}\n","import { S3DB_RUNTIME_RESOURCE } from \"../constants.ts\";\n\nexport default {\n name: S3DB_RUNTIME_RESOURCE,\n attributes: {\n id: \"string|required\",\n schemaVersion: \"number|required\",\n trackerKind: \"string|required\",\n runtimeTag: \"string|optional\",\n updatedAt: \"datetime|required\",\n state: \"json|required\",\n },\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Runtime state snapshots\",\n },\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AgentDirective,\n AgentDirectiveStatus,\n AgentProviderRole,\n AgentTokenUsage,\n IssueEntry,\n JsonRecord,\n} from \"./types.ts\";\nimport { toStringValue } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\n\nexport function normalizeAgentDirectiveStatus(value: unknown, fallback: AgentDirectiveStatus): AgentDirectiveStatus {\n const normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n if (normalized === \"done\" || normalized === \"continue\" || normalized === \"blocked\" || normalized === \"failed\") {\n return normalized;\n }\n return fallback;\n}\n\nexport function addTokenUsage(issue: IssueEntry, usage?: AgentTokenUsage, role?: AgentProviderRole): void {\n if (!usage || usage.totalTokens === 0) return;\n\n // 1. Aggregate overall tokenUsage summary\n const prev = issue.tokenUsage ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokenUsage = {\n inputTokens: prev.inputTokens + usage.inputTokens,\n outputTokens: prev.outputTokens + usage.outputTokens,\n totalTokens: prev.totalTokens + usage.totalTokens,\n model: usage.model || prev.model,\n };\n\n // 2. Per-phase breakdown (planner / executor / reviewer)\n if (role) {\n if (!issue.tokensByPhase) issue.tokensByPhase = {} as Record<AgentProviderRole, AgentTokenUsage>;\n const prevPhase = issue.tokensByPhase[role] ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByPhase[role] = {\n inputTokens: prevPhase.inputTokens + usage.inputTokens,\n outputTokens: prevPhase.outputTokens + usage.outputTokens,\n totalTokens: prevPhase.totalTokens + usage.totalTokens,\n model: usage.model || prevPhase.model,\n };\n }\n\n // 3. Per-model breakdown with full input/output detail\n const model = usage.model || issue.tokenUsage?.model || \"unknown\";\n if (!issue.tokensByModel) issue.tokensByModel = {};\n const prevModel = issue.tokensByModel[model] ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByModel[model] = {\n inputTokens: prevModel.inputTokens + usage.inputTokens,\n outputTokens: prevModel.outputTokens + usage.outputTokens,\n totalTokens: prevModel.totalTokens + usage.totalTokens,\n model,\n };\n\n // 4. Legacy per-model totals for EventualConsistency analytics\n if (!issue.usage) issue.usage = { tokens: {} };\n issue.usage.tokens[model] = (issue.usage.tokens[model] || 0) + usage.totalTokens;\n}\n\nexport function extractOutputMarker(output: string, name: string): string {\n const match = output.match(new RegExp(`^${name}=(.+)$`, \"im\"));\n return match?.[1]?.trim() ?? \"\";\n}\n\nexport function extractTokenUsage(output: string, jsonObj?: JsonRecord | null): AgentTokenUsage | undefined {\n if (jsonObj) {\n // 1a. Claude --output-format json: modelUsage field (richer — includes cache tokens, per-model breakdown)\n const modelUsage = jsonObj.modelUsage as Record<string, Record<string, unknown>> | undefined;\n if (modelUsage && typeof modelUsage === \"object\") {\n let totalInput = 0, totalOutput = 0, primaryModel = \"\", maxTokens = 0;\n for (const [model, data] of Object.entries(modelUsage)) {\n const inp = Number(data?.inputTokens || 0) + Number(data?.cacheReadInputTokens || 0) + Number(data?.cacheCreationInputTokens || 0);\n const out = Number(data?.outputTokens || 0);\n totalInput += inp;\n totalOutput += out;\n if (inp + out > maxTokens) { maxTokens = inp + out; primaryModel = model; }\n }\n if (totalInput > 0 || totalOutput > 0) {\n return {\n inputTokens: totalInput,\n outputTokens: totalOutput,\n totalTokens: totalInput + totalOutput,\n costUsd: typeof jsonObj.cost_usd === \"number\" ? jsonObj.cost_usd : undefined,\n model: primaryModel || (typeof jsonObj.model === \"string\" ? jsonObj.model : undefined),\n };\n }\n }\n\n // 1b. Claude --output-format json: usage field (aggregate totals)\n const usage = jsonObj.usage as Record<string, unknown> | undefined;\n if (usage && typeof usage === \"object\") {\n const inp = Number(usage.input_tokens) || 0;\n const out = Number(usage.output_tokens) || 0;\n if (inp > 0 || out > 0) {\n return {\n inputTokens: inp,\n outputTokens: out,\n totalTokens: inp + out,\n costUsd: typeof jsonObj.cost_usd === \"number\" ? jsonObj.cost_usd : undefined,\n model: typeof jsonObj.model === \"string\" ? jsonObj.model : undefined,\n };\n }\n }\n }\n\n // 2. Codex: \"tokens used\\n1,681\\n\" and \"model: gpt-5.3\" in stdout\n const codexMatch = output.match(/tokens?\\s+used\\s*\\n\\s*([\\d,]+)/i);\n if (codexMatch) {\n const total = parseInt(codexMatch[1].replace(/,/g, \"\"), 10);\n if (total > 0) {\n const modelMatch = output.match(/^model:\\s*(.+)$/im);\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: total,\n model: modelMatch?.[1]?.trim() || undefined,\n };\n }\n }\n\n return undefined;\n}\n\nexport function tryParseJsonOutput(output: string): JsonRecord | null {\n const trimmed = output.trim();\n // --output-format json wraps the result in a JSON object with a \"result\" field\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const obj = parsed as JsonRecord;\n\n // --json-schema puts structured output in .structured_output (not .result)\n if (obj.structured_output && typeof obj.structured_output === \"object\" && !Array.isArray(obj.structured_output)) {\n return obj.structured_output as JsonRecord;\n }\n\n // Claude --output-format json returns { result: \"...\" } — the result may itself be JSON\n if (typeof obj.result === \"string\") {\n try {\n const inner = JSON.parse(obj.result) as unknown;\n if (inner && typeof inner === \"object\" && !Array.isArray(inner)) {\n return inner as JsonRecord;\n }\n } catch {\n // result is plain text, not JSON\n }\n }\n // Direct JSON with status field (from --json-schema)\n if (obj.status) return obj;\n }\n } catch {\n // Not JSON output — fall through to legacy parsing\n }\n return null;\n}\n\nexport function readAgentDirective(workspacePath: string, output: string, success: boolean): AgentDirective {\n const fallbackStatus: AgentDirectiveStatus = success ? \"done\" : \"failed\";\n const resultFile = join(workspacePath, \"result.json\");\n let resultPayload: JsonRecord = {};\n\n // 1. Try structured JSON from stdout (claude --output-format json --json-schema)\n const fullJson = (() => {\n try { return JSON.parse(output.trim()) as JsonRecord; } catch { return null; }\n })();\n const jsonOutput = tryParseJsonOutput(output);\n const tokenUsage = extractTokenUsage(output, fullJson);\n\n if (jsonOutput?.status) {\n return {\n status: normalizeAgentDirectiveStatus(jsonOutput.status, fallbackStatus),\n summary: toStringValue(jsonOutput.summary) || toStringValue(jsonOutput.message) || \"\",\n nextPrompt: toStringValue(jsonOutput.nextPrompt) || toStringValue(jsonOutput.next_prompt) || \"\",\n tokenUsage,\n };\n }\n\n // 2. Try result.json file\n if (existsSync(resultFile)) {\n try {\n const parsed = JSON.parse(readFileSync(resultFile, \"utf8\")) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n resultPayload = parsed as JsonRecord;\n }\n } catch (error) {\n logger.warn(`Invalid result.json in ${workspacePath}: ${String(error)}`);\n }\n }\n\n // 3. Fall back to file + output marker parsing\n const status = normalizeAgentDirectiveStatus(\n resultPayload.status ?? extractOutputMarker(output, \"FIFONY_STATUS\"),\n fallbackStatus,\n );\n const summary =\n toStringValue(resultPayload.summary)\n || toStringValue(resultPayload.message)\n || extractOutputMarker(output, \"FIFONY_SUMMARY\");\n const nextPrompt =\n toStringValue(resultPayload.nextPrompt)\n || toStringValue(resultPayload.next_prompt)\n || \"\";\n\n return { status, summary, nextPrompt, tokenUsage };\n}\n","import { existsSync, readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IssueEntry } from \"./types.ts\";\n\nexport type AgentPidInfo = {\n pid: number;\n issueId: string;\n startedAt: string;\n command: string;\n};\n\n/** Read PID file from workspace, returns null if missing/invalid. */\nexport function readAgentPid(workspacePath: string): AgentPidInfo | null {\n const pidFile = join(workspacePath, \"agent.pid\");\n if (!existsSync(pidFile)) return null;\n try {\n const data = JSON.parse(readFileSync(pidFile, \"utf8\")) as AgentPidInfo;\n if (!data?.pid || typeof data.pid !== \"number\") return null;\n return data;\n } catch {\n return null;\n }\n}\n\n/** Check if a process is still running by PID. */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0); // signal 0 = check existence\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check if an issue's agent is still running from a previous session. */\nexport function isAgentStillRunning(issue: IssueEntry): { alive: boolean; pid: AgentPidInfo | null } {\n const wp = issue.workspacePath;\n if (!wp || !existsSync(wp)) return { alive: false, pid: null };\n const pidInfo = readAgentPid(wp);\n if (!pidInfo) return { alive: false, pid: null };\n return { alive: isProcessAlive(pidInfo.pid), pid: pidInfo };\n}\n\n/** Clean stale PID file if the process is dead. */\nexport function cleanStalePidFile(workspacePath: string): void {\n const pidInfo = readAgentPid(workspacePath);\n if (!pidInfo) return;\n if (!isProcessAlive(pidInfo.pid)) {\n try { rmSync(join(workspacePath, \"agent.pid\"), { force: true }); } catch {}\n }\n}\n","import {\n existsSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type { IssueEntry } from \"./types.ts\";\nimport { TARGET_ROOT } from \"./constants.ts\";\nimport { logger } from \"./logger.ts\";\nimport { inferChangedWorkspacePaths } from \"./workspace-diff.ts\";\nimport { inferCapabilityPaths } from \"../routing/capability-resolver.ts\";\n\nexport interface MergeResult {\n copied: string[];\n deleted: string[];\n skipped: string[];\n conflicts: string[];\n}\n\nfunction ensureWorktreeCommitted(issue: IssueEntry): void {\n const worktreePath = issue.worktreePath;\n if (!worktreePath || !issue.branchName) return;\n\n execSync(\"git add -A\", { cwd: worktreePath, stdio: \"pipe\" });\n const statusBeforeCommit = execSync(\"git status --porcelain\", { cwd: worktreePath, encoding: \"utf8\" }).trim();\n if (!statusBeforeCommit) return;\n\n try {\n execSync(`git commit -m \"fifony: agent changes for ${issue.identifier}\"`, { cwd: worktreePath, stdio: \"pipe\" });\n } catch (error) {\n const remaining = execSync(\"git status --porcelain\", { cwd: worktreePath, encoding: \"utf8\" }).trim();\n if (remaining) {\n throw new Error(`Failed to commit agent changes for ${issue.identifier}: ${String(error)}`);\n }\n }\n\n const statusAfterCommit = execSync(\"git status --porcelain\", { cwd: worktreePath, encoding: \"utf8\" }).trim();\n if (statusAfterCommit) {\n throw new Error(`Worktree for ${issue.identifier} still has uncommitted changes after commit.`);\n }\n}\n\nexport { ensureWorktreeCommitted };\n\n/** Merge a worktree branch into TARGET_ROOT using git merge --no-ff. */\nfunction mergeWorktree(issue: IssueEntry, worktreePath: string): MergeResult {\n const result: MergeResult = { copied: [], deleted: [], skipped: [], conflicts: [] };\n ensureWorktreeCommitted(issue);\n\n const currentBranch = execSync(\"git rev-parse --abbrev-ref HEAD\", { cwd: TARGET_ROOT, encoding: \"utf8\" }).trim();\n if (currentBranch !== issue.baseBranch) {\n throw new Error(`Cannot merge ${issue.identifier}: current branch is ${currentBranch}, expected ${issue.baseBranch}.`);\n }\n\n const targetStatus = execSync(\"git status --porcelain\", { cwd: TARGET_ROOT, encoding: \"utf8\" }).trim();\n if (targetStatus) {\n throw new Error(`Cannot merge ${issue.identifier}: target repository has uncommitted changes.`);\n }\n\n // Collect changed files before merging (for the result summary)\n try {\n const diffOut = execSync(\n `git diff --name-status \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { cwd: TARGET_ROOT, encoding: \"utf8\" },\n );\n for (const line of diffOut.trim().split(\"\\n\").filter(Boolean)) {\n const [statusChar, ...parts] = line.split(\"\\t\");\n const filePath = parts.join(\"\\t\");\n if (statusChar === \"D\") result.deleted.push(filePath);\n else result.copied.push(filePath);\n }\n } catch { /* best-effort */ }\n\n try {\n execSync(\n `git merge --no-ff \"${issue.branchName}\" -m \"fifony: merge ${issue.identifier}\"`,\n { cwd: TARGET_ROOT, stdio: \"pipe\" },\n );\n } catch (err: any) {\n // Merge failed — collect conflict files and abort\n try {\n const conflictOut = execSync(\n \"git diff --name-only --diff-filter=U\",\n { cwd: TARGET_ROOT, encoding: \"utf8\" },\n );\n result.conflicts.push(...conflictOut.trim().split(\"\\n\").filter(Boolean));\n } catch {}\n try { execSync(\"git merge --abort\", { cwd: TARGET_ROOT, stdio: \"pipe\" }); } catch {}\n logger.warn({ issueId: issue.id, err: String(err) }, \"[Agent] Git merge failed, aborted\");\n }\n\n return result;\n}\n\nexport function shouldSkipMergePath(relativePath: string): boolean {\n const parts = relativePath.split(\"/\");\n if (parts.some((s) => s === \".git\" || s === \"node_modules\" || s === \".fifony\" || s === \"dist\" || s === \".tanstack\")) {\n return true;\n }\n const base = parts.at(-1) ?? \"\";\n return base === \"WORKFLOW.local.md\"\n || base === \".fifony-env.sh\"\n || base === \".fifony-compiled-env.sh\"\n || base === \".fifony-local-source-ready\"\n || base.startsWith(\"fifony-\")\n || base.startsWith(\"fifony_\");\n}\n\n/** Push the issue worktree branch to origin and attempt to create a PR via gh CLI. */\nexport function pushWorktreeBranch(issue: IssueEntry): string {\n if (!issue.branchName || !issue.baseBranch || !issue.worktreePath) {\n throw new Error(`Issue ${issue.identifier} has no git worktree — cannot push.`);\n }\n\n ensureWorktreeCommitted(issue);\n execSync(`git push -u origin \"${issue.branchName}\"`, { cwd: TARGET_ROOT, stdio: \"pipe\" });\n\n // Try to create PR via gh CLI if available\n try {\n const prUrl = execSync(\n `gh pr create --head \"${issue.branchName}\" --base \"${issue.baseBranch}\" --title \"${issue.title.replace(/\"/g, '\\\\\"')}\" --body \"Automated by fifony\"`,\n { cwd: TARGET_ROOT, encoding: \"utf8\" },\n ).trim();\n return prUrl;\n } catch {\n // gh not available or PR already exists — return a best-effort compare URL\n try {\n const remote = execSync(\"git remote get-url origin\", { cwd: TARGET_ROOT, encoding: \"utf8\" }).trim();\n const cleanRemote = remote.replace(/\\.git$/, \"\");\n return `${cleanRemote}/compare/${issue.baseBranch}...${issue.branchName}`;\n } catch {\n return `(branch: ${issue.branchName})`;\n }\n }\n}\n\n/** Merge a worktree branch into TARGET_ROOT. */\nexport function mergeWorkspace(issue: IssueEntry): MergeResult {\n if (!issue.branchName || !issue.baseBranch || !issue.worktreePath) {\n throw new Error(`Issue ${issue.identifier} has no git worktree — cannot merge.`);\n }\n return mergeWorktree(issue, issue.worktreePath);\n}\n\nexport function hydrateIssuePathsFromWorkspace(issue: IssueEntry): string[] {\n const inferredPaths = inferChangedWorkspacePaths(issue.workspacePath ?? \"\", 32, issue);\n if (inferredPaths.length === 0) return [];\n issue.paths = [...new Set([...(issue.paths ?? []), ...inferredPaths])];\n issue.inferredPaths = [...new Set([...(issue.inferredPaths ?? []), ...inferredPaths])];\n return inferredPaths;\n}\n\nexport function describeRoutingSignals(issue: IssueEntry, workspaceDerivedPaths: string[]): string {\n const explicitPaths = issue.paths ?? [];\n const textDerivedPaths = inferCapabilityPaths({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n }).filter((path) => !explicitPaths.includes(path));\n\n const parts: string[] = [];\n if (explicitPaths.length > 0) parts.push(`payload paths=${explicitPaths.join(\", \")}`);\n if (textDerivedPaths.length > 0) parts.push(`text hints=${textDerivedPaths.join(\", \")}`);\n if (workspaceDerivedPaths.length > 0) parts.push(`workspace diff=${workspaceDerivedPaths.join(\", \")}`);\n return parts.join(\" | \");\n}\n\n/** Write versioned review artifacts to workspace (also used for execute artifacts). */\nexport function writeVersionedArtifacts(\n workspacePath: string,\n prefix: string,\n planVersion: number,\n attempt: number,\n sources: Array<{ srcFile: string; destSuffix: string }>,\n): void {\n const { writeFileSync: _wfs, readFileSync: _rfs, existsSync: _es } = { writeFileSync, readFileSync, existsSync };\n for (const { srcFile, destSuffix } of sources) {\n const src = join(workspacePath, srcFile);\n if (_es(src)) {\n _wfs(join(workspacePath, `${prefix}.v${planVersion}a${attempt}.${destSuffix}`), _rfs(src, \"utf8\"), \"utf8\");\n }\n }\n}\n","import type {\n AgentPipelineRecord,\n AgentPipelineState,\n AgentProviderDefinition,\n AgentSessionRecord,\n AgentSessionState,\n AgentSessionTurn,\n IssueEntry,\n} from \"./types.ts\";\nimport {\n now,\n clamp,\n idToSafePath,\n toNumberValue,\n} from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport {\n getAgentSessionResource,\n getAgentPipelineResource,\n isStateNotFoundError,\n} from \"./store.ts\";\n\nexport function buildAgentSessionState(\n issue: IssueEntry,\n attempt: number,\n maxTurns: number,\n): AgentSessionState {\n const createdAt = now();\n return {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n status: \"running\",\n startedAt: createdAt,\n updatedAt: createdAt,\n maxTurns,\n turns: [],\n lastPrompt: \"\",\n lastPromptFile: \"\",\n lastOutput: \"\",\n lastCode: null,\n lastDirectiveStatus: \"continue\",\n lastDirectiveSummary: \"\",\n nextPrompt: \"\",\n };\n}\n\nexport async function loadAgentSessionState(\n sessionKey: string,\n issue: IssueEntry,\n attempt: number,\n maxTurns: number,\n): Promise<{ session: AgentSessionState; key: string }> {\n const agentSessionResource = getAgentSessionResource();\n if (agentSessionResource) {\n try {\n const record = await agentSessionResource.get(sessionKey) as AgentSessionRecord;\n if (\n record?.session\n && record.issueId === issue.id\n && record.attempt === attempt\n && Array.isArray(record.session.turns)\n ) {\n return {\n session: {\n ...buildAgentSessionState(issue, attempt, maxTurns),\n ...record.session,\n maxTurns,\n turns: record.session.turns as AgentSessionTurn[],\n updatedAt: now(),\n },\n key: sessionKey,\n };\n }\n } catch (error) {\n if (!isStateNotFoundError(error)) {\n logger.warn(`Failed to load session state for ${issue.id}: ${String(error)}`);\n }\n }\n }\n\n return { session: buildAgentSessionState(issue, attempt, maxTurns), key: sessionKey };\n}\n\nexport async function persistAgentSessionState(\n key: string,\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n cycle: number,\n session: AgentSessionState,\n): Promise<void> {\n session.updatedAt = now();\n const agentSessionResource = getAgentSessionResource();\n if (!agentSessionResource) return;\n\n await agentSessionResource.replace(key, {\n id: key,\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt: session.attempt,\n cycle,\n provider: provider.provider,\n role: provider.role,\n updatedAt: session.updatedAt,\n session,\n } satisfies AgentSessionRecord);\n}\n\nexport function buildProviderSessionKey(issue: IssueEntry, attempt: number, provider: AgentProviderDefinition, cycle: number): string {\n return `${idToSafePath(issue.id)}-a${attempt}-${provider.role}-${provider.provider}-c${cycle}`;\n}\n\nexport function buildPipelineKey(issue: IssueEntry, attempt: number): string {\n return `${idToSafePath(issue.id)}-a${attempt}`;\n}\n\nexport function getLatestPipelineAttempt(issue: IssueEntry): number {\n if (issue.state === \"Blocked\" || issue.state === \"Cancelled\") {\n return Math.max(1, issue.attempts);\n }\n return Math.max(1, issue.attempts + 1);\n}\n\nexport function stateConfigMaxTurnsFallback(): number {\n return 4;\n}\n\nexport async function loadAgentPipelineState(\n issue: IssueEntry,\n attempt: number,\n providers: AgentProviderDefinition[],\n): Promise<{ pipeline: AgentPipelineState; key: string }> {\n const pipelineKey = buildPipelineKey(issue, attempt);\n const agentPipelineResource = getAgentPipelineResource();\n\n if (agentPipelineResource) {\n try {\n const record = await agentPipelineResource.get(pipelineKey) as AgentPipelineRecord;\n if (record?.pipeline && record.issueId === issue.id && record.attempt === attempt) {\n return {\n pipeline: {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n cycle: Math.max(1, toNumberValue(record.pipeline.cycle, 1)),\n activeIndex: clamp(toNumberValue(record.pipeline.activeIndex, 0), 0, Math.max(0, providers.length - 1)),\n updatedAt: now(),\n history: Array.isArray(record.pipeline.history)\n ? record.pipeline.history.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n },\n key: pipelineKey,\n };\n }\n } catch (error) {\n if (!isStateNotFoundError(error)) {\n logger.warn(`Failed to load pipeline state for ${issue.id}: ${String(error)}`);\n }\n }\n }\n\n return {\n pipeline: {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n cycle: 1,\n activeIndex: 0,\n updatedAt: now(),\n history: [],\n },\n key: pipelineKey,\n };\n}\n\nexport async function persistAgentPipelineState(key: string, pipeline: AgentPipelineState): Promise<void> {\n pipeline.updatedAt = now();\n const agentPipelineResource = getAgentPipelineResource();\n if (!agentPipelineResource) return;\n\n await agentPipelineResource.replace(key, {\n id: key,\n issueId: pipeline.issueId,\n issueIdentifier: pipeline.issueIdentifier,\n attempt: pipeline.attempt,\n updatedAt: pipeline.updatedAt,\n pipeline,\n } satisfies AgentPipelineRecord);\n}\n\nexport async function loadAgentPipelineSnapshotForIssue(\n issue: IssueEntry,\n providers: AgentProviderDefinition[],\n): Promise<AgentPipelineState | null> {\n const attempt = getLatestPipelineAttempt(issue);\n const agentPipelineResource = getAgentPipelineResource();\n\n if (agentPipelineResource?.list) {\n try {\n const records = await agentPipelineResource.list({\n partition: \"byIssueAttempt\",\n partitionValues: { issueId: issue.id, attempt },\n limit: 10,\n });\n const record = records\n .map((entry) => entry as AgentPipelineRecord)\n .find((entry) => entry.issueId === issue.id && entry.attempt === attempt && entry.pipeline);\n if (record?.pipeline) {\n return {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n cycle: Math.max(1, toNumberValue(record.pipeline.cycle, 1)),\n activeIndex: clamp(toNumberValue(record.pipeline.activeIndex, 0), 0, Math.max(0, providers.length - 1)),\n updatedAt: now(),\n history: Array.isArray(record.pipeline.history)\n ? record.pipeline.history.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n };\n }\n } catch (error) {\n logger.warn(`Failed to load partitioned pipeline snapshot for ${issue.id}: ${String(error)}`);\n }\n }\n\n const loaded = await loadAgentPipelineState(issue, attempt, providers);\n return loaded.pipeline.history.length > 0 ? loaded.pipeline : null;\n}\n\nexport async function loadAgentSessionSnapshotsForIssue(\n issue: IssueEntry,\n providers: AgentProviderDefinition[],\n pipeline: AgentPipelineState | null,\n _workflowDefinition: null,\n): Promise<Array<{ key: string; session: AgentSessionState; provider: string; role: string; cycle: number }>> {\n if (!pipeline) return [];\n\n const sessions: Array<{ key: string; session: AgentSessionState; provider: string; role: string; cycle: number }> = [];\n const attempt = pipeline.attempt;\n const agentSessionResource = getAgentSessionResource();\n const maxTurns = stateConfigMaxTurnsFallback();\n\n if (agentSessionResource?.list) {\n try {\n const records = await agentSessionResource.list({\n partition: \"byIssueAttempt\",\n partitionValues: { issueId: issue.id, attempt },\n limit: Math.max(12, providers.length * Math.max(1, pipeline.cycle) * 2),\n });\n const loadedSessions = records\n .map((entry) => entry as AgentSessionRecord)\n .filter((entry) => entry.issueId === issue.id && entry.attempt === attempt && entry.session && Array.isArray(entry.session.turns));\n\n for (const record of loadedSessions) {\n if (!record.session.turns.length) continue;\n sessions.push({\n key: record.id,\n session: {\n ...buildAgentSessionState(issue, attempt, maxTurns),\n ...record.session,\n maxTurns,\n turns: record.session.turns as AgentSessionTurn[],\n updatedAt: now(),\n },\n provider: record.provider,\n role: record.role,\n cycle: record.cycle,\n });\n }\n\n sessions.sort((a, b) => a.cycle !== b.cycle ? a.cycle - b.cycle : a.key.localeCompare(b.key));\n if (sessions.length > 0) return sessions;\n } catch (error) {\n logger.warn(`Failed to load partitioned session snapshots for ${issue.id}: ${String(error)}`);\n }\n }\n\n for (let cycle = 1; cycle <= pipeline.cycle; cycle += 1) {\n for (const provider of providers) {\n const key = buildProviderSessionKey(issue, attempt, provider, cycle);\n const loaded = await loadAgentSessionState(key, issue, attempt, maxTurns);\n if (loaded.session.turns.length === 0) continue;\n sessions.push({\n key,\n session: loaded.session,\n provider: provider.provider,\n role: provider.role,\n cycle,\n });\n }\n }\n\n return sessions;\n}\n","import type {\n AgentProviderDefinition,\n IssueEntry,\n} from \"./types.ts\";\nimport { renderPrompt } from \"../prompting.ts\";\n\nexport async function buildPrompt(issue: IssueEntry, _workflowDefinition: null): Promise<string> {\n const rendered = await renderPrompt(\"workflow-default\", { issue, attempt: issue.attempts || 0 });\n\n if (!issue.plan?.steps?.length) {\n return rendered;\n }\n\n const planSection = await renderPrompt(\"workflow-plan-section\", {\n estimatedComplexity: issue.plan.estimatedComplexity,\n summary: issue.plan.summary,\n steps: issue.plan.steps.map((step) => ({\n step: step.step,\n action: step.action,\n files: step.files ?? [],\n details: step.details ?? \"\",\n })),\n });\n\n return `${rendered}\\n\\n${planSection}`;\n}\n\nexport async function buildTurnPrompt(\n issue: IssueEntry,\n basePrompt: string,\n previousOutput: string,\n turnIndex: number,\n maxTurns: number,\n nextPrompt: string,\n): Promise<string> {\n if (turnIndex === 1) return basePrompt;\n\n return renderPrompt(\"agent-turn\", {\n issueIdentifier: issue.identifier,\n turnIndex,\n maxTurns,\n basePrompt,\n continuation: nextPrompt.trim() || \"Continue the work, inspect the workspace, and move the issue toward completion.\",\n outputTail: previousOutput.trim() || \"No previous output captured.\",\n });\n}\n\nexport async function buildProviderBasePrompt(\n provider: AgentProviderDefinition,\n issue: IssueEntry,\n basePrompt: string,\n workspacePath: string,\n skillContext: string,\n): Promise<string> {\n return renderPrompt(\"agent-provider-base\", {\n isPlanner: provider.role === \"planner\",\n isReviewer: provider.role === \"reviewer\",\n hasImpeccableOverlay: provider.overlays?.includes(\"impeccable\") ?? false,\n hasFrontendDesignOverlay: provider.overlays?.includes(\"frontend-design\") ?? false,\n profileInstructions: provider.profileInstructions || \"\",\n skillContext,\n capabilityCategory: provider.capabilityCategory || \"\",\n selectionReason: provider.selectionReason ?? \"No additional routing reason.\",\n overlays: provider.overlays ?? [],\n targetPaths: issue.paths ?? [],\n workspacePath,\n basePrompt,\n });\n}\n","import {\n appendFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { env } from \"node:process\";\nimport { spawn } from \"node:child_process\";\nimport type { IssueEntry, RuntimeConfig } from \"./types.ts\";\nimport { appendFileTail } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { normalizeAgentProvider } from \"./providers.ts\";\n\nexport async function runCommandWithTimeout(\n command: string,\n workspacePath: string,\n issue: IssueEntry,\n config: RuntimeConfig,\n promptText: string,\n promptFile: string,\n extraEnv: Record<string, string> = {},\n): Promise<{ success: boolean; code: number | null; output: string }> {\n return new Promise((resolve) => {\n const started = Date.now();\n const resultFile = extraEnv.FIFONY_RESULT_FILE;\n if (resultFile && extraEnv.FIFONY_PRESERVE_RESULT_FILE !== \"1\") {\n rmSync(resultFile, { force: true });\n }\n\n // Write all FIFONY_* vars to an env file and source it in the command.\n // This avoids E2BIG: child inherits process.env naturally (no ...env spread),\n // and our custom vars are loaded from a file instead of argv/env.\n const allVars: Record<string, string> = {\n FIFONY_ISSUE_ID: issue.id,\n FIFONY_ISSUE_IDENTIFIER: issue.identifier,\n FIFONY_ISSUE_TITLE: issue.title,\n FIFONY_ISSUE_PRIORITY: String(issue.priority),\n FIFONY_WORKSPACE_PATH: issue.worktreePath ?? workspacePath,\n FIFONY_PROMPT_FILE: promptFile,\n };\n for (const [key, value] of Object.entries(extraEnv)) {\n if (value.length > 4000) {\n const valFile = join(workspacePath, `${key.toLowerCase()}.txt`);\n writeFileSync(valFile, value, \"utf8\");\n allVars[`${key}_FILE`] = valFile;\n } else {\n allVars[key] = value;\n }\n }\n\n const envFilePath = join(workspacePath, \".env.sh\");\n const envFileLines = Object.entries(allVars)\n .map(([k, v]) => `export ${k}=${JSON.stringify(v)}`)\n .join(\"\\n\");\n writeFileSync(envFilePath, envFileLines, \"utf8\");\n\n const wrappedCommand = `. \"${envFilePath}\" && ${command}`;\n const child = spawn(wrappedCommand, {\n shell: true,\n cwd: issue.worktreePath ?? workspacePath,\n detached: true, // Survive parent death\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n // Detach from parent so child survives SIGINT/restart\n child.unref();\n\n if (child.stdin) {\n child.stdin.end();\n }\n\n // Write PID file for recovery\n const pidFile = join(workspacePath, \"agent.pid\");\n const pid = child.pid;\n if (pid) {\n logger.debug({ issueId: issue.id, pid, command: command.slice(0, 120), cwd: workspacePath }, \"[Agent] Process spawned\");\n writeFileSync(pidFile, JSON.stringify({\n pid,\n issueId: issue.id,\n startedAt: new Date(started).toISOString(),\n command: command.slice(0, 200),\n }), \"utf8\");\n }\n\n let output = \"\";\n let timedOut = false;\n let outputBytes = 0;\n let outputHeader = \"\"; // First 2KB — always contains provider header (model name, etc.)\n const liveLogFile = join(workspacePath, \"live-output.log\");\n writeFileSync(liveLogFile, \"\", \"utf8\");\n\n const onChunk = (chunk: Buffer | string) => {\n const text = String(chunk);\n if (outputHeader.length < 2000) outputHeader = (outputHeader + text).slice(0, 2000);\n output = appendFileTail(output, text, config.logLinesTail);\n outputBytes += text.length;\n try { appendFileSync(liveLogFile, text); } catch {}\n issue.commandOutputTail = output;\n };\n\n child.stdout?.on(\"data\", onChunk);\n child.stderr?.on(\"data\", onChunk);\n\n const AGENT_STALE_OUTPUT_MS = 300_000; // 5 minutes without output growth → stuck\n\n const timer = setTimeout(() => {\n timedOut = true;\n // Kill the whole process group (detached child + its children)\n if (pid) { try { process.kill(-pid, \"SIGTERM\"); } catch {} }\n else { child.kill(\"SIGTERM\"); }\n }, config.commandTimeoutMs);\n\n // Progress watchdog: check PID alive + output growing every 30s\n let lastWatchdogBytes = 0;\n let lastOutputGrowthAt = Date.now();\n let watchdogKilled = false;\n const watchdog = setInterval(() => {\n // Check if PID is still alive\n if (pid) {\n try { process.kill(pid, 0); } catch {\n // PID died without triggering close — force resolve\n clearInterval(watchdog);\n clearTimeout(timer);\n watchdogKilled = true;\n try { rmSync(pidFile, { force: true }); } catch {}\n resolve({ success: false, code: null, output: appendFileTail(output, `\\nAgent process died unexpectedly (PID ${pid}).`, config.logLinesTail) });\n return;\n }\n }\n // Check if output is still growing\n if (outputBytes > lastWatchdogBytes) {\n lastWatchdogBytes = outputBytes;\n lastOutputGrowthAt = Date.now();\n } else if (Date.now() - lastOutputGrowthAt > AGENT_STALE_OUTPUT_MS) {\n clearInterval(watchdog);\n clearTimeout(timer);\n timedOut = true;\n watchdogKilled = true;\n if (pid) { try { process.kill(-pid, \"SIGTERM\"); } catch {} }\n else { child.kill(\"SIGTERM\"); }\n try { rmSync(pidFile, { force: true }); } catch {}\n resolve({ success: false, code: null, output: appendFileTail(output, `\\nAgent process stuck — no output for ${Math.round(AGENT_STALE_OUTPUT_MS / 60_000)} minutes.`, config.logLinesTail) });\n }\n }, 30_000);\n\n const cleanup = () => {\n clearInterval(watchdog);\n try { rmSync(pidFile, { force: true }); } catch {}\n };\n\n child.on(\"error\", () => {\n clearTimeout(timer);\n cleanup();\n if (watchdogKilled) return;\n resolve({ success: false, code: null, output: `Command execution failed for issue ${issue.id}.` });\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n cleanup();\n if (watchdogKilled) return;\n // Prepend the captured header if it was truncated out of the tail — ensures model name is always extractable\n const buildOutput = (suffix: string) => {\n const tail = appendFileTail(output, suffix, config.logLinesTail);\n return outputHeader.length > 0 && !tail.startsWith(outputHeader.slice(0, 80))\n ? `${outputHeader}\\n${tail}`\n : tail;\n };\n if (timedOut) {\n resolve({ success: false, code: null, output: buildOutput(`\\nExecution timeout after ${config.commandTimeoutMs}ms.`) });\n return;\n }\n const duration = Math.max(0, Date.now() - started);\n if (code === 0) {\n resolve({ success: true, code, output: buildOutput(`\\nExecution succeeded in ${duration}ms.`) });\n return;\n }\n resolve({ success: false, code, output: buildOutput(`\\nCommand exit code ${code ?? \"unknown\"} after ${duration}ms.`) });\n });\n });\n}\n\nexport async function runHook(\n command: string,\n workspacePath: string,\n issue: IssueEntry,\n hookName: string,\n extraEnv: Record<string, string> = {},\n): Promise<void> {\n if (!command.trim()) return;\n\n const result = await runCommandWithTimeout(command, workspacePath, issue, {\n pollIntervalMs: 0,\n workerConcurrency: 1,\n maxConcurrentByState: {},\n commandTimeoutMs: 300_000,\n maxAttemptsDefault: 1,\n retryDelayMs: 0,\n staleInProgressTimeoutMs: 0,\n logLinesTail: 12_000,\n agentProvider: normalizeAgentProvider(env.FIFONY_AGENT_PROVIDER ?? \"codex\"),\n agentCommand: command,\n maxTurns: 1,\n runMode: \"filesystem\",\n }, \"\", \"\", { FIFONY_HOOK_NAME: hookName, ...extraEnv });\n\n if (!result.success) {\n throw new Error(`${hookName} hook failed: ${result.output}`);\n }\n}\n","import {\n cpSync,\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type { IssueEntry, RuntimeState } from \"./types.ts\";\nimport { SOURCE_ROOT, TARGET_ROOT, WORKSPACE_ROOT } from \"./constants.ts\";\nimport { now, idToSafePath } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { runHook } from \"./command-executor.ts\";\nimport { buildPrompt } from \"./prompt-builder.ts\";\nimport { ensureSourceReady } from \"./workflow.ts\";\n\n/** Check if a directory is inside a git repository. */\nfunction isGitRepo(dir: string): boolean {\n try {\n execSync(\"git rev-parse --git-dir\", { cwd: dir, stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Detect the default branch for a git repo using multiple fallback strategies. */\nexport function detectDefaultBranch(dir: string): string {\n try {\n const current = execSync(\"git rev-parse --abbrev-ref HEAD\", { cwd: dir, encoding: \"utf8\" }).trim();\n if (current && current !== \"HEAD\") return current;\n // HEAD = detached state, fall through to remote detection\n const remote = execSync(\"git symbolic-ref refs/remotes/origin/HEAD\", { cwd: dir, encoding: \"utf8\" }).trim();\n return remote.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n return \"main\";\n }\n}\n\n/** Create a git worktree for the issue at the given path. */\nexport async function createGitWorktree(issue: IssueEntry, worktreePath: string, baseBranch?: string): Promise<void> {\n let headCommitAtStart = \"\";\n const resolvedBaseBranch = baseBranch ?? detectDefaultBranch(TARGET_ROOT);\n try {\n headCommitAtStart = execSync(\"git rev-parse HEAD\", { cwd: TARGET_ROOT, encoding: \"utf8\" }).trim();\n } catch {}\n\n const branchName = `fifony/${issue.id}`;\n\n // -B creates or resets the branch (handles retry scenarios)\n execSync(`git worktree add \"${worktreePath}\" -B \"${branchName}\"`, {\n cwd: TARGET_ROOT,\n stdio: \"pipe\",\n });\n\n // Register fifony runtime files as ignored in the worktree's local excludes\n try {\n const gitFileContent = readFileSync(join(worktreePath, \".git\"), \"utf8\").trim();\n const gitDirRel = gitFileContent.replace(\"gitdir: \", \"\").trim();\n const gitDirPath = resolve(worktreePath, gitDirRel);\n mkdirSync(join(gitDirPath, \"info\"), { recursive: true });\n writeFileSync(join(gitDirPath, \"info\", \"exclude\"), \"fifony-*\\n.fifony-*\\nfifony_*\\n\", \"utf8\");\n } catch (err) {\n logger.warn({ err: String(err) }, \"[Agent] Failed to write worktree excludes\");\n }\n\n issue.branchName = branchName;\n issue.baseBranch = resolvedBaseBranch;\n issue.headCommitAtStart = headCommitAtStart;\n issue.worktreePath = worktreePath;\n\n logger.debug({ issueId: issue.id, branchName, baseBranch: resolvedBaseBranch, worktreePath }, \"[Agent] Git worktree created\");\n}\n\nexport async function prepareWorkspace(\n issue: IssueEntry,\n state: RuntimeState,\n defaultBranch?: string,\n): Promise<{ workspacePath: string; promptText: string; promptFile: string }> {\n const safeId = idToSafePath(issue.id);\n const workspaceRoot = join(WORKSPACE_ROOT, safeId); // management dir\n const worktreePath = join(workspaceRoot, \"worktree\"); // code dir (git worktree)\n const createdNow = !existsSync(worktreePath);\n\n if (createdNow) {\n mkdirSync(workspaceRoot, { recursive: true });\n logger.debug({ issueId: issue.id, identifier: issue.identifier, workspacePath: workspaceRoot }, \"[Agent] Creating workspace\");\n\n if (state.config.afterCreateHook) {\n mkdirSync(worktreePath, { recursive: true });\n await runHook(state.config.afterCreateHook, worktreePath, issue, \"after_create\");\n } else if (isGitRepo(TARGET_ROOT)) {\n await createGitWorktree(issue, worktreePath, defaultBranch);\n } else {\n // Fallback: copy SOURCE_ROOT snapshot\n await ensureSourceReady();\n mkdirSync(worktreePath, { recursive: true });\n cpSync(SOURCE_ROOT, worktreePath, {\n recursive: true,\n force: true,\n filter: (sourcePath) => !sourcePath.startsWith(WORKSPACE_ROOT),\n });\n }\n\n logger.debug({ issueId: issue.id, workspacePath: workspaceRoot, worktreePath }, \"[Agent] Workspace created\");\n } else {\n logger.debug({ issueId: issue.id, workspacePath: workspaceRoot }, \"[Agent] Reusing existing workspace\");\n }\n\n const metaPath = join(workspaceRoot, \"issue.json\");\n const promptText = await buildPrompt(issue, null);\n const promptFile = join(workspaceRoot, \"prompt.md\");\n writeFileSync(metaPath, JSON.stringify({ ...issue, runtimeSource: SOURCE_ROOT, bootstrapAt: now() }, null, 2), \"utf8\");\n writeFileSync(promptFile, `${promptText}\\n`, \"utf8\");\n\n issue.workspacePath = workspaceRoot;\n issue.worktreePath = worktreePath;\n issue.workspacePreparedAt = now();\n\n return { workspacePath: workspaceRoot, promptText, promptFile };\n}\n\nexport async function cleanWorkspace(\n issueId: string,\n issue: IssueEntry | null,\n state: RuntimeState,\n): Promise<void> {\n const safeId = idToSafePath(issueId);\n const workspacePath = issue?.workspacePath ?? join(WORKSPACE_ROOT, safeId);\n if (!existsSync(workspacePath)) return;\n\n // Run before_remove hook (failure is logged but ignored)\n if (state.config.beforeRemoveHook) {\n try {\n const dummyIssue = issue ?? { id: issueId, identifier: issueId } as IssueEntry;\n await runHook(state.config.beforeRemoveHook, workspacePath, dummyIssue, \"before_remove\");\n } catch (error) {\n logger.warn(`before_remove hook failed for ${issueId}: ${String(error)}`);\n }\n }\n\n // Git worktree cleanup\n if (issue?.branchName && issue.worktreePath) {\n try {\n execSync(`git worktree remove --force \"${issue.worktreePath}\"`, { cwd: TARGET_ROOT, stdio: \"pipe\" });\n logger.info(`Removed worktree for ${issueId}: ${issue.worktreePath}`);\n } catch (error) {\n logger.warn(`Failed to remove worktree for ${issueId}: ${String(error)}`);\n try { rmSync(issue.worktreePath, { recursive: true, force: true }); } catch {}\n }\n try {\n execSync(`git branch -D \"${issue.branchName}\"`, { cwd: TARGET_ROOT, stdio: \"pipe\" });\n } catch { /* branch may already be gone */ }\n // Also remove the management dir\n try { rmSync(workspacePath, { recursive: true, force: true }); } catch {}\n return;\n }\n\n // Legacy: remove the whole workspace dir\n try {\n rmSync(workspacePath, { recursive: true, force: true });\n logger.info(`Cleaned workspace for ${issueId}: ${workspacePath}`);\n } catch (error) {\n logger.warn(`Failed to clean workspace for ${issueId}: ${String(error)}`);\n }\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { copyFile, mkdir, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { extname, join } from \"node:path\";\nimport { argv, exit } from \"node:process\";\nimport {\n SOURCE_ROOT,\n SOURCE_MARKER,\n TARGET_ROOT,\n} from \"./constants.ts\";\nimport {\n now,\n fail,\n parseIntArg,\n} from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\n\nconst SKIP_DIRS = new Set([\n \".git\", \".fifony\", \"node_modules\", \".venv\", \"data\",\n \"dist\", \"build\", \".turbo\", \".next\", \".nuxt\", \".tanstack\",\n \"coverage\", \"artifacts\", \"captures\", \"tmp\", \"temp\",\n]);\n\nfunction shouldSkipPath(relativePath: string): boolean {\n const parts = relativePath.split(\"/\");\n if (parts.some((segment) => SKIP_DIRS.has(segment))) return true;\n const base = parts.at(-1) ?? \"\";\n if (base.startsWith(\"map_scan_\") && extname(base) === \".json\") return true;\n if (extname(base) === \".xlsx\") return true;\n return false;\n}\n\nexport function bootstrapSource(): void {\n if (existsSync(SOURCE_MARKER)) return;\n\n logger.info(\"Creating local source snapshot for Fifony (local-only runtime)...\");\n\n const copyRecursive = (source: string, target: string, rel = \"\") => {\n mkdirSync(target, { recursive: true });\n const items = readdirSync(source, { withFileTypes: true });\n\n for (const item of items) {\n const nextRel = rel ? `${rel}/${item.name}` : item.name;\n if (shouldSkipPath(nextRel)) continue;\n\n const sourcePath = `${source}/${item.name}`;\n const targetPath = `${target}/${item.name}`;\n const itemStat = statSync(sourcePath);\n\n if (item.isDirectory()) {\n copyRecursive(sourcePath, targetPath, nextRel);\n continue;\n }\n\n if (item.isSymbolicLink() || itemStat.isSymbolicLink()) continue;\n\n if (itemStat.isFile() || itemStat.isFIFO()) {\n try {\n const file = readFileSync(sourcePath);\n writeFileSync(targetPath, file);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n logger.debug(`Skipped missing source file: ${sourcePath}`);\n } else {\n throw error;\n }\n }\n }\n }\n };\n\n mkdirSync(SOURCE_ROOT, { recursive: true });\n copyRecursive(TARGET_ROOT, SOURCE_ROOT);\n writeFileSync(SOURCE_MARKER, `${now()}\\n`, \"utf8\");\n}\n\nlet sourceReadyPromise: Promise<void> | null = null;\nlet skipSourceFlag = false;\n\nexport function setSkipSource(skip: boolean): void {\n skipSourceFlag = skip;\n}\n\n/**\n * Async, lazy version of bootstrapSource().\n * Only runs the copy once, on first call. Subsequent calls resolve immediately.\n * Emits progress via optional callback.\n */\nexport async function ensureSourceReady(\n onProgress?: (status: \"copying\" | \"ready\") => void,\n): Promise<void> {\n if (skipSourceFlag) {\n onProgress?.(\"ready\");\n return;\n }\n if (existsSync(SOURCE_MARKER)) {\n onProgress?.(\"ready\");\n return;\n }\n\n // Deduplicate concurrent calls\n if (sourceReadyPromise) return sourceReadyPromise;\n\n sourceReadyPromise = (async () => {\n onProgress?.(\"copying\");\n logger.info(\"Creating local source snapshot (async) for Fifony...\");\n\n const copyRecursiveAsync = async (source: string, target: string, rel = \"\") => {\n await mkdir(target, { recursive: true });\n const items = await readdir(source, { withFileTypes: true });\n\n for (const item of items) {\n const nextRel = rel ? `${rel}/${item.name}` : item.name;\n if (shouldSkipPath(nextRel)) continue;\n\n const sourcePath = `${source}/${item.name}`;\n const targetPath = `${target}/${item.name}`;\n const itemStat = await stat(sourcePath);\n\n if (item.isDirectory()) {\n await copyRecursiveAsync(sourcePath, targetPath, nextRel);\n continue;\n }\n\n if (item.isSymbolicLink() || itemStat.isSymbolicLink()) continue;\n\n if (itemStat.isFile() || itemStat.isFIFO()) {\n try {\n await copyFile(sourcePath, targetPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n logger.debug(`Skipped missing source file: ${sourcePath}`);\n } else {\n throw error;\n }\n }\n }\n }\n };\n\n await mkdir(SOURCE_ROOT, { recursive: true });\n await copyRecursiveAsync(TARGET_ROOT, SOURCE_ROOT);\n await writeFile(SOURCE_MARKER, `${now()}\\n`, \"utf8\");\n onProgress?.(\"ready\");\n logger.info(\"Source snapshot ready (async).\");\n })();\n\n return sourceReadyPromise;\n}\n\n\nexport function parsePort(args: string[]): number | undefined {\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n\n if (arg === \"--help\" || arg === \"-h\") {\n console.log(\n `Usage: ${argv[1]} [options]\\n` +\n \"Options:\\n\" +\n \" --port <n> Start local dashboard (default: no UI and single batch run)\\n\" +\n \" --workspace <path> Target workspace root (default: current directory)\\n\" +\n \" --persistence <path> Persistence root (default: current directory)\\n\" +\n \" --concurrency <n> Maximum number of parallel issue runners\\n\" +\n \" --attempts <n> Maximum attempts per issue\\n\" +\n \" --poll <ms> Polling interval for the scheduler\\n\" +\n \" --once Run one local batch and exit\\n\" +\n \" --help Show this message\",\n );\n exit(0);\n }\n\n if (arg === \"--port\") {\n const value = args[i + 1];\n if (!value || !/^\\d+$/.test(value)) {\n fail(`Invalid value for --port: ${value ?? \"<empty>\"}`);\n }\n return parseIntArg(value, 4040);\n }\n }\n\n return undefined;\n}\n\n","import {\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AgentProviderDefinition,\n AgentSessionResult,\n IssueEntry,\n RuntimeState,\n WorkflowConfig,\n} from \"./types.ts\";\nimport { now, clamp } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { getEffectiveAgentProviders } from \"./providers.ts\";\nimport { addEvent } from \"./issues.ts\";\nimport { compileExecution, persistCompilationArtifacts } from \"./adapters/index.ts\";\nimport { discoverSkills, buildSkillContext } from \"./skills.ts\";\nimport {\n loadAgentSessionState,\n persistAgentSessionState,\n loadAgentPipelineState,\n persistAgentPipelineState,\n buildProviderSessionKey,\n} from \"./session-state.ts\";\nimport { readAgentDirective, addTokenUsage } from \"./directive-parser.ts\";\nimport { buildTurnPrompt, buildProviderBasePrompt } from \"./prompt-builder.ts\";\nimport { runCommandWithTimeout, runHook } from \"./command-executor.ts\";\nimport { record as recordTokens } from \"./token-ledger.ts\";\n\nexport async function runAgentSession(\n state: RuntimeState,\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n cycle: number,\n workspacePath: string,\n basePromptText: string,\n basePromptFile: string,\n): Promise<AgentSessionResult> {\n const maxTurns = clamp(state.config.maxTurns, 1, 16);\n const attempt = issue.attempts + 1;\n const sessionLookupKey = buildProviderSessionKey(issue, attempt, provider, cycle);\n const loadedSession = await loadAgentSessionState(sessionLookupKey, issue, attempt, maxTurns);\n const sessionKey = loadedSession.key;\n const session = loadedSession.session;\n let previousOutput = session.lastOutput;\n let nextPrompt = session.nextPrompt;\n let lastCode: number | null = session.lastCode;\n let lastOutput = session.lastOutput;\n const resultFile = join(workspacePath, `result-${provider.role}-${provider.provider}.json`);\n\n if (session.status === \"done\" && session.turns.length > 0) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier, provider: provider.provider, role: provider.role }, \"[Agent] Session already completed, returning cached result\");\n return { success: true, blocked: false, continueRequested: false, code: session.lastCode, output: session.lastOutput, turns: session.turns.length };\n }\n\n const turnIndex = session.turns.length + 1;\n if (turnIndex > maxTurns) {\n session.status = \"blocked\";\n session.lastOutput = session.lastOutput + `\\nAgent requested additional turns beyond configured limit (${maxTurns}).`;\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: true, continueRequested: false, code: lastCode, output: session.lastOutput, turns: session.turns.length };\n }\n\n const maxOutputChars = state.config.maxPreviousOutputChars;\n const compactedOutput = previousOutput.length > maxOutputChars\n ? `[...${previousOutput.length - maxOutputChars} chars truncated...]\\n${previousOutput.slice(-maxOutputChars)}`\n : previousOutput;\n const turnPrompt = await buildTurnPrompt(issue, basePromptText, compactedOutput, turnIndex, maxTurns, nextPrompt);\n const turnPromptFile = turnIndex === 1\n ? basePromptFile\n : join(workspacePath, `turn-${String(turnIndex).padStart(2, \"0\")}.md`);\n\n if (turnIndex > 1) writeFileSync(turnPromptFile, `${turnPrompt}\\n`, \"utf8\");\n\n session.status = \"running\";\n session.lastPrompt = turnPrompt;\n session.lastPromptFile = turnPromptFile;\n session.maxTurns = maxTurns;\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, maxTurns, provider: provider.provider, role: provider.role, cycle, command: provider.command.slice(0, 120) }, \"[Agent] Spawning agent command\");\n const turnStartedAt = now();\n const turnEnv = {\n FIFONY_AGENT_PROVIDER: provider.provider,\n FIFONY_AGENT_ROLE: provider.role,\n FIFONY_REASONING_EFFORT: provider.reasoningEffort || \"\",\n FIFONY_SESSION_KEY: sessionKey,\n FIFONY_SESSION_ID: `${issue.id}-attempt-${attempt}`,\n FIFONY_TURN_INDEX: String(turnIndex),\n FIFONY_MAX_TURNS: String(maxTurns),\n FIFONY_TURN_PROMPT: turnPrompt,\n FIFONY_TURN_PROMPT_FILE: turnPromptFile,\n FIFONY_CONTINUE: turnIndex > 1 ? \"1\" : \"0\",\n FIFONY_PREVIOUS_OUTPUT: compactedOutput,\n FIFONY_RESULT_FILE: resultFile,\n FIFONY_AGENT_PROFILE: provider.profile,\n FIFONY_AGENT_PROFILE_FILE: provider.profilePath,\n FIFONY_AGENT_PROFILE_INSTRUCTIONS: provider.profileInstructions,\n };\n\n if (state.config.beforeRunHook) {\n await runHook(state.config.beforeRunHook, workspacePath, issue, \"before_run\", turnEnv);\n }\n\n addEvent(state, issue.id, \"runner\", `Turn ${turnIndex}/${maxTurns} started for ${issue.identifier}.`);\n\n const turnResult = await runCommandWithTimeout(provider.command, workspacePath, issue, state.config, turnPrompt, turnPromptFile, turnEnv);\n\n if (state.config.afterRunHook) {\n await runHook(state.config.afterRunHook, workspacePath, issue, \"after_run\", {\n ...turnEnv,\n FIFONY_LAST_EXIT_CODE: String(turnResult.code ?? \"\"),\n FIFONY_LAST_OUTPUT: turnResult.output,\n FIFONY_PRESERVE_RESULT_FILE: \"1\",\n });\n }\n\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, exitCode: turnResult.code, success: turnResult.success, outputBytes: turnResult.output.length }, \"[Agent] Agent command finished\");\n const directive = readAgentDirective(workspacePath, turnResult.output, turnResult.success);\n lastCode = turnResult.code;\n lastOutput = turnResult.output;\n previousOutput = turnResult.output;\n nextPrompt = directive.nextPrompt;\n if (!directive.tokenUsage) {\n logger.warn({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, role: provider.role, outputBytes: turnResult.output.length }, \"[Agent] Token extraction failed — no usage data in CLI output\");\n }\n addTokenUsage(issue, directive.tokenUsage, provider.role);\n if (directive.tokenUsage) recordTokens(issue, directive.tokenUsage, provider.role);\n\n if (directive.tokenUsage) {\n const tu = directive.tokenUsage;\n const parts = [\n `Turn ${turnIndex} (${provider.role})`,\n `${tu.totalTokens.toLocaleString()} tokens`,\n `(in: ${tu.inputTokens.toLocaleString()}, out: ${tu.outputTokens.toLocaleString()})`,\n ];\n if (tu.model) parts.push(`[${tu.model}]`);\n const cumulative = issue.tokenUsage;\n if (cumulative && cumulative.totalTokens > tu.totalTokens) {\n parts.push(`| cumulative: ${cumulative.totalTokens.toLocaleString()}`);\n }\n addEvent(state, issue.id, \"info\", parts.join(\" \"));\n }\n\n session.turns.push({\n turn: turnIndex,\n role: provider.role,\n model: directive.tokenUsage?.model || provider.model || provider.provider,\n startedAt: turnStartedAt,\n completedAt: now(),\n promptFile: turnPromptFile,\n prompt: turnPrompt,\n output: turnResult.output,\n code: turnResult.code,\n success: turnResult.success,\n directiveStatus: directive.status,\n directiveSummary: directive.summary,\n nextPrompt: directive.nextPrompt,\n tokenUsage: directive.tokenUsage,\n });\n\n session.lastCode = lastCode;\n session.lastOutput = lastOutput;\n session.lastDirectiveStatus = directive.status;\n session.lastDirectiveSummary = directive.summary;\n session.nextPrompt = nextPrompt;\n\n const directiveSummary = directive.summary ? ` ${directive.summary}` : \"\";\n addEvent(state, issue.id, \"runner\", `Turn ${turnIndex}/${maxTurns} finished with status ${directive.status}.${directiveSummary}`.trim());\n\n if (!turnResult.success || directive.status === \"failed\") {\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, directiveStatus: directive.status, exitCode: lastCode }, \"[Agent] Session turn failed\");\n session.status = \"failed\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: false, continueRequested: false, code: lastCode, output: lastOutput, turns: turnIndex };\n }\n\n if (directive.status === \"blocked\") {\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex }, \"[Agent] Session turn blocked — manual intervention requested\");\n session.status = \"blocked\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: true, continueRequested: false, code: lastCode, output: lastOutput, turns: turnIndex };\n }\n\n if (directive.status === \"continue\") {\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, maxTurns }, \"[Agent] Session requests continuation\");\n session.status = \"running\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: false, continueRequested: true, code: lastCode, output: lastOutput, turns: turnIndex };\n }\n\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex }, \"[Agent] Session completed successfully\");\n session.status = \"done\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: true, blocked: false, continueRequested: false, code: lastCode, output: lastOutput, turns: turnIndex };\n}\n\nexport async function runAgentPipeline(\n state: RuntimeState,\n issue: IssueEntry,\n workspacePath: string,\n basePromptText: string,\n basePromptFile: string,\n workflowConfig?: WorkflowConfig | null,\n): Promise<AgentSessionResult> {\n const providers = getEffectiveAgentProviders(state, issue, null, workflowConfig);\n const attempt = issue.attempts + 1;\n logger.debug({ issueId: issue.id, identifier: issue.identifier, attempt, providers: providers.map((p) => `${p.role}:${p.provider}`) }, \"[Agent] Starting pipeline\");\n const { pipeline, key: pipelineFile } = await loadAgentPipelineState(issue, attempt, providers);\n const activeProvider = providers[clamp(pipeline.activeIndex, 0, Math.max(0, providers.length - 1))];\n const executorIndex = providers.findIndex((provider) => provider.role === \"executor\");\n\n // Discover skills and build context\n const skills = discoverSkills(workspacePath);\n const skillContext = buildSkillContext(skills);\n\n // Write skills reference to workspace\n if (skillContext) {\n writeFileSync(join(workspacePath, \"skills.md\"), skillContext, \"utf8\");\n }\n\n // Compile plan-aware execution if plan exists\n const compiled = await compileExecution(issue, activeProvider, state.config, workspacePath, skillContext);\n\n let providerPrompt: string;\n let effectiveProvider = activeProvider;\n\n if (compiled) {\n providerPrompt = compiled.prompt;\n effectiveProvider = { ...activeProvider, command: compiled.command };\n persistCompilationArtifacts(workspacePath, compiled);\n addEvent(state, issue.id, \"info\",\n `Plan compiled for ${compiled.meta.adapter}: effort=${compiled.meta.reasoningEffort}, skills=[${compiled.meta.skillsActivated.join(\",\")}], subagents=[${compiled.meta.subagentsRequested.join(\",\")}].`);\n\n if (Object.keys(compiled.env).length > 0) {\n const envFile = join(workspacePath, \".compiled-env.sh\");\n const envLines = Object.entries(compiled.env).map(([k, v]) => `export ${k}=${JSON.stringify(v)}`).join(\"\\n\");\n writeFileSync(envFile, envLines, \"utf8\");\n }\n } else {\n providerPrompt = await buildProviderBasePrompt(activeProvider, issue, basePromptText, workspacePath, skillContext);\n }\n\n if (!effectiveProvider.command.trim()) {\n throw new Error(`No command configured for provider ${effectiveProvider.provider} (${effectiveProvider.role}).`);\n }\n\n pipeline.history.push(`[${now()}] Running ${effectiveProvider.role}:${effectiveProvider.provider} in cycle ${pipeline.cycle}${compiled ? ` [${compiled.meta.adapter} adapter]` : \"\"}.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n\n const result = await runAgentSession(state, issue, effectiveProvider, pipeline.cycle, workspacePath, providerPrompt, basePromptFile);\n\n if (result.success) {\n if (pipeline.activeIndex < providers.length - 1) {\n pipeline.activeIndex += 1;\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} completed; advancing to next provider.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return { success: false, blocked: false, continueRequested: true, code: result.code, output: result.output, turns: result.turns };\n }\n pipeline.history.push(`[${now()}] Final provider ${activeProvider.role}:${activeProvider.provider} completed the issue.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n if (result.continueRequested && activeProvider.role === \"reviewer\" && executorIndex >= 0) {\n pipeline.cycle += 1;\n pipeline.activeIndex = executorIndex;\n pipeline.history.push(`[${now()}] Reviewer requested rework; returning to executor for cycle ${pipeline.cycle}.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n if (result.continueRequested) {\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} requested another turn.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n if (result.blocked) {\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} blocked the pipeline.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} failed the pipeline.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\n\nexport type DiscoveredSkill = {\n name: string;\n content: string;\n};\n\nexport function discoverSkills(workspacePath: string): DiscoveredSkill[] {\n const home = homedir();\n const codePath = existsSync(join(workspacePath, \"worktree\")) ? join(workspacePath, \"worktree\") : workspacePath;\n const searchPaths = [\n resolve(codePath, \".codex\", \"skills\"),\n resolve(codePath, \".claude\", \"skills\"),\n join(home, \".codex\", \"skills\"),\n join(home, \".claude\", \"skills\"),\n ];\n\n const seen = new Set<string>();\n const skills: DiscoveredSkill[] = [];\n\n for (const basePath of searchPaths) {\n if (!existsSync(basePath)) continue;\n\n for (const entry of readdirSync(basePath, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n if (seen.has(entry.name)) continue;\n\n const skillFile = join(basePath, entry.name, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n\n try {\n const content = readFileSync(skillFile, \"utf8\").trim();\n if (content) {\n seen.add(entry.name);\n skills.push({ name: entry.name, content });\n }\n } catch {\n // skip unreadable skills\n }\n }\n }\n\n return skills;\n}\n\nexport function buildSkillContext(skills: DiscoveredSkill[]): string {\n if (skills.length === 0) return \"\";\n\n const sections = skills.map((skill) =>\n `### Skill: ${skill.name}\\n${skill.content}`\n );\n\n return `## Available Skills\\n\\n${sections.join(\"\\n\\n\")}`;\n}\n","/**\n * agent.ts — public entry point\n *\n * Re-exports the full agent API consumed by scheduler.ts, api-server.ts, and other modules.\n * Implementation is split across the following modules:\n * directive-parser.ts — output parsing, token extraction, directive normalization\n * pid-manager.ts — PID file management and process liveness checks\n * workspace-diff.ts — diff computation and changed-path inference\n * workspace-merge.ts — worktree commit, merge, path hydration, routing signals\n * session-state.ts — session/pipeline state load, persist, and snapshot helpers\n * prompt-builder.ts — prompt construction for sessions, turns, and providers\n * command-executor.ts — runCommandWithTimeout and runHook\n * workspace-setup.ts — workspace creation, git worktree, and cleanWorkspace\n * agent-pipeline.ts — runAgentSession, runAgentPipeline, runPlanningJob, runIssueOnce\n */\n\n// ── Re-exports from directive-parser ──────────────────────────────────────\nexport { addTokenUsage, readAgentDirective, extractTokenUsage, tryParseJsonOutput } from \"./directive-parser.ts\";\n\n// ── Re-exports from pid-manager ───────────────────────────────────────────\nexport { readAgentPid, isProcessAlive, cleanStalePidFile } from \"./pid-manager.ts\";\nexport type { AgentPidInfo } from \"./pid-manager.ts\";\n\n// ── Re-exports from workspace-diff ────────────────────────────────────────\nexport { computeDiffStats, inferChangedWorkspacePaths, parseDiffStats } from \"./workspace-diff.ts\";\n\n// ── Re-exports from workspace-merge ───────────────────────────────────────\nexport { mergeWorkspace, pushWorktreeBranch, hydrateIssuePathsFromWorkspace, describeRoutingSignals, shouldSkipMergePath, ensureWorktreeCommitted } from \"./workspace-merge.ts\";\nexport type { MergeResult } from \"./workspace-merge.ts\";\n\n// ── Re-exports from session-state ─────────────────────────────────────────\nexport {\n loadAgentPipelineState,\n loadAgentPipelineSnapshotForIssue,\n loadAgentSessionSnapshotsForIssue,\n} from \"./session-state.ts\";\n\n// ── Re-exports from prompt-builder ────────────────────────────────────────\nexport { buildPrompt, buildTurnPrompt, buildProviderBasePrompt } from \"./prompt-builder.ts\";\n\n// ── Re-exports from command-executor ──────────────────────────────────────\nexport { runCommandWithTimeout, runHook } from \"./command-executor.ts\";\n\n// ── Re-exports from workspace-setup ───────────────────────────────────────\nexport { cleanWorkspace, prepareWorkspace, createGitWorktree } from \"./workspace-setup.ts\";\n\n// ── Re-exports from agent-pipeline ────────────────────────────────────────\nexport { runAgentPipeline, runAgentSession } from \"./agent-pipeline.ts\";\n\n// ── Re-exports from issue-runner ──────────────────────────────────────────\nexport { runPlanningJob } from \"./issue-runner.ts\";\n\n// ── Public functions consumed by scheduler.ts / api-server.ts ─────────────\n\nimport type { IssueEntry, RuntimeState } from \"./types.ts\";\nimport { TERMINAL_STATES } from \"./constants.ts\";\nimport { logger } from \"./logger.ts\";\nimport { isAgentStillRunning } from \"./pid-manager.ts\";\n\nexport { isAgentStillRunning };\nexport { runIssueOnce } from \"./issue-runner.ts\";\n\nexport function issueHasResumableSession(issue: IssueEntry): boolean {\n return Boolean(issue.workspacePath) && issue.state === \"Running\";\n}\n\nfunction issueDepsResolved(issue: IssueEntry, allIssues: IssueEntry[]): boolean {\n if (issue.blockedBy.length === 0) return true;\n const map = new Map(allIssues.map((entry) => [entry.id, entry]));\n return issue.blockedBy.every((depId) => {\n const dep = map.get(depId);\n return dep?.state === \"Done\";\n });\n}\n\nexport function canRunIssue(issue: IssueEntry, running: Set<string>, state: RuntimeState): boolean {\n if (!issue.assignedToWorker) return false;\n if (running.has(issue.id)) return false;\n if (TERMINAL_STATES.has(issue.state)) return false;\n\n // Planning state: only dispatch when no plan exists yet and no job is active\n if (issue.state === \"Planning\") {\n if (issue.plan) return false; // plan already generated — waiting for user approval\n return issue.planningStatus === \"idle\" || !issue.planningStatus;\n }\n\n // Don't spawn a new agent if one is still alive from a previous session\n const { alive } = isAgentStillRunning(issue);\n if (alive) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier }, \"[Agent] Skipping issue — agent still alive from previous session\");\n return false;\n }\n\n if (issue.state === \"Blocked\") {\n if (!issue.nextRetryAt) return false;\n if (issue.attempts >= issue.maxAttempts) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier, attempts: issue.attempts, maxAttempts: issue.maxAttempts }, \"[Agent] Skipping blocked issue — max attempts reached\");\n return false;\n }\n if (Date.parse(issue.nextRetryAt) > Date.now()) return false;\n }\n\n if (!issueDepsResolved(issue, state.issues)) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier, blockedBy: issue.blockedBy }, \"[Agent] Skipping issue — unresolved dependencies\");\n return false;\n }\n\n if (issue.state === \"Queued\") return true;\n if (issue.state === \"Blocked\") return true;\n if (issue.state === \"Running\" && issueHasResumableSession(issue)) return true;\n if (issue.state === \"Reviewing\") return true;\n\n return false;\n}\n","import { S3DB_ISSUE_RESOURCE } from \"../constants.ts\";\nimport type { JsonRecord, RuntimeState } from \"../types.ts\";\nimport { TERMINAL_STATES } from \"../constants.ts\";\nimport { loadAgentPipelineSnapshotForIssue, loadAgentSessionSnapshotsForIssue } from \"../agent.ts\";\nimport { getApiRuntimeContextOrThrow } from \"../api-runtime-context.ts\";\nimport { persistState, markIssuePlanDirty } from \"../store.ts\";\nimport { getEffectiveAgentProviders } from \"../providers.ts\";\nimport { addEvent, createIssueFromPayload, handleStatePatch, transitionIssueState } from \"../issues.ts\";\nimport { now } from \"../helpers.ts\";\n\nfunction getIssueId(c: unknown): string | null {\n if (!c || typeof c !== \"object\" || !(\"req\" in c) || !c.req || typeof (c as { req: unknown }).req !== \"object\") {\n return null;\n }\n const req = (c as { req: { param: (name: string) => unknown } }).req;\n const value = req.param(\"id\");\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction findIssue(state: RuntimeState, issueId: string) {\n return state.issues.find((issue) => issue.id === issueId || issue.identifier === issueId);\n}\n\nasync function getIssuePipeline(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n const providers = getEffectiveAgentProviders(context.state, issue, null);\n const pipeline = await loadAgentPipelineSnapshotForIssue(issue, providers);\n return { body: { ok: true, issueId: issue.id, pipeline } };\n}\n\nasync function getIssueSessions(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n const providers = getEffectiveAgentProviders(context.state, issue, null);\n const pipeline = await loadAgentPipelineSnapshotForIssue(issue, providers);\n const sessions = await loadAgentSessionSnapshotsForIssue(issue, providers, pipeline, null);\n return { body: { ok: true, issueId: issue.id, pipeline, sessions } };\n}\n\nasync function patchIssueState(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n try {\n const payload = await (c as { req: { json: () => Promise<unknown> } }).req.json() as JsonRecord;\n await handleStatePatch(context.state, issue, payload);\n await persistState(context.state);\n return { body: { ok: true, issue } };\n } catch (error) {\n return { status: 400, body: { ok: false, error: error instanceof Error ? error.message : String(error) } };\n }\n}\n\nasync function retryIssue(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n if (TERMINAL_STATES.has(issue.state)) {\n issue.lastError = undefined;\n issue.nextRetryAt = undefined;\n await transitionIssueState(issue, \"Queued\", \"Manual retry requested.\");\n } else {\n issue.nextRetryAt = undefined;\n issue.lastError = undefined;\n issue.updatedAt = now();\n }\n\n addEvent(context.state, issue.id, \"manual\", `Manual retry requested for ${issue.id}.`);\n await persistState(context.state);\n return { body: { ok: true, issue } };\n}\n\nasync function createIssue(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n try {\n const payload = await (c as { req: { json: () => Promise<unknown> } }).req.json() as JsonRecord;\n const issue = createIssueFromPayload(payload, context.state.issues, context.state.config.defaultBranch);\n context.state.issues.push(issue);\n if (issue.plan) markIssuePlanDirty(issue.id);\n addEvent(context.state, issue.id, \"info\", `Issue ${issue.identifier} created via API.`);\n await persistState(context.state);\n return { body: { ok: true, issue } };\n } catch (error) {\n return { status: 400, body: { ok: false, error: error instanceof Error ? error.message : String(error) } };\n }\n}\n\nasync function cancelIssue(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n await transitionIssueState(issue, \"Cancelled\", \"Manual cancel requested.\");\n addEvent(context.state, issue.id, \"manual\", `Manual cancel requested for ${issue.id}.`);\n await persistState(context.state);\n return { body: { ok: true, issue } };\n}\n\nexport default {\n name: S3DB_ISSUE_RESOURCE,\n attributes: {\n id: \"string|required\",\n identifier: \"string|required\",\n title: \"string|required\",\n description: \"string|optional\",\n priority: \"number|required\",\n state: \"string|required\",\n branchName: \"string|optional\",\n url: \"string|optional\",\n assigneeId: \"string|optional\",\n labels: \"json|required\",\n paths: \"json|optional\",\n inferredPaths: \"json|optional\",\n capabilityCategory: \"string|optional\",\n capabilityOverlays: \"json|optional\",\n capabilityRationale: \"json|optional\",\n blockedBy: \"json|required\",\n assignedToWorker: \"boolean|required\",\n createdAt: \"datetime|required\",\n updatedAt: \"datetime|required\",\n history: \"json|required\",\n startedAt: \"datetime|optional\",\n completedAt: \"datetime|optional\",\n attempts: \"number|required\",\n maxAttempts: \"number|required\",\n nextRetryAt: \"datetime|optional\",\n workspacePath: \"string|optional\",\n worktreePath: \"string|optional\",\n baseBranch: \"string|optional\",\n headCommitAtStart: \"string|optional\",\n mergedAt: \"datetime|optional\",\n mergeResult: \"json|optional\",\n mergedReason: \"string|optional\",\n cancelledReason: \"string|optional\",\n reviewingAt: \"datetime|optional\",\n workspacePreparedAt: \"datetime|optional\",\n lastError: \"string|optional\",\n durationMs: \"number|optional\",\n commandExitCode: \"number|optional\",\n commandOutputTail: \"string|optional\",\n terminalWeek: \"string|optional\",\n usage: \"json|optional\",\n tokenUsage: \"json|optional\",\n tokensByPhase: \"json|optional\",\n tokensByModel: \"json|optional\",\n plan: \"json|optional\",\n planHistory: \"json|optional\",\n planVersion: \"number|optional\",\n planningStatus: \"string|optional\",\n planningStartedAt: \"datetime|optional\",\n planningError: \"string|optional\",\n executeAttempt: \"number|optional\",\n reviewAttempt: \"number|optional\",\n issueType: \"string|optional\",\n eventsCount: \"number|optional\",\n images: \"json|optional\",\n linesAdded: \"number|optional\",\n linesRemoved: \"number|optional\",\n filesChanged: \"number|optional\",\n effort: \"json|optional\",\n },\n partitions: {\n byState: { fields: { state: \"string\" } },\n byCapabilityCategory: { fields: { capabilityCategory: \"string\" } },\n byStateAndCapability: {\n fields: { state: \"string\", capabilityCategory: \"string\" },\n },\n byTerminalWeek: { fields: { terminalWeek: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: true,\n api: {\n auth: false,\n methods: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\"],\n description: \"Issue registry for orchestration runtime\",\n \"POST /create\": async (c: unknown) => {\n const result = await createIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return c.json(result.body, 201);\n },\n \"POST /\": async (c: unknown) => {\n const result = await createIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return c.json(result.body, 201);\n },\n \"GET /:id/pipeline\": async (c: unknown) => {\n const result = await getIssuePipeline(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"GET /:id/sessions\": async (c: unknown) => {\n const result = await getIssueSessions(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"POST /:id/state\": async (c: unknown) => {\n const result = await patchIssueState(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"POST /:id/retry\": async (c: unknown) => {\n const result = await retryIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"POST /:id/cancel\": async (c: unknown) => {\n const result = await cancelIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n },\n};\n","import { S3DB_ISSUE_PLAN_RESOURCE } from \"../constants.ts\";\n\nexport default {\n name: S3DB_ISSUE_PLAN_RESOURCE,\n attributes: {\n id: \"string|required\",\n plan: \"json|optional\",\n planHistory: \"json|optional\",\n planVersion: \"number|required\",\n },\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: true,\n};\n","import { S3DB_EVENT_RESOURCE } from \"../constants.ts\";\n\nexport default {\n name: S3DB_EVENT_RESOURCE,\n attributes: {\n id: \"string|required\",\n issueId: \"string|optional\",\n kind: \"string|required\",\n message: \"string|required\",\n at: \"datetime|required\",\n },\n partitions: {\n byIssueId: { fields: { issueId: \"string\" } },\n byKind: { fields: { kind: \"string\" } },\n byIssueIdAndKind: { fields: { issueId: \"string\", kind: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Runtime event log entries\",\n },\n};\n","import { S3DB_SETTINGS_RESOURCE } from \"../constants.ts\";\n\nexport default {\n name: S3DB_SETTINGS_RESOURCE,\n attributes: {\n id: \"string|required\",\n scope: \"string|required\",\n value: \"json|required\",\n source: \"string|required\",\n updatedAt: \"datetime|required\",\n },\n partitions: {\n byScope: { fields: { scope: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n enabled: false,\n },\n};\n","import { S3DB_AGENT_SESSION_RESOURCE } from \"../constants.ts\";\n\nexport default {\n name: S3DB_AGENT_SESSION_RESOURCE,\n attributes: {\n id: \"string|required\",\n issueId: \"string|required\",\n issueIdentifier: \"string|required\",\n attempt: \"number|required\",\n cycle: \"number|required\",\n provider: \"string|required\",\n role: \"string|required\",\n updatedAt: \"datetime|required\",\n session: \"json|required\",\n },\n partitions: {\n byIssueId: { fields: { issueId: \"string\" } },\n byIssueAttempt: { fields: { issueId: \"string\", attempt: \"number\" } },\n byProviderRole: { fields: { provider: \"string\", role: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Agent session snapshots per attempt\",\n },\n};\n","import { S3DB_AGENT_PIPELINE_RESOURCE } from \"../constants.ts\";\n\nexport default {\n name: S3DB_AGENT_PIPELINE_RESOURCE,\n attributes: {\n id: \"string|required\",\n issueId: \"string|required\",\n issueIdentifier: \"string|required\",\n attempt: \"number|required\",\n updatedAt: \"datetime|required\",\n pipeline: \"json|required\",\n },\n partitions: {\n byIssueId: { fields: { issueId: \"string\" } },\n byIssueAttempt: { fields: { issueId: \"string\", attempt: \"number\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Agent pipeline snapshots per attempt\",\n },\n};\n","import runtimeStateResource from \"./runtime-state.resource.ts\";\nimport issuesResource from \"./issues.resource.ts\";\nimport issuePlansResource from \"./issue-plans.resource.ts\";\nimport eventsResource from \"./events.resource.ts\";\nimport settingsResource from \"./settings.resource.ts\";\nimport agentSessionsResource from \"./agent-sessions.resource.ts\";\nimport agentPipelinesResource from \"./agent-pipelines.resource.ts\";\n\nexport const NATIVE_RESOURCE_CONFIGS = [\n runtimeStateResource,\n issuesResource,\n issuePlansResource,\n eventsResource,\n settingsResource,\n agentSessionsResource,\n agentPipelinesResource,\n] as const;\n\nexport const NATIVE_RESOURCE_NAMES = NATIVE_RESOURCE_CONFIGS.map((resource) => resource.name);\n","import { now } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { computeCapabilityCounts, computeMetrics } from \"./issues.ts\";\nimport type { RuntimeState } from \"./types.ts\";\n\n// ── WebSocket broadcast (same port via listeners) ────────────────────────────\n// s3db.js 21.2.7 WebSocket contract: handlers receive (socketId, send, req)\n// instead of raw socket objects. We track socketId → send function.\n\nexport type WsSendFn = (data: string) => void;\nexport const wsClients = new Map<string, WsSendFn>(); // socketId → send\nexport let broadcastSeq = 0;\nexport let lastBroadcastIssueSnapshot: Map<string, string> = new Map(); // id → JSON\n\nexport function sendToAllClients(data: string): void {\n for (const [socketId, send] of [...wsClients]) {\n try { send(data); } catch (error) {\n logger.debug(`WebSocket send failed for ${socketId}, removing (remaining: ${wsClients.size - 1}): ${String(error)}`);\n wsClients.delete(socketId);\n }\n }\n}\n\nexport function broadcastToWebSocketClients(message: Record<string, unknown>): void {\n if (wsClients.size === 0) return;\n\n broadcastSeq++;\n logger.debug({ seq: broadcastSeq, type: message.type, clientCount: wsClients.size }, \"[WebSocket] Broadcasting state update\");\n const issues = message.issues as Array<Record<string, unknown>> | undefined;\n\n if (issues && lastBroadcastIssueSnapshot.size > 0) {\n // Compute delta: only changed/new/removed issues\n const currentIds = new Set<string>();\n const changedIssues: Array<Record<string, unknown>> = [];\n\n for (const issue of issues) {\n const id = issue.id as string;\n currentIds.add(id);\n const serialized = JSON.stringify(issue);\n if (lastBroadcastIssueSnapshot.get(id) !== serialized) {\n changedIssues.push(issue);\n }\n }\n\n const removedIds: string[] = [];\n for (const prevId of lastBroadcastIssueSnapshot.keys()) {\n if (!currentIds.has(prevId)) {\n removedIds.push(prevId);\n }\n }\n\n // Update snapshot\n lastBroadcastIssueSnapshot = new Map(\n issues.map((issue) => [issue.id as string, JSON.stringify(issue)]),\n );\n\n // If fewer than half changed, send a delta instead of full state\n if (changedIssues.length < issues.length / 2 || changedIssues.length <= 3) {\n const delta: Record<string, unknown> = {\n type: \"state:delta\",\n seq: broadcastSeq,\n metrics: message.metrics,\n capabilities: message.capabilities,\n updatedAt: message.updatedAt,\n issuesDelta: changedIssues,\n issuesRemoved: removedIds,\n events: message.events,\n };\n sendToAllClients(JSON.stringify(delta));\n return;\n }\n }\n\n // Full state broadcast (first time or too many changes)\n if (issues) {\n lastBroadcastIssueSnapshot = new Map(\n issues.map((issue) => [issue.id as string, JSON.stringify(issue)]),\n );\n }\n\n sendToAllClients(JSON.stringify({\n ...message,\n seq: broadcastSeq,\n }));\n}\n\nexport function makeWebSocketConfig(state: RuntimeState) {\n return {\n enabled: true,\n path: \"/ws\",\n maxPayloadBytes: 512_000,\n onConnection: (socketId: string, send: WsSendFn) => {\n wsClients.set(socketId, send);\n logger.debug(`WebSocket client connected: ${socketId} (total: ${wsClients.size})`);\n try {\n send(JSON.stringify({\n type: \"connected\",\n seq: broadcastSeq,\n timestamp: now(),\n metrics: computeMetrics(state.issues),\n capabilities: computeCapabilityCounts(state.issues),\n issues: state.issues,\n events: state.events.slice(0, 50),\n }));\n } catch (error) {\n logger.debug(`WebSocket initial send failed for ${socketId}: ${String(error)}`);\n }\n },\n onMessage: (socketId: string, message: string | Buffer, send: WsSendFn) => {\n try {\n const msg = JSON.parse(typeof message === \"string\" ? message : message.toString(\"utf8\"));\n if (msg.type === \"ping\") {\n send(JSON.stringify({ type: \"pong\", timestamp: now() }));\n }\n } catch {}\n },\n onClose: (socketId: string) => {\n wsClients.delete(socketId);\n logger.debug(`WebSocket client disconnected: ${socketId} (total: ${wsClients.size})`);\n },\n };\n}\n","/**\n * wake-signal.ts — Thin module holding the scheduler wake callback.\n *\n * Extracted to break the circular dependency:\n * scheduler.ts ← agent.ts ← issue-runner.ts ← scheduler.ts\n *\n * Both scheduler.ts (which installs the resolver) and issue-runner.ts\n * (which calls wakeScheduler after a background planning job completes)\n * can safely import from this module without creating a cycle.\n */\n\nlet wakeResolve: (() => void) | null = null;\n\nexport function setWakeResolve(fn: (() => void) | null): void {\n wakeResolve = fn;\n}\n\nexport function wakeScheduler(): void {\n wakeResolve?.();\n}\n","import type { IssueEntry, RuntimeState } from \"./types.ts\";\nimport { logger } from \"./logger.ts\";\nimport { getStateDb, loadS3dbModule } from \"./store.ts\";\nimport { S3DB_ISSUE_RESOURCE } from \"./constants.ts\";\n\ntype QueuePlugin = {\n startProcessing: (handler?: any, options?: { concurrency?: number }) => Promise<void>;\n stopProcessing: () => Promise<void>;\n getStats: () => Promise<{ total: number; pending: number; processing: number; completed: number; failed: number; dead: number }>;\n recoverStalledMessages: (now: number) => Promise<void>;\n};\n\ntype EnqueueableResource = {\n enqueue: (data: Record<string, unknown>, options?: { maxAttempts?: number }) => Promise<Record<string, unknown>>;\n};\n\nlet planPlugin: QueuePlugin | null = null;\nlet executePlugin: QueuePlugin | null = null;\nlet reviewPlugin: QueuePlugin | null = null;\n\nlet planResource: EnqueueableResource | null = null;\nlet executeResource: EnqueueableResource | null = null;\nlet reviewResource: EnqueueableResource | null = null;\n\nlet runtimeState: RuntimeState | null = null;\n\nexport async function initQueueWorkers(state: RuntimeState): Promise<void> {\n runtimeState = state;\n\n const db = getStateDb();\n if (!db) {\n logger.warn(\"[QueueWorkers] No state DB available — queue workers disabled\");\n return;\n }\n\n const { S3QueuePlugin } = await loadS3dbModule();\n if (!S3QueuePlugin) {\n logger.warn(\"[QueueWorkers] S3QueuePlugin not available — queue workers disabled\");\n return;\n }\n\n try {\n const issueResource = await db.getResource(S3DB_ISSUE_RESOURCE);\n\n // plan-queue\n const planPluginInstance = new S3QueuePlugin({\n resource: S3DB_ISSUE_RESOURCE,\n visibilityTimeout: 1_200_000,\n pollInterval: 5_000,\n maxAttempts: 3,\n concurrency: 1,\n autoStart: false,\n autoAcknowledge: false,\n failureStrategy: { mode: \"retry\", maxRetries: 3 },\n });\n await db.usePlugin(planPluginInstance as unknown, \"plan-queue\");\n planPlugin = planPluginInstance;\n planResource = issueResource as unknown as EnqueueableResource;\n\n // execute-queue\n const executePluginInstance = new S3QueuePlugin({\n resource: S3DB_ISSUE_RESOURCE,\n visibilityTimeout: 3_600_000,\n pollInterval: 5_000,\n maxAttempts: 3,\n concurrency: state.config.workerConcurrency,\n autoStart: false,\n autoAcknowledge: false,\n failureStrategy: { mode: \"retry\", maxRetries: 3 },\n });\n await db.usePlugin(executePluginInstance as unknown, \"execute-queue\");\n executePlugin = executePluginInstance;\n executeResource = issueResource as unknown as EnqueueableResource;\n\n // review-queue\n const reviewPluginInstance = new S3QueuePlugin({\n resource: S3DB_ISSUE_RESOURCE,\n visibilityTimeout: 1_200_000,\n pollInterval: 5_000,\n maxAttempts: 3,\n concurrency: 1,\n autoStart: false,\n autoAcknowledge: false,\n failureStrategy: { mode: \"retry\", maxRetries: 3 },\n });\n await db.usePlugin(reviewPluginInstance as unknown, \"review-queue\");\n reviewPlugin = reviewPluginInstance;\n reviewResource = issueResource as unknown as EnqueueableResource;\n\n await planPlugin.startProcessing(buildPlanHandler(), { concurrency: 1 });\n await executePlugin.startProcessing(buildExecuteHandler(), { concurrency: state.config.workerConcurrency });\n await reviewPlugin.startProcessing(buildReviewHandler(), { concurrency: 1 });\n\n logger.info(\"[QueueWorkers] All 3 queue workers started (plan, execute, review)\");\n } catch (error) {\n logger.warn({ err: error }, \"[QueueWorkers] Failed to initialize queue workers — degrading gracefully\");\n planPlugin = null;\n executePlugin = null;\n reviewPlugin = null;\n }\n}\n\nexport async function stopQueueWorkers(): Promise<void> {\n const stops = [\n planPlugin?.stopProcessing(),\n executePlugin?.stopProcessing(),\n reviewPlugin?.stopProcessing(),\n ].filter(Boolean);\n\n if (stops.length === 0) return;\n\n try {\n await Promise.allSettled(stops);\n logger.info(\"[QueueWorkers] All queue workers stopped\");\n } catch (error) {\n logger.warn({ err: error }, \"[QueueWorkers] Error stopping queue workers\");\n } finally {\n planPlugin = null;\n executePlugin = null;\n reviewPlugin = null;\n planResource = null;\n executeResource = null;\n reviewResource = null;\n runtimeState = null;\n }\n}\n\nexport async function enqueueForPlanning(issue: IssueEntry): Promise<void> {\n if (!planResource) return;\n logger.debug({ issueId: issue.id, identifier: issue.identifier }, \"[QueueWorkers] Enqueuing for planning\");\n await (planResource as any).enqueue({ ...issue, _queueTarget: \"Planning\" });\n}\n\nexport async function enqueueForExecution(issue: IssueEntry): Promise<void> {\n if (!executeResource) return;\n logger.debug({ issueId: issue.id, identifier: issue.identifier }, \"[QueueWorkers] Enqueuing for execution\");\n await (executeResource as any).enqueue({ ...issue, _queueTarget: \"Queued\" });\n}\n\nexport async function enqueueForReview(issue: IssueEntry): Promise<void> {\n if (!reviewResource) return;\n logger.debug({ issueId: issue.id, identifier: issue.identifier }, \"[QueueWorkers] Enqueuing for review\");\n await (reviewResource as any).enqueue({ ...issue, _queueTarget: \"Reviewing\" });\n}\n\nexport function areQueueWorkersActive(): boolean {\n return planPlugin !== null && executePlugin !== null && reviewPlugin !== null;\n}\n\nexport async function getQueueStats(): Promise<Record<string, unknown>> {\n const [plan, execute, review] = await Promise.allSettled([\n planPlugin?.getStats(),\n executePlugin?.getStats(),\n reviewPlugin?.getStats(),\n ]);\n\n return {\n plan: plan.status === \"fulfilled\" ? plan.value : null,\n execute: execute.status === \"fulfilled\" ? execute.value : null,\n review: review.status === \"fulfilled\" ? review.value : null,\n };\n}\n\nfunction getCurrentIssue(id: string): IssueEntry | undefined {\n return runtimeState?.issues.find((i) => i.id === id);\n}\n\nfunction buildPlanHandler() {\n return async (record: Record<string, unknown>, context: {\n queueId: string;\n attempts: number;\n workerId: string;\n ack: (result?: unknown) => Promise<void>;\n nack: (error?: Error | string) => Promise<void>;\n renewLock: (extraMs?: number) => Promise<boolean>;\n }) => {\n const issueId = record.id as string;\n if (!issueId) {\n await context.ack();\n return;\n }\n\n const state = runtimeState;\n if (!state) {\n await context.nack(\"Runtime state not available\");\n return;\n }\n\n const issue = getCurrentIssue(issueId);\n if (!issue || issue.state !== \"Planning\") {\n logger.debug({ issueId, currentState: issue?.state }, \"[QueueWorkers:plan] Issue no longer in Planning state, skipping\");\n await context.ack();\n return;\n }\n\n if (issue.planningStatus === \"planning\") {\n logger.debug({ issueId }, \"[QueueWorkers:plan] Planning already in progress, skipping\");\n await context.ack();\n return;\n }\n\n logger.info({ issueId, identifier: issue.identifier }, \"[QueueWorkers:plan] Processing planning job\");\n\n try {\n const { runPlanningJob } = await import(\"./issue-runner.ts\");\n await runPlanningJob(state, issue);\n await context.ack();\n } catch (error) {\n logger.error({ err: error, issueId }, \"[QueueWorkers:plan] Planning job failed\");\n await context.nack(error instanceof Error ? error : String(error));\n }\n };\n}\n\nfunction buildExecuteHandler() {\n return async (record: Record<string, unknown>, context: {\n queueId: string;\n attempts: number;\n workerId: string;\n ack: (result?: unknown) => Promise<void>;\n nack: (error?: Error | string) => Promise<void>;\n renewLock: (extraMs?: number) => Promise<boolean>;\n }) => {\n const issueId = record.id as string;\n if (!issueId) {\n await context.ack();\n return;\n }\n\n const state = runtimeState;\n if (!state) {\n await context.nack(\"Runtime state not available\");\n return;\n }\n\n const issue = getCurrentIssue(issueId);\n if (!issue || (issue.state !== \"Queued\" && issue.state !== \"Running\")) {\n logger.debug({ issueId, currentState: issue?.state }, \"[QueueWorkers:execute] Issue not in Queued/Running state, skipping\");\n await context.ack();\n return;\n }\n\n logger.info({ issueId, identifier: issue.identifier, state: issue.state }, \"[QueueWorkers:execute] Processing execution job\");\n\n const running = new Set<string>();\n\n try {\n const { runIssueOnce } = await import(\"./issue-runner.ts\");\n await runIssueOnce(state, issue, running);\n await context.ack();\n } catch (error) {\n logger.error({ err: error, issueId }, \"[QueueWorkers:execute] Execution job failed\");\n await context.nack(error instanceof Error ? error : String(error));\n }\n };\n}\n\nfunction buildReviewHandler() {\n return async (record: Record<string, unknown>, context: {\n queueId: string;\n attempts: number;\n workerId: string;\n ack: (result?: unknown) => Promise<void>;\n nack: (error?: Error | string) => Promise<void>;\n renewLock: (extraMs?: number) => Promise<boolean>;\n }) => {\n const issueId = record.id as string;\n if (!issueId) {\n await context.ack();\n return;\n }\n\n const state = runtimeState;\n if (!state) {\n await context.nack(\"Runtime state not available\");\n return;\n }\n\n const issue = getCurrentIssue(issueId);\n if (!issue || issue.state !== \"Reviewing\") {\n logger.debug({ issueId, currentState: issue?.state }, \"[QueueWorkers:review] Issue not in Reviewing state, skipping\");\n await context.ack();\n return;\n }\n\n logger.info({ issueId, identifier: issue.identifier }, \"[QueueWorkers:review] Processing review job\");\n\n const running = new Set<string>();\n\n try {\n const { runIssueOnce } = await import(\"./issue-runner.ts\");\n await runIssueOnce(state, issue, running);\n await context.ack();\n } catch (error) {\n logger.error({ err: error, issueId }, \"[QueueWorkers:review] Review job failed\");\n await context.nack(error instanceof Error ? error : String(error));\n }\n };\n}\n","import type {\n IssueEntry,\n JsonRecord,\n ParallelismAnalysis,\n RuntimeState,\n} from \"./types.ts\";\nimport { EXECUTING_STATES, TERMINAL_STATES } from \"./constants.ts\";\nimport { now, sleep, normalizeState, toStringValue } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { persistState } from \"./store.ts\";\nimport { hasDirtyState, markIssueDirty } from \"./dirty-tracker.ts\";\nimport { detectAvailableProviders, resolveDefaultProvider, getProviderDefaultCommand } from \"./providers.ts\";\nimport {\n addEvent,\n computeMetrics,\n getNextRetryAt,\n issueDependenciesResolved,\n transitionIssueState,\n} from \"./issues.ts\";\nimport {\n getIssueCapabilityPriority,\n} from \"./providers.ts\";\nimport { canRunIssue, issueHasResumableSession, runIssueOnce, isAgentStillRunning } from \"./agent.ts\";\nimport { setWakeResolve, wakeScheduler } from \"./wake-signal.ts\";\nimport { areQueueWorkersActive } from \"./queue-workers.ts\";\n\n// States fully managed by queue workers — scheduler must not dispatch these when queues are active\nconst QUEUE_MANAGED_STATES = new Set([\"Planning\", \"Queued\", \"Reviewing\"]);\n\nexport { wakeScheduler };\n\nlet shuttingDown = false;\nlet lastPersistAt = 0;\nconst PERSIST_DEBOUNCE_MS = 5000;\n\n// ── Adaptive polling ────────────────────────────────────────────────────────\nconst IDLE_POLL_MS = 1000;\nconst ACTIVE_POLL_MS = 500;\n\nexport function isShuttingDown(): boolean {\n return shuttingDown;\n}\n\nexport function installGracefulShutdown(\n state: RuntimeState,\n running: Set<string>,\n): void {\n const handler = async (signal: string) => {\n if (shuttingDown) {\n logger.warn(`Received ${signal} again, forcing exit.`);\n process.exit(1);\n }\n shuttingDown = true;\n logger.info(`Received ${signal}, shutting down gracefully...`);\n addEvent(state, undefined, \"info\", `Graceful shutdown initiated (${signal}).`);\n\n // Mark running/reviewing issues as Queued so they resume on next boot\n for (const issue of state.issues) {\n if (running.has(issue.id) && (issue.state === \"Running\" || issue.state === \"Reviewing\")) {\n try {\n await transitionIssueState(issue, \"Queued\", `Interrupted by ${signal} — queued for resume on next start.`, { fallbackToLocal: true });\n } catch {\n // Issue may already be in a terminal state; proceed with shutdown regardless\n logger.warn(`Could not transition issue ${issue.identifier} to Queued during shutdown.`);\n }\n addEvent(state, issue.id, \"info\", `Issue ${issue.identifier} queued for resume on next start.`);\n }\n\n // Planning jobs have no external process — just reset the status so the scheduler picks them up again\n // Note: planning issues no longer occupy the running Set, so check planningStatus directly.\n if (issue.state === \"Planning\" && issue.planningStatus === \"planning\") {\n issue.planningStatus = \"idle\";\n issue.planningError = `Interrupted by ${signal} — will resume.`;\n issue.planningStartedAt = undefined;\n markIssueDirty(issue.id);\n addEvent(state, issue.id, \"info\", `Planning for ${issue.identifier} interrupted by shutdown — will resume.`);\n }\n }\n\n state.updatedAt = now();\n state.metrics = computeMetrics(state.issues);\n try {\n await persistState(state);\n logger.info(\"State persisted.\");\n } catch (error) {\n logger.error(`Failed to persist state during shutdown: ${String(error)}`);\n }\n logger.info(\"Goodbye.\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => handler(\"SIGINT\"));\n process.on(\"SIGTERM\", () => handler(\"SIGTERM\"));\n}\n\nexport function analyzeParallelizability(issues: IssueEntry[]): ParallelismAnalysis {\n const todo = issues.filter((issue) =>\n issue.state === \"Planned\"\n && issue.assignedToWorker\n && issue.blockedBy.length === 0,\n );\n\n if (todo.length === 0) {\n return {\n canParallelize: false,\n maxSafeParallelism: 0,\n reason: \"No runnable issues in Planned state.\",\n groups: [],\n };\n }\n\n // Build path overlap graph\n const getIssuePaths = (issue: IssueEntry): Set<string> =>\n new Set([...(issue.paths ?? []), ...(issue.inferredPaths ?? [])]);\n\n const hasPathOverlap = (a: IssueEntry, b: IssueEntry): boolean => {\n const pathsA = getIssuePaths(a);\n const pathsB = getIssuePaths(b);\n if (pathsA.size === 0 || pathsB.size === 0) return false;\n for (const p of pathsA) {\n if (pathsB.has(p)) return true;\n }\n return false;\n };\n\n // Build dependency graph among todo issues\n const hasDep = (a: IssueEntry, b: IssueEntry): boolean =>\n a.blockedBy.includes(b.id) || b.blockedBy.includes(a.id);\n\n // Group independent issues using greedy coloring\n const groups: string[][] = [];\n const assigned = new Set<string>();\n\n for (const issue of todo) {\n if (assigned.has(issue.id)) continue;\n\n let placed = false;\n for (const group of groups) {\n const canJoin = group.every((memberId) => {\n const member = todo.find((i) => i.id === memberId)!;\n return !hasPathOverlap(issue, member) && !hasDep(issue, member);\n });\n\n if (canJoin) {\n group.push(issue.id);\n assigned.add(issue.id);\n placed = true;\n break;\n }\n }\n\n if (!placed) {\n groups.push([issue.id]);\n assigned.add(issue.id);\n }\n }\n\n const maxSafe = Math.max(...groups.map((g) => g.length));\n const conflictingPairs = todo.filter((a, i) =>\n todo.slice(i + 1).some((b) => hasPathOverlap(a, b)),\n ).length;\n\n const reason = conflictingPairs > 0\n ? `${conflictingPairs} issue(s) share file paths with other issues. Maximum safe parallelism is ${maxSafe}.`\n : `All ${todo.length} runnable issues have independent paths. Safe to parallelize up to ${maxSafe}.`;\n\n return {\n canParallelize: maxSafe > 1,\n maxSafeParallelism: maxSafe,\n reason,\n groups,\n };\n}\n\nexport async function ensureNotStale(state: RuntimeState, staleTimeoutMs: number): Promise<void> {\n const limit = Date.now() - staleTimeoutMs;\n\n // Recover stale planning jobs (Planning state with planningStatus=\"planning\" but worker died)\n for (const issue of state.issues) {\n if (issue.state !== \"Planning\" || issue.planningStatus !== \"planning\") continue;\n if (!issue.planningStartedAt) continue;\n const elapsed = Date.now() - Date.parse(issue.planningStartedAt);\n if (elapsed > staleTimeoutMs) {\n issue.planningStatus = \"idle\";\n issue.planningError = \"Planning worker stalled — auto-recovered.\";\n issue.planningStartedAt = undefined;\n markIssueDirty(issue.id);\n addEvent(state, issue.id, \"info\", `Planning for ${issue.identifier} recovered from stale.`);\n logger.info({ issueId: issue.id, identifier: issue.identifier, elapsed }, \"[Scheduler] Recovered stale planning job\");\n }\n }\n\n for (const issue of state.issues) {\n if (!EXECUTING_STATES.has(issue.state)) continue;\n if (issueHasResumableSession(issue)) continue;\n\n // Fast path: if the agent PID is dead, silently recover to Queued (no attempt++)\n const agentStatus = isAgentStillRunning(issue);\n const pidDead = agentStatus.pid !== null && !agentStatus.alive;\n\n if (pidDead) {\n logger.info({ issueId: issue.id, identifier: issue.identifier, state: issue.state, pid: agentStatus.pid?.pid }, \"[Scheduler] PID dead — silently recovering to Queued\");\n issue.startedAt = undefined;\n markIssueDirty(issue.id);\n await transitionIssueState(issue, \"Queued\", `Agent process died (PID ${agentStatus.pid!.pid}) — auto-recovering.`);\n addEvent(state, issue.id, \"info\", `Issue ${issue.identifier} agent process died (PID ${agentStatus.pid!.pid}), silently recovered to Queued.`);\n continue;\n }\n\n // Stale timeout: block with reason (no PID dead, just no updates)\n if (Date.parse(issue.updatedAt) < limit) {\n const staleMinutes = Math.round((Date.now() - Date.parse(issue.updatedAt)) / 60_000);\n const reason = `Stale execution — no updates for over ${staleMinutes} minute(s) in ${issue.state} state.`;\n logger.info({ issueId: issue.id, identifier: issue.identifier, state: issue.state, updatedAt: issue.updatedAt }, \"[Scheduler] Recovering stale issue → Blocked\");\n issue.attempts += 1;\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n issue.startedAt = undefined;\n markIssueDirty(issue.id);\n await transitionIssueState(issue, \"Blocked\", reason);\n addEvent(state, issue.id, \"info\", `Issue ${issue.identifier} was stale for over ${staleMinutes} minute(s) in ${issue.state} state, moved to Blocked for retry.`);\n }\n }\n}\n\nfunction isPerStateFull(issue: IssueEntry, state: RuntimeState, running: Set<string>): boolean {\n const byState = state.config.maxConcurrentByState;\n if (!byState || Object.keys(byState).length === 0) return false;\n const stateKey = issue.state.toLowerCase();\n const limit = byState[stateKey];\n if (limit === undefined) return false;\n const count = state.issues.filter((i) => running.has(i.id) && i.state.toLowerCase() === stateKey).length;\n return count >= limit;\n}\n\nexport function pickNextIssues(\n state: RuntimeState,\n running: Set<string>,\n): IssueEntry[] {\n const queueManaged = areQueueWorkersActive();\n const candidates = state.issues\n .filter((issue) => {\n if (queueManaged && QUEUE_MANAGED_STATES.has(issue.state)) return false;\n return canRunIssue(issue, running, state) && !isPerStateFull(issue, state, running);\n });\n if (candidates.length > 0) {\n logger.debug({ candidates: candidates.map((i) => ({ id: i.identifier, state: i.state, priority: i.priority })) }, \"[Scheduler] Eligible candidates for dispatch\");\n }\n return candidates\n .sort((a, b) => {\n const stateWeight = (c: IssueEntry) =>\n c.state === \"Running\" ? 0 :\n c.state === \"Planning\" ? 0 :\n c.state === \"Reviewing\" ? 0 :\n c.state === \"Blocked\" ? 2 : 1;\n const weightDiff = stateWeight(a) - stateWeight(b);\n if (weightDiff !== 0) return weightDiff;\n if (a.priority !== b.priority) return a.priority - b.priority;\n const capabilityDiff = getIssueCapabilityPriority(a, null) - getIssueCapabilityPriority(b, null);\n if (capabilityDiff !== 0) return capabilityDiff;\n return Date.parse(a.createdAt) - Date.parse(b.createdAt);\n });\n}\n\nlet lastDispatchWarning = \"\";\n\nfunction validateDispatchConfig(state: RuntimeState): string | null {\n if (!state.config.agentCommand?.trim()) {\n // Self-healing: try to auto-detect a provider\n const detected = detectAvailableProviders();\n const provider = resolveDefaultProvider(detected);\n if (provider) {\n const command = getProviderDefaultCommand(provider);\n if (command) {\n state.config.agentProvider = provider;\n state.config.agentCommand = command;\n logger.info(`Self-healed: auto-detected provider ${provider} → ${command}`);\n return null;\n }\n }\n return \"No agent command configured. Install claude or codex, or set FIFONY_AGENT_COMMAND.\";\n }\n if (state.config.workerConcurrency < 1) {\n return \"Worker concurrency must be >= 1.\";\n }\n if (state.config.maxTurns < 1) {\n return \"Max turns must be >= 1.\";\n }\n return null; // valid\n}\n\nfunction warnOncePerMessage(message: string): void {\n if (message === lastDispatchWarning) return;\n lastDispatchWarning = message;\n logger.warn(`Dispatch skipped: ${message}`);\n}\n\nexport function hasTerminalQueue(state: RuntimeState): boolean {\n return state.issues.every((issue) => TERMINAL_STATES.has(issue.state) || issue.attempts >= issue.maxAttempts);\n}\n\nexport async function scheduler(\n state: RuntimeState,\n running: Set<string>,\n runForever: boolean,\n): Promise<void> {\n if (runForever) {\n while (!shuttingDown) {\n await ensureNotStale(state, state.config.staleInProgressTimeoutMs);\n\n // Per-tick dispatch validation (spec §6.3)\n const validationError = validateDispatchConfig(state);\n if (validationError) {\n warnOncePerMessage(validationError);\n } else {\n const ready = pickNextIssues(state, running);\n const slots = state.config.workerConcurrency - running.size;\n if (slots > 0 && ready.length > 0) {\n const next = ready.slice(0, Math.max(0, slots));\n logger.debug({ slots, readyCount: ready.length, dispatching: next.map((i) => i.identifier) }, \"[Scheduler] Dispatching issues\");\n await Promise.all(next.map((issue) => runIssueOnce(state, issue, running)));\n } else if (ready.length > 0 && slots <= 0) {\n logger.debug({ runningCount: running.size, readyCount: ready.length, concurrency: state.config.workerConcurrency }, \"[Scheduler] No slots available, waiting\");\n }\n }\n state.updatedAt = now();\n const shouldPersist = hasDirtyState() || Date.now() - lastPersistAt > PERSIST_DEBOUNCE_MS;\n if (shouldPersist) {\n await persistState(state);\n lastPersistAt = Date.now();\n }\n logger.debug({ runningCount: running.size, issueCount: state.issues.length, dirty: hasDirtyState() }, \"[Scheduler] Tick completed\");\n const effectivePoll = running.size > 0 ? ACTIVE_POLL_MS : IDLE_POLL_MS;\n await Promise.race([\n sleep(effectivePoll),\n new Promise<void>((resolve) => { setWakeResolve(resolve); }),\n ]);\n setWakeResolve(null);\n }\n return;\n }\n\n while (!hasTerminalQueue(state) && !shuttingDown) {\n await ensureNotStale(state, state.config.staleInProgressTimeoutMs);\n\n const batchValidationError = validateDispatchConfig(state);\n if (batchValidationError) {\n warnOncePerMessage(batchValidationError);\n await sleep(state.config.pollIntervalMs);\n continue;\n }\n\n const ready = pickNextIssues(state, running);\n const slots = state.config.workerConcurrency - running.size;\n const next = ready.slice(0, Math.max(0, slots));\n\n if (next.length === 0 && running.size === 0) {\n if (state.issues.some((issue) => issue.state === \"Blocked\" && issue.nextRetryAt && issue.attempts < issue.maxAttempts)) {\n logger.debug(\"[Scheduler] Batch mode: waiting for blocked issues to become eligible for retry\");\n await sleep(state.config.pollIntervalMs);\n continue;\n }\n logger.debug(\"[Scheduler] Batch mode: no more work to do, exiting loop\");\n break;\n }\n\n if (next.length > 0) {\n logger.debug({ slots, dispatching: next.map((i) => i.identifier) }, \"[Scheduler] Batch mode: dispatching issues\");\n }\n await Promise.all(next.map((issue) => runIssueOnce(state, issue, running)));\n state.updatedAt = now();\n await persistState(state);\n\n if (running.size === 0) {\n await sleep(state.config.pollIntervalMs);\n }\n }\n}\n","import type { IssueEntry, RuntimeEvent, RuntimeState } from \"./types.ts\";\nimport type { PlanningSessionUsage } from \"./issue-planner.ts\";\nimport { logger } from \"./logger.ts\";\nimport { now } from \"./helpers.ts\";\nimport { getEventStateResource } from \"./store.ts\";\nimport { persistState } from \"./store.ts\";\nimport { wakeScheduler } from \"./scheduler.ts\";\n\nexport async function listEvents(\n state: RuntimeState,\n filters: { issueId?: string; kind?: string; since?: string } = {},\n): Promise<RuntimeEvent[]> {\n const eventResource = getEventStateResource();\n const { issueId, kind, since } = filters;\n\n let events: RuntimeEvent[];\n if (eventResource?.list) {\n const partition = issueId && kind ? \"byIssueIdAndKind\"\n : issueId ? \"byIssueId\"\n : kind ? \"byKind\"\n : null;\n const partitionValues = issueId && kind ? { issueId, kind }\n : issueId ? { issueId }\n : kind ? { kind }\n : {};\n events = (await eventResource.list({ partition, partitionValues, limit: 200 }))\n .map((record) => record as RuntimeEvent);\n } else {\n events = state.events.filter((event) => {\n if (issueId && event.issueId !== issueId) return false;\n if (kind && event.kind !== kind) return false;\n return true;\n });\n }\n\n return typeof since === \"string\" && since\n ? events.filter((entry) => entry.at > since)\n : events;\n}\n\nexport function findIssue(state: RuntimeState, issueId: string): IssueEntry | undefined {\n return state.issues.find((issue) => issue.id === issueId || issue.identifier === issueId);\n}\n\nexport function parseIssue(c: any): string | null {\n const value = c.req?.param ? c.req.param(\"id\") : undefined;\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\n/** Apply plan token usage to issue tracking fields */\nexport function applyPlanUsage(issue: IssueEntry, usage: PlanningSessionUsage): void {\n if (usage.totalTokens <= 0) return;\n const prev = issue.tokenUsage ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokenUsage = {\n inputTokens: prev.inputTokens + usage.inputTokens,\n outputTokens: prev.outputTokens + usage.outputTokens,\n totalTokens: prev.totalTokens + usage.totalTokens,\n model: usage.model || prev.model,\n };\n if (!issue.tokensByPhase) issue.tokensByPhase = {} as any;\n const prevPlanner = issue.tokensByPhase.planner ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByPhase.planner = {\n inputTokens: prevPlanner.inputTokens + usage.inputTokens,\n outputTokens: prevPlanner.outputTokens + usage.outputTokens,\n totalTokens: prevPlanner.totalTokens + usage.totalTokens,\n model: usage.model || prevPlanner.model,\n };\n if (!issue.tokensByModel) issue.tokensByModel = {};\n const model = usage.model || \"unknown\";\n const prevModel = issue.tokensByModel[model] ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByModel[model] = {\n inputTokens: prevModel.inputTokens + usage.inputTokens,\n outputTokens: prevModel.outputTokens + usage.outputTokens,\n totalTokens: prevModel.totalTokens + usage.totalTokens,\n model,\n };\n if (!issue.usage) issue.usage = { tokens: {} };\n issue.usage.tokens[model] = (issue.usage.tokens[model] || 0) + usage.totalTokens;\n}\n\n/** Apply plan suggestions to issue (paths, labels, effort) */\nexport function applyPlanSuggestions(issue: IssueEntry, plan: import(\"./types.ts\").IssuePlan): void {\n if (plan.suggestedPaths?.length && !(issue.paths?.length)) issue.paths = plan.suggestedPaths;\n if (plan.suggestedLabels?.length && !issue.labels?.length) issue.labels = plan.suggestedLabels;\n if (plan.suggestedEffort && !issue.effort) issue.effort = plan.suggestedEffort;\n}\n\nexport async function mutateIssueState(\n state: RuntimeState,\n c: any,\n updater: (issue: IssueEntry) => Promise<void> | void,\n): Promise<any> {\n const issueId = parseIssue(c);\n if (!issueId) {\n return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n }\n\n const issue = findIssue(state, issueId);\n if (!issue) {\n return c.json({ ok: false, error: \"Issue not found\" }, 404);\n }\n\n try {\n await updater(issue);\n await persistState(state);\n wakeScheduler();\n return c.json({ ok: true, issue });\n } catch (error) {\n logger.error({ err: error, issueId }, \"[API] mutateIssueState failed\");\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync, readdirSync, realpathSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { env } from \"node:process\";\nimport { logger } from \"./logger.ts\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface ModelInfo {\n slug: string;\n displayName: string;\n description: string;\n}\n\ninterface UsagePeriod {\n inputTokens: number;\n outputTokens: number;\n tokensUsed: number;\n sessions: number;\n since: string;\n}\n\ninterface ProviderUsage {\n name: string;\n available: boolean;\n models: ModelInfo[];\n currentModel: string;\n usage: {\n today: UsagePeriod;\n thisWeek: UsagePeriod;\n allTime: UsagePeriod;\n };\n resetInfo: string;\n nextResetAt: string;\n weeklyLimitEstimate: number | null;\n percentUsed: number | null;\n}\n\ninterface ProvidersUsageResult {\n providers: ProviderUsage[];\n collectedAt: string;\n}\n\nfunction resolveCodexHomeCandidates(): string[] {\n const homePaths = new Set<string>([\n homedir(),\n env.XDG_STATE_HOME?.trim() || \"\",\n env.XDG_DATA_HOME?.trim() || \"\",\n ]);\n\n const sudoUser = env.SUDO_USER?.trim();\n if (sudoUser && sudoUser !== \"root\") {\n homePaths.add(`/home/${sudoUser}`);\n }\n\n const direct = new Set<string>([\n env.CODEX_HOME?.trim() || \"\",\n ]);\n\n const candidates = [...homePaths, ...direct]\n .filter(Boolean)\n .flatMap((candidate) => {\n if (candidate.endsWith(\"/.codex\") || candidate.endsWith(\"/codex\")) return [candidate];\n return [join(candidate, \".codex\"), join(candidate, \"codex\")];\n });\n\n return [...new Set(candidates)];\n}\n\nfunction resolveCodexDir(): string | null {\n for (const candidate of resolveCodexHomeCandidates()) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction findLatestCodexDb(codexDir: string): string | null {\n const explicit = join(codexDir, \"state_5.sqlite\");\n if (existsSync(explicit)) return explicit;\n\n const candidates = readdirSync(codexDir)\n .filter((name) => name.startsWith(\"state_\") && name.endsWith(\".sqlite\"))\n .sort()\n .reverse();\n\n if (candidates.length === 0) return null;\n return join(codexDir, candidates[0]);\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction computeNextMonday(): Date {\n const now = new Date();\n const utcDay = now.getUTCDay();\n const daysUntilMonday = utcDay === 0 ? 1 : utcDay === 1 ? 7 : 8 - utcDay;\n const next = new Date(now);\n next.setUTCDate(next.getUTCDate() + daysUntilMonday);\n next.setUTCHours(0, 0, 0, 0);\n return next;\n}\n\nfunction computeWeekStart(): Date {\n const d = new Date();\n d.setUTCHours(0, 0, 0, 0);\n const utcDay = d.getUTCDay();\n const daysFromMonday = utcDay === 0 ? 6 : utcDay - 1;\n d.setUTCDate(d.getUTCDate() - daysFromMonday);\n return d;\n}\n\nfunction computeTodayStart(): Date {\n const d = new Date();\n d.setUTCHours(0, 0, 0, 0);\n return d;\n}\n\nfunction makePeriod(input: number, output: number, sessions: number, since: string): UsagePeriod {\n return { inputTokens: input, outputTokens: output, tokensUsed: input + output, sessions, since };\n}\n\n// Known weekly token limits per plan (approximate, based on public info)\nconst CLAUDE_PLAN_LIMITS: Record<string, number> = {\n pro: 45_000_000, // ~45M tokens/week (Pro plan estimate)\n max: 135_000_000, // ~135M tokens/week (Max plan)\n max5x: 675_000_000, // ~675M tokens/week (Max 5x plan)\n};\n\n// ── Claude usage (from JSONL session files) ──────────────────────────────────\n\nfunction collectClaudeUsage(): ProviderUsage | null {\n const home = homedir();\n const claudeDir = join(home, \".claude\");\n if (!existsSync(claudeDir)) return null;\n\n // Check if Claude CLI is available\n let available = false;\n try {\n execSync(\"which claude\", { encoding: \"utf8\", timeout: 3000 });\n available = true;\n } catch {}\n\n // Aggregate token usage from all project session files\n const projectsDir = join(claudeDir, \"projects\");\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalSessions = 0;\n let todayInputTokens = 0;\n let todayOutputTokens = 0;\n let todaySessions = 0;\n let weekInputTokens = 0;\n let weekOutputTokens = 0;\n let weekSessions = 0;\n\n const todayStart = computeTodayStart();\n const todayMs = todayStart.getTime();\n const weekStart = computeWeekStart();\n const weekMs = weekStart.getTime();\n\n if (existsSync(projectsDir)) {\n try {\n const projectDirs = readdirSync(projectsDir, { withFileTypes: true });\n for (const dir of projectDirs) {\n if (!dir.isDirectory()) continue;\n const projectPath = join(projectsDir, dir.name);\n\n let sessionFiles: string[];\n try {\n sessionFiles = readdirSync(projectPath)\n .filter((f) => f.endsWith(\".jsonl\"));\n } catch {\n continue;\n }\n\n for (const file of sessionFiles) {\n const filePath = join(projectPath, file);\n let content: string;\n try {\n content = readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n\n let sessionCounted = false;\n let sessionTodayCounted = false;\n let sessionWeekCounted = false;\n\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const entry = JSON.parse(line);\n if (entry.type !== \"assistant\" || !entry.message?.usage) continue;\n\n const usage = entry.message.usage;\n // Only count actual billed tokens — cache reads are free/cheap\n const inputTokens = (usage.input_tokens || 0) +\n (usage.cache_creation_input_tokens || 0);\n const outputTokens = usage.output_tokens || 0;\n\n totalInputTokens += inputTokens;\n totalOutputTokens += outputTokens;\n if (!sessionCounted) {\n totalSessions++;\n sessionCounted = true;\n }\n\n const timestamp = entry.timestamp ? new Date(entry.timestamp).getTime() : 0;\n\n if (timestamp >= todayMs) {\n todayInputTokens += inputTokens;\n todayOutputTokens += outputTokens;\n if (!sessionTodayCounted) {\n todaySessions++;\n sessionTodayCounted = true;\n }\n }\n\n if (timestamp >= weekMs) {\n weekInputTokens += inputTokens;\n weekOutputTokens += outputTokens;\n if (!sessionWeekCounted) {\n weekSessions++;\n sessionWeekCounted = true;\n }\n }\n } catch {}\n }\n }\n }\n } catch (err) {\n logger.debug(`Failed to read Claude session files: ${String(err)}`);\n }\n }\n\n // Claude models (known models for Claude Code)\n const models: ModelInfo[] = [\n { slug: \"claude-opus-4-6\", displayName: \"Claude Opus 4.6\", description: \"Most capable model for complex tasks\" },\n { slug: \"claude-sonnet-4-6\", displayName: \"Claude Sonnet 4.6\", description: \"Balanced performance and speed\" },\n { slug: \"claude-haiku-4-5\", displayName: \"Claude Haiku 4.5\", description: \"Fast and efficient model\" },\n ];\n\n // Detect subscription type and configured model from settings\n let plan = \"pro\";\n let resetInfo = \"Weekly reset (every Monday 00:00 UTC)\";\n let currentModel = \"\";\n const settingsPath = join(claudeDir, \"settings.json\");\n if (existsSync(settingsPath)) {\n try {\n const settings = JSON.parse(readFileSync(settingsPath, \"utf8\"));\n if (settings.plan === \"max\" || settings.plan === \"max5x\") {\n plan = settings.plan;\n resetInfo = `Plan: ${settings.plan.toUpperCase()} — Weekly token limit resets every Monday 00:00 UTC`;\n }\n if (typeof settings.model === \"string\" && settings.model.trim()) {\n currentModel = settings.model.trim();\n }\n } catch {}\n }\n\n const nextResetAt = computeNextMonday().toISOString();\n const weeklyLimit = CLAUDE_PLAN_LIMITS[plan] ?? null;\n const weeklyUsed = weekInputTokens + weekOutputTokens;\n const percentUsed = weeklyLimit ? Math.min(100, Math.round((weeklyUsed / weeklyLimit) * 100)) : null;\n\n return {\n name: \"claude\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(todayInputTokens, todayOutputTokens, todaySessions, todayStart.toISOString()),\n thisWeek: makePeriod(weekInputTokens, weekOutputTokens, weekSessions, weekStart.toISOString()),\n allTime: makePeriod(totalInputTokens, totalOutputTokens, totalSessions, \"\"),\n },\n resetInfo,\n nextResetAt,\n weeklyLimitEstimate: weeklyLimit,\n percentUsed,\n };\n}\n\n// ── Codex usage (from SQLite state DB) ───────────────────────────────────────\n\nfunction collectCodexUsage(): ProviderUsage | null {\n const codexDir = resolveCodexDir();\n if (!codexDir) return null;\n\n let available = false;\n try {\n execSync(\"which codex\", { encoding: \"utf8\", timeout: 3000 });\n available = true;\n } catch {}\n\n // Read models from cache\n const models: ModelInfo[] = [];\n const modelsCachePath = join(codexDir, \"models_cache.json\");\n let currentModel = \"\";\n\n if (existsSync(modelsCachePath)) {\n try {\n const cache = JSON.parse(readFileSync(modelsCachePath, \"utf8\"));\n for (const m of cache.models || []) {\n models.push({\n slug: m.slug,\n displayName: m.display_name || m.slug,\n description: (m.description || \"\").slice(0, 80),\n });\n }\n } catch {}\n }\n\n // Read current model from config\n const configPath = join(codexDir, \"config.toml\");\n if (existsSync(configPath)) {\n try {\n const configContent = readFileSync(configPath, \"utf8\");\n const modelMatch = configContent.match(/^model\\s*=\\s*\"([^\"]+)\"/m);\n if (modelMatch) currentModel = modelMatch[1];\n } catch {}\n }\n\n const todayStart = computeTodayStart();\n const weekStart = computeWeekStart();\n const nextResetAt = computeNextMonday().toISOString();\n\n // Find the right SQLite file\n const dbPath = findLatestCodexDb(codexDir);\n if (!dbPath) {\n return {\n name: \"codex\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(0, 0, 0, todayStart.toISOString()),\n thisWeek: makePeriod(0, 0, 0, weekStart.toISOString()),\n allTime: makePeriod(0, 0, 0, \"\"),\n },\n resetInfo: \"Weekly rate limit resets every Monday\",\n nextResetAt,\n weeklyLimitEstimate: null,\n percentUsed: null,\n };\n }\n\n let allTimeTokens = 0;\n let allTimeSessions = 0;\n let todayTokens = 0;\n let todaySessions = 0;\n let weekTokens = 0;\n let weekSessions = 0;\n\n const todayUnix = Math.floor(todayStart.getTime() / 1000);\n const weekUnix = Math.floor(weekStart.getTime() / 1000);\n\n try {\n const query = `\n SELECT\n SUM(tokens_used) as total_tokens,\n COUNT(*) as total_sessions,\n SUM(CASE WHEN created_at >= ${todayUnix} THEN tokens_used ELSE 0 END) as today_tokens,\n SUM(CASE WHEN created_at >= ${todayUnix} THEN 1 ELSE 0 END) as today_sessions,\n SUM(CASE WHEN created_at >= ${weekUnix} THEN tokens_used ELSE 0 END) as week_tokens,\n SUM(CASE WHEN created_at >= ${weekUnix} THEN 1 ELSE 0 END) as week_sessions\n FROM threads;\n `;\n const result = execSync(`sqlite3 \"${dbPath}\" \"${query}\"`, {\n encoding: \"utf8\",\n timeout: 5000,\n }).trim();\n\n if (result) {\n const parts = result.split(\"|\");\n allTimeTokens = parseInt(parts[0], 10) || 0;\n allTimeSessions = parseInt(parts[1], 10) || 0;\n todayTokens = parseInt(parts[2], 10) || 0;\n todaySessions = parseInt(parts[3], 10) || 0;\n weekTokens = parseInt(parts[4], 10) || 0;\n weekSessions = parseInt(parts[5], 10) || 0;\n }\n } catch (err) {\n logger.debug(`Failed to query Codex SQLite: ${String(err)}`);\n }\n\n // Codex doesn't expose input/output split from SQLite, report all as input\n return {\n name: \"codex\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(todayTokens, 0, todaySessions, todayStart.toISOString()),\n thisWeek: makePeriod(weekTokens, 0, weekSessions, weekStart.toISOString()),\n allTime: makePeriod(allTimeTokens, 0, allTimeSessions, \"\"),\n },\n resetInfo: \"Weekly rate limit resets every Monday\",\n nextResetAt,\n weeklyLimitEstimate: null,\n percentUsed: null,\n };\n}\n\n// ── Gemini usage (stub — CLI has no local usage DB yet) ───────────────────────\n\nfunction collectGeminiUsage(): ProviderUsage | null {\n let available = false;\n try {\n execSync(\"which gemini\", { encoding: \"utf8\", timeout: 3000 });\n available = true;\n } catch {}\n\n if (!available) return null;\n\n const todayStart = computeTodayStart();\n const weekStart = computeWeekStart();\n const nextResetAt = computeNextMonday().toISOString();\n\n // Read models from the installed CLI package (same source as discoverModels)\n const models: ModelInfo[] = [];\n try {\n const binPath = execSync(\"which gemini\", { encoding: \"utf8\", timeout: 3000 }).trim();\n const realBin = realpathSync(binPath);\n const modelsPath = join(dirname(dirname(realBin)), \"node_modules\", \"@google\", \"gemini-cli-core\", \"dist\", \"src\", \"config\", \"models.js\");\n if (existsSync(modelsPath)) {\n const content = readFileSync(modelsPath, \"utf8\");\n const regex = /export const ([A-Z0-9_]+)\\s*=\\s*'(gemini-[^']+)';/g;\n const seen = new Set<string>();\n let m: RegExpExecArray | null;\n while ((m = regex.exec(content)) !== null) {\n const [, constName, slug] = m;\n if (seen.has(slug) || slug.includes(\"embedding\")) continue;\n seen.add(slug);\n models.push({\n slug,\n displayName: slug,\n description: constName.startsWith(\"PREVIEW_\") ? \"Preview\" : \"Stable\",\n });\n }\n }\n } catch { /* fall through — models stays empty */ }\n\n let currentModel = \"\";\n const settingsPath = join(homedir(), \".gemini\", \"settings.json\");\n if (existsSync(settingsPath)) {\n try {\n const settings = JSON.parse(readFileSync(settingsPath, \"utf8\"));\n if (typeof settings.model === \"string\" && settings.model.trim()) {\n currentModel = settings.model.trim();\n }\n } catch {}\n }\n\n return {\n name: \"gemini\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(0, 0, 0, todayStart.toISOString()),\n thisWeek: makePeriod(0, 0, 0, weekStart.toISOString()),\n allTime: makePeriod(0, 0, 0, \"\"),\n },\n resetInfo: \"Usage data not available for Gemini CLI\",\n nextResetAt,\n weeklyLimitEstimate: null,\n percentUsed: null,\n };\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\nexport function collectProvidersUsage(): ProvidersUsageResult {\n const providers: ProviderUsage[] = [];\n\n const claude = collectClaudeUsage();\n if (claude) providers.push(claude);\n\n const codex = collectCodexUsage();\n if (codex) providers.push(codex);\n\n const gemini = collectGeminiUsage();\n if (gemini) providers.push(gemini);\n\n return {\n providers,\n collectedAt: new Date().toISOString(),\n };\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport { isoWeek, now } from \"../helpers.ts\";\nimport { logger } from \"../logger.ts\";\nimport { persistState } from \"../store.ts\";\nimport { markIssueDirty } from \"../dirty-tracker.ts\";\nimport {\n addEvent,\n computeCapabilityCounts,\n computeMetrics,\n createIssueFromPayload,\n handleStatePatch,\n transitionIssueState,\n triggerReplan,\n} from \"../issues.ts\";\nimport { wakeScheduler } from \"../scheduler.ts\";\nimport { ATTACHMENTS_ROOT, TERMINAL_STATES, TARGET_ROOT } from \"../constants.ts\";\nimport { isAgentStillRunning, mergeWorkspace } from \"../agent.ts\";\nimport { readAgentPid } from \"../pid-manager.ts\";\nimport { findIssue, mutateIssueState, parseIssue } from \"../api-helpers.ts\";\nimport { cleanWorkspace } from \"../workspace-setup.ts\";\nimport { detectAvailableProviders } from \"../providers.ts\";\nimport { analyzeParallelizability } from \"../scheduler.ts\";\nimport { collectProvidersUsage } from \"../providers-usage.ts\";\nimport { existsSync, mkdirSync, renameSync, writeFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { execSync } from \"node:child_process\";\nimport { basename, extname, join } from \"node:path\";\n\nexport function registerStateRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/state\", async (c: any) => {\n const showAll = c.req.query(\"all\") === \"1\";\n let issues = state.issues;\n\n if (!showAll) {\n // Default: active issues + terminal from this week and last week\n const thisWeek = isoWeek();\n const lastWeekDate = new Date();\n lastWeekDate.setUTCDate(lastWeekDate.getUTCDate() - 7);\n const lastWeek = isoWeek(lastWeekDate);\n const recentWeeks = new Set([thisWeek, lastWeek]);\n\n issues = state.issues.filter((i) => {\n if (!i.terminalWeek) return true; // active issue\n return recentWeeks.has(i.terminalWeek);\n });\n }\n\n return c.json({\n ...state,\n issues,\n capabilities: computeCapabilityCounts(issues),\n metrics: computeMetrics(issues),\n _filter: showAll ? \"all\" : \"recent\",\n _totalIssues: state.issues.length,\n });\n });\n\n app.get(\"/api/status\", async (c: any) =>\n c.json({\n status: \"ok\",\n updatedAt: state.updatedAt,\n config: state.config,\n trackerKind: state.trackerKind,\n }),\n );\n\n app.get(\"/api/providers\", async (c: any) => {\n const providers = detectAvailableProviders();\n return c.json({ providers });\n });\n\n app.get(\"/api/parallelism\", async (c: any) => {\n return c.json(analyzeParallelizability(state.issues));\n });\n\n app.get(\"/api/providers/usage\", async (c: any) => {\n try {\n const usage = collectProvidersUsage();\n return c.json(usage);\n } catch (error) {\n logger.error({ err: error }, \"Failed to collect providers usage\");\n return c.json({ providers: [] }, 500);\n }\n });\n\n app.post(\"/api/issues/create\", async (c: any) => {\n try {\n const payload = await c.req.json();\n logger.info({ title: (payload.title ?? \"\").toString().slice(0, 80) }, \"[API] POST /api/issues/create\");\n const issue = createIssueFromPayload(payload, state.issues, state.config.defaultBranch);\n\n // Move temp attachment files to permanent issue directory\n const tempImages = Array.isArray(payload.images) ? payload.images as string[] : [];\n if (tempImages.length) {\n const issueAttachDir = join(ATTACHMENTS_ROOT, issue.id);\n mkdirSync(issueAttachDir, { recursive: true });\n const finalPaths: string[] = [];\n for (const tempPath of tempImages) {\n if (typeof tempPath === \"string\" && existsSync(tempPath)) {\n const dest = join(issueAttachDir, basename(tempPath));\n try { renameSync(tempPath, dest); finalPaths.push(dest); } catch { finalPaths.push(tempPath); }\n }\n }\n if (finalPaths.length) issue.images = finalPaths;\n }\n\n state.issues.push(issue);\n markIssueDirty(issue.id);\n addEvent(state, issue.id, \"info\", `Issue ${issue.identifier} created via API.`);\n if (issue.plan) {\n addEvent(state, issue.id, \"info\", `Plan: ${issue.plan.steps.length} steps, complexity: ${issue.plan.estimatedComplexity}.`);\n }\n await persistState(state);\n wakeScheduler();\n return c.json({ ok: true, issue }, 201);\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 400);\n }\n });\n\n app.post(\"/api/issues/:id/state\", async (c: any) => {\n const issueId = parseIssue(c);\n if (!issueId) {\n return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n }\n\n const issue = findIssue(state, issueId);\n if (!issue) {\n return c.json({ ok: false, error: \"Issue not found\" }, 404);\n }\n\n try {\n const payload = await c.req.json();\n logger.info({ issueId, identifier: issue.identifier, targetState: payload.state }, \"[API] POST /api/issues/:id/state\");\n await handleStatePatch(state, issue, payload);\n await persistState(state);\n wakeScheduler();\n return c.json({ ok: true, issue });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 400);\n }\n });\n\n app.post(\"/api/issues/:id/retry\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/retry\");\n return mutateIssueState(state, c, async (issue) => {\n if (TERMINAL_STATES.has(issue.state)) {\n await transitionIssueState(issue, \"Queued\", \"Manual retry requested.\");\n } else {\n issue.lastError = undefined;\n issue.nextRetryAt = undefined;\n issue.updatedAt = now();\n }\n addEvent(state, issue.id, \"manual\", `Manual retry requested for ${issue.id}.`);\n });\n });\n\n app.post(\"/api/issues/:id/cancel\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/cancel\");\n return mutateIssueState(state, c, async (issue) => {\n // Kill running agent process if one exists\n const pidInfo = issue.workspacePath ? readAgentPid(issue.workspacePath) : null;\n if (pidInfo) {\n try {\n process.kill(-pidInfo.pid, \"SIGTERM\");\n logger.info({ pid: pidInfo.pid, issueId: issue.id }, \"[API] Sent SIGTERM to agent process group\");\n } catch {\n try { process.kill(pidInfo.pid, \"SIGTERM\"); } catch {}\n }\n }\n issue.cancelledReason = \"Manually cancelled by user.\";\n await transitionIssueState(issue, \"Cancelled\", \"Manual cancel requested.\");\n addEvent(state, issue.id, \"manual\", `Manual cancel requested for ${issue.id}.`);\n });\n });\n\n app.post(\"/api/issues/:id/approve\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/approve\");\n return mutateIssueState(state, c, async (issue) => {\n if (issue.state !== \"Planning\") {\n throw new Error(`Cannot approve issue in state ${issue.state}. Must be in Planning.`);\n }\n await transitionIssueState(issue, \"Planned\", `Plan approved for ${issue.identifier}. Ready for execution.`);\n addEvent(state, issue.id, \"state\", `Plan approved — ${issue.identifier} moved to Planned.`);\n });\n });\n\n app.post(\"/api/issues/:id/execute\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/execute\");\n return mutateIssueState(state, c, async (issue) => {\n if (issue.state !== \"Planned\") {\n throw new Error(`Cannot execute issue in state ${issue.state}. Must be in Planned.`);\n }\n await transitionIssueState(issue, \"Queued\", `Execution requested for ${issue.identifier}.`);\n addEvent(state, issue.id, \"state\", `Execute requested — ${issue.identifier} moved to Queued.`);\n wakeScheduler();\n });\n });\n\n app.post(\"/api/issues/:id/replan\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/replan\");\n return mutateIssueState(state, c, async (issue) => {\n if (issue.planningStatus === \"planning\") {\n throw new Error(\"Cannot replan while planning is in progress.\");\n }\n if (TERMINAL_STATES.has(issue.state)) {\n throw new Error(`Cannot replan issue in terminal state ${issue.state}.`);\n }\n if (issue.state === \"Running\" || issue.state === \"Reviewing\" || issue.state === \"Queued\") {\n throw new Error(`Cannot replan issue in ${issue.state} state — wait for it to finish or cancel it first.`);\n }\n triggerReplan(issue);\n wakeScheduler();\n addEvent(state, issue.id, \"manual\", `Replan requested for ${issue.identifier} — now at plan v${issue.planVersion}.`);\n });\n });\n\n app.post(\"/api/issues/:id/merge\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/merge\");\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n if (![\"Done\", \"Reviewing\", \"Reviewed\"].includes(issue.state)) {\n return c.json({ ok: false, error: `Issue ${issue.identifier} is in state ${issue.state}. Merge is only allowed in Reviewing, Reviewed, or Done state.` }, 409);\n }\n // Auto-transition to Done if still in review\n if (issue.state === \"Reviewing\" || issue.state === \"Reviewed\") {\n await transitionIssueState(issue, \"Done\", `Approved and merged by user.`);\n addEvent(state, issue.id, \"state\", `${issue.identifier} approved — moved to Done before merge.`);\n }\n const wp = issue.worktreePath ?? issue.workspacePath;\n if (!wp || !existsSync(wp)) {\n return c.json({ ok: false, error: \"No workspace found for this issue.\" }, 400);\n }\n // Compute line stats from git diff before merge\n if (issue.branchName && issue.baseBranch) {\n try {\n const stat = execSync(\n `git diff --shortstat \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { encoding: \"utf8\", cwd: TARGET_ROOT, stdio: \"pipe\", timeout: 10_000 },\n );\n const addMatch = stat.match(/(\\d+) insertion/);\n const delMatch = stat.match(/(\\d+) deletion/);\n const filesMatch = stat.match(/(\\d+) file/);\n issue.linesAdded = addMatch ? parseInt(addMatch[1], 10) : 0;\n issue.linesRemoved = delMatch ? parseInt(delMatch[1], 10) : 0;\n issue.filesChanged = filesMatch ? parseInt(filesMatch[1], 10) : 0;\n } catch { /* non-critical */ }\n }\n // If a prior \"try\" squash was applied (staged but not committed), reset it cleanly\n // before the real git merge --no-ff. Only reset if the index is dirty but working tree is clean,\n // which is exactly the state left by git merge --squash.\n try {\n const indexStatus = execSync(\"git diff --cached --name-only\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim();\n const wtStatus = execSync(\"git diff --name-only\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim();\n if (indexStatus && !wtStatus) {\n // Staged-only changes → residual squash → hard reset so merge --no-ff can proceed cleanly\n execSync(\"git reset --hard HEAD\", { cwd: TARGET_ROOT, stdio: \"pipe\" });\n logger.info({ issueId: issue.id }, \"[API] Cleared residual squash from index before merge\");\n }\n } catch { /* non-critical */ }\n\n const result = mergeWorkspace(issue);\n issue.mergeResult = {\n copied: result.copied.length,\n deleted: result.deleted.length,\n skipped: result.skipped.length,\n conflicts: result.conflicts.length,\n };\n if (result.conflicts.length === 0) {\n issue.mergedAt = now();\n if (!issue.mergedReason) issue.mergedReason = \"Merged by user via PreviewModal.\";\n // Cleanup worktree + branch after successful merge\n if (issue.workspacePath) {\n try {\n await cleanWorkspace(issue.id, issue, state);\n issue.workspacePath = undefined as any;\n issue.worktreePath = undefined as any;\n } catch { /* non-critical */ }\n }\n }\n const conflictMsg = result.conflicts.length > 0\n ? ` ${result.conflicts.length} conflict(s): ${result.conflicts.join(\", \")}.`\n : \"\";\n addEvent(state, issue.id, \"merge\", `Workspace merged: ${result.copied.length} file(s) copied, ${result.deleted.length} deleted.${conflictMsg}`);\n if (result.conflicts.length > 0) {\n addEvent(state, issue.id, \"error\", `Merge conflicts: ${result.conflicts.join(\", \")}`);\n }\n await persistState(state);\n return c.json({ ok: true, ...result });\n } catch (error) {\n const issueId = parseIssue(c);\n logger.error(`Failed to merge workspace for ${issueId || \"<unknown>\"}: ${String(error)}`);\n return c.json({ ok: false, error: String(error) }, 500);\n }\n });\n\n app.post(\"/api/issues/:id/try\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/try\");\n return mutateIssueState(state, c, async (issue) => {\n if (![\"Reviewing\", \"Reviewed\"].includes(issue.state)) {\n throw new Error(`Cannot apply test for issue in state ${issue.state}.`);\n }\n if (!issue.branchName) {\n throw new Error(\"No branch name found for this issue.\");\n }\n try {\n execSync(\n `git merge --squash \"${issue.branchName}\"`,\n { encoding: \"utf8\", cwd: TARGET_ROOT, stdio: \"pipe\", timeout: 30_000 },\n );\n } catch (err: any) {\n const msg = err.stderr || err.stdout || String(err);\n throw new Error(`git merge --squash failed: ${msg}`);\n }\n addEvent(state, issue.id, \"manual\", `Test squash applied to workspace: git merge --squash ${issue.branchName}`);\n });\n });\n\n app.post(\"/api/issues/:id/revert-try\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/revert-try\");\n return mutateIssueState(state, c, async (issue) => {\n try {\n execSync(\"git reset --hard HEAD\", { cwd: TARGET_ROOT, stdio: \"pipe\", timeout: 15_000 });\n execSync(\"git clean -fd\", { cwd: TARGET_ROOT, stdio: \"pipe\", timeout: 15_000 });\n } catch (err: any) {\n const msg = err.stderr || err.stdout || String(err);\n throw new Error(`git reset/clean failed: ${msg}`);\n }\n addEvent(state, issue.id, \"manual\", `Test reverted: git reset --hard HEAD && git clean -fd`);\n });\n });\n\n app.post(\"/api/issues/:id/rollback\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/rollback\");\n return mutateIssueState(state, c, async (issue) => {\n if (![\"Reviewing\", \"Reviewed\", \"Done\"].includes(issue.state)) {\n throw new Error(`Cannot rollback issue in state ${issue.state}. Must be in Reviewing, Reviewed, or Done.`);\n }\n if (issue.workspacePath) {\n try {\n await cleanWorkspace(issue.id, issue, state);\n issue.workspacePath = undefined as any;\n issue.worktreePath = undefined as any;\n } catch (error) {\n logger.warn({ err: error }, `[API] Workspace cleanup failed during rollback for ${issue.id}`);\n }\n }\n await transitionIssueState(issue, \"Queued\", \"Rolled back by user — worktree removed.\");\n addEvent(state, issue.id, \"manual\", `${issue.identifier} rolled back. Worktree and branch removed.`);\n wakeScheduler();\n });\n });\n\n app.post(\"/api/issues/:id/images\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n\n const payload = await c.req.json() as { files?: Array<{ name: string; data: string; type: string }> };\n if (!Array.isArray(payload.files) || payload.files.length === 0) {\n return c.json({ ok: false, error: \"No files provided.\" }, 400);\n }\n\n const issueAttachDir = join(ATTACHMENTS_ROOT, issue.id);\n mkdirSync(issueAttachDir, { recursive: true });\n const newPaths: string[] = [];\n for (const file of payload.files) {\n if (typeof file.data !== \"string\" || !file.name) continue;\n const safeExt = extname(file.name).replace(/[^a-z0-9.]/gi, \"\").slice(0, 10) || \".bin\";\n const safeName = `${randomUUID()}${safeExt}`;\n const dest = join(issueAttachDir, safeName);\n writeFileSync(dest, Buffer.from(file.data, \"base64\"));\n newPaths.push(dest);\n }\n\n issue.images = [...(issue.images ?? []), ...newPaths];\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n await persistState(state);\n return c.json({ ok: true, paths: newPaths, issue });\n } catch (error) {\n logger.error({ err: error }, \"[API] Issue image upload failed\");\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/issues/:id/images/:filename\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const filename = c.req.param?.(\"filename\") ?? c.req.params?.filename ?? \"\";\n if (!filename) return c.json({ ok: false, error: \"Filename is required.\" }, 400);\n const safeName = basename(filename);\n const filePath = join(ATTACHMENTS_ROOT, issueId, safeName);\n if (!existsSync(filePath)) return c.json({ ok: false, error: \"Image not found.\" }, 404);\n const ext = extname(safeName).toLowerCase();\n const mimeMap: Record<string, string> = {\n \".png\": \"image/png\", \".jpg\": \"image/jpeg\", \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\", \".webp\": \"image/webp\", \".svg\": \"image/svg+xml\",\n };\n const mime = mimeMap[ext] ?? \"application/octet-stream\";\n const { readFileSync } = await import(\"node:fs\");\n const data = readFileSync(filePath);\n return new Response(data, { headers: { \"Content-Type\": mime, \"Cache-Control\": \"private, max-age=86400\" } });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/refresh\", async (c: any) => {\n addEvent(state, undefined, \"manual\", \"Manual refresh requested via API.\");\n await persistState(state);\n return c.json({ queued: true, requestedAt: now() }, 202);\n });\n}\n","import { appendFileTail, extractJsonObjects } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { detectAvailableProviders, normalizeAgentProvider, resolveAgentCommand } from \"./providers.ts\";\nimport type { RuntimeConfig } from \"./types.ts\";\nimport { renderPrompt } from \"../prompting.ts\";\nimport { env } from \"node:process\";\nimport { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\n\nexport type EnhancementField = \"title\" | \"description\";\n\ntype EnhanceIssuePayload = {\n field: EnhancementField;\n title: string;\n description: string;\n issueType?: string;\n images?: string[];\n provider?: string;\n preferredProvider?: string;\n};\n\ntype EnhanceResult = {\n field: EnhancementField;\n value: string;\n provider: string;\n};\n\nfunction getProviderCommand(\n provider: string,\n config: RuntimeConfig,\n): string {\n return resolveAgentCommand(provider, config.agentCommand || \"\", \"\", \"\");\n}\n\nasync function buildPrompt(field: EnhancementField, title: string, description: string, issueType?: string, images?: string[]): Promise<string> {\n const context = {\n title: title || \"(empty)\",\n description: description || \"(empty)\",\n issueType: issueType || \"blank\",\n images: images?.length ? images : undefined,\n };\n\n if (field === \"title\") {\n return renderPrompt(\"issue-enhancer-title\", context);\n }\n\n return renderPrompt(\"issue-enhancer-description\", context);\n}\n\nfunction parseEnhancerOutput(raw: string, expectedField: EnhancementField): string {\n const text = raw.trim();\n if (!text) {\n throw new Error(\"AI provider returned an empty response.\");\n }\n\n const candidates = extractJsonObjects(\n text.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i)?.[1]?.trim() ?? text,\n );\n for (const candidate of candidates) {\n const value = parseCandidate(candidate, expectedField);\n if (value) return value;\n }\n\n const cleanedRaw = text.trim();\n const trimmed = cleanedRaw.replace(/^\\\"|\\\"$/g, \"\").trim();\n if (trimmed) {\n const candidatesFromRaw = extractJsonObjects(trimmed);\n for (const candidate of candidatesFromRaw) {\n const value = parseCandidate(candidate, expectedField);\n if (value) return value;\n }\n }\n\n const fallback = cleanedRaw.replace(/^`+\\s*|\\s*`+$/g, \"\").trim();\n if (!fallback) {\n throw new Error(\"AI provider response could not be parsed.\");\n }\n return fallback;\n}\n\nfunction parseCandidate(raw: string, expectedField: EnhancementField): string {\n const candidate = raw.trim();\n if (!candidate) return \"\";\n\n try {\n const parsed = JSON.parse(candidate) as {\n field?: string;\n value?: unknown;\n text?: unknown;\n result?: unknown;\n };\n const value =\n typeof parsed.value === \"string\" ? parsed.value.trim() :\n typeof parsed.text === \"string\" ? parsed.text.trim() :\n \"\";\n const field = parsed.field;\n const isPlaceholder = /^\\.{2,}$/.test(value);\n if (value && !isPlaceholder && (!field || field === expectedField)) {\n return value;\n }\n if (typeof parsed.result === \"string\") {\n const nested = parsed.result.trim();\n if (nested) {\n const nestedClean = nested.replace(/^```(?:json)?\\s*|\\s*```$/g, \"\").trim();\n for (const nestedCandidate of extractJsonObjects(nestedClean)) {\n const parsedNested = parseCandidate(nestedCandidate, expectedField);\n if (parsedNested) return parsedNested;\n }\n }\n }\n } catch {\n // ignore parse errors for heuristic parsing\n }\n return \"\";\n}\n\nfunction readProviderOutput(resultFile: string, fallback: string): string {\n if (existsSync(resultFile)) {\n try {\n return readFileSync(resultFile, \"utf8\").trim();\n } catch {\n // ignore, keep fallback\n }\n }\n return fallback;\n}\n\nasync function runProviderCommand(\n command: string,\n provider: string,\n prompt: string,\n title: string,\n description: string,\n field: EnhancementField,\n timeoutMs: number,\n images?: string[],\n): Promise<string> {\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-enhance-\"));\n const promptFile = join(tempDir, \"fifony-enhance-prompt.md\");\n const issuePayloadFile = join(tempDir, \"fifony-issue.json\");\n const resultFile = join(tempDir, \"fifony-result.txt\");\n writeFileSync(promptFile, `${prompt}\\n`, \"utf8\");\n writeFileSync(issuePayloadFile, JSON.stringify({ title, description, field }, null, 2), \"utf8\");\n\n // For Codex: inject --image flags before the stdin redirect\n let effectiveCommand = command;\n if (provider === \"codex\" && images?.length) {\n const imageFlags = images.map((p) => `--image \"${p}\"`).join(\" \");\n effectiveCommand = command.replace('< \"$FIFONY_PROMPT_FILE\"', `${imageFlags} < \"$FIFONY_PROMPT_FILE\"`);\n }\n\n const spawnEnv = {\n ...env,\n FIFONY_ISSUE_TITLE: title,\n FIFONY_ISSUE_DESCRIPTION: description,\n FIFONY_ENHANCE_FIELD: field,\n FIFONY_PROMPT_FILE: promptFile,\n FIFONY_PROMPT: prompt,\n FIFONY_ISSUE_JSON: issuePayloadFile,\n FIFONY_AGENT_PROVIDER: provider,\n FIFONY_RESULT_FILE: resultFile,\n ...(images?.length ? { FIFONY_IMAGE_PATHS: images.join(\",\") } : {}),\n };\n\n return await new Promise((resolve, reject) => {\n const startedAt = Date.now();\n let output = \"\";\n let timeout = false;\n\n const child = spawn(effectiveCommand, {\n shell: true,\n cwd: tempDir,\n env: spawnEnv,\n });\n\n if (child.stdin) child.stdin.end();\n\n child.stdout?.on(\"data\", (chunk) => {\n output = appendFileTail(output, String(chunk), 12_000);\n });\n child.stderr?.on(\"data\", (chunk) => {\n output = appendFileTail(output, String(chunk), 12_000);\n });\n\n const timer = setTimeout(() => {\n timeout = true;\n child.kill(\"SIGTERM\");\n }, Math.max(timeoutMs, 1_000));\n\n child.on(\"error\", () => {\n clearTimeout(timer);\n rmSync(tempDir, { recursive: true, force: true });\n reject(new Error(\"Could not execute AI command.\"));\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n\n if (timeout) {\n rmSync(tempDir, { recursive: true, force: true });\n reject(new Error(`Enhance command timeout after ${Date.now() - startedAt}ms.`));\n return;\n }\n\n const commandOutput = readProviderOutput(resultFile, output);\n rmSync(tempDir, { recursive: true, force: true });\n\n if (code !== 0) {\n const providerOutput = appendFileTail(commandOutput, \"\", 12_000);\n const reason = providerOutput.trim()\n ? ` Enhance command output: ${providerOutput.slice(0, 1200)}`\n : \"\";\n reject(new Error(`Enhance command failed (exit ${code ?? \"unknown\"}).${reason}`));\n return;\n }\n resolve(commandOutput);\n });\n });\n}\n\nexport async function enhanceIssueField(\n payload: EnhanceIssuePayload,\n config: RuntimeConfig,\n _workflowDefinition: null,\n): Promise<EnhanceResult> {\n const field: EnhancementField = payload.field === \"description\" ? \"description\" : \"title\";\n const title = typeof payload.title === \"string\" ? payload.title.trim() : \"\";\n const description = typeof payload.description === \"string\" ? payload.description.trim() : \"\";\n const issueType = typeof payload.issueType === \"string\" ? payload.issueType.trim() : undefined;\n const requestedProvider = normalizeAgentProvider(\n typeof payload.preferredProvider === \"string\" ? payload.preferredProvider : payload.provider ?? config.agentProvider,\n );\n const providers = detectAvailableProviders();\n const availableSet = new Set(providers.filter((entry) => entry.available).map((entry) => entry.name));\n const orderedProviders: string[] = [];\n const addProvider = (candidate: string) => {\n if (availableSet.has(candidate) && !orderedProviders.includes(candidate)) {\n orderedProviders.push(candidate);\n }\n };\n\n addProvider(requestedProvider);\n // Fall back to any other available provider, in detection order\n for (const entry of providers) {\n if (entry.available) addProvider(entry.name);\n }\n\n if (!orderedProviders.length) {\n const known = providers.map((entry) => `${entry.name}:${entry.available ? \"available\" : \"missing\"}`).join(\", \");\n throw new Error(`No AI provider available (codex/claude). Detected: ${known}`);\n }\n\n const images = Array.isArray(payload.images) ? payload.images.filter((p): p is string => typeof p === \"string\") : undefined;\n const prompt = await buildPrompt(field, title, description, issueType, images);\n const errors: string[] = [];\n\n // JSON schema for structured enhance output via OpenAI API\n const enhanceSchema = {\n type: \"object\" as const,\n properties: {\n field: { type: \"string\" as const },\n value: { type: \"string\" as const },\n },\n required: [\"field\", \"value\"] as const,\n additionalProperties: false as const,\n };\n\n for (const selectedProvider of orderedProviders) {\n // ── All providers: spawn CLI process ──\n const command = getProviderCommand(selectedProvider, config);\n if (!command) {\n errors.push(`Provider \"${selectedProvider}\" has no command.`);\n continue;\n }\n\n try {\n const output = await runProviderCommand(\n command,\n selectedProvider,\n prompt,\n title,\n description,\n field,\n config.commandTimeoutMs,\n images,\n );\n logger.info({ provider: selectedProvider, field, rawOutput: output.slice(0, 2000) }, \"Enhance raw output\");\n const value = parseEnhancerOutput(output, field);\n logger.info({ provider: selectedProvider, field, parsedValue: value }, \"Enhance parsed value\");\n return { field, value, provider: selectedProvider };\n } catch (error) {\n errors.push(\n `Provider \"${selectedProvider}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n throw new Error(`Could not enhance issue field. ${errors.join(\" | \")}`);\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport { logger } from \"../logger.ts\";\nimport { toStringValue } from \"../helpers.ts\";\nimport { addEvent } from \"../issues.ts\";\nimport { mutateIssueState } from \"../api-helpers.ts\";\nimport { applyPlanUsage, applyPlanSuggestions } from \"../api-helpers.ts\";\nimport { persistState } from \"../store.ts\";\nimport {\n generatePlan,\n refinePlan,\n generatePlanInBackground,\n refinePlanInBackground,\n loadPlanningSession,\n savePlanningInput,\n clearPlanningSession,\n} from \"../issue-planner.ts\";\nimport { enhanceIssueField } from \"../issue-enhancer.ts\";\n\nexport function registerPlanRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/planning/session\", async (c: any) => {\n const session = await loadPlanningSession();\n return c.json({ ok: true, session });\n });\n\n app.post(\"/api/planning/save\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n const session = await savePlanningInput(title, description);\n return c.json({ ok: true, session });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/planning/generate\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n if (!title) return c.json({ ok: false, error: \"Title is required.\" }, 400);\n logger.info({ title: title.slice(0, 80) }, \"[API] POST /api/planning/generate\");\n const result = await generatePlan(title, description, state.config, null);\n return c.json({ ok: true, plan: result.plan, usage: result.usage });\n } catch (error) {\n logger.error({ err: error }, `Plan generation failed: ${String(error)}`);\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/planning/clear\", async (c: any) => {\n await clearPlanningSession();\n return c.json({ ok: true });\n });\n\n // Legacy alias\n app.post(\"/api/issues/plan\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n if (!title) return c.json({ ok: false, error: \"Title is required.\" }, 400);\n const result = await generatePlan(title, description, state.config, null);\n return c.json({ ok: true, plan: result.plan, usage: result.usage });\n } catch (error) {\n logger.error({ err: error }, `Plan generation failed: ${String(error)}`);\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/issues/:id/plan\", async (c: any) => {\n return mutateIssueState(state, c, async (issue) => {\n if (issue.state !== \"Planning\") {\n throw new Error(`Cannot plan issue in state ${issue.state}. Must be in Planning.`);\n }\n if (issue.planningStatus === \"planning\") {\n throw new Error(\"Planning already running in worker slot.\");\n }\n const body = await c.req.json().catch(() => ({})) as Record<string, unknown>;\n const fast = body.fast === true;\n\n // Fire-and-forget — plan runs in background, updates via WS\n generatePlanInBackground(issue, state.config, null, {\n addEvent: (issueId, kind, message) => addEvent(state, issueId, kind as any, message),\n persistState: () => persistState(state),\n applyUsage: (iss, usage) => applyPlanUsage(iss, usage),\n applySuggestions: (iss, plan) => applyPlanSuggestions(iss, plan),\n }, { fast });\n\n addEvent(state, issue.id, \"progress\", `${fast ? \"Fast plan\" : \"Plan\"} generation started for ${issue.identifier}.`);\n });\n });\n\n app.post(\"/api/issues/:id/plan/refine\", async (c: any) => {\n return mutateIssueState(state, c, async (issue) => {\n if (issue.state !== \"Planning\") {\n throw new Error(`Cannot refine plan for issue in state ${issue.state}. Must be in Planning.`);\n }\n if (!issue.plan) {\n throw new Error(\"Issue has no plan to refine. Generate a plan first.\");\n }\n if (issue.planningStatus === \"planning\") {\n throw new Error(\"A plan operation is already in progress for this issue.\");\n }\n const body = await c.req.json().catch(() => ({})) as Record<string, unknown>;\n const feedback = typeof body.feedback === \"string\" ? body.feedback.trim() : \"\";\n if (!feedback) {\n throw new Error(\"Feedback message is required.\");\n }\n\n // Fire-and-forget — refinement runs in background, updates via WS\n refinePlanInBackground(issue, feedback, state.config, null, {\n addEvent: (issueId, kind, message) => addEvent(state, issueId, kind as any, message),\n persistState: () => persistState(state),\n applyUsage: (iss, usage) => applyPlanUsage(iss, usage),\n applySuggestions: (iss, plan) => {\n if (plan.suggestedPaths?.length) iss.paths = plan.suggestedPaths;\n if (plan.suggestedLabels?.length) iss.labels = plan.suggestedLabels;\n if (plan.suggestedEffort) iss.effort = plan.suggestedEffort;\n },\n });\n\n addEvent(state, issue.id, \"progress\", `Plan refinement started for ${issue.identifier}.`);\n });\n });\n\n app.post(\"/api/issues/enhance\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const field = payload.field === \"description\" ? \"description\" : payload.field === \"title\" ? \"title\" : null;\n if (!field) {\n return c.json({ ok: false, error: 'Invalid field. Expected \"title\" or \"description\".' }, 400);\n }\n\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n const provider = toStringValue(payload.provider, state.config.agentProvider);\n const issueType = toStringValue(payload.issueType);\n const images = Array.isArray(payload.images) ? payload.images.filter((p: unknown): p is string => typeof p === \"string\") : undefined;\n\n const result = await enhanceIssueField(\n { field, title, description, issueType, images, provider },\n state.config,\n null,\n );\n\n return c.json({ ok: true, field: result.field, value: result.value, provider: result.provider });\n } catch (error) {\n logger.error({ err: error }, `Issue enhance failed: ${String(error)}`);\n return c.json(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n });\n}\n","import type {\n DetectedProvider,\n EffortConfig,\n JsonRecord,\n PipelineStageConfig,\n ReasoningEffort,\n RuntimeConfig,\n RuntimeSettingRecord,\n RuntimeSettingScope,\n RuntimeSettingSource,\n WorkflowConfig,\n} from \"./types.ts\";\nimport type { DiscoveredModel } from \"./providers.ts\";\nimport { clamp, now } from \"./helpers.ts\";\nimport { loadPersistedSettings, replacePersistedSetting } from \"./store.ts\";\nimport { getProviderDefaultCommand, normalizeAgentProvider, readCodexConfig } from \"./providers.ts\";\n\nexport const SETTING_ID_POLL_INTERVAL_MS = \"runtime.pollIntervalMs\";\nexport const SETTING_ID_WORKER_CONCURRENCY = \"runtime.workerConcurrency\";\nexport const SETTING_ID_COMMAND_TIMEOUT_MS = \"runtime.commandTimeoutMs\";\nexport const SETTING_ID_MAX_ATTEMPTS_DEFAULT = \"runtime.maxAttemptsDefault\";\nexport const SETTING_ID_MAX_TURNS = \"runtime.maxTurns\";\nexport const SETTING_ID_RETRY_DELAY_MS = \"runtime.retryDelayMs\";\nexport const SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS = \"runtime.staleInProgressTimeoutMs\";\nexport const SETTING_ID_LOG_LINES_TAIL = \"runtime.logLinesTail\";\nexport const SETTING_ID_MAX_CONCURRENT_BY_STATE = \"runtime.maxConcurrentByState\";\nexport const SETTING_ID_AGENT_PROVIDER = \"runtime.agentProvider\";\nexport const SETTING_ID_AGENT_COMMAND = \"runtime.agentCommand\";\nexport const SETTING_ID_DEFAULT_EFFORT = \"runtime.defaultEffort\";\nexport const SETTING_ID_DETECTED_PROVIDERS = \"providers.detected\";\nexport const SETTING_ID_UI_THEME = \"ui.theme\";\nexport const SETTING_ID_UI_NOTIFICATIONS_ENABLED = \"ui.notifications.enabled\";\nexport const SETTING_ID_WORKFLOW_CONFIG = \"runtime.workflowConfig\";\n\nexport async function loadRuntimeSettings(): Promise<RuntimeSettingRecord[]> {\n return loadPersistedSettings();\n}\n\nexport const RUNTIME_CONFIG_SETTING_IDS = new Set<string>([\n SETTING_ID_POLL_INTERVAL_MS,\n SETTING_ID_WORKER_CONCURRENCY,\n SETTING_ID_COMMAND_TIMEOUT_MS,\n SETTING_ID_MAX_ATTEMPTS_DEFAULT,\n SETTING_ID_MAX_TURNS,\n SETTING_ID_RETRY_DELAY_MS,\n SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,\n SETTING_ID_LOG_LINES_TAIL,\n SETTING_ID_MAX_CONCURRENT_BY_STATE,\n SETTING_ID_AGENT_PROVIDER,\n SETTING_ID_AGENT_COMMAND,\n SETTING_ID_DEFAULT_EFFORT,\n]);\n\nconst VALID_REASONING_EFFORTS = new Set<ReasoningEffort>([\"low\", \"medium\", \"high\", \"extra-high\"]);\n\nfunction parseIntegerSetting(value: unknown): number | null {\n const parsed = typeof value === \"number\"\n ? value\n : Number.parseInt(String(value ?? \"\"), 10);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction sanitizeMaxConcurrentByState(value: unknown): Record<string, number> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n const result: Record<string, number> = {};\n for (const [key, rawLimit] of Object.entries(value as JsonRecord)) {\n const limit = parseIntegerSetting(rawLimit);\n if (!limit || limit < 1) continue;\n const normalizedKey = key.trim().toLowerCase();\n if (!normalizedKey) continue;\n result[normalizedKey] = limit;\n }\n\n return result;\n}\n\nfunction sanitizeReasoningEffort(value: unknown): ReasoningEffort | undefined {\n return typeof value === \"string\" && VALID_REASONING_EFFORTS.has(value as ReasoningEffort)\n ? value as ReasoningEffort\n : undefined;\n}\n\nfunction sanitizeDefaultEffort(value: unknown): EffortConfig | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n const raw = value as JsonRecord;\n const next: EffortConfig = {};\n const keys: Array<keyof EffortConfig> = [\"default\", \"planner\", \"executor\", \"reviewer\"];\n\n for (const key of keys) {\n const effort = sanitizeReasoningEffort(raw[key]);\n if (effort) {\n next[key] = effort;\n }\n }\n\n return Object.keys(next).length > 0 ? next : {};\n}\n\nfunction buildRuntimeConfigSettings(\n config: RuntimeConfig,\n source: RuntimeSettingSource,\n): RuntimeSettingRecord[] {\n const updatedAt = now();\n return [\n { id: SETTING_ID_POLL_INTERVAL_MS, scope: \"runtime\", value: config.pollIntervalMs, source, updatedAt },\n { id: SETTING_ID_WORKER_CONCURRENCY, scope: \"runtime\", value: config.workerConcurrency, source, updatedAt },\n { id: SETTING_ID_COMMAND_TIMEOUT_MS, scope: \"runtime\", value: config.commandTimeoutMs, source, updatedAt },\n { id: SETTING_ID_MAX_ATTEMPTS_DEFAULT, scope: \"runtime\", value: config.maxAttemptsDefault, source, updatedAt },\n { id: SETTING_ID_MAX_TURNS, scope: \"runtime\", value: config.maxTurns, source, updatedAt },\n { id: SETTING_ID_RETRY_DELAY_MS, scope: \"runtime\", value: config.retryDelayMs, source, updatedAt },\n {\n id: SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,\n scope: \"runtime\",\n value: config.staleInProgressTimeoutMs,\n source,\n updatedAt,\n },\n { id: SETTING_ID_LOG_LINES_TAIL, scope: \"runtime\", value: config.logLinesTail, source, updatedAt },\n { id: SETTING_ID_MAX_CONCURRENT_BY_STATE, scope: \"runtime\", value: config.maxConcurrentByState, source, updatedAt },\n { id: SETTING_ID_AGENT_PROVIDER, scope: \"runtime\", value: config.agentProvider, source, updatedAt },\n { id: SETTING_ID_AGENT_COMMAND, scope: \"runtime\", value: config.agentCommand, source, updatedAt },\n { id: SETTING_ID_DEFAULT_EFFORT, scope: \"runtime\", value: config.defaultEffort, source, updatedAt },\n ];\n}\n\nexport function applyPersistedSettings(config: RuntimeConfig, settings: RuntimeSettingRecord[]): RuntimeConfig {\n let nextConfig = { ...config };\n let agentProviderOverridden = false;\n let agentCommandOverridden = false;\n\n for (const setting of settings) {\n switch (setting.id) {\n case SETTING_ID_POLL_INTERVAL_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.pollIntervalMs = clamp(parsed, 200, 10_000);\n }\n break;\n }\n case SETTING_ID_WORKER_CONCURRENCY: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.workerConcurrency = clamp(parsed, 1, 16);\n }\n break;\n }\n case SETTING_ID_COMMAND_TIMEOUT_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.commandTimeoutMs = clamp(parsed, 1_000, 3_600_000);\n }\n break;\n }\n case SETTING_ID_MAX_ATTEMPTS_DEFAULT: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.maxAttemptsDefault = clamp(parsed, 1, 10);\n }\n break;\n }\n case SETTING_ID_MAX_TURNS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.maxTurns = clamp(parsed, 1, 16);\n }\n break;\n }\n case SETTING_ID_RETRY_DELAY_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.retryDelayMs = Math.max(0, parsed);\n }\n break;\n }\n case SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.staleInProgressTimeoutMs = Math.max(0, parsed);\n }\n break;\n }\n case SETTING_ID_LOG_LINES_TAIL: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.logLinesTail = clamp(parsed, 1_000, 200_000);\n }\n break;\n }\n case SETTING_ID_MAX_CONCURRENT_BY_STATE: {\n const parsed = sanitizeMaxConcurrentByState(setting.value);\n if (parsed) {\n nextConfig.maxConcurrentByState = parsed;\n }\n break;\n }\n case SETTING_ID_AGENT_PROVIDER: {\n if (typeof setting.value === \"string\") {\n nextConfig.agentProvider = normalizeAgentProvider(setting.value);\n agentProviderOverridden = true;\n }\n break;\n }\n case SETTING_ID_AGENT_COMMAND: {\n nextConfig.agentCommand = typeof setting.value === \"string\" ? setting.value.trim() : \"\";\n agentCommandOverridden = true;\n break;\n }\n case SETTING_ID_DEFAULT_EFFORT: {\n const parsed = sanitizeDefaultEffort(setting.value);\n if (parsed) {\n nextConfig.defaultEffort = parsed;\n }\n break;\n }\n default:\n break;\n }\n }\n\n if (agentProviderOverridden && !agentCommandOverridden) {\n nextConfig.agentCommand = getProviderDefaultCommand(\n nextConfig.agentProvider,\n nextConfig.defaultEffort?.default,\n );\n }\n\n return nextConfig;\n}\n\nexport function inferSettingScope(settingId: string): RuntimeSettingScope {\n if (settingId.startsWith(\"runtime.\")) return \"runtime\";\n if (settingId.startsWith(\"providers.\")) return \"providers\";\n if (settingId.startsWith(\"ui.\")) return \"ui\";\n return \"system\";\n}\n\nexport async function persistSetting(\n id: string,\n value: unknown,\n options: {\n scope?: RuntimeSettingScope;\n source?: RuntimeSettingSource;\n } = {},\n): Promise<RuntimeSettingRecord> {\n const setting: RuntimeSettingRecord = {\n id,\n scope: options.scope ?? inferSettingScope(id),\n value,\n source: options.source ?? \"user\",\n updatedAt: now(),\n };\n await replacePersistedSetting(setting);\n return setting;\n}\n\nexport async function persistWorkerConcurrencySetting(value: number, source: RuntimeSettingRecord[\"source\"] = \"user\"): Promise<void> {\n await persistSetting(\n SETTING_ID_WORKER_CONCURRENCY,\n clamp(Math.round(value), 1, 16),\n { scope: \"runtime\", source },\n );\n}\n\nexport async function persistDetectedProvidersSetting(providers: DetectedProvider[]): Promise<void> {\n await persistSetting(\n SETTING_ID_DETECTED_PROVIDERS,\n {\n providers,\n detectedAt: now(),\n },\n { scope: \"providers\", source: \"detected\" },\n );\n}\n\nexport async function syncRuntimeConfigSettings(\n config: RuntimeConfig,\n settings: RuntimeSettingRecord[],\n): Promise<void> {\n const existingById = new Map(settings.map((setting) => [setting.id, setting]));\n const desiredSettings = buildRuntimeConfigSettings(config, \"system\");\n\n await Promise.all(\n desiredSettings.map(async (setting) => {\n const existing = existingById.get(setting.id);\n if (existing?.source === \"user\") return;\n await replacePersistedSetting({\n ...setting,\n source: existing?.source === \"workflow\" ? \"workflow\" : \"system\",\n });\n }),\n );\n}\n\n// ── Workflow Config (pipeline stage configuration) ────────────────────────\n\nfunction isValidStage(v: unknown): v is PipelineStageConfig {\n if (!v || typeof v !== \"object\") return false;\n const s = v as Record<string, unknown>;\n // model is optional — empty string means \"use CLI default\"\n return typeof s.provider === \"string\" && typeof s.effort === \"string\";\n}\n\n/**\n * Build a default workflow config using discovered models.\n * Never hardcodes model IDs — always uses the first model from each provider's discovery.\n * Falls back to provider name as model if discovery returned nothing.\n */\nexport function buildDefaultWorkflowConfig(\n detectedProviders: DetectedProvider[],\n discoveredModels?: Record<string, DiscoveredModel[]>,\n): WorkflowConfig {\n const available = detectedProviders.filter((p) => p.available);\n const hasClaude = available.some((p) => p.name === \"claude\");\n const hasCodex = available.some((p) => p.name === \"codex\");\n\n // Pick the first discovered model per provider (discoverModels promotes the user's configured CLI default to [0])\n const claudeModel = discoveredModels?.claude?.[0]?.id || \"\";\n const codexModel = discoveredModels?.codex?.[0]?.id || \"\";\n\n // Use the effort the user already configured in ~/.codex/config.toml as the execute default\n const codexEffort = (readCodexConfig().reasoningEffort as ReasoningEffort | undefined) || \"medium\";\n\n const claudeDefault: PipelineStageConfig = { provider: \"claude\", model: claudeModel, effort: \"medium\" };\n const codexDefault: PipelineStageConfig = { provider: \"codex\", model: codexModel, effort: codexEffort };\n\n // Default: claude for plan+review (better reasoning), codex for execute (better code)\n if (hasClaude && hasCodex) {\n return {\n plan: { ...claudeDefault, effort: \"high\" },\n execute: { ...codexDefault },\n review: { ...claudeDefault },\n };\n }\n if (hasClaude) {\n return { plan: { ...claudeDefault, effort: \"high\" }, execute: claudeDefault, review: claudeDefault };\n }\n if (hasCodex) {\n return { plan: { ...codexDefault, effort: \"high\" }, execute: codexDefault, review: codexDefault };\n }\n return { plan: claudeDefault, execute: codexDefault, review: claudeDefault };\n}\n\n/** Load workflow config from settings */\nexport function getWorkflowConfig(settings: RuntimeSettingRecord[]): WorkflowConfig | null {\n const setting = settings.find((s) => s.id === SETTING_ID_WORKFLOW_CONFIG);\n if (!setting?.value || typeof setting.value !== \"object\") return null;\n const wf = setting.value as Record<string, unknown>;\n if (isValidStage(wf.plan) && isValidStage(wf.execute) && isValidStage(wf.review)) {\n return wf as unknown as WorkflowConfig;\n }\n return null;\n}\n\n/** Persist workflow config */\nexport async function persistWorkflowConfig(config: WorkflowConfig): Promise<void> {\n await persistSetting(SETTING_ID_WORKFLOW_CONFIG, config, { scope: \"runtime\", source: \"user\" });\n}\n","import type { JsonRecord, RuntimeState, RuntimeSettingScope, RuntimeSettingSource } from \"../types.ts\";\nimport { logger } from \"../logger.ts\";\nimport { now, clamp } from \"../helpers.ts\";\nimport { addEvent } from \"../issues.ts\";\nimport { persistState } from \"../store.ts\";\nimport { detectAvailableProviders, discoverModels } from \"../providers.ts\";\nimport { resolveProjectMetadata, SETTING_ID_PROJECT_NAME } from \"../project-meta.ts\";\nimport {\n applyPersistedSettings,\n buildDefaultWorkflowConfig,\n getWorkflowConfig,\n inferSettingScope,\n loadRuntimeSettings,\n persistSetting,\n persistWorkerConcurrencySetting,\n persistWorkflowConfig,\n RUNTIME_CONFIG_SETTING_IDS,\n} from \"../settings.ts\";\n\nconst VALID_SETTING_SCOPES = new Set<RuntimeSettingScope>([\"runtime\", \"providers\", \"ui\", \"system\"]);\nconst VALID_SETTING_SOURCES = new Set<RuntimeSettingSource>([\"user\", \"detected\", \"workflow\", \"system\"]);\n\nexport function registerSettingsRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/settings\", async (c: any) => {\n const settings = await loadRuntimeSettings();\n return c.json({ settings });\n });\n\n app.get(\"/api/settings/:id\", async (c: any) => {\n const settingId = c.req?.param ? c.req.param(\"id\") : \"\";\n const settings = await loadRuntimeSettings();\n const setting = settings.find((entry) => entry.id === settingId);\n if (!setting) {\n return c.json({ ok: false, error: \"Setting not found\" }, 404);\n }\n return c.json({ ok: true, setting });\n });\n\n app.post(\"/api/settings/:id\", async (c: any) => {\n const settingId = c.req?.param ? c.req.param(\"id\") : \"\";\n if (!settingId) {\n return c.json({ ok: false, error: \"Setting id is required\" }, 400);\n }\n\n const payload = await c.req.json() as JsonRecord;\n const scopeValue = typeof payload.scope === \"string\" ? payload.scope : inferSettingScope(settingId);\n const sourceValue = typeof payload.source === \"string\" ? payload.source : \"user\";\n\n if (!VALID_SETTING_SCOPES.has(scopeValue as RuntimeSettingScope)) {\n return c.json({ ok: false, error: \"Invalid setting scope\" }, 400);\n }\n\n if (!VALID_SETTING_SOURCES.has(sourceValue as RuntimeSettingSource)) {\n return c.json({ ok: false, error: \"Invalid setting source\" }, 400);\n }\n\n const setting = await persistSetting(settingId, payload.value, {\n scope: scopeValue as RuntimeSettingScope,\n source: sourceValue as RuntimeSettingSource,\n });\n if (settingId === SETTING_ID_PROJECT_NAME) {\n const settings = await loadRuntimeSettings();\n const projectMetadata = resolveProjectMetadata(settings, state.sourceRepoUrl);\n state.projectName = projectMetadata.projectName;\n state.detectedProjectName = projectMetadata.detectedProjectName;\n state.projectNameSource = projectMetadata.projectNameSource;\n state.queueTitle = projectMetadata.queueTitle;\n state.updatedAt = now();\n addEvent(state, undefined, \"manual\", `Project title updated to ${projectMetadata.queueTitle}.`);\n await persistState(state);\n }\n if (RUNTIME_CONFIG_SETTING_IDS.has(settingId)) {\n state.config = applyPersistedSettings(state.config, [setting]);\n state.updatedAt = now();\n addEvent(state, undefined, \"manual\", `Runtime setting ${settingId} updated.`);\n await persistState(state);\n }\n return c.json({ ok: true, setting });\n });\n\n app.post(\"/api/config/concurrency\", async (c: any) => {\n const payload = await c.req.json() as JsonRecord;\n const value = typeof payload.concurrency === \"number\" ? payload.concurrency : undefined;\n if (!value || value < 1 || value > 16) {\n return c.json({ ok: false, error: \"concurrency must be between 1 and 16\" }, 400);\n }\n state.config.workerConcurrency = clamp(Math.round(value), 1, 16);\n state.updatedAt = now();\n addEvent(state, undefined, \"manual\", `Worker concurrency updated to ${state.config.workerConcurrency}.`);\n await persistWorkerConcurrencySetting(state.config.workerConcurrency);\n await persistState(state);\n return c.json({ ok: true, workerConcurrency: state.config.workerConcurrency });\n });\n\n app.get(\"/api/config/workflow\", async (c: any) => {\n const settings = await loadRuntimeSettings();\n const saved = getWorkflowConfig(settings);\n const includeDetails = c.req.query(\"details\") === \"1\";\n if (!includeDetails) {\n const providers = detectAvailableProviders();\n const workflow = saved || buildDefaultWorkflowConfig(providers);\n return c.json({ ok: true, workflow, isDefault: !saved });\n }\n const providers = detectAvailableProviders();\n const models = await discoverModels(providers);\n const defaultConfig = buildDefaultWorkflowConfig(providers, models);\n return c.json({ ok: true, workflow: saved || defaultConfig, isDefault: !saved, providers, models });\n });\n\n app.get(\"/api/config/models\", async (c: any) => {\n const providers = detectAvailableProviders();\n const models = await discoverModels(providers);\n return c.json({ ok: true, models });\n });\n\n app.post(\"/api/config/workflow\", async (c: any) => {\n try {\n const payload = await c.req.json() as JsonRecord;\n const workflow = payload.workflow as any;\n if (!workflow?.plan?.provider || !workflow?.execute?.provider || !workflow?.review?.provider) {\n return c.json({ ok: false, error: \"Invalid workflow config. Each stage needs provider, model, and effort.\" }, 400);\n }\n await persistWorkflowConfig(workflow);\n addEvent(state, undefined, \"manual\", `Workflow config updated: plan=${workflow.plan.provider}/${workflow.plan.model}, execute=${workflow.execute.provider}/${workflow.execute.model}, review=${workflow.review.provider}/${workflow.review.model}.`);\n return c.json({ ok: true, workflow });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n}\n","import { getAnalytics as getTokenAnalytics, getHourlySnapshot } from \"../token-ledger.ts\";\nimport { getEcDailyEvents, getEcDailyLines } from \"../store.ts\";\nimport { logger } from \"../logger.ts\";\nimport { getApiRuntimeContextOrThrow } from \"../api-runtime-context.ts\";\n\nexport function registerAnalyticsRoutes(app: any): void {\n app.get(\"/api/analytics/tokens\", async (c: any) => {\n const [tokenData, ecEvents] = await Promise.all([\n Promise.resolve(getTokenAnalytics()),\n getEcDailyEvents(),\n ]);\n // Merge EC daily event counts into the daily token array\n if (ecEvents.length > 0) {\n const eventsByDate = new Map(ecEvents.map((e) => [e.date, e.events]));\n const dateSet = new Set(tokenData.daily.map((d: { date: string }) => d.date));\n const merged = tokenData.daily.map((d: { date: string; events?: number }) => ({\n ...d,\n events: (eventsByDate.get(d.date) || 0) + (d.events || 0),\n }));\n for (const e of ecEvents) {\n if (!dateSet.has(e.date)) {\n merged.push({ date: e.date, inputTokens: 0, outputTokens: 0, totalTokens: 0, events: e.events });\n }\n }\n merged.sort((a: { date: string }, b: { date: string }) => a.date.localeCompare(b.date));\n return c.json({ ok: true, ...tokenData, daily: merged });\n }\n return c.json({ ok: true, ...tokenData });\n });\n\n app.get(\"/api/analytics/tokens/weekly\", async (c: any) => {\n // Weekly is part of the daily data in the ledger — filter client-side\n return c.json({ ok: true, ...getTokenAnalytics() });\n });\n\n app.get(\"/api/analytics/hourly\", async (c: any) => {\n const hours = Math.min(parseInt(c.req.query(\"hours\") || \"24\", 10) || 24, 48);\n return c.json({ ok: true, ...getHourlySnapshot(hours) });\n });\n\n app.get(\"/api/analytics/lines\", async (c: any) => {\n try {\n const days = Math.min(parseInt(c.req.query(\"days\") || \"90\", 10) || 90, 180);\n const lines = await getEcDailyLines(days);\n return c.json({ ok: true, lines });\n } catch (error) {\n logger.error({ err: error }, \"Failed to collect lines analytics\");\n return c.json({ ok: true, lines: [] });\n }\n });\n\n app.get(\"/api/analytics/kpis\", (c: any) => {\n try {\n const context = getApiRuntimeContextOrThrow();\n const doneIssues = context.state.issues.filter(\n (i) => i.state === \"Done\" && i.completedAt,\n );\n\n const msToDay = (ms: number) => ms / (1000 * 60 * 60 * 24);\n const avg = (arr: number[]) =>\n arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : null;\n const median = (arr: number[]) => {\n if (!arr.length) return null;\n const sorted = [...arr].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n };\n\n // Code review turnaround: reviewingAt → completedAt\n const reviewMs = doneIssues\n .filter((i) => i.reviewingAt && i.completedAt)\n .map((i) => Date.parse(i.completedAt!) - Date.parse(i.reviewingAt!))\n .filter((ms) => ms > 0);\n\n // PR cycle time: startedAt → completedAt\n const cycleMs = doneIssues\n .filter((i) => i.startedAt && i.completedAt)\n .map((i) => Date.parse(i.completedAt!) - Date.parse(i.startedAt!))\n .filter((ms) => ms > 0);\n\n // PR size: linesAdded + linesRemoved (only issues with diff data)\n const prSizes = doneIssues\n .filter((i) => typeof i.linesAdded === \"number\" || typeof i.linesRemoved === \"number\")\n .map((i) => (i.linesAdded || 0) + (i.linesRemoved || 0));\n\n // Issue cycle time: createdAt → completedAt\n const issueCycleMs = doneIssues\n .filter((i) => i.createdAt && i.completedAt)\n .map((i) => Date.parse(i.completedAt!) - Date.parse(i.createdAt))\n .filter((ms) => ms > 0);\n\n return c.json({\n ok: true,\n sampleSize: doneIssues.length,\n reviewTurnaroundDays: reviewMs.length\n ? { avg: msToDay(avg(reviewMs)!), median: msToDay(median(reviewMs)!), n: reviewMs.length }\n : null,\n prCycleTimeDays: cycleMs.length\n ? { avg: msToDay(avg(cycleMs)!), median: msToDay(median(cycleMs)!), n: cycleMs.length }\n : null,\n prSizeLines: prSizes.length\n ? { avg: avg(prSizes)!, median: median(prSizes)!, n: prSizes.length }\n : null,\n issueCycleTimeDays: issueCycleMs.length\n ? { avg: msToDay(avg(issueCycleMs)!), median: msToDay(median(issueCycleMs)!), n: issueCycleMs.length }\n : null,\n });\n } catch (error) {\n logger.error({ err: error }, \"Failed to compute KPI analytics\");\n return c.json({ ok: false, error: String(error) }, 500);\n }\n });\n}\n","import {\n existsSync,\n mkdtempSync,\n readdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { tmpdir } from \"node:os\";\nimport { env } from \"node:process\";\nimport { logger } from \"./logger.ts\";\nimport { detectAvailableProviders } from \"./providers.ts\";\nimport { appendFileTail } from \"./helpers.ts\";\nimport { renderPrompt } from \"../prompting.ts\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type ProjectScanResult = {\n root: string;\n files: {\n claudeMd: boolean;\n claudeDir: boolean;\n codexDir: boolean;\n readmeMd: boolean;\n packageJson: boolean;\n agentsMd: boolean;\n claudeAgentsDir: boolean;\n claudeSkillsDir: boolean;\n codexAgentsDir: boolean;\n codexSkillsDir: boolean;\n };\n existingAgents: string[];\n existingSkills: string[];\n readmeExcerpt: string;\n packageName: string;\n packageDescription: string;\n};\n\nexport type ProjectAnalysis = {\n description: string;\n language: string;\n domains: string[];\n stack: string[];\n suggestedAgents: string[];\n source: \"cli\" | \"fallback\";\n};\n\n// ── Filesystem scan (no CLI needed) ──────────────────────────────────────────\n\nexport function scanProjectFiles(targetRoot: string): ProjectScanResult {\n const check = (rel: string) => existsSync(join(targetRoot, rel));\n\n const files = {\n claudeMd: check(\"CLAUDE.md\"),\n claudeDir: check(\".claude\"),\n codexDir: check(\".codex\"),\n readmeMd: check(\"README.md\"),\n packageJson: check(\"package.json\"),\n cargoToml: check(\"Cargo.toml\"),\n pyprojectToml: check(\"pyproject.toml\"),\n goMod: check(\"go.mod\"),\n buildGradle: check(\"build.gradle\") || check(\"build.gradle.kts\"),\n gemfile: check(\"Gemfile\"),\n dockerfile: check(\"Dockerfile\"),\n agentsMd: check(\"AGENTS.md\"),\n claudeAgentsDir: check(\".claude/agents\"),\n claudeSkillsDir: check(\".claude/skills\"),\n codexAgentsDir: check(\".codex/agents\"),\n codexSkillsDir: check(\".codex/skills\"),\n };\n\n // List existing agents\n const existingAgents: string[] = [];\n for (const agentDir of [\".claude/agents\", \".codex/agents\"]) {\n const fullPath = join(targetRoot, agentDir);\n if (!existsSync(fullPath)) continue;\n try {\n const entries = readdirSync(fullPath);\n for (const entry of entries) {\n if (entry.endsWith(\".md\")) {\n existingAgents.push(basename(entry, \".md\"));\n }\n }\n } catch {\n // ignore read errors\n }\n }\n\n // List existing skills\n const existingSkills: string[] = [];\n for (const skillDir of [\".claude/skills\", \".codex/skills\"]) {\n const fullPath = join(targetRoot, skillDir);\n if (!existsSync(fullPath)) continue;\n try {\n const entries = readdirSync(fullPath);\n for (const entry of entries) {\n const skillFile = join(fullPath, entry, \"SKILL.md\");\n if (existsSync(skillFile)) {\n existingSkills.push(entry);\n }\n }\n } catch {\n // ignore read errors\n }\n }\n\n // Read README excerpt\n let readmeExcerpt = \"\";\n const readmePath = join(targetRoot, \"README.md\");\n if (existsSync(readmePath)) {\n try {\n const content = readFileSync(readmePath, \"utf8\");\n readmeExcerpt = content.slice(0, 200).trim();\n } catch {\n // ignore read errors\n }\n }\n\n // Read package.json name + description\n let packageName = \"\";\n let packageDescription = \"\";\n const pkgPath = join(targetRoot, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\"));\n packageName = typeof pkg.name === \"string\" ? pkg.name : \"\";\n packageDescription = typeof pkg.description === \"string\" ? pkg.description : \"\";\n } catch {\n // ignore parse errors\n }\n }\n\n return {\n root: targetRoot,\n files,\n existingAgents: [...new Set(existingAgents)],\n existingSkills: [...new Set(existingSkills)],\n readmeExcerpt,\n packageName,\n packageDescription,\n };\n}\n\n// ── CLI-based analysis ───────────────────────────────────────────────────────\n\n// Detect language from build files present in the project root\nconst BUILD_FILE_SIGNALS: Record<string, { language: string; stack: string[] }> = {\n \"package.json\": { language: \"javascript\", stack: [\"node\"] },\n \"Cargo.toml\": { language: \"rust\", stack: [\"cargo\"] },\n \"pyproject.toml\": { language: \"python\", stack: [\"python\"] },\n \"setup.py\": { language: \"python\", stack: [\"python\"] },\n \"requirements.txt\": { language: \"python\", stack: [\"pip\"] },\n \"Pipfile\": { language: \"python\", stack: [\"pipenv\"] },\n \"go.mod\": { language: \"go\", stack: [\"go\"] },\n \"build.gradle\": { language: \"java\", stack: [\"gradle\"] },\n \"build.gradle.kts\": { language: \"kotlin\", stack: [\"gradle\"] },\n \"pom.xml\": { language: \"java\", stack: [\"maven\"] },\n \"Gemfile\": { language: \"ruby\", stack: [\"bundler\"] },\n \"mix.exs\": { language: \"elixir\", stack: [\"mix\"] },\n \"pubspec.yaml\": { language: \"dart\", stack: [\"flutter\"] },\n \"CMakeLists.txt\": { language: \"c++\", stack: [\"cmake\"] },\n \"Makefile\": { language: \"unknown\", stack: [\"make\"] },\n \"Dockerfile\": { language: \"unknown\", stack: [\"docker\"] },\n \"composer.json\": { language: \"php\", stack: [\"composer\"] },\n \"Package.swift\": { language: \"swift\", stack: [\"spm\"] },\n \"deno.json\": { language: \"typescript\", stack: [\"deno\"] },\n \"bun.lockb\": { language: \"typescript\", stack: [\"bun\"] },\n};\n\nfunction buildFallbackAnalysis(targetRoot: string): ProjectAnalysis {\n // Read any available project description\n let description = \"\";\n let readmeExcerpt = \"\";\n\n for (const readmeFile of [\"README.md\", \"README.rst\", \"README.txt\", \"README\"]) {\n const p = join(targetRoot, readmeFile);\n if (existsSync(p)) {\n try {\n readmeExcerpt = readFileSync(p, \"utf8\").slice(0, 300).trim();\n break;\n } catch { /* ignore */ }\n }\n }\n\n // Try package.json description (JS/TS projects)\n const pkgPath = join(targetRoot, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\"));\n const name = typeof pkg.name === \"string\" ? pkg.name : \"\";\n const desc = typeof pkg.description === \"string\" ? pkg.description : \"\";\n if (desc) description = name ? `${name}: ${desc}` : desc;\n } catch { /* ignore */ }\n }\n\n // Try Cargo.toml description (Rust)\n const cargoPath = join(targetRoot, \"Cargo.toml\");\n if (!description && existsSync(cargoPath)) {\n try {\n const content = readFileSync(cargoPath, \"utf8\");\n const descMatch = content.match(/^description\\s*=\\s*\"([^\"]+)\"/m);\n const nameMatch = content.match(/^name\\s*=\\s*\"([^\"]+)\"/m);\n if (descMatch) description = nameMatch ? `${nameMatch[1]}: ${descMatch[1]}` : descMatch[1];\n } catch { /* ignore */ }\n }\n\n // Try pyproject.toml description (Python)\n const pyprojectPath = join(targetRoot, \"pyproject.toml\");\n if (!description && existsSync(pyprojectPath)) {\n try {\n const content = readFileSync(pyprojectPath, \"utf8\");\n const descMatch = content.match(/^description\\s*=\\s*\"([^\"]+)\"/m);\n const nameMatch = content.match(/^name\\s*=\\s*\"([^\"]+)\"/m);\n if (descMatch) description = nameMatch ? `${nameMatch[1]}: ${descMatch[1]}` : descMatch[1];\n } catch { /* ignore */ }\n }\n\n if (!description) {\n description = readmeExcerpt\n ? readmeExcerpt.split(\"\\n\").filter(Boolean).slice(0, 2).join(\". \")\n : \"A software project.\";\n }\n\n // Detect language and stack from build files\n let language = \"unknown\";\n const stack: string[] = [];\n\n for (const [file, signal] of Object.entries(BUILD_FILE_SIGNALS)) {\n if (existsSync(join(targetRoot, file))) {\n if (language === \"unknown\" && signal.language !== \"unknown\") {\n language = signal.language;\n }\n for (const s of signal.stack) {\n if (!stack.includes(s)) stack.push(s);\n }\n }\n }\n\n return {\n description,\n language,\n domains: [],\n stack: stack.length ? stack : [language],\n suggestedAgents: [\"code-reviewer\", \"software-architect\"],\n source: \"fallback\",\n };\n}\n\nfunction parseAnalysisOutput(raw: string): ProjectAnalysis | null {\n const text = raw.trim();\n if (!text) return null;\n\n // Try to extract JSON from the output (may be wrapped in markdown or Claude JSON envelope)\n let jsonText = text;\n\n // Handle Claude --output-format json envelope: { \"result\": \"...\" }\n try {\n const envelope = JSON.parse(text);\n if (typeof envelope.result === \"string\") {\n jsonText = envelope.result.trim();\n } else if (envelope.description || envelope.domains) {\n // Already the analysis object\n return validateAnalysis(envelope);\n }\n } catch {\n // not a JSON envelope, proceed\n }\n\n // Strip markdown fences if present\n const fenced = jsonText.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) {\n jsonText = fenced[1].trim();\n }\n\n try {\n const parsed = JSON.parse(jsonText);\n return validateAnalysis(parsed);\n } catch {\n // try to find JSON object in the text\n const match = jsonText.match(/\\{[\\s\\S]*\\}/);\n if (match) {\n try {\n const parsed = JSON.parse(match[0]);\n return validateAnalysis(parsed);\n } catch {\n return null;\n }\n }\n return null;\n }\n}\n\nfunction validateAnalysis(parsed: Record<string, unknown>): ProjectAnalysis | null {\n if (!parsed || typeof parsed !== \"object\") return null;\n\n const description = typeof parsed.description === \"string\" ? parsed.description.trim() : \"\";\n const language = typeof parsed.language === \"string\" ? parsed.language.trim().toLowerCase() : \"\";\n const domains = Array.isArray(parsed.domains)\n ? (parsed.domains as unknown[]).filter((d): d is string => typeof d === \"string\")\n : [];\n const stack = Array.isArray(parsed.stack)\n ? (parsed.stack as unknown[]).filter((s): s is string => typeof s === \"string\")\n : [];\n const suggestedAgents = Array.isArray(parsed.suggestedAgents)\n ? (parsed.suggestedAgents as unknown[]).filter((a): a is string => typeof a === \"string\")\n : [];\n\n if (!description && domains.length === 0 && stack.length === 0) return null;\n\n return {\n description: description || \"A software project.\",\n language,\n domains,\n stack,\n suggestedAgents,\n source: \"cli\",\n };\n}\n\nfunction isBlockedProjectAnalysisResponse(analysis: ProjectAnalysis): boolean {\n const normalized = `${analysis.description || \"\"}`.toLowerCase();\n const indicators = [\n \"could not inspect the repository files\",\n \"local command execution is blocked\",\n \"please provide access\",\n \"paste the key files\",\n \"failed to inspect\",\n \"unable to access the repository\",\n ];\n return indicators.some((indicator) => normalized.includes(indicator));\n}\n\n// ── Analysis cache ────────────────────────────────────────────────────────────\n\nimport { createHash } from \"node:crypto\";\nimport { getSettingStateResource } from \"./store.ts\";\n\nconst ANALYSIS_CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h\n\nfunction computeProjectHash(targetRoot: string): string {\n const buildFiles = Object.keys(BUILD_FILE_SIGNALS);\n const found = buildFiles.filter((f) => existsSync(join(targetRoot, f))).sort();\n return createHash(\"sha256\").update(found.join(\",\")).digest(\"hex\").slice(0, 16);\n}\n\nasync function loadCachedAnalysis(targetRoot: string): Promise<ProjectAnalysis | null> {\n const resource = getSettingStateResource();\n if (!resource) return null;\n const hash = computeProjectHash(targetRoot);\n const key = `project-analysis:${hash}`;\n try {\n const record = await resource.get(key);\n if (!record?.value) return null;\n const cached = record.value as { analysis: ProjectAnalysis; updatedAt: string };\n if (!cached.analysis || !cached.updatedAt) return null;\n if (Date.now() - Date.parse(cached.updatedAt) > ANALYSIS_CACHE_TTL_MS) return null;\n return cached.analysis;\n } catch {\n return null;\n }\n}\n\nasync function saveCachedAnalysis(targetRoot: string, analysis: ProjectAnalysis): Promise<void> {\n const resource = getSettingStateResource();\n if (!resource) return;\n const hash = computeProjectHash(targetRoot);\n const key = `project-analysis:${hash}`;\n try {\n await resource.replace(key, {\n id: key,\n scope: \"system\",\n source: \"detected\",\n value: { analysis, updatedAt: new Date().toISOString() },\n });\n } catch {\n // non-critical\n }\n}\n\nexport { buildFallbackAnalysis };\n\nexport async function analyzeProjectWithCli(\n provider: string,\n targetRoot: string,\n options?: { forceRefresh?: boolean },\n): Promise<ProjectAnalysis> {\n // Check cache first\n if (!options?.forceRefresh) {\n const cached = await loadCachedAnalysis(targetRoot);\n if (cached) {\n logger.info(\"Using cached project analysis.\");\n return cached;\n }\n }\n\n const normalizedProvider = provider.trim().toLowerCase();\n const providers = detectAvailableProviders();\n const providerInfo = providers.find((p) => p.name === normalizedProvider && p.available);\n\n if (!providerInfo) {\n logger.warn(\n { provider: normalizedProvider },\n \"Requested CLI provider not available, using fallback analysis\",\n );\n return buildFallbackAnalysis(targetRoot);\n }\n\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-scan-\"));\n const promptFile = join(tempDir, \"fifony-scan-prompt.txt\");\n const analysisPrompt = await renderPrompt(\"project-analysis\");\n writeFileSync(promptFile, analysisPrompt, \"utf8\");\n\n // Build environment with prompt file path\n const processEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === \"string\") processEnv[key] = value;\n }\n processEnv.FIFONY_PROMPT_FILE = promptFile;\n\n try {\n const output = await new Promise<string>((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n let args: string[];\n let command: string;\n\n if (normalizedProvider === \"claude\") {\n command = \"claude\";\n args = [\n \"--print\",\n \"--no-session-persistence\",\n \"--output-format\", \"json\",\n \"-p\", analysisPrompt,\n ];\n } else if (normalizedProvider === \"codex\") {\n command = \"sh\";\n args = [\"-c\", `codex exec --skip-git-repo-check < \"${promptFile}\"`];\n } else {\n reject(new Error(`Unsupported provider: ${normalizedProvider}`));\n return;\n }\n\n const child = spawn(command, args, {\n cwd: targetRoot,\n env: processEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.stdin) child.stdin.end();\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout = appendFileTail(stdout, chunk.toString(\"utf8\"), 64_000);\n });\n\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr = appendFileTail(stderr, chunk.toString(\"utf8\"), 16_000);\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, 120_000);\n\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n reject(new Error(`Failed to spawn ${normalizedProvider}: ${err.message}`));\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n if (timedOut) {\n reject(new Error(`CLI analysis timed out after 120s`));\n return;\n }\n if (code !== 0) {\n logger.debug(\n { provider: normalizedProvider, code, stderr: stderr.slice(0, 500) },\n \"CLI analysis command exited with non-zero code\",\n );\n }\n resolve(stdout);\n });\n });\n\n const analysis = parseAnalysisOutput(output);\n if (analysis && !isBlockedProjectAnalysisResponse(analysis)) {\n logger.info(\n { provider: normalizedProvider, domains: analysis.domains, stack: analysis.stack },\n \"CLI project analysis completed\",\n );\n // Cache the result for future use\n await saveCachedAnalysis(targetRoot, analysis);\n return analysis;\n }\n\n if (!analysis) {\n logger.warn(\n { provider: normalizedProvider, rawOutput: output.slice(0, 500) },\n \"CLI returned unparseable output, using fallback\",\n );\n } else {\n logger.warn(\n { provider: normalizedProvider, blockedAnalysis: analysis.description },\n \"CLI analysis returned blocked/insufficient context response, using fallback\",\n );\n }\n return buildFallbackAnalysis(targetRoot);\n } catch (error) {\n logger.warn(\n { err: error, provider: normalizedProvider },\n \"CLI analysis failed, using fallback\",\n );\n return buildFallbackAnalysis(targetRoot);\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport { logger } from \"./logger.ts\";\nimport {\n resolveTaskCapabilities,\n} from \"../routing/capability-resolver.ts\";\nimport {\n getCapabilityRoutingOptions,\n} from \"./providers.ts\";\n\nexport type ScannedIssue = {\n source: \"todo\" | \"fixme\" | \"hack\" | \"github\";\n title: string;\n file: string;\n line: number;\n context: string;\n category?: string;\n overlays?: string[];\n rationale?: string[];\n suggestedLabels?: string[];\n suggestedPaths?: string[];\n};\n\nconst SCAN_PATTERN = /\\b(TODO|FIXME|HACK|XXX)\\b[:\\s]*(.*)/i;\n\nconst EXCLUDE_DIRS = [\n \"node_modules\", \".git\", \".fifony\", \"dist\", \"build\",\n \".turbo\", \".next\", \".nuxt\", \"coverage\", \".venv\",\n \"vendor\", \"tmp\", \"temp\", \"artifacts\",\n];\n\nexport function scanForTodos(targetRoot: string): ScannedIssue[] {\n const excludeArgs = EXCLUDE_DIRS.flatMap((dir) => [\"--exclude-dir\", dir]);\n\n let output: string;\n try {\n output = execFileSync(\"grep\", [\n \"-rn\",\n \"-E\", \"\\\\b(TODO|FIXME|HACK|XXX)\\\\b\",\n ...excludeArgs,\n \"--include=*.ts\",\n \"--include=*.tsx\",\n \"--include=*.js\",\n \"--include=*.jsx\",\n \"--include=*.py\",\n \"--include=*.rs\",\n \"--include=*.go\",\n \"--include=*.java\",\n \"--include=*.rb\",\n \"--include=*.php\",\n \"--include=*.cs\",\n \"--include=*.swift\",\n \"--include=*.kt\",\n \"--include=*.vue\",\n \"--include=*.svelte\",\n targetRoot,\n ], {\n encoding: \"utf8\",\n timeout: 15_000,\n maxBuffer: 5_000_000,\n });\n } catch (error: any) {\n // grep returns exit code 1 when no matches found\n if (error.status === 1) return [];\n if (error.stdout) output = error.stdout;\n else {\n logger.warn(`TODO scan failed: ${String(error)}`);\n return [];\n }\n }\n\n const results: ScannedIssue[] = [];\n const lines = output.split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n // Format: file:line:content\n const match = line.match(/^(.+?):(\\d+):(.+)$/);\n if (!match) continue;\n\n const [, file, lineNo, content] = match;\n const todoMatch = content.match(SCAN_PATTERN);\n if (!todoMatch) continue;\n\n const [, tag, text] = todoMatch;\n const source = tag.toLowerCase() as ScannedIssue[\"source\"];\n const trimmedText = text.trim();\n if (!trimmedText || trimmedText.length < 5) continue;\n\n const relativePath = file.startsWith(targetRoot)\n ? file.slice(targetRoot.length + 1)\n : file;\n\n results.push({\n source: source === \"xxx\" ? \"hack\" : source,\n title: trimmedText.length > 120 ? `${trimmedText.slice(0, 117)}...` : trimmedText,\n file: relativePath,\n line: parseInt(lineNo, 10),\n context: content.trim(),\n });\n }\n\n return results;\n}\n\n/**\n * Enrich scanned issues with capability routing metadata.\n */\nexport function categorizeScannedIssues(\n issues: ScannedIssue[],\n): ScannedIssue[] {\n const options = getCapabilityRoutingOptions();\n\n return issues.map((issue) => {\n const resolution = resolveTaskCapabilities({\n id: `scan-${issue.file}:${issue.line}`,\n identifier: `${issue.source}:${issue.file}:${issue.line}`,\n title: issue.title,\n description: issue.context,\n labels: [issue.source],\n paths: [issue.file],\n }, options);\n\n return {\n ...issue,\n category: resolution.category,\n overlays: resolution.overlays,\n rationale: resolution.rationale,\n suggestedLabels: [\n issue.source,\n resolution.category ? `capability:${resolution.category}` : \"\",\n ].filter(Boolean),\n suggestedPaths: [issue.file],\n };\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { logger } from \"./logger.ts\";\nimport type { ScannedIssue } from \"./issue-scanner.ts\";\n\ntype GitHubIssue = {\n number: number;\n title: string;\n body: string;\n labels: Array<{ name: string }>;\n state: string;\n url: string;\n};\n\n/**\n * Fetch open GitHub issues using the `gh` CLI (no API token dependency).\n * Returns them as ScannedIssue[] for uniform handling in the dashboard.\n */\nexport async function fetchGitHubIssues(targetRoot: string): Promise<ScannedIssue[]> {\n return new Promise((resolve) => {\n execFile(\n \"gh\",\n [\n \"issue\", \"list\",\n \"--json\", \"number,title,body,labels,state,url\",\n \"--state\", \"open\",\n \"--limit\", \"50\",\n ],\n {\n cwd: targetRoot,\n timeout: 15_000,\n maxBuffer: 2_000_000,\n },\n (error, stdout) => {\n if (error) {\n logger.warn(`Failed to fetch GitHub issues: ${String(error)}`);\n resolve([]);\n return;\n }\n\n try {\n const issues = JSON.parse(stdout.trim()) as GitHubIssue[];\n const results: ScannedIssue[] = issues.map((issue) => ({\n source: \"github\" as const,\n title: issue.title,\n file: \"\",\n line: 0,\n context: (issue.body || \"\").slice(0, 500),\n suggestedLabels: issue.labels.map((l) => l.name),\n suggestedPaths: [],\n }));\n resolve(results);\n } catch (parseError) {\n logger.warn(`Failed to parse GitHub issues: ${String(parseError)}`);\n resolve([]);\n }\n },\n );\n });\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport { logger } from \"../logger.ts\";\nimport { TARGET_ROOT } from \"../constants.ts\";\nimport { broadcastToWebSocketClients } from \"../api-websocket.ts\";\nimport { scanProjectFiles, analyzeProjectWithCli } from \"../project-scanner.ts\";\nimport { scanForTodos, categorizeScannedIssues } from \"../issue-scanner.ts\";\nimport { fetchGitHubIssues } from \"../github-sync.ts\";\n\nexport function registerScanningRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/scan/project\", async (c: any) => {\n try {\n const result = scanProjectFiles(TARGET_ROOT);\n return c.json(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to scan project files\");\n return c.json({ ok: false, error: \"Failed to scan project.\" }, 500);\n }\n });\n\n app.post(\"/api/scan/analyze\", async (c: any) => {\n try {\n const payload = await c.req.json() as { provider?: string };\n const provider = typeof payload.provider === \"string\" ? payload.provider : state.config.agentProvider;\n const result = await analyzeProjectWithCli(provider, TARGET_ROOT);\n return c.json(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to analyze project with CLI\");\n return c.json({ ok: false, error: \"Failed to analyze project.\" }, 500);\n }\n });\n\n app.get(\"/api/scan/issues\", async (c: any) => {\n try {\n const todos = scanForTodos(TARGET_ROOT);\n const categorized = categorizeScannedIssues(todos);\n return c.json({ ok: true, issues: categorized, total: categorized.length });\n } catch (error) {\n logger.error({ err: error }, \"Failed to scan for TODOs\");\n return c.json({ ok: false, error: \"Failed to scan for issues.\" }, 500);\n }\n });\n\n app.post(\"/api/boot/skip-scan\", async (c: any) => {\n broadcastToWebSocketClients({ type: \"boot:scan:skipped\" });\n return c.json({ ok: true, message: \"Scan skipped.\" });\n });\n\n app.get(\"/api/scan/github-issues\", async (c: any) => {\n try {\n const issues = await fetchGitHubIssues(TARGET_ROOT);\n const categorized = categorizeScannedIssues(issues);\n return c.json({ ok: true, issues: categorized, total: categorized.length });\n } catch (error) {\n logger.error({ err: error }, \"Failed to fetch GitHub issues\");\n return c.json({ ok: false, error: \"Failed to fetch GitHub issues.\" }, 500);\n }\n });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { logger } from \"./logger.ts\";\nimport { listReferenceRepositories, collectArtifacts } from \"../reference-repositories.js\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type AgentCatalogEntry = {\n name: string;\n displayName: string;\n description: string;\n emoji: string;\n domains: string[];\n source: string;\n content: string;\n};\n\nexport type SkillCatalogEntry = {\n name: string;\n displayName: string;\n description: string;\n domains: string[];\n source: string;\n installType: \"reference\" | \"bundled\";\n url?: string;\n content?: string;\n};\n\nexport type InstallResult = {\n installed: string[];\n skipped: string[];\n errors: Array<{ name: string; error: string }>;\n};\n\n// ── Catalog loaders ──────────────────────────────────────────────────────────\n\nfunction parseFrontmatter(content: string): Record<string, string> {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return {};\n const result: Record<string, string> = {};\n for (const line of match[1].split(\"\\n\")) {\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n if (key) result[key] = value;\n }\n return result;\n}\n\nexport function loadAgentCatalog(): AgentCatalogEntry[] {\n const entries: AgentCatalogEntry[] = [];\n try {\n const repos = listReferenceRepositories();\n for (const repo of repos) {\n if (!repo.present || !repo.synced) continue;\n const artifacts = collectArtifacts(repo.path, repo.id).filter((a) => a.kind === \"agent\");\n for (const artifact of artifacts) {\n try {\n const content = readFileSync(artifact.sourcePath, \"utf8\");\n const fm = parseFrontmatter(content);\n entries.push({\n name: artifact.targetName,\n displayName: fm.name || artifact.targetName,\n description: fm.description || \"\",\n emoji: fm.emoji || \"\\u{1F916}\",\n domains: fm.domains ? fm.domains.split(\",\").map((d) => d.trim()).filter(Boolean) : [],\n source: repo.id,\n content,\n });\n } catch (err) {\n logger.warn({ err, path: artifact.sourcePath }, \"Failed to read agent file\");\n }\n }\n }\n } catch (error) {\n logger.error({ err: error }, \"Failed to load agent catalog from repositories\");\n }\n return entries;\n}\n\nexport function loadSkillCatalog(): SkillCatalogEntry[] {\n return [];\n}\n\n// ── Filter by domains ────────────────────────────────────────────────────────\n\nexport function filterByDomains<T extends { domains: string[] }>(\n catalog: T[],\n domains: string[],\n): T[] {\n const domainSet = new Set(domains.map((d) => d.toLowerCase().trim()));\n if (domainSet.size === 0) return catalog;\n\n const scored = catalog.map((entry) => {\n const matchCount = entry.domains.filter((d) => domainSet.has(d.toLowerCase())).length;\n return { entry, matchCount };\n });\n\n // Include only entries that match at least one domain, sorted by match count descending\n return scored\n .filter((item) => item.matchCount > 0)\n .sort((a, b) => b.matchCount - a.matchCount)\n .map((item) => item.entry);\n}\n\n// ── Install agents ───────────────────────────────────────────────────────────\n\nexport function installAgents(\n targetRoot: string,\n agentNames: string[],\n catalog: AgentCatalogEntry[],\n): InstallResult {\n const result: InstallResult = { installed: [], skipped: [], errors: [] };\n const catalogMap = new Map(catalog.map((entry) => [entry.name, entry]));\n const agentsDir = join(targetRoot, \".claude\", \"agents\");\n\n // Ensure directory exists\n try {\n mkdirSync(agentsDir, { recursive: true });\n } catch (error) {\n logger.error({ err: error, path: agentsDir }, \"Failed to create agents directory\");\n result.errors.push({ name: \"_directory\", error: `Failed to create ${agentsDir}` });\n return result;\n }\n\n for (const name of agentNames) {\n const entry = catalogMap.get(name);\n if (!entry) {\n result.errors.push({ name, error: \"Agent not found in catalog\" });\n continue;\n }\n\n const filePath = join(agentsDir, `${name}.md`);\n if (existsSync(filePath)) {\n result.skipped.push(name);\n continue;\n }\n\n try {\n writeFileSync(filePath, entry.content, \"utf8\");\n result.installed.push(name);\n logger.info({ agent: name, path: filePath }, \"Agent installed\");\n } catch (error) {\n result.errors.push({\n name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n// ── Install skills ───────────────────────────────────────────────────────────\n\nexport function installSkills(\n targetRoot: string,\n skillNames: string[],\n catalog: SkillCatalogEntry[],\n): InstallResult {\n const result: InstallResult = { installed: [], skipped: [], errors: [] };\n const catalogMap = new Map(catalog.map((entry) => [entry.name, entry]));\n const skillsDir = join(targetRoot, \".claude\", \"skills\");\n\n // Ensure directory exists\n try {\n mkdirSync(skillsDir, { recursive: true });\n } catch (error) {\n logger.error({ err: error, path: skillsDir }, \"Failed to create skills directory\");\n result.errors.push({ name: \"_directory\", error: `Failed to create ${skillsDir}` });\n return result;\n }\n\n for (const name of skillNames) {\n const entry = catalogMap.get(name);\n if (!entry) {\n result.errors.push({ name, error: \"Skill not found in catalog\" });\n continue;\n }\n\n const skillDir = join(skillsDir, name);\n const filePath = join(skillDir, \"SKILL.md\");\n if (existsSync(filePath)) {\n result.skipped.push(name);\n continue;\n }\n\n try {\n mkdirSync(skillDir, { recursive: true });\n\n if (entry.installType === \"bundled\" && entry.content) {\n writeFileSync(filePath, entry.content, \"utf8\");\n } else {\n // For reference skills, create a SKILL.md pointing to the external source\n const referenceContent = [\n `# ${entry.displayName}`,\n \"\",\n entry.description,\n \"\",\n `**Source**: ${entry.source}`,\n entry.url ? `**URL**: ${entry.url}` : \"\",\n \"\",\n `> This skill references an external resource. Install it from the source above.`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n writeFileSync(filePath, referenceContent, \"utf8\");\n }\n\n result.installed.push(name);\n logger.info({ skill: name, path: filePath, type: entry.installType }, \"Skill installed\");\n } catch (error) {\n result.errors.push({\n name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n","import { logger } from \"../logger.ts\";\nimport { TARGET_ROOT } from \"../constants.ts\";\nimport {\n loadAgentCatalog,\n loadSkillCatalog,\n filterByDomains,\n installAgents,\n installSkills,\n} from \"../catalog.ts\";\n\nexport function registerCatalogRoutes(app: any): void {\n app.get(\"/api/catalog/agents\", async (c: any) => {\n const domainsParam = c.req.query(\"domains\");\n const domains = typeof domainsParam === \"string\"\n ? domainsParam.split(\",\").map((d: string) => d.trim()).filter(Boolean)\n : [];\n const catalog = loadAgentCatalog();\n return c.json({ agents: domains.length ? filterByDomains(catalog, domains) : catalog });\n });\n\n app.get(\"/api/catalog/skills\", async (c: any) => {\n const catalog = loadSkillCatalog();\n return c.json({ skills: catalog });\n });\n\n app.post(\"/api/install/agents\", async (c: any) => {\n try {\n const payload = await c.req.json() as { agents?: string[] };\n const agentNames = Array.isArray(payload.agents) ? payload.agents.filter((a): a is string => typeof a === \"string\") : [];\n if (agentNames.length === 0) {\n return c.json({ ok: false, error: \"No agent names provided.\" }, 400);\n }\n const catalog = loadAgentCatalog();\n const result = installAgents(TARGET_ROOT, agentNames, catalog);\n return c.json({ ok: true, ...result });\n } catch (error) {\n logger.error({ err: error }, \"Failed to install agents\");\n return c.json({ ok: false, error: \"Failed to install agents.\" }, 500);\n }\n });\n\n app.post(\"/api/install/skills\", async (c: any) => {\n try {\n const payload = await c.req.json() as { skills?: string[] };\n const skillNames = Array.isArray(payload.skills) ? payload.skills.filter((s): s is string => typeof s === \"string\") : [];\n if (skillNames.length === 0) {\n return c.json({ ok: false, error: \"No skill names provided.\" }, 400);\n }\n const catalog = loadSkillCatalog();\n const result = installSkills(TARGET_ROOT, skillNames, catalog);\n return c.json({ ok: true, ...result });\n } catch (error) {\n logger.error({ err: error }, \"Failed to install skills\");\n return c.json({ ok: false, error: \"Failed to install skills.\" }, 500);\n }\n });\n}\n","import { logger } from \"../logger.ts\";\nimport {\n importReferenceArtifacts,\n listReferenceRepositories,\n syncReferenceRepositories,\n} from \"../../reference-repositories.ts\";\nimport { TARGET_ROOT } from \"../constants.ts\";\nimport type { ReferenceImportKind } from \"../../reference-repositories.ts\";\n\nfunction normalizeReferenceKind(value: unknown): ReferenceImportKind {\n const normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"all\";\n if (normalized === \"all\" || normalized === \"\" || typeof value === \"undefined\") {\n return \"all\";\n }\n if (normalized === \"agents\" || normalized === \"agent\") {\n return \"agents\";\n }\n if (normalized === \"skills\" || normalized === \"skill\") {\n return \"skills\";\n }\n throw new Error(`Invalid import kind: ${normalized}`);\n}\n\nexport function registerReferenceRepositoryRoutes(app: any): void {\n app.get(\"/api/reference-repositories\", async (c: any) => {\n const repositories = listReferenceRepositories();\n return c.json({\n ok: true,\n repositories,\n });\n });\n\n app.post(\"/api/reference-repositories/sync\", async (c: any) => {\n try {\n const payload = await c.req.json().catch(() => ({})) as { repository?: string };\n const repository = typeof payload?.repository === \"string\"\n ? payload.repository.trim() || undefined\n : undefined;\n\n const results = syncReferenceRepositories(repository);\n const hasFailed = results.some((item) => item.action === \"failed\");\n return c.json({\n ok: true,\n failed: hasFailed,\n results,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error({ err: error }, \"Failed to sync reference repositories\");\n const status = message.startsWith(\"Unknown reference repository\") ? 400 : 500;\n return c.json({ ok: false, error: message }, status);\n }\n });\n\n app.post(\"/api/reference-repositories/import\", async (c: any) => {\n try {\n const payload = await c.req.json() as {\n repository?: string;\n kind?: unknown;\n overwrite?: boolean;\n dryRun?: boolean;\n global?: boolean;\n };\n\n const repository = typeof payload?.repository === \"string\" ? payload.repository.trim() : \"\";\n if (!repository) {\n return c.json({ ok: false, error: \"repository is required.\" }, 400);\n }\n\n const kind = normalizeReferenceKind(payload?.kind);\n const summary = importReferenceArtifacts(repository, TARGET_ROOT, {\n kind,\n overwrite: payload?.overwrite === true,\n dryRun: payload?.dryRun === true,\n importToGlobal: payload?.global === true,\n });\n\n return c.json({\n ok: true,\n ...summary,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error({ err: error }, \"Failed to import reference repository artifacts\");\n const status = message.startsWith(\"Unknown reference repository\") || message.startsWith(\"Repository not synced\")\n ? 400\n : 500;\n return c.json({ ok: false, error: message }, status);\n }\n });\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport { logger } from \"../logger.ts\";\nimport { toStringValue } from \"../helpers.ts\";\nimport { isAgentStillRunning, pushWorktreeBranch } from \"../agent.ts\";\nimport { addEvent } from \"../issues.ts\";\nimport { persistState } from \"../store.ts\";\nimport { findIssue, listEvents, parseIssue } from \"../api-helpers.ts\";\nimport { TARGET_ROOT, SOURCE_ROOT, ATTACHMENTS_ROOT } from \"../constants.ts\";\nimport { execSync } from \"node:child_process\";\nimport {\n appendFileSync,\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n readSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { basename, extname, join } from \"node:path\";\nimport { now } from \"../helpers.ts\";\n\nexport function registerMiscRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.post(\"/api/issues/:id/push\", async (c: any) => {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n if (issue.state !== \"Done\") {\n return c.json({ ok: false, error: `Issue ${issue.identifier} must be in Done state to push. Current state: ${issue.state}.` }, 409);\n }\n try {\n const prUrl = pushWorktreeBranch(issue);\n issue.mergedAt = new Date().toISOString();\n addEvent(state, issue.id, \"merge\", `Branch ${issue.branchName} pushed to origin. PR: ${prUrl}`);\n await persistState(state);\n return c.json({ ok: true, prUrl });\n } catch (error) {\n logger.error({ err: error }, `[API] Failed to push branch for ${issueId}`);\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/live/:id/stream\", (c: any) => {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n\n const enc = new TextEncoder();\n const sseMsg = (data: unknown) => enc.encode(`data: ${JSON.stringify(data)}\\n\\n`);\n const sseComment = () => enc.encode(\": keepalive\\n\\n\");\n\n let intervalId: ReturnType<typeof setInterval>;\n let keepaliveId: ReturnType<typeof setInterval>;\n\n const stream = new ReadableStream({\n start(ctrl) {\n // Send initial content\n const wp = issue.workspacePath;\n const liveLog = wp ? `${wp}/live-output.log` : null;\n let lastSize = 0;\n\n if (liveLog && existsSync(liveLog)) {\n try {\n const stat = statSync(liveLog);\n lastSize = stat.size;\n const readSize = Math.min(lastSize, 16_384);\n const fd = openSync(liveLog, \"r\");\n const buf = Buffer.alloc(readSize);\n readSync(fd, buf, 0, readSize, Math.max(0, lastSize - readSize));\n closeSync(fd);\n ctrl.enqueue(sseMsg({ type: \"init\", text: buf.toString(\"utf8\"), size: lastSize }));\n } catch {}\n } else {\n ctrl.enqueue(sseMsg({ type: \"init\", text: \"\", size: 0 }));\n }\n\n // Stream new bytes every second\n intervalId = setInterval(() => {\n const currentIssue = findIssue(state, issueId);\n if (!currentIssue || (currentIssue.state !== \"Running\" && currentIssue.state !== \"Reviewing\" && currentIssue.state !== \"Planning\")) {\n ctrl.enqueue(sseMsg({ type: \"done\", state: currentIssue?.state }));\n clearInterval(intervalId);\n clearInterval(keepaliveId);\n try { ctrl.close(); } catch {}\n return;\n }\n const logPath = currentIssue.workspacePath ? `${currentIssue.workspacePath}/live-output.log` : null;\n if (logPath && existsSync(logPath)) {\n try {\n const stat = statSync(logPath);\n if (stat.size > lastSize) {\n const readSize = stat.size - lastSize;\n const fd = openSync(logPath, \"r\");\n const buf = Buffer.alloc(readSize);\n readSync(fd, buf, 0, readSize, lastSize);\n closeSync(fd);\n lastSize = stat.size;\n ctrl.enqueue(sseMsg({ type: \"chunk\", text: buf.toString(\"utf8\"), size: lastSize }));\n }\n } catch {}\n }\n }, 1_000);\n\n // Keepalive every 15s to prevent proxy timeouts\n keepaliveId = setInterval(() => {\n try { ctrl.enqueue(sseComment()); } catch {}\n }, 15_000);\n },\n cancel() {\n clearInterval(intervalId);\n clearInterval(keepaliveId);\n },\n });\n\n return c.body(stream, 200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n });\n\n app.get(\"/api/live/:id\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n\n const parseStartedAt = (value: unknown): number | null => {\n const valueText = typeof value === \"string\" ? value.trim() : \"\";\n if (!valueText) return null;\n const ts = Date.parse(valueText);\n return Number.isFinite(ts) ? ts : null;\n };\n\n const startedAtText = toStringValue(issue.startedAt, \"\");\n const updatedAtText = toStringValue(issue.updatedAt, \"\");\n const startedAtTs = parseStartedAt(startedAtText) ?? parseStartedAt(updatedAtText);\n const elapsed = startedAtTs ? Date.now() - startedAtTs : 0;\n\n const wp = issue.workspacePath;\n const liveLog = wp ? `${wp}/live-output.log` : null;\n let logTail = \"\";\n let logSize = 0;\n if (liveLog && existsSync(liveLog)) {\n try {\n const stat = statSync(liveLog);\n logSize = stat.size;\n // Read last 8KB\n const fd = openSync(liveLog, \"r\");\n const readSize = Math.min(logSize, 8192);\n const buf = Buffer.alloc(readSize);\n readSync(fd, buf, 0, readSize, Math.max(0, logSize - readSize));\n closeSync(fd);\n logTail = buf.toString(\"utf8\");\n } catch {}\n }\n const agentStatus = isAgentStillRunning(issue);\n return c.json({\n ok: true,\n issueId: issue.id,\n state: issue.state,\n running: issue.state === \"Running\" || issue.state === \"Reviewing\",\n agentAlive: agentStatus.alive,\n agentPid: agentStatus.pid?.pid ?? null,\n startedAt: startedAtText || updatedAtText || now(),\n elapsed: Number.isFinite(elapsed) ? elapsed : 0,\n logSize,\n logTail,\n outputTail: issue.commandOutputTail || \"\",\n });\n } catch (error) {\n const issueId = parseIssue(c);\n logger.error(`Failed to load live issue state for ${issueId || \"<unknown>\"}: ${String(error)}`);\n return c.json({ ok: false, error: \"Failed to load live issue state.\" }, 500);\n }\n });\n\n app.get(\"/api/diff/:id\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n const wp = issue.workspacePath;\n if (!wp || !existsSync(wp)) {\n return c.json({ ok: true, files: [], diff: \"\", message: \"No workspace found.\" });\n }\n let raw = \"\";\n if (issue.branchName && issue.baseBranch) {\n // Git worktree: proper branch diff\n try {\n raw = execSync(\n `git diff --no-color \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024, timeout: 15_000, cwd: TARGET_ROOT, stdio: \"pipe\" },\n );\n } catch (err: any) {\n raw = err.stdout || \"\";\n }\n } else {\n // Legacy: no-index diff between SOURCE_ROOT and workspace\n if (!existsSync(SOURCE_ROOT)) {\n return c.json({ ok: true, files: [], diff: \"\", message: \"Source root not found.\" });\n }\n try {\n raw = execSync(\n `git diff --no-index --no-color -- \"${SOURCE_ROOT}\" \"${wp}\"`,\n { encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024, timeout: 15_000 },\n );\n } catch (err: any) {\n raw = err.stdout || \"\";\n }\n }\n\n if (!raw.trim()) {\n return c.json({ ok: true, files: [], diff: \"\", message: \"No changes\" });\n }\n\n // Clean paths for legacy diff (git worktree diff already uses a/ b/ prefixes)\n let cleaned = raw;\n if (!issue.branchName || !issue.baseBranch) {\n const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const sourcePrefix = SOURCE_ROOT.endsWith(\"/\") ? SOURCE_ROOT : `${SOURCE_ROOT}/`;\n const wpPrefix = wp.endsWith(\"/\") ? wp : `${wp}/`;\n cleaned = raw\n .replace(new RegExp(esc(wpPrefix), \"g\"), \"b/\")\n .replace(new RegExp(esc(sourcePrefix), \"g\"), \"a/\");\n }\n\n // Split into per-file chunks and filter internals\n const internalRe = /^(fifony[-_]|\\.fifony-|WORKFLOW\\.local)/;\n const chunks = cleaned.split(/(?=^diff --git )/m);\n const filtered = chunks.filter((chunk) => {\n const m = chunk.match(/^diff --git a\\/(.+?) b\\//);\n if (!m) return false;\n const basename = m[1].split(\"/\").pop() || \"\";\n return !internalRe.test(basename);\n });\n\n const diff = filtered.join(\"\").trim();\n\n // Per-file summary (like GitHub PR file list)\n const files = filtered.map((chunk) => {\n const pathMatch = chunk.match(/^diff --git a\\/(.+?) b\\//);\n const path = pathMatch?.[1] || \"unknown\";\n const additions = (chunk.match(/^\\+[^+]/gm) || []).length;\n const deletions = (chunk.match(/^-[^-]/gm) || []).length;\n const isNew = chunk.includes(\"new file mode\");\n const isDeleted = chunk.includes(\"deleted file mode\");\n const status = isNew ? \"added\" : isDeleted ? \"removed\" : \"modified\";\n return { path, status, additions, deletions };\n });\n\n const totalAdditions = files.reduce((s, f) => s + f.additions, 0);\n const totalDeletions = files.reduce((s, f) => s + f.deletions, 0);\n\n return c.json({ ok: true, files, diff, totalAdditions, totalDeletions });\n } catch (error) {\n const issueId = parseIssue(c);\n logger.error(`Failed to load issue diff for ${issueId || \"<unknown>\"}: ${String(error)}`);\n return c.json({ ok: false, error: \"Failed to load issue diff.\" }, 500);\n }\n });\n\n app.get(\"/api/git/status\", async (c: any) => {\n try {\n const isGit = (() => {\n try { execSync(\"git rev-parse --git-dir\", { cwd: TARGET_ROOT, stdio: \"pipe\" }); return true; } catch { return false; }\n })();\n if (!isGit) return c.json({ isGit: false, branch: null, hasCommits: false });\n const branch = (() => {\n try { return execSync(\"git rev-parse --abbrev-ref HEAD\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim(); } catch { return null; }\n })();\n const hasCommits = (() => {\n try { execSync(\"git rev-parse HEAD\", { cwd: TARGET_ROOT, stdio: \"pipe\" }); return true; } catch { return false; }\n })();\n return c.json({ isGit: true, branch, hasCommits });\n } catch (error) {\n return c.json({ ok: false, error: String(error) }, 500);\n }\n });\n\n app.post(\"/api/git/init\", async (c: any) => {\n try {\n execSync(\"git init\", { cwd: TARGET_ROOT, stdio: \"pipe\" });\n // Create an empty initial commit so HEAD exists and branching works normally\n execSync('git commit --allow-empty -m \"Initial commit\"', { cwd: TARGET_ROOT, stdio: \"pipe\" });\n const branch = execSync(\"git rev-parse --abbrev-ref HEAD\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim();\n state.config.defaultBranch = branch;\n await persistState(state);\n return c.json({ ok: true, branch });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/git/branch\", async (c: any) => {\n try {\n const { branchName } = await c.req.json() as { branchName?: string };\n if (!branchName || !/^[a-zA-Z0-9/_.-]+$/.test(branchName)) {\n return c.json({ ok: false, error: \"Invalid branch name.\" }, 400);\n }\n execSync(`git checkout -b \"${branchName}\"`, { cwd: TARGET_ROOT, stdio: \"pipe\" });\n state.config.defaultBranch = branchName;\n await persistState(state);\n return c.json({ ok: true, defaultBranch: branchName });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/events/feed\", async (c: any) => {\n const since = c.req.query(\"since\");\n const issueId = c.req.query(\"issueId\");\n const kind = c.req.query(\"kind\");\n const events = await listEvents(state, {\n since: typeof since === \"string\" ? since : undefined,\n issueId: typeof issueId === \"string\" && issueId ? issueId : undefined,\n kind: typeof kind === \"string\" && kind ? kind : undefined,\n });\n return c.json({ events: events.slice(0, 200) });\n });\n\n app.get(\"/api/gitignore/status\", async (c: any) => {\n try {\n const gitignorePath = join(TARGET_ROOT, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n return c.json({ exists: false, hasFifony: false });\n }\n const content = readFileSync(gitignorePath, \"utf-8\");\n const lines = content.split(\"\\n\").map((l: string) => l.trim());\n const hasFifony = lines.some((l: string) => l === \".fifony\" || l === \".fifony/\" || l === \"/.fifony\" || l === \"/.fifony/\");\n return c.json({ exists: true, hasFifony });\n } catch (error) {\n logger.error({ err: error }, \"Failed to check .gitignore\");\n return c.json({ exists: false, hasFifony: false, error: \"Failed to check .gitignore\" }, 500);\n }\n });\n\n app.post(\"/api/gitignore/add\", async (c: any) => {\n try {\n const gitignorePath = join(TARGET_ROOT, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n writeFileSync(gitignorePath, \"# Fifony state directory\\n.fifony/\\n\", \"utf-8\");\n return c.json({ ok: true, created: true });\n }\n const content = readFileSync(gitignorePath, \"utf-8\");\n const lines = content.split(\"\\n\").map((l: string) => l.trim());\n const hasFifony = lines.some((l: string) => l === \".fifony\" || l === \".fifony/\" || l === \"/.fifony\" || l === \"/.fifony/\");\n if (hasFifony) {\n return c.json({ ok: true, alreadyPresent: true });\n }\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n appendFileSync(gitignorePath, `${suffix}\\n# Fifony state directory\\n.fifony/\\n`, \"utf-8\");\n return c.json({ ok: true, added: true });\n } catch (error) {\n logger.error({ err: error }, \"Failed to update .gitignore\");\n return c.json({ ok: false, error: \"Failed to update .gitignore\" }, 500);\n }\n });\n\n app.post(\"/api/attachments/upload\", async (c: any) => {\n try {\n const payload = await c.req.json() as { files?: Array<{ name: string; data: string; type: string }> };\n if (!Array.isArray(payload.files) || payload.files.length === 0) {\n return c.json({ ok: false, error: \"No files provided.\" }, 400);\n }\n const uploadId = randomUUID();\n const uploadDir = join(ATTACHMENTS_ROOT, \"temp\", uploadId);\n mkdirSync(uploadDir, { recursive: true });\n const paths: string[] = [];\n for (const file of payload.files) {\n if (typeof file.data !== \"string\" || !file.name) continue;\n const safeExt = extname(file.name).replace(/[^a-z0-9.]/gi, \"\").slice(0, 10) || \".bin\";\n const safeName = `${randomUUID()}${safeExt}`;\n const dest = join(uploadDir, safeName);\n writeFileSync(dest, Buffer.from(file.data, \"base64\"));\n paths.push(dest);\n }\n return c.json({ ok: true, paths, uploadId });\n } catch (error) {\n logger.error({ err: error }, \"[API] Attachment upload failed\");\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n}\n","import type { IssuePlan } from \"./types.ts\";\nimport { now } from \"./helpers.ts\";\nimport { replacePersistedSetting, getSettingStateResource } from \"./store.ts\";\nimport { logger } from \"./logger.ts\";\n\n// ── Planning session persistence ─────────────────────────────────────────────\n\nexport type PlanningSessionStatus = \"input\" | \"planning\" | \"done\" | \"error\" | \"interrupted\";\n\nexport type PlanningSessionUsage = {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n model: string;\n promptChars: number;\n outputChars: number;\n durationMs: number;\n};\n\nexport type PlanningSession = {\n title: string;\n description: string;\n status: PlanningSessionStatus;\n plan: IssuePlan | null;\n error: string | null;\n pid: number | null;\n provider: string | null;\n startedAt: string | null;\n completedAt: string | null;\n updatedAt: string;\n /** Live progress: output bytes received so far (updated during planning) */\n outputBytes: number;\n /** Token usage extracted after planning completes */\n usage: PlanningSessionUsage | null;\n};\n\nconst PLANNING_SETTING_ID = \"planning:active\";\n\nfunction emptySession(): PlanningSession {\n return {\n title: \"\", description: \"\", status: \"input\",\n plan: null, error: null, pid: null, provider: null,\n startedAt: null, completedAt: null, updatedAt: now(),\n outputBytes: 0, usage: null,\n };\n}\n\nexport async function persistSession(session: PlanningSession): Promise<void> {\n session.updatedAt = now();\n try {\n await replacePersistedSetting({\n id: PLANNING_SETTING_ID,\n scope: \"runtime\",\n value: session,\n source: \"system\",\n updatedAt: session.updatedAt,\n });\n } catch (error) {\n logger.warn(`Failed to persist planning session: ${String(error)}`);\n }\n}\n\nexport async function loadPlanningSession(): Promise<PlanningSession | null> {\n const resource = getSettingStateResource();\n if (!resource) return null;\n try {\n const record = await resource.get(PLANNING_SETTING_ID);\n if (record?.value && typeof record.value === \"object\") {\n return record.value as PlanningSession;\n }\n } catch {\n // not found\n }\n return null;\n}\n\nexport async function clearPlanningSession(): Promise<void> {\n await persistSession(emptySession());\n}\n\n/** Check on boot if a planning process is still alive. */\nexport async function recoverPlanningSession(): Promise<void> {\n const session = await loadPlanningSession();\n if (!session || session.status !== \"planning\") return;\n\n if (session.pid) {\n let alive = false;\n try { process.kill(session.pid, 0); alive = true; } catch {}\n\n if (alive) {\n logger.info(`Planning process still alive (PID ${session.pid}), keeping status.`);\n return;\n }\n }\n\n // Process died — mark as interrupted\n session.status = \"interrupted\";\n session.error = \"Planning process was interrupted by server restart.\";\n session.pid = null;\n await persistSession(session);\n logger.info(\"Planning session marked as interrupted (process not found).\");\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport type { IssuePlan, RuntimeConfig, IssueEntry, AgentTokenUsage } from \"./types.ts\";\nimport { now } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { record as recordTokens } from \"./token-ledger.ts\";\nimport { persistSession, type PlanningSession, type PlanningSessionUsage } from \"./planning-session.ts\";\nimport { parsePlanOutput, extractPlanTokenUsage } from \"./planning-parser.ts\";\nimport {\n buildPlanPrompt,\n getPlanCommand,\n savePlanDebugFiles,\n resolvePlanStageConfig,\n runPlanningProcess,\n} from \"./planning-prompts.ts\";\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\nexport type GeneratePlanResult = {\n plan: IssuePlan;\n usage: PlanningSessionUsage;\n prompt: string;\n};\n\n// ── savePlanningInput ─────────────────────────────────────────────────────────\n\nexport async function savePlanningInput(title: string, description: string): Promise<PlanningSession> {\n const session: PlanningSession = {\n title, description, status: \"input\",\n plan: null, error: null, pid: null, provider: null,\n startedAt: null, completedAt: null, updatedAt: now(),\n outputBytes: 0, usage: null,\n };\n await persistSession(session);\n return session;\n}\n\n// ── Main: generate plan ───────────────────────────────────────────────────────\n\nexport async function generatePlan(\n title: string,\n description: string,\n config: RuntimeConfig,\n _workflowDefinition: null,\n options?: { fast?: boolean; persistSession?: boolean; images?: string[] },\n): Promise<GeneratePlanResult> {\n const fast = options?.fast ?? false;\n const images = options?.images;\n const shouldPersistSession = options?.persistSession !== false; // default true\n logger.info({ title: title.slice(0, 80), fast }, \"[Planner] Starting plan generation\");\n\n const { provider: preferred, model: planStageModel, effort: planStageEffort } = await resolvePlanStageConfig(config);\n\n // Fast mode: same model, effort low (embedded in prompt since CLIs don't support effort flags)\n const effectiveEffort = fast ? \"low\" : (planStageEffort || \"medium\");\n void effectiveEffort; // used in prompt logic\n\n // Persist: planning started\n const planStartMs = Date.now();\n const session: PlanningSession = {\n title, description, status: \"planning\",\n plan: null, error: null, pid: null, provider: preferred,\n startedAt: now(), completedAt: null, updatedAt: now(),\n outputBytes: 0, usage: null,\n };\n if (shouldPersistSession) await persistSession(session);\n\n const prompt = await buildPlanPrompt(title, description, fast, images);\n\n let plan: IssuePlan | null = null;\n let planUsage: PlanningSessionUsage;\n\n {\n const command = getPlanCommand(preferred, planStageModel, images);\n if (!command) throw new Error(`No command configured for provider ${preferred}.`);\n\n logger.debug({ provider: preferred, model: planStageModel, command: command.slice(0, 120) }, \"[Planner] Provider selected for plan generation\");\n\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-plan-\"));\n const promptFile = join(tempDir, \"fifony-plan-prompt.md\");\n writeFileSync(promptFile, `${prompt}\\n`, \"utf8\");\n\n // Track output bytes live — persist progress periodically so the UI can show it\n let lastProgressPersist = 0;\n const PROGRESS_INTERVAL_MS = 2000;\n\n const output = await runPlanningProcess({\n command,\n tempDir,\n promptFile,\n provider: preferred,\n extraEnv: images?.length ? { FIFONY_IMAGE_PATHS: images.join(\",\") } : {},\n onPid: (pid) => {\n session.pid = pid;\n if (shouldPersistSession) persistSession(session).catch(() => {});\n },\n onChunk: (bytes) => {\n session.outputBytes = bytes;\n if (shouldPersistSession) {\n const elapsed = Date.now() - planStartMs;\n if (elapsed - lastProgressPersist > PROGRESS_INTERVAL_MS) {\n lastProgressPersist = elapsed;\n persistSession(session).catch(() => {});\n }\n }\n },\n }).finally(() => {\n rmSync(tempDir, { recursive: true, force: true });\n });\n\n logger.info({ rawOutput: output.slice(0, 2000) }, `Plan raw output from ${preferred}`);\n savePlanDebugFiles(\"cli\", prompt, output);\n\n logger.debug({ outputLength: output.length }, \"[Planner] Plan command completed, parsing output\");\n plan = parsePlanOutput(output);\n\n const durationMs = Date.now() - planStartMs;\n const tokenInfo = extractPlanTokenUsage(output);\n planUsage = {\n inputTokens: tokenInfo?.inputTokens ?? 0,\n outputTokens: tokenInfo?.outputTokens ?? 0,\n totalTokens: tokenInfo?.totalTokens ?? 0,\n model: tokenInfo?.model || planStageModel || preferred,\n promptChars: prompt.length,\n outputChars: output.length,\n durationMs,\n };\n }\n\n if (!plan) {\n const durationMs = Date.now() - planStartMs;\n session.status = \"error\";\n session.error = `Could not parse plan from AI output. Duration: ${durationMs}ms`;\n session.pid = null;\n if (shouldPersistSession) await persistSession(session);\n logger.error({ durationMs }, \"[Planner] Could not parse plan from AI output\");\n throw new Error(session.error);\n }\n\n plan.provider = planStageModel ? `${preferred}/${planStageModel}` : preferred;\n\n if (planUsage.totalTokens > 0) {\n const tokenUsage: AgentTokenUsage = {\n inputTokens: planUsage.inputTokens,\n outputTokens: planUsage.outputTokens,\n totalTokens: planUsage.totalTokens,\n model: planUsage.model,\n };\n recordTokens({ id: \"planning\", identifier: \"PLAN\", title } as IssueEntry, tokenUsage, \"planner\");\n }\n\n session.status = \"done\";\n session.plan = plan;\n session.pid = null;\n session.completedAt = now();\n session.error = null;\n session.usage = planUsage;\n if (shouldPersistSession) await persistSession(session);\n\n const tokenSummary = planUsage.totalTokens > 0\n ? `, ${planUsage.totalTokens.toLocaleString()} tokens (in: ${planUsage.inputTokens.toLocaleString()}, out: ${planUsage.outputTokens.toLocaleString()})`\n : `, ${planUsage.outputChars.toLocaleString()} output chars`;\n logger.info(`Plan generated for \"${title}\" via ${planUsage.model}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}${tokenSummary}, ${planUsage.durationMs}ms`);\n return { plan, usage: planUsage, prompt };\n}\n","import type { IssuePlan } from \"./types.ts\";\nimport { now, toStringArray, extractJsonObjects, repairTruncatedJson } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\n\n// ── Parser ────────────────────────────────────────────────────────────────────\n\nexport function tryBuildPlan(parsed: any): IssuePlan | null {\n if (!parsed || typeof parsed !== \"object\") return null;\n if (!Array.isArray(parsed.steps) || parsed.steps.length === 0) return null;\n // Accept various summary field names that different models use\n const summary = parsed.summary || parsed.issueTitle || parsed.title || parsed.issue_title || parsed.description || \"\";\n\n const complexities = [\"trivial\", \"low\", \"medium\", \"high\"];\n\n return {\n summary: String(summary),\n estimatedComplexity: complexities.includes(parsed.estimatedComplexity) ? parsed.estimatedComplexity\n : complexities.includes(parsed.complexity) ? parsed.complexity : \"medium\",\n\n steps: parsed.steps.map((s: any, i: number) => ({\n step: typeof s.step === \"number\" ? s.step : typeof s.id === \"number\" ? s.id : i + 1,\n action: String(s.action || s.what || s.description || s.title || s.task_name || (typeof s.step === \"string\" ? s.step : \"\") || \"\"),\n files: toStringArray(s.files),\n details: s.details ? String(s.details) : undefined,\n ownerType: s.ownerType || s.owner_type || undefined,\n doneWhen: Array.isArray(s.doneWhen) ? s.doneWhen.join(\"\\n\") : (s.doneWhen || s.done_when || undefined),\n })),\n\n assumptions: toStringArray(parsed.assumptions),\n constraints: toStringArray(parsed.constraints),\n unknowns: Array.isArray(parsed.unknowns) ? parsed.unknowns.map((u: any) => ({\n question: String(u.question || \"\"),\n whyItMatters: String(u.whyItMatters || u.why_it_matters || \"\"),\n howToResolve: String(u.howToResolve || u.how_to_resolve || \"\"),\n })) : undefined,\n successCriteria: toStringArray(parsed.successCriteria || parsed.success_criteria),\n risks: Array.isArray(parsed.risks) ? parsed.risks.map((r: any) => ({\n risk: String(r.risk || \"\"),\n impact: String(r.impact || \"\"),\n mitigation: String(r.mitigation || \"\"),\n })) : undefined,\n validation: toStringArray(parsed.validation),\n deliverables: toStringArray(parsed.deliverables),\n\n executionStrategy: parsed.executionStrategy || parsed.execution_strategy || undefined,\n toolingDecision: parsed.toolingDecision || parsed.tooling_decision || undefined,\n\n suggestedPaths: toStringArray(parsed.suggestedPaths || parsed.suggested_paths || parsed.suggestedFilePaths || parsed.filePaths || parsed.file_paths || parsed.paths),\n suggestedLabels: toStringArray(parsed.suggestedLabels || parsed.suggested_labels || parsed.labels),\n suggestedEffort: parsed.suggestedEffort || parsed.suggested_effort || parsed.effortSuggestion || parsed.effort_suggestion || parsed.effort || { default: \"medium\" },\n\n provider: \"\",\n createdAt: now(),\n };\n}\n\nexport function parsePlanOutput(raw: string): IssuePlan | null {\n const text = raw.trim();\n if (!text) return null;\n\n const candidates: string[] = [];\n\n // 1. Try to unwrap --output-format json envelope\n try {\n const outer = JSON.parse(text);\n\n // --json-schema puts structured output in .structured_output (not .result)\n if (outer?.structured_output && typeof outer.structured_output === \"object\") {\n const plan = tryBuildPlan(outer.structured_output);\n if (plan) return plan;\n // If it didn't validate, still try as a candidate string\n candidates.push(JSON.stringify(outer.structured_output));\n }\n\n if (outer?.result && typeof outer.result === \"string\") {\n const result = outer.result;\n candidates.push(result);\n // Also extract any JSON objects embedded in the result string\n candidates.push(...extractJsonObjects(result));\n // Try code blocks inside .result\n const resultCodeBlocks = result.matchAll(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/gi);\n for (const match of resultCodeBlocks) candidates.push(match[1]);\n }\n // If the outer object itself looks like a plan (no .type envelope)\n if (outer?.summary) candidates.push(text);\n } catch {}\n\n // 2. Try code blocks in full output\n const codeBlocks = text.matchAll(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/gi);\n for (const match of codeBlocks) candidates.push(match[1]);\n\n // 3. Extract top-level JSON objects from full text\n candidates.push(...extractJsonObjects(text));\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate.trim());\n // Direct plan\n const plan = tryBuildPlan(parsed);\n if (plan) return plan;\n // Envelope with structured_output\n if (parsed?.structured_output && typeof parsed.structured_output === \"object\") {\n const innerPlan = tryBuildPlan(parsed.structured_output);\n if (innerPlan) return innerPlan;\n }\n } catch {}\n }\n\n // Last resort: try to repair truncated JSON output\n const repaired = repairTruncatedJson(text);\n if (repaired) {\n try {\n const parsed = JSON.parse(repaired);\n const plan = tryBuildPlan(parsed);\n if (plan) {\n logger.warn(\"[Planner] Plan parsed from repaired truncated JSON output\");\n return plan;\n }\n // Check for envelope\n if (parsed?.structured_output && typeof parsed.structured_output === \"object\") {\n const innerPlan = tryBuildPlan(parsed.structured_output);\n if (innerPlan) {\n logger.warn(\"[Planner] Plan parsed from repaired truncated JSON envelope\");\n return innerPlan;\n }\n }\n } catch {\n logger.debug(\"[Planner] JSON repair attempted but result still not parseable\");\n }\n }\n\n return null;\n}\n\n/** Extract token usage from CLI output (Claude JSON or Codex text) */\nexport function extractPlanTokenUsage(raw: string): { inputTokens: number; outputTokens: number; totalTokens: number; model: string } | null {\n // 1. Claude --output-format json: parse the outer JSON envelope\n try {\n const parsed = JSON.parse(raw.trim());\n\n // Try modelUsage field first (richer data, per-model breakdown)\n if (parsed?.modelUsage && typeof parsed.modelUsage === \"object\") {\n let totalInput = 0, totalOutput = 0, primaryModel = \"\";\n let maxTokens = 0;\n for (const [model, data] of Object.entries<any>(parsed.modelUsage)) {\n const inp = Number(data?.inputTokens || 0) + Number(data?.cacheReadInputTokens || 0) + Number(data?.cacheCreationInputTokens || 0);\n const out = Number(data?.outputTokens || 0);\n totalInput += inp;\n totalOutput += out;\n if (inp + out > maxTokens) {\n maxTokens = inp + out;\n primaryModel = model;\n }\n }\n if (totalInput > 0 || totalOutput > 0) {\n return { inputTokens: totalInput, outputTokens: totalOutput, totalTokens: totalInput + totalOutput, model: primaryModel };\n }\n }\n\n // Fallback: usage field\n const usage = parsed?.usage;\n if (usage && typeof usage === \"object\") {\n const input = Number(usage.input_tokens) || 0;\n const output = Number(usage.output_tokens) || 0;\n if (input > 0 || output > 0) {\n return {\n inputTokens: input,\n outputTokens: output,\n totalTokens: input + output,\n model: typeof parsed.model === \"string\" ? parsed.model : \"\",\n };\n }\n }\n\n // Fallback: total_cost_usd present means we can at least log the cost\n } catch { /* not JSON — try Codex format */ }\n\n // 2. Codex: \"tokens used\\n1,681\\n\"\n const codexMatch = raw.match(/tokens?\\s+used\\s*\\n\\s*([\\d,]+)/i);\n if (codexMatch) {\n const total = parseInt(codexMatch[1].replace(/,/g, \"\"), 10);\n const modelMatch = raw.match(/^model:\\s*(.+)$/im);\n if (total > 0) {\n return { inputTokens: 0, outputTokens: 0, totalTokens: total, model: modelMatch?.[1]?.trim() || \"\" };\n }\n }\n\n return null;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { appendFileTail } from \"./helpers.ts\";\nimport type { IssuePlan, RuntimeConfig, PipelineStageConfig } from \"./types.ts\";\nimport { PLAN_JSON_SCHEMA } from \"./planning-schema.ts\";\nimport { ADAPTERS } from \"./adapters/registry.ts\";\nimport { CLAUDE_RESULT_SCHEMA } from \"./adapters/commands.ts\";\nimport { renderPrompt } from \"../prompting.ts\";\nimport { STATE_ROOT } from \"./constants.ts\";\nimport { detectAvailableProviders } from \"./providers.ts\";\nimport { getWorkflowConfig, loadRuntimeSettings } from \"./settings.ts\";\n\n// ── Prompt builders ───────────────────────────────────────────────────────────\n\nexport async function buildPlanPrompt(title: string, description: string, fast = false, images?: string[]): Promise<string> {\n return renderPrompt(\"issue-planner\", {\n title,\n description: description || \"(none provided)\",\n fast,\n images: images?.length ? images : undefined,\n });\n}\n\nexport async function buildRefinePrompt(\n title: string,\n description: string,\n currentPlan: IssuePlan,\n feedback: string,\n): Promise<string> {\n return renderPrompt(\"issue-planner-refine\", {\n title,\n description: description || \"(none provided)\",\n currentPlan: JSON.stringify(currentPlan, null, 2),\n feedback,\n });\n}\n\n// ── Provider command ──────────────────────────────────────────────────────────\n\nexport function getPlanCommand(provider: string, model?: string, imagePaths?: string[]): string {\n const adapter = ADAPTERS[provider];\n if (!adapter) return \"\";\n const jsonSchema = provider === \"claude\" ? PLAN_JSON_SCHEMA : undefined;\n return adapter.buildCommand({ model, imagePaths, jsonSchema, noToolAccess: provider === \"claude\" });\n}\n\n// ── Shared: debug file saving ─────────────────────────────────────────────────\n\nexport function savePlanDebugFiles(slug: string, prompt: string, output: string): void {\n try {\n const debugDir = join(STATE_ROOT, \"debug\");\n mkdirSync(debugDir, { recursive: true });\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n writeFileSync(join(debugDir, `plan-${slug}-${ts}-prompt.md`), prompt, \"utf8\");\n if (output) writeFileSync(join(debugDir, `plan-${slug}-${ts}-output.txt`), output, \"utf8\");\n } catch {\n // non-critical\n }\n}\n\n// ── Shared: provider resolution ───────────────────────────────────────────────\n\nexport type PlanStageConfig = {\n provider: string;\n model: string | undefined;\n effort: string | undefined;\n};\n\nexport async function resolvePlanStageConfig(config: RuntimeConfig): Promise<PlanStageConfig> {\n const providers = detectAvailableProviders();\n const available = providers.filter((p) => p.available).map((p) => p.name);\n\n let configuredProvider: string | undefined;\n let configuredModel: string | undefined;\n let configuredEffort: string | undefined;\n\n try {\n const settings = await loadRuntimeSettings();\n const workflowConfig = getWorkflowConfig(settings);\n if (workflowConfig?.plan) {\n configuredProvider = workflowConfig.plan.provider;\n configuredModel = workflowConfig.plan.model;\n configuredEffort = workflowConfig.plan.effort;\n }\n } catch {\n // fall through to defaults\n }\n\n const provider =\n (configuredProvider && available.includes(configuredProvider)) ? configuredProvider :\n (config.agentProvider && available.includes(config.agentProvider)) ? config.agentProvider :\n available[0];\n\n if (!provider) throw new Error(\"No AI provider available for planning.\");\n\n // If the configured provider wasn't available and we fell back, discard its model\n // to avoid passing a model ID that belongs to a different CLI.\n const model = provider === configuredProvider ? configuredModel : undefined;\n\n return { provider, model, effort: configuredEffort };\n}\n\n// ── Shared: subprocess runner ─────────────────────────────────────────────────\n\nconst PLAN_TIMEOUT_MS = 1_800_000; // 30 minutes\nconst PLAN_STALE_OUTPUT_MS = 300_000; // 5 minutes without output growth\n\nexport async function runPlanningProcess(options: {\n command: string;\n tempDir: string;\n promptFile: string;\n provider: string;\n extraEnv?: Record<string, string>;\n onPid?: (pid: number) => void;\n onChunk?: (bytes: number) => void;\n}): Promise<string> {\n const { command, tempDir, promptFile, provider, extraEnv = {}, onPid, onChunk } = options;\n\n return new Promise<string>((resolve, reject) => {\n let stdout = \"\";\n const child = spawn(command, {\n shell: true,\n cwd: tempDir,\n detached: true,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, FIFONY_PROMPT_FILE: promptFile, FIFONY_AGENT_PROVIDER: provider, ...extraEnv },\n });\n child.unref();\n child.stdin?.end();\n\n if (child.pid) onPid?.(child.pid);\n\n let outputBytes = 0;\n const onData = (chunk: Buffer | string) => {\n const text = String(chunk);\n stdout = appendFileTail(stdout, text, 32_000);\n outputBytes += text.length;\n onChunk?.(outputBytes);\n };\n child.stdout?.on(\"data\", onData);\n child.stderr?.on(\"data\", onData);\n\n const timer = setTimeout(() => {\n if (child.pid) { try { process.kill(-child.pid, \"SIGTERM\"); } catch {} }\n else { child.kill(\"SIGTERM\"); }\n reject(new Error(\"Plan generation timed out after 30 minutes.\"));\n }, PLAN_TIMEOUT_MS);\n\n let lastWatchdogBytes = 0;\n let lastGrowthAt = Date.now();\n const watchdog = setInterval(() => {\n if (child.pid) {\n try { process.kill(child.pid, 0); } catch {\n clearInterval(watchdog);\n clearTimeout(timer);\n reject(new Error(`Planning process died unexpectedly (PID ${child.pid}).`));\n return;\n }\n }\n if (outputBytes > lastWatchdogBytes) {\n lastWatchdogBytes = outputBytes;\n lastGrowthAt = Date.now();\n } else if (Date.now() - lastGrowthAt > PLAN_STALE_OUTPUT_MS) {\n clearInterval(watchdog);\n clearTimeout(timer);\n if (child.pid) { try { process.kill(-child.pid, \"SIGTERM\"); } catch {} }\n else { child.kill(\"SIGTERM\"); }\n reject(new Error(`Planning process stuck — no output for ${Math.round(PLAN_STALE_OUTPUT_MS / 60_000)} minutes.`));\n }\n }, 30_000);\n\n child.on(\"error\", () => { clearInterval(watchdog); clearTimeout(timer); reject(new Error(\"Failed to execute planning command.\")); });\n child.on(\"close\", (code) => {\n clearInterval(watchdog);\n clearTimeout(timer);\n if (code !== 0) {\n reject(new Error(`Planning failed (exit ${code}): ${stdout.slice(0, 500)}`));\n return;\n }\n resolve(stdout);\n });\n });\n}\n","// ── Plan JSON schema definitions ─────────────────────────────────────────────\n\n// Reusable step schema (used in both steps[] and phases[].tasks[])\nexport const STEP_SCHEMA = {\n type: \"object\",\n additionalProperties: false,\n required: [\"step\", \"action\", \"files\", \"details\", \"ownerType\", \"doneWhen\"],\n properties: {\n step: { type: \"number\" },\n action: { type: \"string\" },\n files: { type: \"array\", items: { type: \"string\" } },\n details: { type: \"string\" },\n ownerType: { type: \"string\", enum: [\"human\", \"agent\", \"skill\", \"subagent\", \"tool\"] },\n doneWhen: { type: \"string\" },\n },\n};\n\nexport const PLAN_JSON_SCHEMA = JSON.stringify({\n type: \"object\",\n additionalProperties: false,\n required: [\"summary\", \"steps\", \"phases\", \"estimatedComplexity\", \"suggestedPaths\", \"suggestedLabels\", \"assumptions\", \"constraints\", \"unknowns\", \"successCriteria\", \"executionStrategy\", \"toolingDecision\", \"risks\", \"validation\", \"deliverables\", \"suggestedEffort\"],\n properties: {\n summary: { type: \"string\" },\n estimatedComplexity: { type: \"string\", enum: [\"trivial\", \"low\", \"medium\", \"high\"] },\n assumptions: { type: \"array\", items: { type: \"string\" } },\n constraints: { type: \"array\", items: { type: \"string\" } },\n unknowns: { type: \"array\", items: { type: \"object\", additionalProperties: false, properties: { question: { type: \"string\" }, whyItMatters: { type: \"string\" }, howToResolve: { type: \"string\" } }, required: [\"question\", \"whyItMatters\", \"howToResolve\"] } },\n successCriteria: { type: \"array\", items: { type: \"string\" } },\n executionStrategy: { type: \"object\", additionalProperties: false, required: [\"approach\", \"whyThisApproach\", \"alternativesConsidered\"], properties: { approach: { type: \"string\" }, whyThisApproach: { type: \"string\" }, alternativesConsidered: { type: \"array\", items: { type: \"string\" } } } },\n toolingDecision: { type: \"object\", additionalProperties: false, required: [\"shouldUseSkills\", \"skillsToUse\", \"shouldUseSubagents\", \"subagentsToUse\", \"decisionSummary\"], properties: {\n shouldUseSkills: { type: \"boolean\" },\n skillsToUse: { type: \"array\", items: { type: \"object\", additionalProperties: false, properties: { name: { type: \"string\" }, why: { type: \"string\" } }, required: [\"name\", \"why\"] } },\n shouldUseSubagents: { type: \"boolean\" },\n subagentsToUse: { type: \"array\", items: { type: \"object\", additionalProperties: false, properties: { name: { type: \"string\" }, role: { type: \"string\" }, why: { type: \"string\" } }, required: [\"name\", \"role\", \"why\"] } },\n decisionSummary: { type: \"string\" },\n } },\n steps: { type: \"array\", items: STEP_SCHEMA },\n phases: { type: \"array\", items: { type: \"object\", additionalProperties: false, required: [\"phaseName\", \"goal\", \"tasks\", \"dependencies\", \"outputs\"], properties: {\n phaseName: { type: \"string\" },\n goal: { type: \"string\" },\n tasks: { type: \"array\", items: STEP_SCHEMA },\n dependencies: { type: \"array\", items: { type: \"string\" } },\n outputs: { type: \"array\", items: { type: \"string\" } },\n } } },\n risks: { type: \"array\", items: { type: \"object\", additionalProperties: false, required: [\"risk\", \"impact\", \"mitigation\"], properties: { risk: { type: \"string\" }, impact: { type: \"string\" }, mitigation: { type: \"string\" } } } },\n validation: { type: \"array\", items: { type: \"string\" } },\n deliverables: { type: \"array\", items: { type: \"string\" } },\n suggestedPaths: { type: \"array\", items: { type: \"string\" } },\n suggestedLabels: { type: \"array\", items: { type: \"string\" } },\n suggestedEffort: { type: \"object\", additionalProperties: false, required: [\"default\", \"planner\", \"executor\", \"reviewer\"], properties: { default: { type: \"string\" }, planner: { type: \"string\" }, executor: { type: \"string\" }, reviewer: { type: \"string\" } } },\n },\n});\n\n/** Parsed schema object for OpenAI API json_schema response_format. */\nexport const PLAN_SCHEMA_OBJECT = JSON.parse(PLAN_JSON_SCHEMA) as Record<string, unknown>;\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport type { IssuePlan, RuntimeConfig, IssueEntry, AgentTokenUsage } from \"./types.ts\";\nimport { now } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { record as recordTokens } from \"./token-ledger.ts\";\nimport { type PlanningSessionUsage } from \"./planning-session.ts\";\nimport { parsePlanOutput, extractPlanTokenUsage } from \"./planning-parser.ts\";\nimport {\n buildRefinePrompt,\n getPlanCommand,\n savePlanDebugFiles,\n resolvePlanStageConfig,\n runPlanningProcess,\n} from \"./planning-prompts.ts\";\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\nexport type RefinePlanResult = {\n plan: IssuePlan;\n usage: PlanningSessionUsage;\n};\n\n// ── Refine plan ───────────────────────────────────────────────────────────────\n\nexport async function refinePlan(\n issue: IssueEntry,\n feedback: string,\n config: RuntimeConfig,\n _workflowDefinition: null,\n): Promise<RefinePlanResult> {\n if (!issue.plan) throw new Error(\"Issue has no plan to refine.\");\n\n const { provider: preferred, model: planStageModel } = await resolvePlanStageConfig(config);\n\n const refineStartMs = Date.now();\n const prompt = await buildRefinePrompt(issue.title, issue.description, issue.plan, feedback);\n\n let plan: IssuePlan | null = null;\n let refineUsage: PlanningSessionUsage;\n\n {\n const command = getPlanCommand(preferred, planStageModel);\n if (!command) throw new Error(`No command configured for provider ${preferred}.`);\n\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-refine-\"));\n const promptFile = join(tempDir, \"fifony-refine-prompt.md\");\n writeFileSync(promptFile, `${prompt}\\n`, \"utf8\");\n\n const output = await runPlanningProcess({\n command,\n tempDir,\n promptFile,\n provider: preferred,\n }).finally(() => {\n rmSync(tempDir, { recursive: true, force: true });\n });\n\n logger.info({ rawOutput: output.slice(0, 2000) }, `Refine raw output from ${preferred}`);\n savePlanDebugFiles(\"refine-cli\", prompt, output);\n\n plan = parsePlanOutput(output);\n\n const durationMs = Date.now() - refineStartMs;\n const tokenInfo = extractPlanTokenUsage(output);\n refineUsage = {\n inputTokens: tokenInfo?.inputTokens ?? 0,\n outputTokens: tokenInfo?.outputTokens ?? 0,\n totalTokens: tokenInfo?.totalTokens ?? 0,\n model: tokenInfo?.model || planStageModel || preferred,\n promptChars: prompt.length,\n outputChars: output.length,\n durationMs,\n };\n }\n\n if (!plan) {\n logger.error(\"[Planner] Could not parse refined plan from AI output\");\n throw new Error(\"Could not parse refined plan from AI output.\");\n }\n\n plan.provider = planStageModel ? `${preferred}/${planStageModel}` : preferred;\n\n const existingRefinements = issue.plan.refinements ?? [];\n const nextVersion = existingRefinements.length + 1;\n plan.refinements = [\n ...existingRefinements,\n { feedback, at: now(), version: nextVersion },\n ];\n\n const durationMs = Date.now() - refineStartMs;\n refineUsage.durationMs = durationMs;\n\n if (refineUsage.totalTokens > 0) {\n const tokenUsage: AgentTokenUsage = {\n inputTokens: refineUsage.inputTokens,\n outputTokens: refineUsage.outputTokens,\n totalTokens: refineUsage.totalTokens,\n model: refineUsage.model,\n };\n recordTokens({ id: issue.id, identifier: issue.identifier, title: issue.title } as IssueEntry, tokenUsage, \"planner\");\n }\n\n const tokenSummary = refineUsage.totalTokens > 0\n ? `, ${refineUsage.totalTokens.toLocaleString()} tokens (in: ${refineUsage.inputTokens.toLocaleString()}, out: ${refineUsage.outputTokens.toLocaleString()})`\n : `, ${refineUsage.outputChars.toLocaleString()} output chars`;\n logger.info(`Plan refined for \"${issue.title}\" via ${refineUsage.model}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}${tokenSummary}, ${durationMs}ms`);\n return { plan, usage: refineUsage };\n}\n","import type { IssuePlan, RuntimeConfig, IssueEntry } from \"./types.ts\";\nimport { now } from \"./helpers.ts\";\nimport { logger } from \"./logger.ts\";\nimport { markIssuePlanDirty } from \"./dirty-tracker.ts\";\nimport { type PlanningSessionUsage } from \"./planning-session.ts\";\nimport { generatePlan } from \"./plan-generator.ts\";\nimport { refinePlan } from \"./plan-refiner.ts\";\n\n// ── Callbacks type ────────────────────────────────────────────────────────────\n\nexport type PlanCallbacks = {\n addEvent: (issueId: string, kind: string, message: string) => void;\n persistState: () => Promise<void>;\n applyUsage: (issue: IssueEntry, usage: PlanningSessionUsage) => void;\n applySuggestions: (issue: IssueEntry, plan: IssuePlan) => void;\n};\n\n/**\n * Start plan generation in the background. Returns immediately.\n * Updates issue.plan and broadcasts via WS when done.\n */\nexport function generatePlanInBackground(\n issue: IssueEntry,\n config: RuntimeConfig,\n _workflowDefinition: null,\n callbacks: PlanCallbacks,\n options?: { fast?: boolean },\n): void {\n const { addEvent, persistState, applyUsage, applySuggestions } = callbacks;\n const fast = options?.fast ?? false;\n\n issue.planningStatus = \"planning\";\n issue.planningStartedAt = now();\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n addEvent(issue.id, \"info\", `${fast ? \"Fast plan\" : \"Plan\"} generation starting for ${issue.identifier} (provider detection in progress).`);\n\n // Fire-and-forget — errors are caught and stored on the issue\n generatePlan(issue.title, issue.description, config, null, { fast })\n .then(async ({ plan, usage }) => {\n issue.plan = plan;\n markIssuePlanDirty(issue.id);\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n applyUsage(issue, usage);\n applySuggestions(issue, plan);\n\n addEvent(issue.id, \"progress\", `${fast ? \"Fast plan\" : \"Plan\"} generated for ${issue.identifier}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}.`);\n if (usage.totalTokens > 0) {\n addEvent(issue.id, \"info\", `Plan tokens (${issue.identifier}): ${usage.totalTokens.toLocaleString()} (in: ${usage.inputTokens.toLocaleString()}, out: ${usage.outputTokens.toLocaleString()}) [${usage.model}]`);\n }\n await persistState();\n })\n .catch(async (err) => {\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = err instanceof Error ? err.message : String(err);\n issue.updatedAt = now();\n addEvent(issue.id, \"error\", `Plan generation failed for ${issue.identifier}: ${issue.planningError}`);\n await persistState();\n logger.error({ err }, `Background plan generation failed for ${issue.identifier}`);\n });\n}\n\n/**\n * Start plan refinement in the background. Returns immediately.\n * Updates issue.plan and broadcasts via WS when done.\n */\nexport function refinePlanInBackground(\n issue: IssueEntry,\n feedback: string,\n config: RuntimeConfig,\n _workflowDefinition: null,\n callbacks: PlanCallbacks,\n): void {\n const { addEvent, persistState, applyUsage, applySuggestions } = callbacks;\n\n issue.planningStatus = \"planning\";\n issue.planningStartedAt = now();\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n const feedbackSnippet = feedback.length > 60 ? `${feedback.slice(0, 57)}...` : feedback;\n addEvent(issue.id, \"info\", `Plan refinement starting for ${issue.identifier}: \"${feedbackSnippet}\".`);\n\n refinePlan(issue, feedback, config, null)\n .then(async ({ plan, usage }) => {\n issue.plan = plan;\n markIssuePlanDirty(issue.id);\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n applyUsage(issue, usage);\n applySuggestions(issue, plan);\n\n const feedbackPreview = feedback.length > 80 ? `${feedback.slice(0, 77)}...` : feedback;\n addEvent(issue.id, \"progress\", `Plan refined for ${issue.identifier}: \"${feedbackPreview}\" → ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}.`);\n if (usage.totalTokens > 0) {\n addEvent(issue.id, \"info\", `Refinement tokens (${issue.identifier}): ${usage.totalTokens.toLocaleString()} (in: ${usage.inputTokens.toLocaleString()}, out: ${usage.outputTokens.toLocaleString()}) [${usage.model}]`);\n }\n await persistState();\n })\n .catch(async (err) => {\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = err instanceof Error ? err.message : String(err);\n issue.updatedAt = now();\n addEvent(issue.id, \"error\", `Plan refinement failed for ${issue.identifier}: ${issue.planningError}`);\n await persistState();\n logger.error({ err }, `Background plan refinement failed for ${issue.identifier}`);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE,cAAAA;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,QAAAC,cAAY;AACrB,SAAS,YAAAC,iBAAgB;;;ACPzB,OAAO,UAAU;AACjB,SAAS,KAAK,cAAc;AAC5B,SAAS,YAAY;AAErB,IAAM,QAAQ,IAAI,oBAAoB;AACtC,IAAM,SAAS,IAAI,sBAAsB,OAAQ,IAAI,sBAAsB,OAAO,OAAO;AAIzF,IAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,iBAAiB;AAChD,MAAI,kBAAkB,SAAS,SAAS;AAC1C;AACA,IAAI,CAAC,IAAI,gBAAgB;AACvB,MAAI,iBAAiB;AACvB;AAEA,SAAS,iBAAiB,SAAkB;AAC1C,QAAM,UAAyC,CAAC;AAEhD,MAAI,QAAQ;AACV,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,SAAS,EAAE,UAAU,MAAM,eAAe,cAAc,QAAQ,eAAe;AAAA,MAC/E;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,SAAS,EAAE,aAAa,EAAE;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,SAAS;AACX,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,SAAS,EAAE,aAAa,SAAS,OAAO,KAAK;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,KAAK,UAAU,EAAE,QAAQ,CAAC;AACnC;AAEA,IAAI,UAA8B;AAClC,IAAI;AAEG,SAAS,WAAW,WAAiC;AAC1D,aAAW,YAAY,KAAK,WAAW,kBAAkB,IAAI;AAC7D,YAAU,KAAK,EAAE,MAAM,UAAU,MAAM,GAAG,iBAAiB,QAAQ,CAAC;AACpE,SAAO;AACT;AAEO,SAAS,YAAyB;AACvC,MAAI,CAAC,SAAS;AACZ,cAAU,KAAK,EAAE,MAAM,UAAU,MAAM,GAAG,iBAAiB,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAEO,IAAM,SAAS;AAAA,EACpB,IAAI,OAAO;AAAE,WAAO,UAAU,EAAE,KAAK,KAAK,UAAU,CAAC;AAAA,EAAG;AAAA,EACxD,IAAI,OAAO;AAAE,WAAO,UAAU,EAAE,KAAK,KAAK,UAAU,CAAC;AAAA,EAAG;AAAA,EACxD,IAAI,QAAQ;AAAE,WAAO,UAAU,EAAE,MAAM,KAAK,UAAU,CAAC;AAAA,EAAG;AAAA,EAC1D,IAAI,QAAQ;AAAE,WAAO,UAAU,EAAE,MAAM,KAAK,UAAU,CAAC;AAAA,EAAG;AAAA,EAC1D,IAAI,QAAQ;AAAE,WAAO,UAAU,EAAE,MAAM,KAAK,UAAU,CAAC;AAAA,EAAG;AAAA,EAC1D,IAAI,QAAQ;AAAE,WAAO,UAAU,EAAE,MAAM,KAAK,UAAU,CAAC;AAAA,EAAG;AAC5D;;;AC9DA,IAAM,gBAAgB,oBAAI,IAAY;AACtC,IAAM,oBAAoB,oBAAI,IAAY;AAC1C,IAAM,gBAAgB,oBAAI,IAAY;AAE/B,SAAS,eAAe,IAAkB;AAC/C,gBAAc,IAAI,EAAE;AACtB;AAEO,SAAS,mBAAmB,IAAkB;AACnD,oBAAkB,IAAI,EAAE;AAC1B;AAEO,SAAS,eAAe,IAAkB;AAC/C,gBAAc,IAAI,EAAE;AACtB;AAEO,SAAS,gBAAyB;AACvC,SAAO,cAAc,OAAO,KAAK,cAAc,OAAO;AACxD;AAEO,SAAS,mBAAgC;AAC9C,SAAO;AACT;AAEO,SAAS,uBAAoC;AAClD,SAAO;AACT;AAEO,SAAS,mBAAgC;AAC9C,SAAO;AACT;AAEO,SAAS,qBAA2B;AACzC,gBAAc,MAAM;AACtB;AAEO,SAAS,yBAA+B;AAC7C,oBAAkB,MAAM;AAC1B;AAEO,SAAS,qBAA2B;AACzC,gBAAc,MAAM;AACtB;AAEO,SAAS,mBAAmB,KAAqB;AACtD,aAAW,MAAM,IAAK,eAAc,IAAI,EAAE;AAC5C;AAEO,SAAS,uBAAuB,KAAqB;AAC1D,aAAW,MAAM,IAAK,mBAAkB,IAAI,EAAE;AAChD;AAEO,SAAS,mBAAmB,KAAqB;AACtD,aAAW,MAAM,IAAK,eAAc,IAAI,EAAE;AAC5C;;;AC3DA,SAAS,oBAA2B;AACpC,SAAS,cAAAC,aAAY,cAAc,oBAAoB;AACvD,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,eAAe;;;ACHxB,SAAS,kBAAkB;AAC3B,SAAS,QAAAC,aAAY;;;ACEd,SAAS,wBAAwB,MAAyB;AAC/D,QAAM,QAAkB,CAAC,mBAAmB,IAAI,gBAAgB,KAAK,OAAO,EAAE;AAE9E,MAAI,KAAK,aAAa,QAAQ;AAC5B,UAAM,KAAK,IAAI,kBAAkB;AACjC,SAAK,YAAY,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EACtD;AACA,MAAI,KAAK,aAAa,QAAQ;AAC5B,UAAM,KAAK,IAAI,kBAAkB;AACjC,SAAK,YAAY,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EACtD;AACA,MAAI,KAAK,UAAU,QAAQ;AACzB,UAAM,KAAK,IAAI,8BAA8B;AAC7C,SAAK,SAAS,QAAQ,CAAC,MAAM;AAC3B,YAAM,KAAK,OAAO,EAAE,QAAQ,IAAI;AAChC,UAAI,EAAE,aAAc,OAAM,KAAK,qBAAqB,EAAE,YAAY,EAAE;AACpE,UAAI,EAAE,aAAc,OAAM,KAAK,qBAAqB,EAAE,YAAY,EAAE;AAAA,IACtE,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,kBAAkB,MAAyB;AACzD,QAAM,QAAkB,CAAC,oBAAoB;AAE7C,MAAI,KAAK,QAAQ,QAAQ;AACvB,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,KAAK,IAAI,cAAc,MAAM,SAAS,IAAI,SAAS,MAAM,IAAI,EAAE;AACrE,UAAI,MAAM,cAAc,OAAQ,OAAM,KAAK,iBAAiB,MAAM,aAAa,KAAK,IAAI,CAAC,EAAE;AAC3F,iBAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,KAAK,GAAG,KAAK,IAAI,OAAO,KAAK,MAAM,KAAK,KAAK,YAAY,KAAK,KAAK,SAAS,MAAM,EAAE,EAAE;AAC5F,YAAI,KAAK,QAAS,OAAM,KAAK,MAAM,KAAK,OAAO,EAAE;AACjD,YAAI,KAAK,SAAU,OAAM,KAAK,iBAAiB,KAAK,QAAQ,EAAE;AAC9D,YAAI,KAAK,OAAO,OAAQ,OAAM,KAAK,aAAa,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACzE;AACA,UAAI,MAAM,SAAS,OAAQ,OAAM,KAAK,YAAY,MAAM,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF,OAAO;AACL,UAAM,KAAK,EAAE;AACb,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,KAAK,GAAG,KAAK,IAAI,OAAO,KAAK,MAAM,KAAK,KAAK,YAAY,KAAK,KAAK,SAAS,MAAM,EAAE,EAAE;AAC5F,UAAI,KAAK,QAAS,OAAM,KAAK,MAAM,KAAK,OAAO,EAAE;AACjD,UAAI,KAAK,SAAU,OAAM,KAAK,iBAAiB,KAAK,QAAQ,EAAE;AAC9D,UAAI,KAAK,OAAO,OAAQ,OAAM,KAAK,aAAa,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AAEA,QAAM,KAAK,IAAI,gDAAgD;AAC/D,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,iBAAiB,MAAyB;AACxD,MAAI,CAAC,KAAK,OAAO,OAAQ,QAAO;AAChC,QAAM,QAAQ,CAAC,UAAU;AACzB,aAAW,KAAK,KAAK,OAAO;AAC1B,UAAM,KAAK,OAAO,EAAE,IAAI,qBAAgB,EAAE,MAAM,iBAAiB,EAAE,UAAU,EAAE;AAAA,EACjF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,uBAAuB,MAAyB;AAC9D,QAAM,QAAkB,CAAC;AAEzB,MAAI,KAAK,iBAAiB,QAAQ;AAChC,UAAM,KAAK,qBAAqB;AAChC,SAAK,gBAAgB,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EAC1D;AACA,MAAI,KAAK,YAAY,QAAQ;AAC3B,UAAM,KAAK,IAAI,sBAAsB;AACrC,UAAM,KAAK,mCAAmC;AAC9C,SAAK,WAAW,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EACrD;AACA,MAAI,KAAK,cAAc,QAAQ;AAC7B,UAAM,KAAK,IAAI,iBAAiB;AAChC,SAAK,aAAa,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EACvD;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,oBAAoB,MAAyB;AAC3D,QAAM,KAAK,KAAK;AAChB,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,QAAQ,CAAC,kCAAkC;AAEjD,MAAI,GAAG,gBAAiB,OAAM,KAAK,IAAI,GAAG,eAAe;AAEzD,MAAI,GAAG,mBAAmB,GAAG,aAAa,QAAQ;AAChD,UAAM,KAAK,IAAI,yBAAyB;AACxC,OAAG,YAAY,QAAQ,CAAC,MAAM,MAAM,KAAK,OAAO,EAAE,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,EACvE;AAEA,MAAI,GAAG,sBAAsB,GAAG,gBAAgB,QAAQ;AACtD,UAAM,KAAK,IAAI,uBAAuB;AACtC,OAAG,eAAe,QAAQ,CAAC,MAAM,MAAM,KAAK,OAAO,EAAE,IAAI,OAAO,EAAE,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,EACtF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,qBAAqB,MAAyB;AAC5D,QAAM,KAAK,KAAK;AAChB,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,iBAAiB,GAAG,QAAQ;AAAA,IAC5B,kBAAkB,GAAG,eAAe;AAAA,EACtC;AAEA,MAAI,GAAG,wBAAwB,QAAQ;AACrC,UAAM,KAAK,IAAI,0BAA0B;AACzC,OAAG,uBAAuB,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EAC/D;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,yBACd,MACA,MACA,cACoB;AACpB,QAAM,aAAa,MAAM;AACzB,QAAM,UAAU;AAChB,SAAO,aAAa,OAAO,KACtB,YAAY,WACZ,eAAe,OAAO,KACtB,cAAc,WACd;AACP;AAGO,SAAS,oBAAoB,MAAyB;AAC3D,SAAO;AAAA,IACL,wBAAwB,IAAI;AAAA,IAC5B,qBAAqB,IAAI;AAAA,IACzB,oBAAoB,IAAI;AAAA,IACxB,kBAAkB,IAAI;AAAA,IACtB,iBAAiB,IAAI;AAAA,IACrB,uBAAuB,IAAI;AAAA,EAC7B,EAAE,OAAO,OAAO,EAAE,KAAK,MAAM;AAC/B;AAGO,SAAS,0BAA0B,MAAoD;AAC5F,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAiB,CAAC;AAExB,aAAW,KAAK,KAAK,cAAc,CAAC,GAAG;AACrC,UAAM,QAAQ,EAAE,YAAY;AAC5B,QAAI,MAAM,SAAS,MAAM,EAAG,MAAK,KAAK,uCAAuC;AAC7E,QAAI,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,KAAK,EAAG,MAAK,KAAK,uCAAuC;AAC3G,QAAI,MAAM,SAAS,MAAM,EAAG,MAAK,KAAK,+BAA+B;AAAA,EACvE;AAGA,SAAO,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE;AAC5D;AAsGO,SAAS,sBACd,OACA,UACA,MACA,eACkB;AAClB,QAAM,WAAW,KAAK;AACtB,QAAM,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAE7C,SAAO;AAAA,IACL,SAAS;AAAA,IAET,OAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM,eAAe;AAAA,MAClC,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM,UAAU,CAAC;AAAA,MACzB,OAAO,MAAM,SAAS,CAAC;AAAA,IACzB;AAAA,IAEA,UAAU;AAAA,MACR,MAAM,SAAS;AAAA,MACf,MAAM,SAAS;AAAA,MACf,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,SAAS,mBAAmB;AAAA,MACpC,oBAAoB,SAAS,sBAAsB;AAAA,MACnD,UAAU,SAAS,YAAY,CAAC;AAAA,IAClC;AAAA,IAEA,iBAAiB;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,UAAU,UAAU,YAAY;AAAA,MAChC,WAAW,UAAU,mBAAmB;AAAA,MACxC,aAAa,YACT,WACA,KAAK,iBAAiB,qBACpB,sBACA;AAAA,IACR;AAAA,IAEA,MAAM;AAAA,MACJ,SAAS,KAAK;AAAA,MACd,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO;AAAA,QAC5B,MAAM,EAAE;AAAA,QACR,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,SAAS,CAAC;AAAA,QACnB,WAAW,EAAE,aAAa;AAAA,QAC1B,UAAU,EAAE,YAAY;AAAA,MAC1B,EAAE;AAAA,MACF,SAAS,KAAK,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,QACtC,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,QAChC,cAAc,EAAE,gBAAgB,CAAC;AAAA,QACjC,SAAS,EAAE,WAAW,CAAC;AAAA,MACzB,EAAE;AAAA,IACJ;AAAA,IAEA,aAAa,KAAK,eAAe,CAAC;AAAA,IAClC,iBAAiB,KAAK,mBAAmB,CAAC;AAAA,IAC1C,YAAY,KAAK,cAAc,CAAC;AAAA,IAChC,cAAc,KAAK,gBAAgB,CAAC;AAAA,IACpC,aAAa,KAAK,eAAe,CAAC;AAAA,IAClC,WAAW,KAAK,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MAC1C,UAAU,EAAE;AAAA,MACZ,cAAc,EAAE,gBAAgB;AAAA,MAChC,cAAc,EAAE,gBAAgB;AAAA,IAClC,EAAE;AAAA,IACF,QAAQ,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACpC,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE,UAAU;AAAA,MACpB,YAAY,EAAE,cAAc;AAAA,IAC9B,EAAE;AAAA,IAEF,SAAS;AAAA,MACP,QAAQ,KAAK,iBAAiB,eAAe,CAAC;AAAA,MAC9C,WAAW,KAAK,iBAAiB,kBAAkB,CAAC;AAAA,IACtD;AAAA,IAEA,aAAa,KAAK,kBAAkB,CAAC;AAAA,IACrC;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;;;ACxVO,IAAM,uBAAuB,KAAK,UAAU;AAAA,EACjD,MAAM;AAAA,EACN,YAAY;AAAA,IACV,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,YAAY,WAAW,QAAQ,EAAE;AAAA,IAC1E,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,YAAY,EAAE,MAAM,SAAS;AAAA,EAC/B;AAAA,EACA,UAAU,CAAC,QAAQ;AACrB,CAAC;AAEM,IAAM,uBAAuB,KAAK,UAAU;AAAA,EACjD,MAAM;AAAA,EACN,YAAY;AAAA,IACV,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,YAAY,WAAW,QAAQ,EAAE;AAAA,IAC1E,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,YAAY,EAAE,MAAM,SAAS;AAAA,IAC7B,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,GAAG,KAAK,EAAE,MAAM,UAAU,GAAG,MAAM,EAAE,MAAM,SAAS,EAAE;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU,CAAC,QAAQ;AACrB,CAAC;AAKM,SAAS,gBAAgB,MAA2B;AACzD,MAAI,CAAC,KAAK,gBAAgB,OAAQ,QAAO,CAAC;AAC1C,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,KAAK,KAAK,gBAAgB;AACnC,UAAM,YAAY,EAAE,YAAY,GAAG;AACnC,QAAI,YAAY,EAAG,MAAK,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;AAAA,aACxC,CAAC,EAAE,SAAS,GAAG,EAAG,MAAK,IAAI,CAAC;AAAA,EACvC;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;;;AFzCO,SAAS,mBAAmB,SAAyC;AAC1E,QAAM,QAAQ,CAAC,UAAU,SAAS;AAElC,MAAI,CAAC,QAAQ,cAAc;AACzB,UAAM,KAAK,gCAAgC;AAAA,EAC7C;AAEA,QAAM,KAAK,4BAA4B,sBAAsB;AAE7D,MAAI,QAAQ,QAAQ;AAClB,UAAM,KAAK,YAAY,QAAQ,MAAM,EAAE;AAAA,EACzC;AAEA,MAAI,QAAQ,YAAY;AACtB,UAAM,KAAK,kBAAkB,QAAQ,UAAU,GAAG;AAAA,EACpD;AAEA,MAAI,QAAQ,SAAS,QAAQ;AAC3B,eAAW,OAAO,QAAQ,SAAS;AACjC,YAAM,KAAK,cAAc,GAAG,GAAG;AAAA,IACjC;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,QAAQ,UAAU,UAAU;AAC/C,UAAM,OAAO,GAAG,GAAG,WAAW,QAAQ,KAAK,EAAE;AAAA,EAC/C;AAEA,QAAM,KAAK,yBAA2B;AACtC,SAAO,MAAM,KAAK,GAAG;AACvB;AAIA,eAAe,QACb,OACA,UACA,MACA,QACA,eACA,cAC4B;AAC5B,QAAM,SAAS,yBAAyB,MAAM,SAAS,MAAM,OAAO,aAAa;AAEjF,QAAM,SAAS,MAAM,aAAa,4BAA4B;AAAA,IAC5D,WAAW,SAAS,SAAS;AAAA,IAC7B,YAAY,SAAS,SAAS;AAAA,IAC9B,qBAAqB,SAAS,uBAAuB;AAAA,IACrD;AAAA,IACA,YAAY,oBAAoB,IAAI;AAAA,IACpC,gBAAgB,KAAK,iBAAiB,qBAAsB,KAAK,gBAAgB,kBAAkB,CAAC,IAAK,CAAC;AAAA,IAC1G,aAAa,KAAK,iBAAiB,kBAAmB,KAAK,gBAAgB,eAAe,CAAC,IAAK,CAAC;AAAA,IACjG,gBAAgB,KAAK,kBAAkB,CAAC;AAAA,IACxC;AAAA,IACA,iBAAiB,MAAM;AAAA,IACvB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM,eAAe;AAAA,IAClC,kBAAkB,KAAK,cAAc,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,EACrE,CAAC;AAED,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,WAAW,WAAWC,MAAK,eAAe,UAAU,CAAC,IAAIA,MAAK,eAAe,UAAU,IAAI;AACjG,QAAM,eAAe,aAAa,IAAI,CAAC,MAAMA,MAAK,UAAU,CAAC,CAAC;AAE9D,QAAM,UAAU,mBAAmB;AAAA,IACjC,OAAO,SAAS;AAAA,IAChB;AAAA,IACA,SAAS;AAAA,IACT,YAAY;AAAA,EACd,CAAC;AAED,QAAMC,OAA8B;AAAA,IAClC,wBAAwB,KAAK;AAAA,IAC7B,mBAAmB,OAAO,KAAK,MAAM,MAAM;AAAA,IAC3C,+BAA+B;AAAA,EACjC;AACA,MAAI,KAAK,gBAAgB,OAAQ,CAAAA,KAAI,oBAAoB,KAAK,eAAe,KAAK,GAAG;AACrF,MAAI,KAAK,iBAAiB,aAAa,QAAQ;AAC7C,IAAAA,KAAI,qBAAqB,KAAK,gBAAgB,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG;AAAA,EACvF;AAEA,QAAM,EAAE,KAAK,KAAK,IAAI,0BAA0B,IAAI;AAEpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAAA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,iBAAiB,UAAU;AAAA,MAC3B,OAAO,SAAS,SAAS;AAAA,MACzB,iBAAiB,KAAK,iBAAiB,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,MAC3E,oBAAoB,KAAK,iBAAiB,gBAAgB,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,MACjF,aAAa,KAAK,QAAQ,UAAU;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,gBAAiC;AAAA,EAC5C,cAAc;AAAA,EACd,oBAAoB,CAAC,aAAa,mBAAmB;AAAA,IACnD,OAAO,SAAS;AAAA,IAChB,QAAQ,SAAS;AAAA,IACjB,YAAY;AAAA,EACd,CAAC;AAAA,EACD;AACF;;;AGxHA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAUrB,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY5B,KAAK;AAIA,SAAS,kBAAkB,SAAyC;AACzE,QAAM,QAAQ,CAAC,SAAS,QAAQ,yBAAyB,4CAA4C;AAErG,MAAI,QAAQ,SAAS,QAAQ,UAAU,SAAS;AAC9C,UAAM,KAAK,WAAW,QAAQ,KAAK,EAAE;AAAA,EACvC;AAEA,MAAI,QAAQ,QAAQ;AAElB,UAAM,KAAK,wBAAwB,QAAQ,MAAM,GAAG;AAAA,EACtD;AAEA,MAAI,QAAQ,SAAS,QAAQ;AAC3B,eAAW,OAAO,QAAQ,SAAS;AACjC,YAAM,KAAK,cAAc,GAAG,GAAG;AAAA,IACjC;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY,QAAQ;AAC9B,eAAW,OAAO,QAAQ,YAAY;AACpC,YAAM,KAAK,YAAY,GAAG,GAAG;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,KAAK,yBAA2B;AACtC,SAAO,MAAM,KAAK,GAAG;AACvB;AAIA,eAAeC,SACb,OACA,UACA,MACA,QACA,eACA,cAC4B;AAC5B,QAAM,SAAS,yBAAyB,MAAM,SAAS,MAAM,OAAO,aAAa,KAAK,SAAS;AAE/F,QAAM,SAAS,MAAM,aAAa,2BAA2B;AAAA,IAC3D,WAAW,SAAS,SAAS;AAAA,IAC7B,YAAY,SAAS,SAAS;AAAA,IAC9B,qBAAqB,SAAS,uBAAuB;AAAA,IACrD;AAAA,IACA,iBAAiB,MAAM;AAAA,IACvB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM,eAAe;AAAA,IAClC;AAAA,IACA,YAAY,oBAAoB,IAAI;AAAA,IACpC,SAAS,KAAK,UAAU,CAAC,GAAG,IAAI,CAAC,WAAW;AAAA,MAC1C,WAAW,MAAM;AAAA,MACjB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,WAAW,CAAC;AAAA,IAC7B,EAAE;AAAA,IACF,gBAAgB,KAAK,kBAAkB,CAAC;AAAA,IACxC,aAAa,KAAK,iBAAiB,kBAAmB,KAAK,gBAAgB,eAAe,CAAC,IAAK,CAAC;AAAA,IACjG,kBAAkB,KAAK,cAAc,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,IACnE,gBAAgB;AAAA,EAClB,CAAC;AAED,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,WAAWC,YAAWC,MAAK,eAAe,UAAU,CAAC,IAAIA,MAAK,eAAe,UAAU,IAAI;AACjG,QAAM,eAAe,aAAa,IAAI,CAAC,MAAMA,MAAK,UAAU,CAAC,CAAC;AAE9D,QAAM,UAAU,kBAAkB;AAAA,IAChC,OAAO,SAAS;AAAA,IAChB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAMC,OAA8B;AAAA,IAClC,wBAAwB,KAAK;AAAA,IAC7B,mBAAmB,OAAO,KAAK,MAAM,MAAM;AAAA,IAC3C,oBAAoB,OAAO,KAAK,QAAQ,UAAU,CAAC;AAAA,IACnD,+BAA+B;AAAA,EACjC;AACA,MAAI,KAAK,gBAAgB,OAAQ,CAAAA,KAAI,oBAAoB,KAAK,eAAe,KAAK,GAAG;AAErF,QAAM,EAAE,KAAK,KAAK,IAAI,0BAA0B,IAAI;AAEpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAAA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,iBAAiB,UAAU;AAAA,MAC3B,OAAO,SAAS,SAAS;AAAA,MACzB,iBAAiB,KAAK,iBAAiB,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,MAC3E,oBAAoB,CAAC;AAAA,MACrB,aAAa,KAAK,QAAQ,UAAU;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,eAAgC;AAAA,EAC3C,cAAc;AAAA,EACd,oBAAoB,CAAC,aAAa,kBAAkB;AAAA,IAClD,OAAO,SAAS;AAAA,IAChB,QAAQ,SAAS;AAAA,EACnB,CAAC;AAAA,EACD,SAAAH;AACF;;;ACtIA,SAAS,cAAAI,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAUrB,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY7B,KAAK;AAIA,SAAS,mBAAmB,SAAyC;AAC1E,QAAM,QAAQ,CAAC,UAAU,QAAQ;AAEjC,MAAI,QAAQ,OAAO;AACjB,UAAM,KAAK,WAAW,QAAQ,KAAK,EAAE;AAAA,EACvC;AAEA,MAAI,QAAQ,SAAS,QAAQ;AAC3B,UAAM,KAAK,yBAAyB,QAAQ,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,EACtF;AAGA,QAAM,KAAK,+BAAmC;AAC9C,SAAO,MAAM,KAAK,GAAG;AACvB;AAIA,eAAeC,SACb,OACA,UACA,MACA,QACA,eACA,cAC4B;AAC5B,QAAM,SAAS,yBAAyB,MAAM,SAAS,MAAM,OAAO,aAAa,KAAK,SAAS;AAE/F,QAAM,SAAS,MAAM,aAAa,2BAA2B;AAAA,IAC3D,WAAW,SAAS,SAAS;AAAA,IAC7B,YAAY,SAAS,SAAS;AAAA,IAC9B,qBAAqB,SAAS,uBAAuB;AAAA,IACrD;AAAA,IACA,iBAAiB,MAAM;AAAA,IACvB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM,eAAe;AAAA,IAClC;AAAA,IACA,YAAY,oBAAoB,IAAI;AAAA,IACpC,SAAS,KAAK,UAAU,CAAC,GAAG,IAAI,CAAC,WAAW;AAAA,MAC1C,WAAW,MAAM;AAAA,MACjB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,WAAW,CAAC;AAAA,IAC7B,EAAE;AAAA,IACF,gBAAgB,KAAK,kBAAkB,CAAC;AAAA,IACxC,aAAa,KAAK,iBAAiB,kBAAmB,KAAK,gBAAgB,eAAe,CAAC,IAAK,CAAC;AAAA,IACjG,kBAAkB,KAAK,cAAc,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,IACnE,gBAAgB;AAAA,EAClB,CAAC;AAED,QAAM,eAAe,gBAAgB,IAAI;AACzC,QAAM,WAAWC,YAAWC,MAAK,eAAe,UAAU,CAAC,IAAIA,MAAK,eAAe,UAAU,IAAI;AACjG,QAAM,eAAe,aAAa,IAAI,CAAC,MAAMA,MAAK,UAAU,CAAC,CAAC;AAE9D,QAAM,UAAU,mBAAmB;AAAA,IACjC,OAAO,SAAS;AAAA,IAChB,SAAS;AAAA,EACX,CAAC;AAED,QAAMC,OAA8B;AAAA,IAClC,wBAAwB,KAAK;AAAA,IAC7B,mBAAmB,OAAO,KAAK,MAAM,MAAM;AAAA,IAC3C,oBAAoB,OAAO,KAAK,QAAQ,UAAU,CAAC;AAAA,IACnD,+BAA+B;AAAA,EACjC;AACA,MAAI,KAAK,gBAAgB,OAAQ,CAAAA,KAAI,oBAAoB,KAAK,eAAe,KAAK,GAAG;AAErF,QAAM,EAAE,KAAK,KAAK,IAAI,0BAA0B,IAAI;AAEpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAAA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc;AAAA,IACd,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,iBAAiB,UAAU;AAAA,MAC3B,OAAO,SAAS,SAAS;AAAA,MACzB,iBAAiB,KAAK,iBAAiB,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,MAC3E,oBAAoB,CAAC;AAAA,MACrB,aAAa,KAAK,QAAQ,UAAU;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,gBAAiC;AAAA,EAC5C,cAAc;AAAA,EACd,oBAAoB,CAAC,aAAa,mBAAmB;AAAA,IACnD,OAAO,SAAS;AAAA,EAClB,CAAC;AAAA,EACD,SAAAH;AACF;;;ACpFO,IAAM,WAA4C;AAAA,EACvD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;;;ANTO,SAAS,oBAAoB,MAA6D;AAC/F,QAAM,aAAa,KAAK,KAAK;AAC7B,MAAI,CAAC,WAAY,QAAO,EAAE,aAAa,IAAI,cAAc,GAAG;AAE5D,QAAM,aAAa;AAAA,IACjBI,MAAK,aAAa,UAAU,UAAU,GAAG,UAAU,KAAK;AAAA,IACxDA,MAAK,aAAa,UAAU,UAAU,YAAY,UAAU;AAAA,IAC5DA,MAAK,aAAa,UAAU,GAAG,UAAU,KAAK;AAAA,IAC9CA,MAAK,aAAa,UAAU,YAAY,UAAU;AAAA,IAClDA,MAAK,QAAQ,GAAG,UAAU,UAAU,GAAG,UAAU,KAAK;AAAA,IACtDA,MAAK,QAAQ,GAAG,UAAU,UAAU,YAAY,UAAU;AAAA,IAC1DA,MAAK,QAAQ,GAAG,WAAW,UAAU,GAAG,UAAU,KAAK;AAAA,IACvDA,MAAK,QAAQ,GAAG,WAAW,UAAU,YAAY,UAAU;AAAA,EAC7D;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,CAACC,YAAW,SAAS,EAAG;AAC5B,WAAO;AAAA,MACL,aAAa;AAAA,MACb,cAAc,aAAa,WAAW,MAAM,EAAE,KAAK;AAAA,IACrD;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,IAAI,cAAc,GAAG;AAC7C;AAEO,SAAS,uBAAuB,OAAuB;AAC5D,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,eAAe,YAAY,eAAe,WAAW,eAAe,SAAU,QAAO;AACzF,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO;AACT;AAUO,SAAS,oBACd,UACA,iBACA,cACA,eACA,iBACQ;AACR,MAAI,gBAAgB,KAAK,EAAG,QAAO,gBAAgB,KAAK;AACxD,MAAI,aAAa,YAAY,cAAc,KAAK,EAAG,QAAO,cAAc,KAAK;AAC7E,MAAI,aAAa,WAAW,aAAa,KAAK,EAAG,QAAO,aAAa,KAAK;AAC1E,SAAO,0BAA0B,UAAU,eAAe;AAC5D;AAGO,SAAS,cACd,MACA,aACA,cAC6B;AAE7B,QAAM,UAAU;AAChB,MAAI,cAAc,OAAO,EAAG,QAAO,YAAY,OAAO;AAEtD,MAAI,aAAa,QAAS,QAAO,YAAY;AAE7C,MAAI,eAAe,OAAO,EAAG,QAAO,aAAa,OAAO;AAExD,SAAO,cAAc;AACvB;AAKO,SAAS,0BAA0B,UAAkB,iBAA0B,OAAwB;AAC5G,QAAM,UAAU,SAAS,QAAQ;AACjC,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,aAAa,aAAa,WAAW,uBAAuB;AAClE,SAAO,QAAQ,aAAa,EAAE,OAAO,QAAQ,iBAAiB,WAAW,CAAC;AAC5E;AAEA,IAAI,kBAA6C;AACjD,IAAI,oBAAoB;AACxB,IAAM,qBAAqB;AAEpB,SAAS,2BAA+C;AAC7D,MAAI,mBAAmB,KAAK,IAAI,IAAI,oBAAoB,oBAAoB;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,YAAgC,CAAC;AAEvC,aAAW,QAAQ,CAAC,UAAU,SAAS,QAAQ,GAAG;AAChD,QAAI;AACF,YAAM,OAAO,aAAa,SAAS,CAAC,IAAI,GAAG,EAAE,UAAU,QAAQ,SAAS,IAAK,CAAC,EAAE,KAAK;AACrF,gBAAU,KAAK,EAAE,MAAM,WAAW,MAAM,KAAK,CAAC;AAAA,IAChD,QAAQ;AACN,gBAAU,KAAK,EAAE,MAAM,WAAW,OAAO,MAAM,GAAG,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,oBAAkB;AAClB,sBAAoB,KAAK,IAAI;AAC7B,SAAO;AACT;AAiBA,IAAM,aAAa,oBAAI,IAA8D;AACrF,IAAM,qBAAqB,IAAI,KAAK;AAmB7B,SAAS,kBAAgE;AAC9E,MAAI;AACF,UAAM,aAAaC,MAAK,QAAQ,GAAG,UAAU,aAAa;AAC1D,QAAI,CAACC,YAAW,UAAU,EAAG,QAAO,CAAC;AACrC,UAAM,MAAM,aAAa,YAAY,MAAM;AAC3C,UAAM,QAAQ,IAAI,MAAM,yBAAyB,IAAI,CAAC;AACtD,UAAM,kBAAkB,IAAI,MAAM,0CAA0C,IAAI,CAAC;AACjF,WAAO,EAAE,OAAO,gBAAgB;AAAA,EAClC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAMA,SAAS,mBAAuC;AAC9C,MAAI;AACF,UAAM,eAAeD,MAAK,QAAQ,GAAG,WAAW,eAAe;AAC/D,QAAI,CAACC,YAAW,YAAY,EAAG,QAAO,CAAC;AACvC,UAAM,MAAM,aAAa,cAAc,MAAM;AAC7C,UAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,WAAO,EAAE,OAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ,OAAU;AAAA,EAClF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAMO,SAAS,mBAAkE;AAChF,MAAI;AACF,UAAM,eAAeD,MAAK,QAAQ,GAAG,WAAW,eAAe;AAC/D,QAAI,CAACC,YAAW,YAAY,EAAG,QAAO,CAAC;AACvC,UAAM,MAAM,aAAa,cAAc,MAAM;AAC7C,UAAM,WAAW,KAAK,MAAM,GAAG;AAI/B,WAAO;AAAA,MACL,OAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AAAA,MAC7D,iBAAiB,SAAS,SAAS,oBAAoB;AAAA,IACzD;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AASA,SAAS,0BAAyC;AAChD,MAAI;AACF,UAAM,UAAU,aAAa,SAAS,CAAC,QAAQ,GAAG,EAAE,UAAU,QAAQ,SAAS,IAAK,CAAC,EAAE,KAAK;AAC5F,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,UAAU,aAAa,OAAO;AAEpC,UAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC;AACxC,UAAM,aAAaD,MAAK,SAAS,gBAAgB,WAAW,mBAAmB,QAAQ,OAAO,UAAU,WAAW;AACnH,WAAOC,YAAW,UAAU,IAAI,aAAa;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,oBAAgD;AAC7D,QAAM,aAAa,wBAAwB;AAC3C,MAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,MAAI;AACF,UAAM,UAAU,aAAa,YAAY,MAAM;AAG/C,UAAM,QAAQ;AACd,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,SAA4B,CAAC;AACnC,UAAM,UAA6B,CAAC;AAEpC,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC7C,YAAM,CAAC,EAAE,WAAW,OAAO,IAAI;AAC/B,UAAI,KAAK,IAAI,OAAO,EAAG;AACvB,UAAI,QAAQ,SAAS,WAAW,EAAG;AACnC,WAAK,IAAI,OAAO;AAEhB,YAAM,YAAY,UAAU,WAAW,UAAU;AACjD,YAAM,OAAO,YAAY,YAAY;AACrC,YAAM,QAAyB,EAAE,IAAI,SAAS,UAAU,UAAU,OAAO,SAAS,KAAK;AACvF,UAAI,UAAW,SAAQ,KAAK,KAAK;AAAA,UAC5B,QAAO,KAAK,KAAK;AAAA,IACxB;AAGA,WAAO,CAAC,GAAG,QAAQ,GAAG,OAAO;AAAA,EAC/B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,mBAA+C;AAE5D,QAAM,YAAYD,MAAK,QAAQ,GAAG,UAAU,mBAAmB;AAC/D,MAAI;AACF,QAAIC,YAAW,SAAS,GAAG;AACzB,YAAM,MAAM,aAAa,WAAW,MAAM;AAC1C,YAAM,QAAQ,KAAK,MAAM,GAAG;AAW5B,UAAI,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,GAAG;AAC1D,eAAO,MAAM,OAEV,KAAK,CAAC,GAAG,MAAM;AACd,gBAAM,OAAO,EAAE,eAAe,SAAS,IAAI;AAC3C,gBAAM,OAAO,EAAE,eAAe,SAAS,IAAI;AAC3C,cAAI,SAAS,KAAM,QAAO,OAAO;AACjC,kBAAQ,EAAE,YAAY,OAAO,EAAE,YAAY;AAAA,QAC7C,CAAC,EACA,IAAI,CAAC,OAAO;AAAA,UACX,IAAI,EAAE;AAAA,UACN,UAAU;AAAA,UACV,OAAO,EAAE;AAAA,UACT,MAAM,EAAE,gBAAgB,EAAE,eAAe,SAAS,cAAc;AAAA,QAClE,EAAE;AAAA,MACN;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,CAAC;AACV;AAgBA,eAAe,uBAAmD;AAEhE,MAAI;AACF,iBAAa,SAAS,CAAC,QAAQ,GAAG,EAAE,UAAU,QAAQ,SAAS,IAAK,CAAC;AAAA,EACvE,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAIA,SAAO;AAAA,IACL,EAAE,IAAI,QAAU,UAAU,UAAU,OAAO,wBAA0B,MAAM,eAAe;AAAA,IAC1F,EAAE,IAAI,UAAU,UAAU,UAAU,OAAO,0BAA2B,MAAM,WAAW;AAAA,IACvF,EAAE,IAAI,SAAU,UAAU,UAAU,OAAO,yBAA2B,MAAM,OAAO;AAAA,EACrF;AACF;AAOA,eAAsB,eAAe,WAA2E;AAC9G,QAAM,SAA4C,CAAC;AAEnD,QAAM,QAA0E,CAAC;AAEjF,aAAW,KAAK,WAAW;AACzB,QAAI,CAAC,EAAE,UAAW;AAClB,UAAM,SAAS,WAAW,IAAI,EAAE,IAAI;AACpC,QAAI,UAAU,KAAK,IAAI,IAAI,OAAO,YAAY,oBAAoB;AAChE,aAAO,EAAE,IAAI,IAAI,OAAO;AACxB;AAAA,IACF;AACA,QAAI,EAAE,SAAS,QAAS,OAAM,KAAK,EAAE,MAAM,SAAS,OAAO,iBAAiB,CAAC;AAC7E,QAAI,EAAE,SAAS,SAAU,OAAM,KAAK,EAAE,MAAM,UAAU,OAAO,qBAAqB,CAAC;AACnF,QAAI,EAAE,SAAS,SAAU,OAAM,KAAK,EAAE,MAAM,UAAU,OAAO,kBAAkB,CAAC;AAAA,EAClF;AAEA,QAAM,UAAU,MAAM,QAAQ,WAAW,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpE,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,MAAM,QAAQ,CAAC;AACrB,QAAI,SAAS,IAAI,WAAW,cAAc,IAAI,QAAQ,CAAC;AAGvD,QAAI,MAAM,CAAC,EAAE,SAAS,SAAS;AAC7B,YAAM,EAAE,OAAO,gBAAgB,IAAI,gBAAgB;AACnD,UAAI,iBAAiB;AACnB,cAAM,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,eAAe;AAC5D,YAAI,MAAM,GAAG;AAEX,mBAAS,CAAC,OAAO,GAAG,GAAG,GAAG,OAAO,MAAM,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,MAAM,CAAC,CAAC;AAAA,QAC1E,WAAW,QAAQ,IAAI;AAErB,mBAAS,CAAC,EAAE,IAAI,iBAAiB,UAAU,SAAS,OAAO,iBAAiB,MAAM,qBAAqB,GAAG,GAAG,MAAM;AAAA,QACrH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,CAAC,EAAE,SAAS,UAAU;AAC9B,YAAM,EAAE,OAAO,gBAAgB,IAAI,iBAAiB;AACpD,UAAI,iBAAiB;AAEnB,cAAM,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,mBAAmB,EAAE,GAAG,SAAS,eAAe,CAAC;AAC9F,YAAI,MAAM,GAAG;AACX,mBAAS,CAAC,OAAO,GAAG,GAAG,GAAG,OAAO,MAAM,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,MAAM,CAAC,CAAC;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,CAAC,EAAE,SAAS,UAAU;AAC9B,YAAM,EAAE,OAAO,iBAAiB,gBAAgB,IAAI,iBAAiB;AACrE,UAAI,iBAAiB;AAEnB,cAAM,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,eAAe;AAC5D,YAAI,MAAM,GAAG;AACX,mBAAS,CAAC,OAAO,GAAG,GAAG,GAAG,OAAO,MAAM,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,MAAM,CAAC,CAAC;AAAA,QAC1E,WAAW,QAAQ,IAAI;AACrB,mBAAS,CAAC,EAAE,IAAI,iBAAiB,UAAU,UAAU,OAAO,iBAAiB,MAAM,qBAAqB,GAAG,GAAG,MAAM;AAAA,QACtH;AAAA,MACF,WAAW,iBAAiB;AAE1B,cAAM,aAAa,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,SAAS;AAC/D,YAAI,aAAa,GAAG;AAClB,mBAAS,CAAC,OAAO,UAAU,GAAG,GAAG,OAAO,MAAM,GAAG,UAAU,GAAG,GAAG,OAAO,MAAM,aAAa,CAAC,CAAC;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,CAAC,EAAE,IAAI,IAAI;AACxB,eAAW,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,UAAsC;AAC3E,QAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS;AACpD,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,MAAI,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,EAAG,QAAO;AACtD,SAAO,UAAU,CAAC,EAAE;AACtB;AA8DO,SAAS,sBACd,OAC2B;AAC3B,SAAO;AAAA,IACL;AAAA,MACE,UAAU,MAAM,OAAO;AAAA,MACvB,MAAM;AAAA,MACN,SAAS,MAAM,OAAO;AAAA,MACtB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,qBAAqB;AAAA,IACvB;AAAA,EACF;AACF;AAEO,SAAS,8BAAyD;AAGvE,SAAO,EAAE,SAAS,MAAM,WAAW,CAAC,EAAE;AACxC;AAEO,SAAS,2BAAmD;AACjE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,SAAS;AAAA,IACT,qBAAqB;AAAA,EACvB;AACF;AAEO,SAAS,2BACd,OACA,qBACQ;AACR,QAAM,WAAW,MAAM,oBAAoB,KAAK,KAAK;AACrD,QAAM,aAAa,yBAAyB;AAC5C,SAAO,WAAW,QAAQ,KAAK;AACjC;AAEO,SAAS,wBACd,OACA,YACM;AACN,QAAM,qBAAqB,WAAW;AACtC,QAAM,qBAAqB,CAAC,GAAG,WAAW,QAAQ;AAClD,QAAM,sBAAsB,CAAC,GAAG,WAAW,SAAS;AAEpD,QAAM,cAAc,MAAM,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,WAAW,aAAa,KAAK,CAAC,MAAM,WAAW,UAAU,CAAC;AAC3H,QAAM,gBAAgB;AAAA,IACpB,WAAW,WAAW,cAAc,WAAW,QAAQ,KAAK;AAAA,IAC5D,GAAG,WAAW,SAAS,IAAI,CAAC,YAAY,WAAW,OAAO,EAAE;AAAA,EAC9D,EAAE,OAAO,OAAO;AAEhB,QAAM,SAAS,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,YAAY,GAAG,aAAa,CAAC,CAAC;AAC/D;AAGA,SAAS,eAAe,MAA+C;AACrE,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAY,aAAO;AAAA,IACxB,KAAK;AAAY,aAAO;AAAA,EAC1B;AACF;AAMO,SAAS,+BACd,WACA,gBAC2B;AAC3B,MAAI,CAAC,eAAgB,QAAO;AAE5B,SAAO,UAAU,IAAI,CAAC,aAAa;AACjC,UAAM,WAAW,eAAe,SAAS,IAAI;AAC7C,UAAM,cAA+C,eAAe,QAAQ;AAC5E,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,cAAc,YAAY,YAAY,SAAS;AACrD,UAAM,WAAW,YAAY,SAAS;AACtC,UAAM,YAAY,YAAY,UAAU,SAAS;AAGjD,UAAM,UAAU,0BAA0B,aAAa,WAAW,QAAQ;AAE1E,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,OAAO;AAAA,MACP,SAAS,WAAW,SAAS;AAAA,MAC7B,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEO,SAAS,2BACd,OACA,OACA,qBACA,gBAC2B;AAC3B,QAAM,gBAAgB,sBAAsB,KAAK;AACjD,QAAM,aAAa;AAAA,IACjB;AAAA,MACE,IAAI,MAAM;AAAA,MACV,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,IACf;AAAA,IACA,4BAA4B;AAAA,EAC9B;AACA,0BAAwB,OAAO,UAAU;AAEzC,QAAM,SAAS,yBAAyB,eAAe,UAAU,EAAE,IAAI,CAAC,aAAa;AACnF,UAAM,kBAAkB,oBAAoB,SAAS,WAAW,EAAE;AAClE,UAAM,aAAa,WAAW,UAAU;AAAA,MACtC,CAAC,UAAU,MAAM,aAAa,SAAS,YAAY,MAAM,SAAS,SAAS;AAAA,IAC7E;AAEA,UAAM,SAAS,cAAc,SAAS,MAAM,MAAM,QAAQ,MAAM,OAAO,aAAa;AAGpF,UAAM,UAAU,SAAS;AAEzB,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,aAAa,gBAAgB;AAAA,MAC7B,qBAAqB,gBAAgB;AAAA,MACrC,iBAAiB,YAAY,UAAU,WAAW,UAAU,KAAK,GAAG;AAAA,MACpE,UAAU,WAAW;AAAA,MACrB,oBAAoB,WAAW;AAAA,MAC/B,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AAGD,SAAO,+BAA+B,QAAQ,kBAAkB,IAAI;AACtE;;;AOroBA,SAAS,OAAAC,YAAW;;;ACgDpB,IAAM,QAAqB,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AAG7E,IAAI,UAAuB,EAAE,GAAG,MAAM;AAGtC,IAAM,UAAU,oBAAI,IAAyB;AAG7C,IAAM,UAAU,oBAAI,IAAyB;AAG7C,IAAM,QAAQ,oBAAI,IAAyB;AAG3C,IAAM,eAAe,oBAAI,IAAyB;AAGlD,IAAM,eAAe,oBAAI,IAAyB;AAGlD,IAAM,UAAU,oBAAI,IAAwE;AAG5F,IAAM,cAAc,oBAAI,IAAoB;AAG5C,IAAM,SAAS,oBAAI,IAAyB;AAE5C,IAAM,mBAAmB;AAIzB,SAAS,YAAoB;AAC3B,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C;AAEA,SAAS,cAAsB;AAC7B,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C;AAEA,SAAS,gBAAsB;AAC7B,MAAI,OAAO,QAAQ,iBAAkB;AACrC,QAAM,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,mBAAmB,IAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC3F,aAAW,OAAO,OAAO,KAAK,GAAG;AAC/B,QAAI,MAAM,OAAQ,QAAO,OAAO,GAAG;AAAA,EACrC;AACF;AAEA,SAAS,MAAM,QAAqB,OAA8B;AAChE,SAAO,eAAe,MAAM;AAC5B,SAAO,gBAAgB,MAAM;AAC7B,SAAO,eAAe,MAAM;AAC9B;AAEA,SAAS,YAAY,KAA+B,KAA0B;AAC5E,MAAI,SAAS,IAAI,IAAI,GAAG;AACxB,MAAI,CAAC,QAAQ;AACX,aAAS,EAAE,GAAG,MAAM;AACpB,QAAI,IAAI,KAAK,MAAM;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAA+B,QAA+B;AACrF,QAAM,SAAwB,CAAC;AAC/B,aAAW,CAAC,KAAK,MAAM,KAAK,KAAK;AAC/B,QAAI,CAAC,IAAI,WAAW,MAAM,EAAG;AAC7B,UAAM,OAAO,IAAI,MAAM,OAAO,MAAM;AACpC,WAAO,KAAK,EAAE,GAAG,QAAQ,KAAK,CAAC;AAAA,EACjC;AACA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAClD,SAAO;AACT;AAQO,SAAS,OACd,OACA,OACA,MACM;AACN,MAAI,CAAC,SAAS,MAAM,gBAAgB,EAAG;AAEvC,QAAM,OAAO,UAAU;AACvB,QAAM,OAAO,YAAY;AACzB,QAAM,QAAQ,MAAM,SAAS;AAG7B,QAAM,SAAS,KAAK;AAGpB,QAAM,YAAY,OAAO,IAAI,GAAG,KAAK;AAGrC,QAAM,YAAY,QAAQ,IAAI,GAAG,KAAK;AACtC,gBAAc;AAGd,MAAI,MAAM;AACR,UAAM,YAAY,SAAS,IAAI,GAAG,KAAK;AACvC,UAAM,YAAY,cAAc,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK;AAAA,EAC3D;AAGA,QAAM,YAAY,SAAS,KAAK,GAAG,KAAK;AACxC,QAAM,YAAY,cAAc,GAAG,KAAK,IAAI,IAAI,EAAE,GAAG,KAAK;AAG1D,QAAM,OAAO,QAAQ,IAAI,MAAM,EAAE;AACjC,MAAI,MAAM;AACR,SAAK,eAAe,MAAM;AAC1B,SAAK,QAAQ,MAAM;AAAA,EACrB,OAAO;AACL,YAAQ,IAAI,MAAM,IAAI;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AAMO,SAAS,cAAoB;AAClC,QAAM,OAAO,UAAU;AACvB,cAAY,IAAI,OAAO,YAAY,IAAI,IAAI,KAAK,KAAK,CAAC;AACxD;AAMO,SAAS,kBAAkB,QAAQ,IAAoB;AAC5D,QAAMC,OAAM,KAAK,IAAI;AACrB,QAAM,gBAAgC,CAAC;AAEvC,WAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;AACnC,UAAM,IAAI,IAAI,KAAKA,OAAM,IAAI,IAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAChE,UAAM,cAAc,OAAO,IAAI,CAAC;AAChC,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,aAAa,aAAa,eAAe;AAAA,MACzC,cAAc,aAAa,gBAAgB;AAAA,MAC3C,aAAa,aAAa,eAAe;AAAA,IAC3C,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,cAAc;AACzB;AAMO,SAAS,QAAQ,QAA4B;AAElD,YAAU,EAAE,GAAG,MAAM;AACrB,UAAQ,MAAM;AACd,UAAQ,MAAM;AACd,QAAM,MAAM;AACZ,eAAa,MAAM;AACnB,eAAa,MAAM;AACnB,UAAQ,MAAM;AACd,cAAY,MAAM;AAElB,aAAW,SAAS,QAAQ;AAE1B,QAAI,MAAM,cAAc,MAAM,WAAW,cAAc,GAAG;AACxD,cAAQ,IAAI,MAAM,IAAI;AAAA,QACpB,YAAY,MAAM;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,aAAa,MAAM,WAAW;AAAA,MAChC,CAAC;AACD,YAAM,SAAS,MAAM,UAAU;AAAA,IACjC;AAGA,QAAI,MAAM,eAAe;AACvB,iBAAW,CAAC,OAAO,EAAE,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AAC7D,YAAI,GAAG,cAAc,EAAG,OAAM,YAAY,SAAS,KAAK,GAAG,EAAE;AAAA,MAC/D;AAAA,IACF;AAGA,QAAI,MAAM,eAAe;AACvB,iBAAW,CAAC,OAAO,EAAE,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AAC7D,YAAI,GAAG,cAAc,EAAG,OAAM,YAAY,SAAS,KAAK,GAAG,EAAE;AAAA,MAC/D;AAAA,IACF;AAGA,UAAM,OAAO,MAAM,aAAa,MAAM,GAAG,EAAE;AAC3C,QAAI,QAAQ,MAAM,cAAc,MAAM,WAAW,cAAc,GAAG;AAChE,YAAM,YAAY,OAAO,IAAI,GAAG,MAAM,UAAU;AAAA,IAClD;AACA,QAAI,QAAQ,MAAM,eAAe;AAC/B,iBAAW,CAAC,OAAO,EAAE,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AAC7D,YAAI,GAAG,cAAc,EAAG,OAAM,YAAY,cAAc,GAAG,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE;AAAA,MACjF;AAAA,IACF;AACA,QAAI,QAAQ,MAAM,eAAe;AAC/B,iBAAW,CAAC,OAAO,EAAE,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AAC7D,YAAI,GAAG,cAAc,EAAG,OAAM,YAAY,cAAc,GAAG,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,aAAa,OAAO,IAAoB;AAEtD,QAAM,WAAW,oBAAI,IAAI,CAAC,GAAG,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC;AACjE,QAAM,aAA4B,CAAC;AACnC,aAAW,QAAQ,UAAU;AAC3B,UAAM,SAAS,MAAM,IAAI,IAAI,KAAK,EAAE,GAAG,MAAM;AAC7C,UAAM,SAAS,YAAY,IAAI,IAAI,KAAK;AACxC,eAAW,KAAK,EAAE,GAAG,QAAQ,MAAM,GAAI,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC;AAAA,EACxE;AACA,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAGtD,QAAM,qBAAoD,CAAC;AAC3D,aAAW,SAAS,QAAQ,KAAK,GAAG;AAClC,uBAAmB,KAAK,IAAI,gBAAgB,cAAc,GAAG,KAAK,GAAG;AAAA,EACvE;AAGA,QAAM,qBAAoD,CAAC;AAC3D,aAAW,SAAS,QAAQ,KAAK,GAAG;AAClC,uBAAmB,KAAK,IAAI,gBAAgB,cAAc,GAAG,KAAK,GAAG;AAAA,EACvE;AAGA,QAAM,YAAY,CAAC,GAAG,QAAQ,QAAQ,CAAC,EACpC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,IAAI,GAAG,KAAK,EAAE,EACrC,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW,EAC5C,MAAM,GAAG,IAAI;AAGhB,QAAM,gBAA6C,CAAC;AACpD,aAAW,CAAC,GAAG,CAAC,KAAK,QAAS,eAAc,CAAC,IAAI,EAAE,GAAG,EAAE;AAExD,QAAM,gBAA6C,CAAC;AACpD,aAAW,CAAC,GAAG,CAAC,KAAK,QAAS,eAAc,CAAC,IAAI,EAAE,GAAG,EAAE;AAExD,SAAO;AAAA,IACL,SAAS,EAAE,GAAG,QAAQ;AAAA,IACtB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,cAAc;AAAA,IACd,cAAc;AAAA,IACd;AAAA,EACF;AACF;;;ACrTA,IAAI,gBAAuC;AAC3C,IAAI,eAAe;AAEZ,SAAS,oBAA0B;AACxC,iBAAe;AACjB;AAEO,SAAS,WAAW,QAAsC;AAC/D,MAAI,CAAC,gBAAgB,cAAe,QAAO;AAC3C,kBAAgB,eAAe,MAAM;AACrC,iBAAe;AACf,SAAO;AACT;;;ACbO,IAAM,yBAAyB;AAqB/B,IAAM,iCAAiC;AAAA,EAC5C,cAAc;AAAA,EACd,QAAQ;AAAA,IACN,UAAU;AAAA,MACR,IAAI;AAAA,QACF,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,IAAI;AAAA,QACF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,IAAI;AAAA,QACF,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,IAAI;AAAA,QACF,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,IAAI;AAAA,QACF,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,IAAI;AAAA,QACF,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,IAAI;AAAA,QACF,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAmBA,IAAI,0BAA8D;AAElE,SAAS,2BAA2B,mBAAyD;AAC3F,QAAM,aAAa;AACnB,SAAO;AAAA,IACL,cAAc,OAAO,YAAY,iBAAiB,WAAW,WAAW,eAAe;AAAA,IACvF,QAAQ,YAAY,UAAU,OAAO,WAAW,WAAW,YAAY,CAAC,MAAM,QAAQ,WAAW,MAAM,IACnG,WAAW,SACV,+BAA+D;AAAA,EACtE;AACF;AAEO,SAAS,2BAA2B,QAAkD;AAC3F,4BAA0B;AAC5B;AAEO,SAAS,6BAAiE;AAC/E,SAAO;AACT;AAEO,SAAS,iCAA0C;AACxD,SAAO,yBAAyB,uBAAuB,sBAAsB,KACxE;AACP;AAEO,SAAS,iCAAiC,oBAA6B,+BAA+B,GAAW;AACtH,SAAO,2BAA2B,iBAAiB,EAAE;AACvD;AAuCO,SAAS,oCACd,mBACA,MACA,IACiB;AACjB,MAAI,SAAS,GAAI,QAAO,CAAC;AAEzB,QAAM,aAAa,2BAA2B,iBAAiB;AAC/D,QAAM,QAAQ,WAAW,UAAU,CAAC;AACpC,MAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAG,QAAO;AAEvC,QAAM,QAAkB,CAAC,IAAI;AAC7B,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,gBAAc,IAAI,MAAM,EAAE;AAE1B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,cAAc,MAAM,OAAO,GAAG;AACpC,QAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU;AAErD,eAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC1D,UAAI,OAAO,YAAY,SAAU;AACjC,YAAM,OAAO;AACb,UAAI,cAAc,IAAI,IAAI,EAAG;AAE7B,oBAAc,IAAI,MAAM,OAAO;AAC/B,oBAAc,IAAI,MAAM,KAAK;AAE7B,UAAI,SAAS,IAAI;AACf,cAAM,SAAS,CAAC;AAChB,YAAI,SAAS;AACb,eAAO,WAAW,MAAM;AACtB,gBAAM,OAAO,cAAc,IAAI,MAAM;AACrC,gBAAMC,SAAQ,cAAc,IAAI,MAAM;AACtC,cAAI,CAAC,QAAQ,CAACA,OAAO,QAAO;AAC5B,iBAAO,QAAQA,MAAK;AACpB,mBAAS;AAAA,QACX;AACA,eAAO;AAAA,MACT;AAEA,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;;;AC1NA,SAAS,gBAAgB;AAGlB,IAAM,0BAA0B;AAChC,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,SAAS,qBAAqB,OAAwB;AAC3D,SAAO,OAAO,UAAU,WACpB,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,IAChC;AACN;AAEO,SAAS,kBAAkB,YAA4B;AAC5D,QAAM,iBAAiB,OAAO,eAAe,WACzC,WAAW,KAAK,EAAE,QAAQ,WAAW,EAAE,IACvC;AACJ,MAAI,CAAC,eAAgB,QAAO;AAC5B,SAAO,qBAAqB,SAAS,cAAc,CAAC;AACtD;AAEO,SAAS,qBAAqB,UAA0C;AAC7E,QAAM,aAAa,CAAC,yBAAyB,GAAG,0BAA0B;AAE1E,aAAW,MAAM,YAAY;AAC3B,UAAM,QAAQ,qBAAqB,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,EAAE,GAAG,KAAK;AACvF,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,aAA6B;AAC3D,QAAM,wBAAwB,qBAAqB,WAAW;AAC9D,SAAO,wBAAwB,WAAW,qBAAqB,KAAK;AACtE;AAEO,SAAS,uBACd,UACA,YACiB;AACjB,QAAM,mBAAmB,qBAAqB,QAAQ;AACtD,QAAM,sBAAsB,kBAAkB,UAAU;AACxD,QAAM,cAAc,oBAAoB;AAExC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,mBAAmB,mBAAmB,UAAU,sBAAsB,aAAa;AAAA,IACnF,YAAY,gBAAgB,WAAW;AAAA,EACzC;AACF;;;AChEA,SAAS,gBAAgB;AAIlB,SAAS,2BAA2B,eAAuB,QAAQ,IAAI,OAA8B;AAC1G,MAAI,CAAC,OAAO,cAAc,CAAC,MAAM,WAAY,QAAO,CAAC;AACrD,MAAI;AACF,UAAM,SAAS;AAAA,MACb,yBAAyB,MAAM,UAAU,QAAQ,MAAM,UAAU;AAAA,MACjE,EAAE,KAAK,aAAa,UAAU,QAAQ,SAAS,KAAQ,OAAO,OAAO;AAAA,IACvE;AACA,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,MAAM,GAAG,KAAK;AAAA,EACjE,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGO,SAAS,iBAAiB,OAAyB;AACxD,MAAI,CAAC,MAAM,cAAc,CAAC,MAAM,WAAY;AAC5C,MAAI;AACF,QAAI,MAAM;AACV,QAAI;AACF,YAAM;AAAA,QACJ,oBAAoB,MAAM,UAAU,QAAQ,MAAM,UAAU;AAAA,QAC5D,EAAE,KAAK,aAAa,UAAU,QAAQ,WAAW,OAAS,SAAS,KAAQ,OAAO,OAAO;AAAA,MAC3F;AAAA,IACF,SAAS,KAAU;AACjB,YAAM,IAAI,UAAU;AAAA,IACtB;AACA,QAAI,IAAK,gBAAe,OAAO,GAAG;AAAA,EACpC,QAAQ;AAAA,EAAC;AACX;AAEO,SAAS,eAAe,OAAmB,KAAmB;AACnE,QAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,IAAI;AACnC,QAAM,UAAU,MAAM,MAAM,SAAS,CAAC,KAAK;AAC3C,QAAM,aAAa,QAAQ,MAAM,0BAA0B;AAC3D,QAAM,WAAW,QAAQ,MAAM,2BAA2B;AAC1D,QAAM,WAAW,QAAQ,MAAM,yBAAyB;AAExD,QAAM,aAAa;AACnB,QAAM,YAAY,MAAM,MAAM,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM;AACjD,UAAM,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAChE,WAAO,CAAC,WAAW,KAAK,IAAI;AAAA,EAC9B,CAAC;AAED,QAAM,eAAe,UAAU,WAAW,aAAa,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI;AACrF,QAAM,aAAa,WAAW,SAAS,SAAS,CAAC,GAAG,EAAE,IAAI;AAC1D,QAAM,eAAe,WAAW,SAAS,SAAS,CAAC,GAAG,EAAE,IAAI;AAC9D;;;AL+DA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,OAAO,UAAU,QAAQ,YAAY,CAAC;AAErE,SAAS,iBAAiB,OAA6C;AACrE,QAAM,MAAM,OAAO,UAAU,WAAW,MAAM,KAAK,EAAE,YAAY,IAAI;AACrE,SAAO,cAAc,IAAI,GAAG,IAAK,MAA0B;AAC7D;AAEA,SAAS,kBAAkB,OAA0C;AACnE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAEvC,UAAM,SAAS,iBAAiB,KAAK;AACrC,WAAO,SAAS,EAAE,SAAS,OAAO,IAAI;AAAA,EACxC;AACA,QAAM,MAAM;AACZ,QAAM,SAAuB,CAAC;AAC9B,QAAM,IAAI,iBAAiB,IAAI,OAAO;AACtC,QAAM,IAAI,iBAAiB,IAAI,OAAO;AACtC,QAAM,IAAI,iBAAiB,IAAI,QAAQ;AACvC,QAAM,IAAI,iBAAiB,IAAI,QAAQ;AACvC,MAAI,EAAG,QAAO,UAAU;AACxB,MAAI,EAAG,QAAO,UAAU;AACxB,MAAI,EAAG,QAAO,WAAW;AACzB,MAAI,EAAG,QAAO,WAAW;AACzB,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEO,SAAS,iBAAiB,QAA8B;AAC7D,QAAM,QAAQ,OAAO,OAAO,CAAC,SAAS,UAAU;AAC9C,UAAM,QAAQ,MAAM,WAAW,MAAM,UAAU;AAC/C,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,SAAS,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAC3C,WAAO,OAAO,SAAS,MAAM,IAAI,KAAK,IAAI,SAAS,MAAM,IAAI;AAAA,EAC/D,GAAG,CAAC;AAEJ,SAAO,IAAI,QAAQ,CAAC;AACtB;AAEO,SAAS,uBACd,SACA,QACA,eACY;AACZ,QAAM,aAAa,cAAc,QAAQ,YAAY,iBAAiB,MAAM,CAAC;AAC7E,QAAM,KAAK,cAAc,QAAQ,IAAI,WAAW,QAAQ,MAAM,QAAQ,CAAC;AACvE,SAAO,KAAK,EAAE,IAAI,YAAY,OAAO,cAAc,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,6BAA6B;AACnH,QAAM,YAAY,IAAI;AACtB,QAAM,YAAY,cAAc,QAAQ,SAAS;AACjD,QAAM,QAAQ,cAAc,QAAQ,KAAK;AACzC,QAAM,SAAS,cAAc,QAAQ,MAAM;AAC3C,QAAM,eAAe,gBAAgB,QAAQ,KAAK,MAAM,QAAQ,OAAO,YAAY;AAEnF,QAAM,QAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,OAAO,cAAc,QAAQ,OAAO,SAAS,UAAU,EAAE;AAAA,IACzD,aAAa,cAAc,QAAQ,aAAa,EAAE;AAAA,IAClD,UAAU,MAAM,cAAc,QAAQ,UAAU,CAAC,GAAG,GAAG,EAAE;AAAA,IACzD,OAAO;AAAA,IACP,YAAY,cAAc,QAAQ,UAAU;AAAA,IAC5C,YAAY,cAAc,QAAQ,UAAU,KAAK;AAAA,IACjD,KAAK,cAAc,QAAQ,GAAG;AAAA,IAC9B,YAAY,cAAc,QAAQ,UAAU;AAAA,IAC5C,QAAQ,cAAc,QAAQ,MAAM;AAAA,IACpC;AAAA,IACA,eAAe,CAAC;AAAA,IAChB,oBAAoB;AAAA,IACpB,oBAAoB,CAAC;AAAA,IACrB,qBAAqB,CAAC;AAAA,IACtB;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,IACX,SAAS,CAAC,IAAI,SAAS,0BAA0B;AAAA,IACjD,UAAU;AAAA,IACV,aAAa,MAAM,cAAc,QAAQ,aAAa,CAAC,GAAG,GAAG,EAAE;AAAA,IAC/D,cAAc;AAAA,IACd,QAAQ,OAAO,SAAS,SAAS;AAAA,IACjC,WAAW,cAAc,QAAQ,SAAS,KAAK;AAAA,IAC/C,QAAQ,kBAAkB,QAAQ,MAAM;AAAA,IACxC,MAAM,QAAQ,QAAQ,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAA6B;AAAA,IAC9F,aAAa,QAAQ,OAAO,IAAI;AAAA,IAChC,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,aAAa,CAAC;AAAA,EAChB;AAGA,MAAI,MAAM,MAAM;AACd,QAAI,MAAM,KAAK,gBAAgB,UAAU,CAAC,MAAM,OAAO,QAAQ;AAC7D,YAAM,QAAQ,MAAM,KAAK;AAAA,IAC3B;AACA,QAAI,MAAM,KAAK,iBAAiB,UAAU,CAAC,MAAM,QAAQ,QAAQ;AAC/D,YAAM,SAAS,MAAM,KAAK;AAAA,IAC5B;AACA,QAAI,MAAM,KAAK,mBAAmB,CAAC,MAAM,QAAQ;AAC/C,YAAM,SAAS,MAAM,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,0BAAwB,OAAO,wBAAwB;AAAA,IACrD,IAAI,MAAM;AAAA,IACV,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,EACf,GAAG,4BAA4B,CAAC,CAAC;AAEjC,SAAO;AACT;AAEO,SAAS,aAAa,MAA+B;AAC1D,QAAM,oBAAoB,oBAAoB,6BAA6B,CAAC;AAC5E,MAAI,iBAAiB,eAAe,2BAA2B,IAAI;AACnE,MAAI,oBAAoB;AACxB,MAAI,qBAAqB,eAAe,uBAAuB,CAAC;AAChE,MAAI,mBAAmB,eAAe,2BAA2B,IAAS;AAE1E,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,UAAU;AACpB,YAAM,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC7B,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,MAAK,6BAA6B,KAAK,EAAE;AACnE,uBAAiB,YAAY,OAAO,cAAc;AAAA,IACpD;AACA,QAAI,QAAQ,iBAAiB;AAC3B,YAAM,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC7B,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,MAAK,oCAAoC,KAAK,EAAE;AAC1E,0BAAoB,YAAY,OAAO,iBAAiB;AAAA,IAC1D;AACA,QAAI,QAAQ,cAAc;AACxB,YAAM,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC7B,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,MAAK,iCAAiC,KAAK,EAAE;AACvE,2BAAqB,YAAY,OAAO,kBAAkB;AAAA,IAC5D;AACA,QAAI,QAAQ,aAAa;AACvB,YAAM,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC7B,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,MAAK,gCAAgC,KAAK,EAAE;AACtE,yBAAmB,YAAY,OAAO,gBAAgB;AAAA,IACxD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,gBAAgB,MAAM,gBAAgB,KAAK,GAAM;AAAA,IACjD,mBAAmB,MAAM,mBAAmB,GAAG,EAAE;AAAA,IACjD,kBAAkB,MAAM,kBAAkB,KAAO,IAAS;AAAA,IAC1D,oBAAoB,MAAM,oBAAoB,GAAG,EAAE;AAAA,IACnD,UAAU,MAAM,eAAe,0BAA0B,CAAC,GAAG,GAAG,EAAE;AAAA,IAClE,cAAc,eAAe,yBAAyB,GAAK;AAAA,IAC3D,0BAA0B,eAAe,+BAA+B,IAAS;AAAA,IACjF,cAAc,eAAe,yBAAyB,IAAM;AAAA,IAC5D,wBAAwB,eAAe,gCAAgC,GAAM;AAAA,IAC7E,eAAe,uBAAuBC,KAAI,yBAAyB,OAAO;AAAA,IAC1E,cAAc,cAAcA,KAAI,sBAAsB,EAAE;AAAA,IACxD,eAAe;AAAA,MACb,SAAS,iBAAiBA,KAAI,uBAAuB;AAAA,MACrD,SAAS,iBAAiBA,KAAI,qBAAqB;AAAA,MACnD,UAAU,iBAAiBA,KAAI,sBAAsB;AAAA,MACrD,UAAU,iBAAiBA,KAAI,sBAAsB;AAAA,IACvD;AAAA,IACA,sBAAsB,CAAC;AAAA,IACvB,SAAS;AAAA,IACT,iBAAiBA,KAAI,4BAA4B;AAAA,IACjD,eAAeA,KAAI,0BAA0B;AAAA,IAC7C,cAAcA,KAAI,yBAAyB;AAAA,IAC3C,kBAAkBA,KAAI,6BAA6B;AAAA,EACrD;AACF;AAEO,SAAS,oBACd,QACA,MACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe,OAAO,OAAO,IAAI,IAAI,OAAO;AAAA,EAC9C;AACF;AAEO,SAAS,eAAe,QAAiC;AAC9D,QAAM,SAAmB,CAAC;AAC1B,MAAI,OAAO,iBAAiB,IAAK,QAAO,KAAK,2BAA2B,OAAO,cAAc,YAAY;AACzG,MAAI,OAAO,oBAAoB,KAAK,OAAO,oBAAoB,GAAI,QAAO,KAAK,mCAAmC,OAAO,iBAAiB,SAAS;AACnJ,MAAI,OAAO,qBAAqB,KAAK,OAAO,qBAAqB,GAAI,QAAO,KAAK,oCAAoC,OAAO,kBAAkB,SAAS;AACvJ,MAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAI,QAAO,KAAK,0BAA0B,OAAO,QAAQ,SAAS;AAC/G,MAAI,OAAO,mBAAmB,IAAM,QAAO,KAAK,6BAA6B,OAAO,gBAAgB,aAAa;AACjH,MAAI,OAAO,eAAe,EAAG,QAAO,KAAK,0BAA0B,OAAO,YAAY,EAAE;AACxF,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,OAAO,oBAAoB,GAAG;AAC3E,QAAI,QAAQ,EAAG,QAAO,KAAK,wBAAwB,QAAQ,uBAAuB,KAAK,EAAE;AAAA,EAC3F;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,QAA4B;AAC9D,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,UAAU;AAC9C,YAAM,MAAM,MAAM,YAAY;AAC9B,UAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,WAAK,IAAI,GAAG;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEO,SAAS,kBACd,UACA,QACA,kBAAmC,uBAAuB,CAAC,GAAG,WAAW,GAC3D;AACd,QAAM,gBAAgB,UAAU,UAAU,CAAC,GACxC,IAAI,CAAC,aAAa;AACjB,QAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAEtD,UAAM,WAAW;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,IAAI,cAAc,SAAS,IAAI,EAAE;AAAA,MACjC,YAAY,cAAc,SAAS,YAAY,SAAS,EAAE;AAAA,MAC1D,OAAO,cAAc,SAAS,OAAO,SAAS,cAAc,SAAS,YAAY,SAAS,EAAE,CAAC,EAAE;AAAA,MAC/F,aAAa,cAAc,SAAS,aAAa,EAAE;AAAA,MACnD,OAAO,eAAe,SAAS,OAAO,SAAS,OAAO,YAAY,UAAU;AAAA,MAC5E,OAAO,cAAc,SAAS,KAAK;AAAA,MACnC,eAAe,cAAc,SAAS,aAAa;AAAA,MACnD,QAAQ,cAAc,SAAS,MAAM;AAAA,MACrC,oBAAoB,cAAc,SAAS,kBAAkB;AAAA,MAC7D,qBAAqB,cAAc,SAAS,mBAAmB;AAAA,MAC/D,WAAW,cAAc,SAAS,SAAS,EAAE,SAAS,IAClD,cAAc,SAAS,SAAS,IAChC,cAAc,SAAS,UAAU;AAAA,MACrC,SAAS,MAAM,QAAQ,SAAS,OAAO,IAAI,SAAS,UAAU,CAAC;AAAA,MAC/D,UAAU,MAAM,cAAc,SAAS,UAAU,CAAC,GAAG,GAAG,OAAO,kBAAkB;AAAA,MACjF,aAAa,MAAM,cAAc,SAAS,aAAa,OAAO,kBAAkB,GAAG,GAAG,OAAO,kBAAkB;AAAA,MAC/G,aAAa,cAAc,SAAS,WAAW;AAAA,MAC/C,WAAW,cAAc,SAAS,WAAW,IAAI,CAAC;AAAA,MAClD,WAAW,cAAc,SAAS,WAAW,IAAI,CAAC;AAAA,MAClD,aAAa,cAAc,SAAS,aAAa,SAAS,OAAO,IAAI,CAAC;AAAA,MACtE,gBAAgB,cAAc,SAAS,gBAAgB,cAAc,SAAS,UAAU,CAAC,CAAC;AAAA,MAC1F,eAAe,cAAc,SAAS,eAAe,cAAc,SAAS,UAAU,CAAC,CAAC;AAAA,MACxF,aAAa,MAAM,QAAQ,SAAS,WAAW,IAAI,SAAS,cAAc,CAAC;AAAA,IAC7E;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAA+B,UAAU,IAAI,EACrD,OAAO,CAAC,UAAU,MAAM,EAAE;AAG7B,aAAW,SAAS,cAAc;AAChC,QAAI,gBAAgB,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,cAAc;AAC3D,YAAM,eAAe,QAAQ,MAAM,eAAe,MAAM,SAAS;AAAA,IACnE,WAAW,CAAC,gBAAgB,IAAI,MAAM,KAAK,GAAG;AAC5C,YAAM,eAAe;AAAA,IACvB;AAAA,EACF;AAEA,sBAAoB,YAAY;AAEhC,QAAM,UAAU,eAAe,YAAY;AAE3C,SAAO;AAAA,IACL,WAAW,UAAU,aAAa,IAAI;AAAA,IACtC,WAAW,IAAI;AAAA,IACf,aAAa;AAAA,IACb,eAAe;AAAA,IACf,WAAW;AAAA,IACX,aAAa,gBAAgB;AAAA,IAC7B,qBAAqB,gBAAgB;AAAA,IACrC,mBAAmB,gBAAgB;AAAA,IACnC,YAAY,gBAAgB;AAAA,IAC5B,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,eAAe,UAAU,OAAO;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,UAAU,UAAU,CAAC;AAAA,IAC7B;AAAA,IACA,OAAO,UAAU,SAAS;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAe,QAAsC;AACnE,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,QAAM,kBAA4B,CAAC;AAEnC,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAW,MAAM;AACvB,QAAI,MAAM,UAAU,QAAQ;AAC1B,YAAM,YAAY,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,IACtE,WACA,OAAO,SAAS,KAAK,MAAM,MAAM,aAAa,EAAE,CAAC,KAAK,OAAO,SAAS,KAAK,MAAM,MAAM,eAAe,EAAE,CAAC,IACvG,KAAK,MAAM,MAAM,WAAW,IAAI,KAAK,MAAM,MAAM,SAAS,IAC1D;AACN,UAAI,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AAChD,wBAAgB,KAAK,SAAS;AAAA,MAChC;AAAA,IACF;AAEA,YAAQ,MAAM,OAAO;AAAA,MACnB,KAAK;AACH,oBAAY;AACZ;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,sBAAc;AACd;AAAA,MACF,KAAK;AACH,mBAAW;AACX;AAAA,MACF,KAAK;AACH,gBAAQ;AACR;AAAA,MACF,KAAK;AACH,qBAAa;AACb;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,gBAAgB,WAAW,GAAG;AAChC,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,wBAAwB,gBAAgB,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC1E,QAAM,oBAAoB,sBAAsB,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACrF,QAAM,MAAM,KAAK,MAAM,sBAAsB,SAAS,CAAC;AACvD,QAAM,qBAAqB,sBAAsB,SAAS,MAAM,IAC5D,sBAAsB,GAAG,IACzB,KAAK,OAAO,sBAAsB,MAAM,CAAC,IAAI,sBAAsB,GAAG,KAAK,CAAC;AAEhF,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,iBAAiB,KAAK,MAAM,oBAAoB,gBAAgB,MAAM;AAAA,IACtE;AAAA,IACA,qBAAqB,sBAAsB,CAAC;AAAA,IAC5C,qBAAqB,sBAAsB,sBAAsB,SAAS,CAAC;AAAA,EAC7E;AACF;AAEO,SAAS,wBAAwB,QAA8C;AACpF,SAAO,OAAO,OAA+B,CAAC,aAAa,UAAU;AACnE,UAAM,MAAM,MAAM,oBAAoB,KAAK,KAAK;AAChD,gBAAY,GAAG,KAAK,YAAY,GAAG,KAAK,KAAK;AAC7C,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAEO,SAAS,SACd,OACA,SACA,MACA,SACM;AACN,QAAM,QAAsB;AAAA,IAC1B,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,MAAM,OAAO,SAAS,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,IAAI;AAAA,EACV;AAEA,QAAM,SAAS,CAAC,OAAO,GAAG,MAAM,MAAM,EAAE,MAAM,GAAG,kBAAkB;AACnE,iBAAe,MAAM,EAAE;AAGvB,MAAI;AAAE,gBAAkB;AAAA,EAAG,QAAQ;AAAA,EAAqB;AAGxD,MAAI,SAAS;AACX,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvD,QAAI,OAAO;AACT,YAAM,eAAe,MAAM,eAAe,KAAK;AAC/C,qBAAe,MAAM,EAAE;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,KAAK,EAAE,SAAS,KAAK,GAAG,OAAO;AACxC;AAEO,SAAS,WAAW,OAAmB,QAAoB,MAAoB;AACpF,QAAM,WAAW,MAAM;AACvB,SAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,UAAU,IAAI,QAAQ,KAAK,GAAG,0BAA0B;AAE9H,MAAI,WAAW,aAAa,CAAC,KAAK,KAAK,GAAG;AACxC,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,MAAI,WAAW,WAAW;AACxB,UAAM,YAAY;AAAA,EACpB;AAEA,QAAM,QAAQ;AACd,QAAM,YAAY,IAAI;AACtB,iBAAe,MAAM,EAAE;AACvB,oBAAkB;AAClB,QAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI,EAAE;AAEjD,MAAI,aAAa,aAAa,WAAW,WAAW;AAClD,UAAM,YAAY;AAClB,UAAM,cAAc;AAAA,EACtB;AAEA,MAAI,WAAW,aAAa;AAC1B,UAAM,cAAc,IAAI;AAAA,EAC1B;AAEA,MAAI,gBAAgB,IAAI,MAAM,GAAG;AAC/B,UAAM,cAAc,IAAI;AACxB,UAAM,cAAc;AACpB,UAAM,eAAe,QAAQ;AAAA,EAC/B;AAGA,MAAI,gBAAgB,IAAI,QAAQ,KAAK,CAAC,gBAAgB,IAAI,MAAM,GAAG;AACjE,UAAM,eAAe;AAAA,EACvB;AAEA,MAAI,WAAW,QAAQ;AACrB,UAAM,YAAY;AAElB,QAAI,CAAC,MAAM,cAAc,CAAC,MAAM,cAAc;AAC5C,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF;AACF;AAWO,SAAS,eAAe,OAAmB,QAAwB;AACxE,QAAM,cAAc,MAAM,WAAW;AACrC,QAAM,YAAY,iBAAiB,aAAa,MAAM;AACtD,SAAO,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,EAAE,YAAY;AACtD;AAEA,eAAe,kCAAkC,OAAkC;AACjF,QAAM,SAAS,2BAA2B;AAC1C,MAAI,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,OAAO,QAAQ,CAAC,OAAO,kBAAkB;AAC3E;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,wBAAoB,OAAO,uBACvB,OAAO,qBAAqB,sBAAsB,IAClD,+BAA+B;AAAA,EACrC,QAAQ;AACN,wBAAoB,+BAA+B;AAAA,EACrD;AACA,QAAM,cAAc,eAAe,MAAM,KAAK;AAC9C,MAAI,eAAe,MAAM,OAAO,SAAS,wBAAwB,MAAM,EAAE,EAAE,MAAM,MAAM,IAAI;AAE3F,MAAI,CAAC,cAAc;AACjB,UAAM,OAAO,iBAAiB,wBAAwB,MAAM,IAAI;AAAA,MAC9D,SAAS,MAAM;AAAA,MACf,iBAAiB,MAAM;AAAA,MACvB,OAAO;AAAA,IACT,CAAC;AACD,mBAAe,MAAM,OAAO,SAAS,wBAAwB,MAAM,EAAE,EAAE,MAAM,MAAM;AACjF,aAAO,iCAAiC,iBAAiB;AAAA,IAC3D,CAAC;AAAA,EACH;AAEA,MAAI,iBAAiB,aAAa;AAChC;AAAA,EACF;AAEA,QAAM,OAAO,oCAAoC,mBAAmB,cAAc,WAAW;AAC7F,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,0CAA0C,MAAM,EAAE,UAAU,YAAY,SAAS,WAAW,IAAI;AAAA,EAClH;AAEA,aAAW,SAAS,MAAM;AACxB,UAAM,OAAO,KAAK,wBAAwB,MAAM,IAAI,OAAO;AAAA,MACzD,SAAS,MAAM;AAAA,MACf,iBAAiB,MAAM;AAAA,MACvB,YAAY;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAgBA,eAAe,0BAA0B,OAAmB,aAAyB,MAA6B;AAChH,QAAM,SAAS,2BAA2B;AAC1C,MAAI,CAAC,QAAQ,QAAQ,CAAC,OAAO,UAAU;AACrC,eAAW,OAAO,aAAa,IAAI;AACnC;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,wBAAoB,OAAO,uBACvB,OAAO,qBAAqB,sBAAsB,IAClD,+BAA+B;AAAA,EACrC,QAAQ;AACN,wBAAoB,+BAA+B;AAAA,EACrD;AACA,QAAM,sBAAsB,eAAe,MAAM,KAAK;AACtD,QAAM,SAAS,eAAe,WAAW;AAEzC,QAAM,kCAAkC,KAAK;AAC7C,QAAM,eAAe,MAAM,OAAO,SAAS,wBAAwB,MAAM,EAAE,EAAE,MAAM,MAAM,mBAAmB;AAE5G,MAAI,iBAAiB,qBAAqB;AACxC,UAAM,IAAI,MAAM,kDAAkD,MAAM,EAAE,cAAc,mBAAmB,iBAAiB,YAAY,GAAG;AAAA,EAC7I;AAEA,MAAI,wBAAwB,QAAQ;AAClC,UAAM,OAAO,oCAAoC,mBAAmB,qBAAqB,MAAM;AAC/F,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,iDAAiD,mBAAmB,SAAS,MAAM,eAAe,MAAM,EAAE,GAAG;AAAA,IAC/H;AAEA,eAAW,SAAS,MAAM;AACxB,YAAM,OAAO,KAAK,wBAAwB,MAAM,IAAI,OAAO;AAAA,QACzD,SAAS,MAAM;AAAA,QACf,iBAAiB,MAAM;AAAA,QACvB,WAAW,MAAM;AAAA,QACjB,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,OAAO,QAAQ,IAAI;AAChC;AAEA,eAAsB,qBACpB,OACA,QACA,MACA,SACe;AACf,MAAI;AACF,UAAM,0BAA0B,OAAO,QAAQ,IAAI;AAAA,EACrD,SAAS,OAAO;AACd,QAAI,SAAS,mBAAmB,CAAC,2BAA2B,GAAG;AAC7D,aAAO,KAAK,6CAA6C,MAAM,EAAE,uCAAuC,OAAO,KAAK,CAAC,EAAE;AACvH,iBAAW,OAAO,QAAQ,IAAI;AAAA,IAChC,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,WAAW,YAAY;AACzB,WAAO,6BAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,mBAAmB,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,OAAO,KAAK,EAAE,IAAI,GAAG,+CAA+C,CAAC;AAAA,EAC5J,WAAW,WAAW,UAAU;AAC9B,WAAO,6BAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,oBAAoB,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,OAAO,KAAK,EAAE,IAAI,GAAG,gDAAgD,CAAC;AAAA,EAC9J,WAAW,WAAW,aAAa;AACjC,WAAO,6BAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,OAAO,KAAK,EAAE,IAAI,GAAG,6CAA6C,CAAC;AAAA,EACxJ;AACF;AAMO,SAAS,cAAc,OAAyB;AACrD,MAAI,MAAM,MAAM;AACd,QAAI,CAAC,MAAM,QAAQ,MAAM,WAAW,EAAG,OAAM,cAAc,CAAC;AAC5D,UAAM,YAAY,KAAK,MAAM,IAAI;AACjC,UAAM,OAAO;AACb,uBAAmB,MAAM,EAAE;AAAA,EAC7B;AACA,QAAM,eAAe,MAAM,eAAe,KAAK;AAC/C,QAAM,iBAAiB;AACvB,QAAM,gBAAgB;AACtB,aAAW,OAAO,YAAY,mBAAmB;AACjD,QAAM,iBAAiB;AACvB,QAAM,gBAAgB;AACtB,QAAM,oBAAoB;AAC1B,iBAAe,MAAM,EAAE;AACzB;AAEA,eAAsB,iBAAiB,OAAqB,OAAmB,SAAoC;AACjH,QAAM,YAAY,gBAAgB,QAAQ,KAAK;AAC/C,MAAI,CAAC,aAAa,CAAC,eAAe,SAAS,SAAS,GAAG;AACrD,UAAM,IAAI,MAAM,sBAAsB,OAAO,QAAQ,KAAK,CAAC,EAAE;AAAA,EAC/D;AAEA,QAAM,qBAAqB,OAAO,WAAW,wBAAwB,SAAS,EAAE;AAChF,MAAI,cAAc,WAAW;AAC3B,UAAM,cAAc;AACpB,UAAM,YAAY;AAAA,EACpB;AACA,MAAI,cAAc,aAAa;AAC7B,UAAM,YAAY,cAAc,QAAQ,MAAM;AAAA,EAChD;AAEA,WAAS,OAAO,MAAM,IAAI,UAAU,8BAA8B,SAAS,EAAE;AAC/E;;;AM7uBA,SAAS,qBAAqB;AAC9B,SAAS,QAAAC,aAAY;AAarB,eAAsB,iBACpB,OACA,UACA,QACA,eACA,cACmC;AACnC,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,MAAM,OAAO,OAAQ,QAAO;AAEjC,QAAM,UAAU,SAAS,SAAS,QAAQ;AAC1C,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,UAAU,sBAAsB,OAAO,UAAU,MAAM,aAAa;AAC1E,QAAM,WAAW,MAAM,QAAQ,QAAQ,OAAO,UAAU,MAAM,QAAQ,eAAe,YAAY;AACjG,WAAS,UAAU;AACnB,SAAO;AACT;AAIA,eAAsB,cACpB,OACA,UACA,eACA,aACyB;AACzB,QAAM,OAAO,MAAM;AACnB,QAAM,SAAS,MAAM,aAAa,kBAAkB;AAAA,IAClD,iBAAiB,MAAM;AAAA,IACvB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM,eAAe;AAAA,IAClC;AAAA,IACA,YAAY,OAAO,oBAAoB,IAAI,IAAI;AAAA,IAC/C,kBAAkB,MAAM,mBAAmB,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,IACzE,eAAe,MAAM,gBAAgB,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,IACnE;AAAA,EACF,CAAC;AAED,QAAM,UAAU,SAAS,SAAS,QAAQ;AAC1C,QAAM,UAAU,UACZ,QAAQ,mBAAmB,QAAQ,IACnC,SAAS;AAEb,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAIO,SAAS,oBACd,UACA,UACA,OACA,YACA,QACgB;AAChB,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS,SAAS,UAAU,KAAK,SAAS;AAAA,IACjD,QAAQ,SAAS,mBAAmB,UAAU,KAAK,mBAAmB;AAAA,IACtE,MAAM,SAAS;AAAA,IACf,iBAAiB,UAAU,KAAK,mBAAmB,CAAC;AAAA,IACpD,oBAAoB,UAAU,KAAK,sBAAsB,CAAC;AAAA,IAC1D;AAAA,IACA,YAAY,MAAM,cAAc;AAAA,IAChC,WAAW,MAAM,gBAAgB,OAC7B,EAAE,cAAc,MAAM,cAAc,YAAY,MAAM,cAAc,GAAG,cAAc,MAAM,gBAAgB,EAAE,IAC7G;AAAA,IACJ;AAAA,IACA,YAAY,YAAW,oBAAI,KAAK,GAAE,YAAY,IAAI;AAAA,IAClD,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACF;AAIO,SAAS,4BAA4B,eAAuB,UAAmC;AACpG,MAAI;AACF;AAAA,MACEC,MAAK,eAAe,yBAAyB;AAAA,MAC7C,KAAK,UAAU;AAAA,QACb,SAAS,SAAS,KAAK;AAAA,QACvB,OAAO,SAAS,KAAK;AAAA,QACrB,iBAAiB,SAAS,KAAK;AAAA,QAC/B,iBAAiB,SAAS,KAAK;AAAA,QAC/B,oBAAoB,SAAS,KAAK;AAAA,QAClC,aAAa,SAAS,KAAK;AAAA,QAC3B,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,QACpB,iBAAiB,CAAC,CAAC,SAAS;AAAA,QAC5B,YAAY,CAAC,CAAC,SAAS;AAAA,QACvB,SAAS,SAAS;AAAA,QAClB,cAAc,SAAS,OAAO;AAAA,QAC9B,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,GAAG,MAAM,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAA4B;AAEpC,MAAI;AACF,kBAAcA,MAAK,eAAe,WAAW,GAAG,SAAS,QAAQ,MAAM;AAAA,EACzE,QAAQ;AAAA,EAAiB;AAEzB,MAAI,SAAS,SAAS;AACpB,QAAI;AACF;AAAA,QACEA,MAAK,eAAe,wBAAwB;AAAA,QAC5C,KAAK,UAAU,SAAS,SAAS,MAAM,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAiB;AAAA,EAC3B;AACF;AAEO,SAAS,sBAAsB,eAAuB,OAA6B;AACxF,MAAI;AACF;AAAA,MACEA,MAAK,eAAe,sBAAsB;AAAA,MAC1C,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAA4B;AACtC;;;ACxIA,SAAS,aAAAC,kBAAiB;;;ACM1B,IAAI,UAAoC;AAEjC,SAAS,qBAAqB,OAA2B;AAC9D,YAAU,EAAE,MAAM;AACpB;AAEO,SAAS,yBAA+B;AAC7C,YAAU;AACZ;AAEO,SAAS,8BAAiD;AAC/D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,SAAO;AACT;;;AClBA;AAAA,EACE,cAAAC;AAAA,EACA,gBAAAC;AAAA,OACK;;;ACJP,IAAO,iCAAQ;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,eAAe;AAAA,IACf,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS,CAAC,OAAO,QAAQ,SAAS;AAAA,IAClC,aAAa;AAAA,EACf;AACF;;;ACpBA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;AAYd,SAAS,8BAA8B,OAAgB,UAAsD;AAClH,QAAM,aAAa,OAAO,UAAU,WAAW,MAAM,KAAK,EAAE,YAAY,IAAI;AAC5E,MAAI,eAAe,UAAU,eAAe,cAAc,eAAe,aAAa,eAAe,UAAU;AAC7G,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAmB,OAAyB,MAAgC;AACxG,MAAI,CAAC,SAAS,MAAM,gBAAgB,EAAG;AAGvC,QAAM,OAAO,MAAM,cAAc,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AACnF,QAAM,aAAa;AAAA,IACjB,aAAa,KAAK,cAAc,MAAM;AAAA,IACtC,cAAc,KAAK,eAAe,MAAM;AAAA,IACxC,aAAa,KAAK,cAAc,MAAM;AAAA,IACtC,OAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AAGA,MAAI,MAAM;AACR,QAAI,CAAC,MAAM,cAAe,OAAM,gBAAgB,CAAC;AACjD,UAAM,YAAY,MAAM,cAAc,IAAI,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AACjG,UAAM,cAAc,IAAI,IAAI;AAAA,MAC1B,aAAa,UAAU,cAAc,MAAM;AAAA,MAC3C,cAAc,UAAU,eAAe,MAAM;AAAA,MAC7C,aAAa,UAAU,cAAc,MAAM;AAAA,MAC3C,OAAO,MAAM,SAAS,UAAU;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,QAAQ,MAAM,SAAS,MAAM,YAAY,SAAS;AACxD,MAAI,CAAC,MAAM,cAAe,OAAM,gBAAgB,CAAC;AACjD,QAAM,YAAY,MAAM,cAAc,KAAK,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AAClG,QAAM,cAAc,KAAK,IAAI;AAAA,IAC3B,aAAa,UAAU,cAAc,MAAM;AAAA,IAC3C,cAAc,UAAU,eAAe,MAAM;AAAA,IAC7C,aAAa,UAAU,cAAc,MAAM;AAAA,IAC3C;AAAA,EACF;AAGA,MAAI,CAAC,MAAM,MAAO,OAAM,QAAQ,EAAE,QAAQ,CAAC,EAAE;AAC7C,QAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,KAAK,MAAM;AACvE;AAEO,SAAS,oBAAoB,QAAgB,MAAsB;AACxE,QAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,IAAI,IAAI,UAAU,IAAI,CAAC;AAC7D,SAAO,QAAQ,CAAC,GAAG,KAAK,KAAK;AAC/B;AAEO,SAAS,kBAAkB,QAAgB,SAA0D;AAC1G,MAAI,SAAS;AAEX,UAAM,aAAa,QAAQ;AAC3B,QAAI,cAAc,OAAO,eAAe,UAAU;AAChD,UAAI,aAAa,GAAG,cAAc,GAAG,eAAe,IAAI,YAAY;AACpE,iBAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,cAAM,MAAM,OAAO,MAAM,eAAe,CAAC,IAAI,OAAO,MAAM,wBAAwB,CAAC,IAAI,OAAO,MAAM,4BAA4B,CAAC;AACjI,cAAM,MAAM,OAAO,MAAM,gBAAgB,CAAC;AAC1C,sBAAc;AACd,uBAAe;AACf,YAAI,MAAM,MAAM,WAAW;AAAE,sBAAY,MAAM;AAAK,yBAAe;AAAA,QAAO;AAAA,MAC5E;AACA,UAAI,aAAa,KAAK,cAAc,GAAG;AACrC,eAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,aAAa,aAAa;AAAA,UAC1B,SAAS,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAAA,UACnE,OAAO,iBAAiB,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AAAA,QAC9E;AAAA,MACF;AAAA,IACF;AAGA,UAAM,QAAQ,QAAQ;AACtB,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,MAAM,OAAO,MAAM,YAAY,KAAK;AAC1C,YAAM,MAAM,OAAO,MAAM,aAAa,KAAK;AAC3C,UAAI,MAAM,KAAK,MAAM,GAAG;AACtB,eAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,aAAa,MAAM;AAAA,UACnB,SAAS,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAAA,UACnE,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,OAAO,MAAM,iCAAiC;AACjE,MAAI,YAAY;AACd,UAAM,QAAQ,SAAS,WAAW,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,EAAE;AAC1D,QAAI,QAAQ,GAAG;AACb,YAAM,aAAa,OAAO,MAAM,mBAAmB;AACnD,aAAO;AAAA,QACL,aAAa;AAAA,QACb,cAAc;AAAA,QACd,aAAa;AAAA,QACb,OAAO,aAAa,CAAC,GAAG,KAAK,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,QAAmC;AACpE,QAAM,UAAU,OAAO,KAAK;AAE5B,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,YAAM,MAAM;AAGZ,UAAI,IAAI,qBAAqB,OAAO,IAAI,sBAAsB,YAAY,CAAC,MAAM,QAAQ,IAAI,iBAAiB,GAAG;AAC/G,eAAO,IAAI;AAAA,MACb;AAGA,UAAI,OAAO,IAAI,WAAW,UAAU;AAClC,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAM,IAAI,MAAM;AACnC,cAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,mBAAO;AAAA,UACT;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,UAAI,IAAI,OAAQ,QAAO;AAAA,IACzB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,eAAuB,QAAgB,SAAkC;AAC1G,QAAM,iBAAuC,UAAU,SAAS;AAChE,QAAM,aAAaC,MAAK,eAAe,aAAa;AACpD,MAAI,gBAA4B,CAAC;AAGjC,QAAM,YAAY,MAAM;AACtB,QAAI;AAAE,aAAO,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,IAAiB,QAAQ;AAAE,aAAO;AAAA,IAAM;AAAA,EAC/E,GAAG;AACH,QAAM,aAAa,mBAAmB,MAAM;AAC5C,QAAM,aAAa,kBAAkB,QAAQ,QAAQ;AAErD,MAAI,YAAY,QAAQ;AACtB,WAAO;AAAA,MACL,QAAQ,8BAA8B,WAAW,QAAQ,cAAc;AAAA,MACvE,SAAS,cAAc,WAAW,OAAO,KAAK,cAAc,WAAW,OAAO,KAAK;AAAA,MACnF,YAAY,cAAc,WAAW,UAAU,KAAK,cAAc,WAAW,WAAW,KAAK;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAGA,MAAIC,YAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,SAAS,KAAK,MAAMC,cAAa,YAAY,MAAM,CAAC;AAC1D,UAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,wBAAgB;AAAA,MAClB;AAAA,IACF,SAAS,OAAO;AACd,aAAO,KAAK,0BAA0B,aAAa,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AAGA,QAAM,SAAS;AAAA,IACb,cAAc,UAAU,oBAAoB,QAAQ,eAAe;AAAA,IACnE;AAAA,EACF;AACA,QAAM,UACJ,cAAc,cAAc,OAAO,KAChC,cAAc,cAAc,OAAO,KACnC,oBAAoB,QAAQ,gBAAgB;AACjD,QAAM,aACJ,cAAc,cAAc,UAAU,KACnC,cAAc,cAAc,WAAW,KACvC;AAEL,SAAO,EAAE,QAAQ,SAAS,YAAY,WAAW;AACnD;;;AC9MA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,cAAc;AACjD,SAAS,QAAAC,aAAY;AAWd,SAAS,aAAa,eAA4C;AACvE,QAAM,UAAUA,MAAK,eAAe,WAAW;AAC/C,MAAI,CAACF,YAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,OAAO,KAAK,MAAMC,cAAa,SAAS,MAAM,CAAC;AACrD,QAAI,CAAC,MAAM,OAAO,OAAO,KAAK,QAAQ,SAAU,QAAO;AACvD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,eAAe,KAAsB;AACnD,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,oBAAoB,OAAiE;AACnG,QAAM,KAAK,MAAM;AACjB,MAAI,CAAC,MAAM,CAACD,YAAW,EAAE,EAAG,QAAO,EAAE,OAAO,OAAO,KAAK,KAAK;AAC7D,QAAM,UAAU,aAAa,EAAE;AAC/B,MAAI,CAAC,QAAS,QAAO,EAAE,OAAO,OAAO,KAAK,KAAK;AAC/C,SAAO,EAAE,OAAO,eAAe,QAAQ,GAAG,GAAG,KAAK,QAAQ;AAC5D;AAGO,SAAS,kBAAkB,eAA6B;AAC7D,QAAM,UAAU,aAAa,aAAa;AAC1C,MAAI,CAAC,QAAS;AACd,MAAI,CAAC,eAAe,QAAQ,GAAG,GAAG;AAChC,QAAI;AAAE,aAAOE,MAAK,eAAe,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,IAAG,QAAQ;AAAA,IAAC;AAAA,EAC5E;AACF;;;AClDA;AAAA,EACE,cAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,QAAAC,aAAY;AACrB,SAAS,YAAAC,iBAAgB;AAczB,SAAS,wBAAwB,OAAyB;AACxD,QAAM,eAAe,MAAM;AAC3B,MAAI,CAAC,gBAAgB,CAAC,MAAM,WAAY;AAExC,EAAAC,UAAS,cAAc,EAAE,KAAK,cAAc,OAAO,OAAO,CAAC;AAC3D,QAAM,qBAAqBA,UAAS,0BAA0B,EAAE,KAAK,cAAc,UAAU,OAAO,CAAC,EAAE,KAAK;AAC5G,MAAI,CAAC,mBAAoB;AAEzB,MAAI;AACF,IAAAA,UAAS,4CAA4C,MAAM,UAAU,KAAK,EAAE,KAAK,cAAc,OAAO,OAAO,CAAC;AAAA,EAChH,SAAS,OAAO;AACd,UAAM,YAAYA,UAAS,0BAA0B,EAAE,KAAK,cAAc,UAAU,OAAO,CAAC,EAAE,KAAK;AACnG,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,sCAAsC,MAAM,UAAU,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,IAC5F;AAAA,EACF;AAEA,QAAM,oBAAoBA,UAAS,0BAA0B,EAAE,KAAK,cAAc,UAAU,OAAO,CAAC,EAAE,KAAK;AAC3G,MAAI,mBAAmB;AACrB,UAAM,IAAI,MAAM,gBAAgB,MAAM,UAAU,8CAA8C;AAAA,EAChG;AACF;AAKA,SAAS,cAAc,OAAmB,cAAmC;AAC3E,QAAM,SAAsB,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,WAAW,CAAC,EAAE;AAClF,0BAAwB,KAAK;AAE7B,QAAM,gBAAgBC,UAAS,mCAAmC,EAAE,KAAK,aAAa,UAAU,OAAO,CAAC,EAAE,KAAK;AAC/G,MAAI,kBAAkB,MAAM,YAAY;AACtC,UAAM,IAAI,MAAM,gBAAgB,MAAM,UAAU,uBAAuB,aAAa,cAAc,MAAM,UAAU,GAAG;AAAA,EACvH;AAEA,QAAM,eAAeA,UAAS,0BAA0B,EAAE,KAAK,aAAa,UAAU,OAAO,CAAC,EAAE,KAAK;AACrG,MAAI,cAAc;AAChB,UAAM,IAAI,MAAM,gBAAgB,MAAM,UAAU,8CAA8C;AAAA,EAChG;AAGA,MAAI;AACF,UAAM,UAAUA;AAAA,MACd,2BAA2B,MAAM,UAAU,QAAQ,MAAM,UAAU;AAAA,MACnE,EAAE,KAAK,aAAa,UAAU,OAAO;AAAA,IACvC;AACA,eAAW,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AAC7D,YAAM,CAAC,YAAY,GAAG,KAAK,IAAI,KAAK,MAAM,GAAI;AAC9C,YAAM,WAAW,MAAM,KAAK,GAAI;AAChC,UAAI,eAAe,IAAK,QAAO,QAAQ,KAAK,QAAQ;AAAA,UAC/C,QAAO,OAAO,KAAK,QAAQ;AAAA,IAClC;AAAA,EACF,QAAQ;AAAA,EAAoB;AAE5B,MAAI;AACF,IAAAA;AAAA,MACE,sBAAsB,MAAM,UAAU,uBAAuB,MAAM,UAAU;AAAA,MAC7E,EAAE,KAAK,aAAa,OAAO,OAAO;AAAA,IACpC;AAAA,EACF,SAAS,KAAU;AAEjB,QAAI;AACF,YAAM,cAAcA;AAAA,QAClB;AAAA,QACA,EAAE,KAAK,aAAa,UAAU,OAAO;AAAA,MACvC;AACA,aAAO,UAAU,KAAK,GAAG,YAAY,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,IACzE,QAAQ;AAAA,IAAC;AACT,QAAI;AAAE,MAAAA,UAAS,qBAAqB,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAAA,IAAG,QAAQ;AAAA,IAAC;AACnF,WAAO,KAAK,EAAE,SAAS,MAAM,IAAI,KAAK,OAAO,GAAG,EAAE,GAAG,mCAAmC;AAAA,EAC1F;AAEA,SAAO;AACT;AAiBO,SAAS,mBAAmB,OAA2B;AAC5D,MAAI,CAAC,MAAM,cAAc,CAAC,MAAM,cAAc,CAAC,MAAM,cAAc;AACjE,UAAM,IAAI,MAAM,SAAS,MAAM,UAAU,0CAAqC;AAAA,EAChF;AAEA,0BAAwB,KAAK;AAC7B,EAAAC,UAAS,uBAAuB,MAAM,UAAU,KAAK,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAGxF,MAAI;AACF,UAAM,QAAQA;AAAA,MACZ,wBAAwB,MAAM,UAAU,aAAa,MAAM,UAAU,cAAc,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,MACnH,EAAE,KAAK,aAAa,UAAU,OAAO;AAAA,IACvC,EAAE,KAAK;AACP,WAAO;AAAA,EACT,QAAQ;AAEN,QAAI;AACF,YAAM,SAASA,UAAS,6BAA6B,EAAE,KAAK,aAAa,UAAU,OAAO,CAAC,EAAE,KAAK;AAClG,YAAM,cAAc,OAAO,QAAQ,UAAU,EAAE;AAC/C,aAAO,GAAG,WAAW,YAAY,MAAM,UAAU,MAAM,MAAM,UAAU;AAAA,IACzE,QAAQ;AACN,aAAO,YAAY,MAAM,UAAU;AAAA,IACrC;AAAA,EACF;AACF;AAGO,SAAS,eAAe,OAAgC;AAC7D,MAAI,CAAC,MAAM,cAAc,CAAC,MAAM,cAAc,CAAC,MAAM,cAAc;AACjE,UAAM,IAAI,MAAM,SAAS,MAAM,UAAU,2CAAsC;AAAA,EACjF;AACA,SAAO,cAAc,OAAO,MAAM,YAAY;AAChD;AAEO,SAAS,+BAA+B,OAA6B;AAC1E,QAAM,gBAAgB,2BAA2B,MAAM,iBAAiB,IAAI,IAAI,KAAK;AACrF,MAAI,cAAc,WAAW,EAAG,QAAO,CAAC;AACxC,QAAM,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,MAAM,SAAS,CAAC,GAAI,GAAG,aAAa,CAAC,CAAC;AACrE,QAAM,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,MAAM,iBAAiB,CAAC,GAAI,GAAG,aAAa,CAAC,CAAC;AACrF,SAAO;AACT;AAEO,SAAS,uBAAuB,OAAmB,uBAAyC;AACjG,QAAM,gBAAgB,MAAM,SAAS,CAAC;AACtC,QAAM,mBAAmB,qBAAqB;AAAA,IAC5C,IAAI,MAAM;AAAA,IACV,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM;AAAA,EAChB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,cAAc,SAAS,IAAI,CAAC;AAEjD,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc,SAAS,EAAG,OAAM,KAAK,iBAAiB,cAAc,KAAK,IAAI,CAAC,EAAE;AACpF,MAAI,iBAAiB,SAAS,EAAG,OAAM,KAAK,cAAc,iBAAiB,KAAK,IAAI,CAAC,EAAE;AACvF,MAAI,sBAAsB,SAAS,EAAG,OAAM,KAAK,kBAAkB,sBAAsB,KAAK,IAAI,CAAC,EAAE;AACrG,SAAO,MAAM,KAAK,KAAK;AACzB;;;AClJO,SAAS,uBACd,OACA,SACA,UACmB;AACnB,QAAM,YAAY,IAAI;AACtB,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,iBAAiB,MAAM;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,OAAO,CAAC;AAAA,IACR,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,YAAY;AAAA,EACd;AACF;AAEA,eAAsB,sBACpB,YACA,OACA,SACA,UACsD;AACtD,QAAMC,wBAAuB,wBAAwB;AACrD,MAAIA,uBAAsB;AACxB,QAAI;AACF,YAAMC,UAAS,MAAMD,sBAAqB,IAAI,UAAU;AACxD,UACEC,SAAQ,WACLA,QAAO,YAAY,MAAM,MACzBA,QAAO,YAAY,WACnB,MAAM,QAAQA,QAAO,QAAQ,KAAK,GACrC;AACA,eAAO;AAAA,UACL,SAAS;AAAA,YACP,GAAG,uBAAuB,OAAO,SAAS,QAAQ;AAAA,YAClD,GAAGA,QAAO;AAAA,YACV;AAAA,YACA,OAAOA,QAAO,QAAQ;AAAA,YACtB,WAAW,IAAI;AAAA,UACjB;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,CAAC,qBAAqB,KAAK,GAAG;AAChC,eAAO,KAAK,oCAAoC,MAAM,EAAE,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,uBAAuB,OAAO,SAAS,QAAQ,GAAG,KAAK,WAAW;AACtF;AAEA,eAAsB,yBACpB,KACA,OACA,UACA,OACA,SACe;AACf,UAAQ,YAAY,IAAI;AACxB,QAAMD,wBAAuB,wBAAwB;AACrD,MAAI,CAACA,sBAAsB;AAE3B,QAAMA,sBAAqB,QAAQ,KAAK;AAAA,IACtC,IAAI;AAAA,IACJ,SAAS,MAAM;AAAA,IACf,iBAAiB,MAAM;AAAA,IACvB,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,UAAU,SAAS;AAAA,IACnB,MAAM,SAAS;AAAA,IACf,WAAW,QAAQ;AAAA,IACnB;AAAA,EACF,CAA8B;AAChC;AAEO,SAAS,wBAAwB,OAAmB,SAAiB,UAAmC,OAAuB;AACpI,SAAO,GAAG,aAAa,MAAM,EAAE,CAAC,KAAK,OAAO,IAAI,SAAS,IAAI,IAAI,SAAS,QAAQ,KAAK,KAAK;AAC9F;AAEO,SAAS,iBAAiB,OAAmB,SAAyB;AAC3E,SAAO,GAAG,aAAa,MAAM,EAAE,CAAC,KAAK,OAAO;AAC9C;AAEO,SAAS,yBAAyB,OAA2B;AAClE,MAAI,MAAM,UAAU,aAAa,MAAM,UAAU,aAAa;AAC5D,WAAO,KAAK,IAAI,GAAG,MAAM,QAAQ;AAAA,EACnC;AACA,SAAO,KAAK,IAAI,GAAG,MAAM,WAAW,CAAC;AACvC;AAEO,SAAS,8BAAsC;AACpD,SAAO;AACT;AAEA,eAAsB,uBACpB,OACA,SACA,WACwD;AACxD,QAAM,cAAc,iBAAiB,OAAO,OAAO;AACnD,QAAME,yBAAwB,yBAAyB;AAEvD,MAAIA,wBAAuB;AACzB,QAAI;AACF,YAAMD,UAAS,MAAMC,uBAAsB,IAAI,WAAW;AAC1D,UAAID,SAAQ,YAAYA,QAAO,YAAY,MAAM,MAAMA,QAAO,YAAY,SAAS;AACjF,eAAO;AAAA,UACL,UAAU;AAAA,YACR,SAAS,MAAM;AAAA,YACf,iBAAiB,MAAM;AAAA,YACvB;AAAA,YACA,OAAO,KAAK,IAAI,GAAG,cAAcA,QAAO,SAAS,OAAO,CAAC,CAAC;AAAA,YAC1D,aAAa,MAAM,cAAcA,QAAO,SAAS,aAAa,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,UAAU,SAAS,CAAC,CAAC;AAAA,YACtG,WAAW,IAAI;AAAA,YACf,SAAS,MAAM,QAAQA,QAAO,SAAS,OAAO,IAC1CA,QAAO,SAAS,QAAQ,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IACpF,CAAC;AAAA,UACP;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,CAAC,qBAAqB,KAAK,GAAG;AAChC,eAAO,KAAK,qCAAqC,MAAM,EAAE,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,SAAS,MAAM;AAAA,MACf,iBAAiB,MAAM;AAAA,MACvB;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW,IAAI;AAAA,MACf,SAAS,CAAC;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAEA,eAAsB,0BAA0B,KAAa,UAA6C;AACxG,WAAS,YAAY,IAAI;AACzB,QAAMC,yBAAwB,yBAAyB;AACvD,MAAI,CAACA,uBAAuB;AAE5B,QAAMA,uBAAsB,QAAQ,KAAK;AAAA,IACvC,IAAI;AAAA,IACJ,SAAS,SAAS;AAAA,IAClB,iBAAiB,SAAS;AAAA,IAC1B,SAAS,SAAS;AAAA,IAClB,WAAW,SAAS;AAAA,IACpB;AAAA,EACF,CAA+B;AACjC;AAEA,eAAsB,kCACpB,OACA,WACoC;AACpC,QAAM,UAAU,yBAAyB,KAAK;AAC9C,QAAMA,yBAAwB,yBAAyB;AAEvD,MAAIA,wBAAuB,MAAM;AAC/B,QAAI;AACF,YAAM,UAAU,MAAMA,uBAAsB,KAAK;AAAA,QAC/C,WAAW;AAAA,QACX,iBAAiB,EAAE,SAAS,MAAM,IAAI,QAAQ;AAAA,QAC9C,OAAO;AAAA,MACT,CAAC;AACD,YAAMD,UAAS,QACZ,IAAI,CAAC,UAAU,KAA4B,EAC3C,KAAK,CAAC,UAAU,MAAM,YAAY,MAAM,MAAM,MAAM,YAAY,WAAW,MAAM,QAAQ;AAC5F,UAAIA,SAAQ,UAAU;AACpB,eAAO;AAAA,UACL,SAAS,MAAM;AAAA,UACf,iBAAiB,MAAM;AAAA,UACvB;AAAA,UACA,OAAO,KAAK,IAAI,GAAG,cAAcA,QAAO,SAAS,OAAO,CAAC,CAAC;AAAA,UAC1D,aAAa,MAAM,cAAcA,QAAO,SAAS,aAAa,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,UAAU,SAAS,CAAC,CAAC;AAAA,UACtG,WAAW,IAAI;AAAA,UACf,SAAS,MAAM,QAAQA,QAAO,SAAS,OAAO,IAC1CA,QAAO,SAAS,QAAQ,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IACpF,CAAC;AAAA,QACP;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,KAAK,oDAAoD,MAAM,EAAE,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,uBAAuB,OAAO,SAAS,SAAS;AACrE,SAAO,OAAO,SAAS,QAAQ,SAAS,IAAI,OAAO,WAAW;AAChE;AAEA,eAAsB,kCACpB,OACA,WACA,UACA,qBAC4G;AAC5G,MAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,QAAM,WAA8G,CAAC;AACrH,QAAM,UAAU,SAAS;AACzB,QAAMD,wBAAuB,wBAAwB;AACrD,QAAM,WAAW,4BAA4B;AAE7C,MAAIA,uBAAsB,MAAM;AAC9B,QAAI;AACF,YAAM,UAAU,MAAMA,sBAAqB,KAAK;AAAA,QAC9C,WAAW;AAAA,QACX,iBAAiB,EAAE,SAAS,MAAM,IAAI,QAAQ;AAAA,QAC9C,OAAO,KAAK,IAAI,IAAI,UAAU,SAAS,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,MACxE,CAAC;AACD,YAAM,iBAAiB,QACpB,IAAI,CAAC,UAAU,KAA2B,EAC1C,OAAO,CAAC,UAAU,MAAM,YAAY,MAAM,MAAM,MAAM,YAAY,WAAW,MAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,KAAK,CAAC;AAEnI,iBAAWC,WAAU,gBAAgB;AACnC,YAAI,CAACA,QAAO,QAAQ,MAAM,OAAQ;AAClC,iBAAS,KAAK;AAAA,UACZ,KAAKA,QAAO;AAAA,UACZ,SAAS;AAAA,YACP,GAAG,uBAAuB,OAAO,SAAS,QAAQ;AAAA,YAClD,GAAGA,QAAO;AAAA,YACV;AAAA,YACA,OAAOA,QAAO,QAAQ;AAAA,YACtB,WAAW,IAAI;AAAA,UACjB;AAAA,UACA,UAAUA,QAAO;AAAA,UACjB,MAAMA,QAAO;AAAA,UACb,OAAOA,QAAO;AAAA,QAChB,CAAC;AAAA,MACH;AAEA,eAAS,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC;AAC5F,UAAI,SAAS,SAAS,EAAG,QAAO;AAAA,IAClC,SAAS,OAAO;AACd,aAAO,KAAK,oDAAoD,MAAM,EAAE,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AAEA,WAAS,QAAQ,GAAG,SAAS,SAAS,OAAO,SAAS,GAAG;AACvD,eAAW,YAAY,WAAW;AAChC,YAAM,MAAM,wBAAwB,OAAO,SAAS,UAAU,KAAK;AACnE,YAAM,SAAS,MAAM,sBAAsB,KAAK,OAAO,SAAS,QAAQ;AACxE,UAAI,OAAO,QAAQ,MAAM,WAAW,EAAG;AACvC,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,UAAU,SAAS;AAAA,QACnB,MAAM,SAAS;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC/RA,eAAsB,YAAY,OAAmB,qBAA4C;AAC/F,QAAM,WAAW,MAAM,aAAa,oBAAoB,EAAE,OAAO,SAAS,MAAM,YAAY,EAAE,CAAC;AAE/F,MAAI,CAAC,MAAM,MAAM,OAAO,QAAQ;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,MAAM,aAAa,yBAAyB;AAAA,IAC9D,qBAAqB,MAAM,KAAK;AAAA,IAChC,SAAS,MAAM,KAAK;AAAA,IACpB,OAAO,MAAM,KAAK,MAAM,IAAI,CAAC,UAAU;AAAA,MACrC,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK,SAAS,CAAC;AAAA,MACtB,SAAS,KAAK,WAAW;AAAA,IAC3B,EAAE;AAAA,EACJ,CAAC;AAED,SAAO,GAAG,QAAQ;AAAA;AAAA,EAAO,WAAW;AACtC;AAEA,eAAsB,gBACpB,OACA,YACA,gBACA,WACA,UACA,YACiB;AACjB,MAAI,cAAc,EAAG,QAAO;AAE5B,SAAO,aAAa,cAAc;AAAA,IAChC,iBAAiB,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,WAAW,KAAK,KAAK;AAAA,IACnC,YAAY,eAAe,KAAK,KAAK;AAAA,EACvC,CAAC;AACH;AAEA,eAAsB,wBACpB,UACA,OACA,YACA,eACA,cACiB;AACjB,SAAO,aAAa,uBAAuB;AAAA,IACzC,WAAW,SAAS,SAAS;AAAA,IAC7B,YAAY,SAAS,SAAS;AAAA,IAC9B,sBAAsB,SAAS,UAAU,SAAS,YAAY,KAAK;AAAA,IACnE,0BAA0B,SAAS,UAAU,SAAS,iBAAiB,KAAK;AAAA,IAC5E,qBAAqB,SAAS,uBAAuB;AAAA,IACrD;AAAA,IACA,oBAAoB,SAAS,sBAAsB;AAAA,IACnD,iBAAiB,SAAS,mBAAmB;AAAA,IAC7C,UAAU,SAAS,YAAY,CAAC;AAAA,IAChC,aAAa,MAAM,SAAS,CAAC;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACpEA;AAAA,EACE;AAAA,EACA,UAAAE;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,QAAAC,cAAY;AACrB,SAAS,OAAAC,YAAW;AACpB,SAAS,SAAAC,cAAa;AAMtB,eAAsB,sBACpB,SACA,eACA,OACA,QACA,YACA,YACA,WAAmC,CAAC,GACgC;AACpE,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,aAAa,SAAS;AAC5B,QAAI,cAAc,SAAS,gCAAgC,KAAK;AAC9D,MAAAC,QAAO,YAAY,EAAE,OAAO,KAAK,CAAC;AAAA,IACpC;AAKA,UAAM,UAAkC;AAAA,MACtC,iBAAiB,MAAM;AAAA,MACvB,yBAAyB,MAAM;AAAA,MAC/B,oBAAoB,MAAM;AAAA,MAC1B,uBAAuB,OAAO,MAAM,QAAQ;AAAA,MAC5C,uBAAuB,MAAM,gBAAgB;AAAA,MAC7C,oBAAoB;AAAA,IACtB;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,UAAI,MAAM,SAAS,KAAM;AACvB,cAAM,UAAUC,OAAK,eAAe,GAAG,IAAI,YAAY,CAAC,MAAM;AAC9D,QAAAC,eAAc,SAAS,OAAO,MAAM;AACpC,gBAAQ,GAAG,GAAG,OAAO,IAAI;AAAA,MAC3B,OAAO;AACL,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,cAAcD,OAAK,eAAe,SAAS;AACjD,UAAM,eAAe,OAAO,QAAQ,OAAO,EACxC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,EAAE,EAClD,KAAK,IAAI;AACZ,IAAAC,eAAc,aAAa,cAAc,MAAM;AAE/C,UAAM,iBAAiB,MAAM,WAAW,QAAQ,OAAO;AACvD,UAAM,QAAQC,OAAM,gBAAgB;AAAA,MAClC,OAAO;AAAA,MACP,KAAK,MAAM,gBAAgB;AAAA,MAC3B,UAAU;AAAA;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAGD,UAAM,MAAM;AAEZ,QAAI,MAAM,OAAO;AACf,YAAM,MAAM,IAAI;AAAA,IAClB;AAGA,UAAM,UAAUF,OAAK,eAAe,WAAW;AAC/C,UAAM,MAAM,MAAM;AAClB,QAAI,KAAK;AACP,aAAO,MAAM,EAAE,SAAS,MAAM,IAAI,KAAK,SAAS,QAAQ,MAAM,GAAG,GAAG,GAAG,KAAK,cAAc,GAAG,yBAAyB;AACtH,MAAAC,eAAc,SAAS,KAAK,UAAU;AAAA,QACpC;AAAA,QACA,SAAS,MAAM;AAAA,QACf,WAAW,IAAI,KAAK,OAAO,EAAE,YAAY;AAAA,QACzC,SAAS,QAAQ,MAAM,GAAG,GAAG;AAAA,MAC/B,CAAC,GAAG,MAAM;AAAA,IACZ;AAEA,QAAI,SAAS;AACb,QAAI,WAAW;AACf,QAAI,cAAc;AAClB,QAAI,eAAe;AACnB,UAAM,cAAcD,OAAK,eAAe,iBAAiB;AACzD,IAAAC,eAAc,aAAa,IAAI,MAAM;AAErC,UAAM,UAAU,CAAC,UAA2B;AAC1C,YAAM,OAAO,OAAO,KAAK;AACzB,UAAI,aAAa,SAAS,IAAM,iBAAgB,eAAe,MAAM,MAAM,GAAG,GAAI;AAClF,eAAS,eAAe,QAAQ,MAAM,OAAO,YAAY;AACzD,qBAAe,KAAK;AACpB,UAAI;AAAE,uBAAe,aAAa,IAAI;AAAA,MAAG,QAAQ;AAAA,MAAC;AAClD,YAAM,oBAAoB;AAAA,IAC5B;AAEA,UAAM,QAAQ,GAAG,QAAQ,OAAO;AAChC,UAAM,QAAQ,GAAG,QAAQ,OAAO;AAEhC,UAAM,wBAAwB;AAE9B,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW;AAEX,UAAI,KAAK;AAAE,YAAI;AAAE,kBAAQ,KAAK,CAAC,KAAK,SAAS;AAAA,QAAG,QAAQ;AAAA,QAAC;AAAA,MAAE,OACtD;AAAE,cAAM,KAAK,SAAS;AAAA,MAAG;AAAA,IAChC,GAAG,OAAO,gBAAgB;AAG1B,QAAI,oBAAoB;AACxB,QAAI,qBAAqB,KAAK,IAAI;AAClC,QAAI,iBAAiB;AACrB,UAAM,WAAW,YAAY,MAAM;AAEjC,UAAI,KAAK;AACP,YAAI;AAAE,kBAAQ,KAAK,KAAK,CAAC;AAAA,QAAG,QAAQ;AAElC,wBAAc,QAAQ;AACtB,uBAAa,KAAK;AAClB,2BAAiB;AACjB,cAAI;AAAE,YAAAF,QAAO,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,UAAG,QAAQ;AAAA,UAAC;AACjD,UAAAD,SAAQ,EAAE,SAAS,OAAO,MAAM,MAAM,QAAQ,eAAe,QAAQ;AAAA,uCAA0C,GAAG,MAAM,OAAO,YAAY,EAAE,CAAC;AAC9I;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc,mBAAmB;AACnC,4BAAoB;AACpB,6BAAqB,KAAK,IAAI;AAAA,MAChC,WAAW,KAAK,IAAI,IAAI,qBAAqB,uBAAuB;AAClE,sBAAc,QAAQ;AACtB,qBAAa,KAAK;AAClB,mBAAW;AACX,yBAAiB;AACjB,YAAI,KAAK;AAAE,cAAI;AAAE,oBAAQ,KAAK,CAAC,KAAK,SAAS;AAAA,UAAG,QAAQ;AAAA,UAAC;AAAA,QAAE,OACtD;AAAE,gBAAM,KAAK,SAAS;AAAA,QAAG;AAC9B,YAAI;AAAE,UAAAC,QAAO,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,QAAG,QAAQ;AAAA,QAAC;AACjD,QAAAD,SAAQ,EAAE,SAAS,OAAO,MAAM,MAAM,QAAQ,eAAe,QAAQ;AAAA,2CAAyC,KAAK,MAAM,wBAAwB,GAAM,CAAC,aAAa,OAAO,YAAY,EAAE,CAAC;AAAA,MAC7L;AAAA,IACF,GAAG,GAAM;AAET,UAAM,UAAU,MAAM;AACpB,oBAAc,QAAQ;AACtB,UAAI;AAAE,QAAAC,QAAO,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,MAAG,QAAQ;AAAA,MAAC;AAAA,IACnD;AAEA,UAAM,GAAG,SAAS,MAAM;AACtB,mBAAa,KAAK;AAClB,cAAQ;AACR,UAAI,eAAgB;AACpB,MAAAD,SAAQ,EAAE,SAAS,OAAO,MAAM,MAAM,QAAQ,sCAAsC,MAAM,EAAE,IAAI,CAAC;AAAA,IACnG,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,mBAAa,KAAK;AAClB,cAAQ;AACR,UAAI,eAAgB;AAEpB,YAAM,cAAc,CAAC,WAAmB;AACtC,cAAM,OAAO,eAAe,QAAQ,QAAQ,OAAO,YAAY;AAC/D,eAAO,aAAa,SAAS,KAAK,CAAC,KAAK,WAAW,aAAa,MAAM,GAAG,EAAE,CAAC,IACxE,GAAG,YAAY;AAAA,EAAK,IAAI,KACxB;AAAA,MACN;AACA,UAAI,UAAU;AACZ,QAAAA,SAAQ,EAAE,SAAS,OAAO,MAAM,MAAM,QAAQ,YAAY;AAAA,0BAA6B,OAAO,gBAAgB,KAAK,EAAE,CAAC;AACtH;AAAA,MACF;AACA,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO;AACjD,UAAI,SAAS,GAAG;AACd,QAAAA,SAAQ,EAAE,SAAS,MAAM,MAAM,QAAQ,YAAY;AAAA,yBAA4B,QAAQ,KAAK,EAAE,CAAC;AAC/F;AAAA,MACF;AACA,MAAAA,SAAQ,EAAE,SAAS,OAAO,MAAM,QAAQ,YAAY;AAAA,oBAAuB,QAAQ,SAAS,UAAU,QAAQ,KAAK,EAAE,CAAC;AAAA,IACxH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,QACpB,SACA,eACA,OACA,UACA,WAAmC,CAAC,GACrB;AACf,MAAI,CAAC,QAAQ,KAAK,EAAG;AAErB,QAAM,SAAS,MAAM,sBAAsB,SAAS,eAAe,OAAO;AAAA,IACxE,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,sBAAsB,CAAC;AAAA,IACvB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,0BAA0B;AAAA,IAC1B,cAAc;AAAA,IACd,eAAe,uBAAuBK,KAAI,yBAAyB,OAAO;AAAA,IAC1E,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,EACX,GAAG,IAAI,IAAI,EAAE,kBAAkB,UAAU,GAAG,SAAS,CAAC;AAEtD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,GAAG,QAAQ,iBAAiB,OAAO,MAAM,EAAE;AAAA,EAC7D;AACF;;;ACjNA;AAAA,EACE;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,QAAAC,QAAM,eAAe;AAC9B,SAAS,YAAAC,iBAAgB;;;ACTzB,SAAS,cAAAC,aAAY,WAAW,aAAa,gBAAAC,eAAc,UAAU,iBAAAC,sBAAqB;AAC1F,SAAS,UAAU,OAAO,SAAS,MAAM,iBAAiB;AAC1D,SAAS,eAAqB;AAC9B,SAAS,MAAM,YAAY;AAa3B,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAgB;AAAA,EAAS;AAAA,EAC5C;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAAA,EAAS;AAAA,EAC7C;AAAA,EAAY;AAAA,EAAa;AAAA,EAAY;AAAA,EAAO;AAC9C,CAAC;AAED,SAAS,eAAe,cAA+B;AACrD,QAAM,QAAQ,aAAa,MAAM,GAAG;AACpC,MAAI,MAAM,KAAK,CAAC,YAAY,UAAU,IAAI,OAAO,CAAC,EAAG,QAAO;AAC5D,QAAM,OAAO,MAAM,GAAG,EAAE,KAAK;AAC7B,MAAI,KAAK,WAAW,WAAW,KAAK,QAAQ,IAAI,MAAM,QAAS,QAAO;AACtE,MAAI,QAAQ,IAAI,MAAM,QAAS,QAAO;AACtC,SAAO;AACT;AA8CA,IAAI,qBAA2C;AAC/C,IAAI,iBAAiB;AAEd,SAAS,cAAc,MAAqB;AACjD,mBAAiB;AACnB;AAOA,eAAsB,kBACpB,YACe;AACf,MAAI,gBAAgB;AAClB,iBAAa,OAAO;AACpB;AAAA,EACF;AACA,MAAIC,YAAW,aAAa,GAAG;AAC7B,iBAAa,OAAO;AACpB;AAAA,EACF;AAGA,MAAI,mBAAoB,QAAO;AAE/B,wBAAsB,YAAY;AAChC,iBAAa,SAAS;AACtB,WAAO,KAAK,sDAAsD;AAElE,UAAM,qBAAqB,OAAO,QAAgB,QAAgB,MAAM,OAAO;AAC7E,YAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC,YAAM,QAAQ,MAAM,QAAQ,QAAQ,EAAE,eAAe,KAAK,CAAC;AAE3D,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,MAAM,GAAG,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK;AACnD,YAAI,eAAe,OAAO,EAAG;AAE7B,cAAM,aAAa,GAAG,MAAM,IAAI,KAAK,IAAI;AACzC,cAAM,aAAa,GAAG,MAAM,IAAI,KAAK,IAAI;AACzC,cAAM,WAAW,MAAM,KAAK,UAAU;AAEtC,YAAI,KAAK,YAAY,GAAG;AACtB,gBAAM,mBAAmB,YAAY,YAAY,OAAO;AACxD;AAAA,QACF;AAEA,YAAI,KAAK,eAAe,KAAK,SAAS,eAAe,EAAG;AAExD,YAAI,SAAS,OAAO,KAAK,SAAS,OAAO,GAAG;AAC1C,cAAI;AACF,kBAAM,SAAS,YAAY,UAAU;AAAA,UACvC,SAAS,OAAO;AACd,gBAAK,MAAgC,SAAS,UAAU;AACtD,qBAAO,MAAM,gCAAgC,UAAU,EAAE;AAAA,YAC3D,OAAO;AACL,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAC5C,UAAM,mBAAmB,aAAa,WAAW;AACjD,UAAM,UAAU,eAAe,GAAG,IAAI,CAAC;AAAA,GAAM,MAAM;AACnD,iBAAa,OAAO;AACpB,WAAO,KAAK,gCAAgC;AAAA,EAC9C,GAAG;AAEH,SAAO;AACT;AAGO,SAAS,UAAU,MAAoC;AAC5D,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,cAAQ;AAAA,QACN,UAAU,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUnB;AACA,WAAK,CAAC;AAAA,IACR;AAEA,QAAI,QAAQ,UAAU;AACpB,YAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,UAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,KAAK,GAAG;AAClC,aAAK,6BAA6B,SAAS,SAAS,EAAE;AAAA,MACxD;AACA,aAAO,YAAY,OAAO,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;;;ADjKA,SAAS,UAAU,KAAsB;AACvC,MAAI;AACF,IAAAC,UAAS,2BAA2B,EAAE,KAAK,KAAK,OAAO,OAAO,CAAC;AAC/D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,oBAAoB,KAAqB;AACvD,MAAI;AACF,UAAM,UAAUA,UAAS,mCAAmC,EAAE,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK;AACjG,QAAI,WAAW,YAAY,OAAQ,QAAO;AAE1C,UAAM,SAASA,UAAS,6CAA6C,EAAE,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK;AAC1G,WAAO,OAAO,QAAQ,wBAAwB,EAAE;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,kBAAkB,OAAmB,cAAsB,YAAoC;AACnH,MAAI,oBAAoB;AACxB,QAAM,qBAAqB,cAAc,oBAAoB,WAAW;AACxE,MAAI;AACF,wBAAoBA,UAAS,sBAAsB,EAAE,KAAK,aAAa,UAAU,OAAO,CAAC,EAAE,KAAK;AAAA,EAClG,QAAQ;AAAA,EAAC;AAET,QAAM,aAAa,UAAU,MAAM,EAAE;AAGrC,EAAAA,UAAS,qBAAqB,YAAY,SAAS,UAAU,KAAK;AAAA,IAChE,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AAGD,MAAI;AACF,UAAM,iBAAiBC,cAAaC,OAAK,cAAc,MAAM,GAAG,MAAM,EAAE,KAAK;AAC7E,UAAM,YAAY,eAAe,QAAQ,YAAY,EAAE,EAAE,KAAK;AAC9D,UAAM,aAAa,QAAQ,cAAc,SAAS;AAClD,IAAAC,WAAUD,OAAK,YAAY,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,IAAAE,eAAcF,OAAK,YAAY,QAAQ,SAAS,GAAG,mCAAmC,MAAM;AAAA,EAC9F,SAAS,KAAK;AACZ,WAAO,KAAK,EAAE,KAAK,OAAO,GAAG,EAAE,GAAG,2CAA2C;AAAA,EAC/E;AAEA,QAAM,aAAa;AACnB,QAAM,aAAa;AACnB,QAAM,oBAAoB;AAC1B,QAAM,eAAe;AAErB,SAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,YAAY,oBAAoB,aAAa,GAAG,8BAA8B;AAC9H;AAEA,eAAsB,iBACpB,OACA,OACA,eAC4E;AAC5E,QAAM,SAAS,aAAa,MAAM,EAAE;AACpC,QAAM,gBAAgBA,OAAK,gBAAgB,MAAM;AACjD,QAAM,eAAeA,OAAK,eAAe,UAAU;AACnD,QAAM,aAAa,CAACG,YAAW,YAAY;AAE3C,MAAI,YAAY;AACd,IAAAF,WAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAC5C,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,eAAe,cAAc,GAAG,4BAA4B;AAE5H,QAAI,MAAM,OAAO,iBAAiB;AAChC,MAAAA,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,YAAM,QAAQ,MAAM,OAAO,iBAAiB,cAAc,OAAO,cAAc;AAAA,IACjF,WAAW,UAAU,WAAW,GAAG;AACjC,YAAM,kBAAkB,OAAO,cAAc,aAAa;AAAA,IAC5D,OAAO;AAEL,YAAM,kBAAkB;AACxB,MAAAA,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,aAAO,aAAa,cAAc;AAAA,QAChC,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ,CAAC,eAAe,CAAC,WAAW,WAAW,cAAc;AAAA,MAC/D,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,eAAe,eAAe,aAAa,GAAG,2BAA2B;AAAA,EAC7G,OAAO;AACL,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,eAAe,cAAc,GAAG,oCAAoC;AAAA,EACxG;AAEA,QAAM,WAAWD,OAAK,eAAe,YAAY;AACjD,QAAM,aAAa,MAAM,YAAY,OAAO,IAAI;AAChD,QAAM,aAAaA,OAAK,eAAe,WAAW;AAClD,EAAAE,eAAc,UAAU,KAAK,UAAU,EAAE,GAAG,OAAO,eAAe,aAAa,aAAa,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM;AACrH,EAAAA,eAAc,YAAY,GAAG,UAAU;AAAA,GAAM,MAAM;AAEnD,QAAM,gBAAgB;AACtB,QAAM,eAAe;AACrB,QAAM,sBAAsB,IAAI;AAEhC,SAAO,EAAE,eAAe,eAAe,YAAY,WAAW;AAChE;AAEA,eAAsB,eACpB,SACA,OACA,OACe;AACf,QAAM,SAAS,aAAa,OAAO;AACnC,QAAM,gBAAgB,OAAO,iBAAiBF,OAAK,gBAAgB,MAAM;AACzE,MAAI,CAACG,YAAW,aAAa,EAAG;AAGhC,MAAI,MAAM,OAAO,kBAAkB;AACjC,QAAI;AACF,YAAM,aAAa,SAAS,EAAE,IAAI,SAAS,YAAY,QAAQ;AAC/D,YAAM,QAAQ,MAAM,OAAO,kBAAkB,eAAe,YAAY,eAAe;AAAA,IACzF,SAAS,OAAO;AACd,aAAO,KAAK,iCAAiC,OAAO,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,IAC1E;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,MAAM,cAAc;AAC3C,QAAI;AACF,MAAAL,UAAS,gCAAgC,MAAM,YAAY,KAAK,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AACnG,aAAO,KAAK,wBAAwB,OAAO,KAAK,MAAM,YAAY,EAAE;AAAA,IACtE,SAAS,OAAO;AACd,aAAO,KAAK,iCAAiC,OAAO,KAAK,OAAO,KAAK,CAAC,EAAE;AACxE,UAAI;AAAE,QAAAM,QAAO,MAAM,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAAG,QAAQ;AAAA,MAAC;AAAA,IAC/E;AACA,QAAI;AACF,MAAAN,UAAS,kBAAkB,MAAM,UAAU,KAAK,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAAA,IACrF,QAAQ;AAAA,IAAmC;AAE3C,QAAI;AAAE,MAAAM,QAAO,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAAG,QAAQ;AAAA,IAAC;AACxE;AAAA,EACF;AAGA,MAAI;AACF,IAAAA,QAAO,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACtD,WAAO,KAAK,yBAAyB,OAAO,KAAK,aAAa,EAAE;AAAA,EAClE,SAAS,OAAO;AACd,WAAO,KAAK,iCAAiC,OAAO,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,EAC1E;AACF;;;AEvKA;AAAA,EACE,iBAAAC;AAAA,OACK;AACP,SAAS,QAAAC,cAAY;;;ACHrB,SAAS,cAAAC,cAAY,eAAAC,cAAa,gBAAAC,qBAAoB;AACtD,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAOvB,SAAS,eAAe,eAA0C;AACvE,QAAM,OAAOF,SAAQ;AACrB,QAAM,WAAWH,aAAWI,OAAK,eAAe,UAAU,CAAC,IAAIA,OAAK,eAAe,UAAU,IAAI;AACjG,QAAM,cAAc;AAAA,IAClBC,SAAQ,UAAU,UAAU,QAAQ;AAAA,IACpCA,SAAQ,UAAU,WAAW,QAAQ;AAAA,IACrCD,OAAK,MAAM,UAAU,QAAQ;AAAA,IAC7BA,OAAK,MAAM,WAAW,QAAQ;AAAA,EAChC;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAA4B,CAAC;AAEnC,aAAW,YAAY,aAAa;AAClC,QAAI,CAACJ,aAAW,QAAQ,EAAG;AAE3B,eAAW,SAASC,aAAY,UAAU,EAAE,eAAe,KAAK,CAAC,GAAG;AAClE,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAI,KAAK,IAAI,MAAM,IAAI,EAAG;AAE1B,YAAM,YAAYG,OAAK,UAAU,MAAM,MAAM,UAAU;AACvD,UAAI,CAACJ,aAAW,SAAS,EAAG;AAE5B,UAAI;AACF,cAAM,UAAUE,cAAa,WAAW,MAAM,EAAE,KAAK;AACrD,YAAI,SAAS;AACX,eAAK,IAAI,MAAM,IAAI;AACnB,iBAAO,KAAK,EAAE,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,QAC3C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,QAAmC;AACnE,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAM,WAAW,OAAO;AAAA,IAAI,CAAC,UAC3B,cAAc,MAAM,IAAI;AAAA,EAAK,MAAM,OAAO;AAAA,EAC5C;AAEA,SAAO;AAAA;AAAA,EAA0B,SAAS,KAAK,MAAM,CAAC;AACxD;;;AD1BA,eAAsB,gBACpB,OACA,OACA,UACA,OACA,eACA,gBACA,gBAC6B;AAC7B,QAAM,WAAW,MAAM,MAAM,OAAO,UAAU,GAAG,EAAE;AACnD,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,mBAAmB,wBAAwB,OAAO,SAAS,UAAU,KAAK;AAChF,QAAM,gBAAgB,MAAM,sBAAsB,kBAAkB,OAAO,SAAS,QAAQ;AAC5F,QAAM,aAAa,cAAc;AACjC,QAAM,UAAU,cAAc;AAC9B,MAAI,iBAAiB,QAAQ;AAC7B,MAAI,aAAa,QAAQ;AACzB,MAAI,WAA0B,QAAQ;AACtC,MAAI,aAAa,QAAQ;AACzB,QAAM,aAAaI,OAAK,eAAe,UAAU,SAAS,IAAI,IAAI,SAAS,QAAQ,OAAO;AAE1F,MAAI,QAAQ,WAAW,UAAU,QAAQ,MAAM,SAAS,GAAG;AACzD,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,UAAU,SAAS,UAAU,MAAM,SAAS,KAAK,GAAG,4DAA4D;AAChL,WAAO,EAAE,SAAS,MAAM,SAAS,OAAO,mBAAmB,OAAO,MAAM,QAAQ,UAAU,QAAQ,QAAQ,YAAY,OAAO,QAAQ,MAAM,OAAO;AAAA,EACpJ;AAEA,QAAM,YAAY,QAAQ,MAAM,SAAS;AACzC,MAAI,YAAY,UAAU;AACxB,YAAQ,SAAS;AACjB,YAAQ,aAAa,QAAQ,aAAa;AAAA,4DAA+D,QAAQ;AACjH,UAAM,yBAAyB,YAAY,OAAO,UAAU,OAAO,OAAO;AAC1E,WAAO,EAAE,SAAS,OAAO,SAAS,MAAM,mBAAmB,OAAO,MAAM,UAAU,QAAQ,QAAQ,YAAY,OAAO,QAAQ,MAAM,OAAO;AAAA,EAC5I;AAEA,QAAM,iBAAiB,MAAM,OAAO;AACpC,QAAM,kBAAkB,eAAe,SAAS,iBAC5C,OAAO,eAAe,SAAS,cAAc;AAAA,EAAyB,eAAe,MAAM,CAAC,cAAc,CAAC,KAC3G;AACJ,QAAM,aAAa,MAAM,gBAAgB,OAAO,gBAAgB,iBAAiB,WAAW,UAAU,UAAU;AAChH,QAAM,iBAAiB,cAAc,IACjC,iBACAA,OAAK,eAAe,QAAQ,OAAO,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK;AAEvE,MAAI,YAAY,EAAG,CAAAC,eAAc,gBAAgB,GAAG,UAAU;AAAA,GAAM,MAAM;AAE1E,UAAQ,SAAS;AACjB,UAAQ,aAAa;AACrB,UAAQ,iBAAiB;AACzB,UAAQ,WAAW;AACnB,QAAM,yBAAyB,YAAY,OAAO,UAAU,OAAO,OAAO;AAE1E,SAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,WAAW,UAAU,UAAU,SAAS,UAAU,MAAM,SAAS,MAAM,OAAO,SAAS,SAAS,QAAQ,MAAM,GAAG,GAAG,EAAE,GAAG,gCAAgC;AAC9N,QAAM,gBAAgB,IAAI;AAC1B,QAAM,UAAU;AAAA,IACd,uBAAuB,SAAS;AAAA,IAChC,mBAAmB,SAAS;AAAA,IAC5B,yBAAyB,SAAS,mBAAmB;AAAA,IACrD,oBAAoB;AAAA,IACpB,mBAAmB,GAAG,MAAM,EAAE,YAAY,OAAO;AAAA,IACjD,mBAAmB,OAAO,SAAS;AAAA,IACnC,kBAAkB,OAAO,QAAQ;AAAA,IACjC,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,iBAAiB,YAAY,IAAI,MAAM;AAAA,IACvC,wBAAwB;AAAA,IACxB,oBAAoB;AAAA,IACpB,sBAAsB,SAAS;AAAA,IAC/B,2BAA2B,SAAS;AAAA,IACpC,mCAAmC,SAAS;AAAA,EAC9C;AAEA,MAAI,MAAM,OAAO,eAAe;AAC9B,UAAM,QAAQ,MAAM,OAAO,eAAe,eAAe,OAAO,cAAc,OAAO;AAAA,EACvF;AAEA,WAAS,OAAO,MAAM,IAAI,UAAU,QAAQ,SAAS,IAAI,QAAQ,gBAAgB,MAAM,UAAU,GAAG;AAEpG,QAAM,aAAa,MAAM,sBAAsB,SAAS,SAAS,eAAe,OAAO,MAAM,QAAQ,YAAY,gBAAgB,OAAO;AAExI,MAAI,MAAM,OAAO,cAAc;AAC7B,UAAM,QAAQ,MAAM,OAAO,cAAc,eAAe,OAAO,aAAa;AAAA,MAC1E,GAAG;AAAA,MACH,uBAAuB,OAAO,WAAW,QAAQ,EAAE;AAAA,MACnD,oBAAoB,WAAW;AAAA,MAC/B,6BAA6B;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,SAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,WAAW,UAAU,WAAW,MAAM,SAAS,WAAW,SAAS,aAAa,WAAW,OAAO,OAAO,GAAG,gCAAgC;AACjN,QAAM,YAAY,mBAAmB,eAAe,WAAW,QAAQ,WAAW,OAAO;AACzF,aAAW,WAAW;AACtB,eAAa,WAAW;AACxB,mBAAiB,WAAW;AAC5B,eAAa,UAAU;AACvB,MAAI,CAAC,UAAU,YAAY;AACzB,WAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,WAAW,MAAM,SAAS,MAAM,aAAa,WAAW,OAAO,OAAO,GAAG,oEAA+D;AAAA,EAC/M;AACA,gBAAc,OAAO,UAAU,YAAY,SAAS,IAAI;AACxD,MAAI,UAAU,WAAY,QAAa,OAAO,UAAU,YAAY,SAAS,IAAI;AAEjF,MAAI,UAAU,YAAY;AACxB,UAAM,KAAK,UAAU;AACrB,UAAM,QAAQ;AAAA,MACZ,QAAQ,SAAS,KAAK,SAAS,IAAI;AAAA,MACnC,GAAG,GAAG,YAAY,eAAe,CAAC;AAAA,MAClC,QAAQ,GAAG,YAAY,eAAe,CAAC,UAAU,GAAG,aAAa,eAAe,CAAC;AAAA,IACnF;AACA,QAAI,GAAG,MAAO,OAAM,KAAK,IAAI,GAAG,KAAK,GAAG;AACxC,UAAM,aAAa,MAAM;AACzB,QAAI,cAAc,WAAW,cAAc,GAAG,aAAa;AACzD,YAAM,KAAK,iBAAiB,WAAW,YAAY,eAAe,CAAC,EAAE;AAAA,IACvE;AACA,aAAS,OAAO,MAAM,IAAI,QAAQ,MAAM,KAAK,GAAG,CAAC;AAAA,EACnD;AAEA,UAAQ,MAAM,KAAK;AAAA,IACjB,MAAM;AAAA,IACN,MAAM,SAAS;AAAA,IACf,OAAO,UAAU,YAAY,SAAS,SAAS,SAAS,SAAS;AAAA,IACjE,WAAW;AAAA,IACX,aAAa,IAAI;AAAA,IACjB,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ,WAAW;AAAA,IACnB,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,IACpB,iBAAiB,UAAU;AAAA,IAC3B,kBAAkB,UAAU;AAAA,IAC5B,YAAY,UAAU;AAAA,IACtB,YAAY,UAAU;AAAA,EACxB,CAAC;AAED,UAAQ,WAAW;AACnB,UAAQ,aAAa;AACrB,UAAQ,sBAAsB,UAAU;AACxC,UAAQ,uBAAuB,UAAU;AACzC,UAAQ,aAAa;AAErB,QAAM,mBAAmB,UAAU,UAAU,IAAI,UAAU,OAAO,KAAK;AACvE,WAAS,OAAO,MAAM,IAAI,UAAU,QAAQ,SAAS,IAAI,QAAQ,yBAAyB,UAAU,MAAM,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAEvI,MAAI,CAAC,WAAW,WAAW,UAAU,WAAW,UAAU;AACxD,WAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,WAAW,iBAAiB,UAAU,QAAQ,UAAU,SAAS,GAAG,6BAA6B;AACtK,YAAQ,SAAS;AACjB,UAAM,yBAAyB,YAAY,OAAO,UAAU,OAAO,OAAO;AAC1E,WAAO,EAAE,SAAS,OAAO,SAAS,OAAO,mBAAmB,OAAO,MAAM,UAAU,QAAQ,YAAY,OAAO,UAAU;AAAA,EAC1H;AAEA,MAAI,UAAU,WAAW,WAAW;AAClC,WAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,UAAU,GAAG,mEAA8D;AAChJ,YAAQ,SAAS;AACjB,UAAM,yBAAyB,YAAY,OAAO,UAAU,OAAO,OAAO;AAC1E,WAAO,EAAE,SAAS,OAAO,SAAS,MAAM,mBAAmB,OAAO,MAAM,UAAU,QAAQ,YAAY,OAAO,UAAU;AAAA,EACzH;AAEA,MAAI,UAAU,WAAW,YAAY;AACnC,WAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,WAAW,SAAS,GAAG,uCAAuC;AACnI,YAAQ,SAAS;AACjB,UAAM,yBAAyB,YAAY,OAAO,UAAU,OAAO,OAAO;AAC1E,WAAO,EAAE,SAAS,OAAO,SAAS,OAAO,mBAAmB,MAAM,MAAM,UAAU,QAAQ,YAAY,OAAO,UAAU;AAAA,EACzH;AAEA,SAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,MAAM,UAAU,GAAG,wCAAwC;AAC1H,UAAQ,SAAS;AACjB,QAAM,yBAAyB,YAAY,OAAO,UAAU,OAAO,OAAO;AAC1E,SAAO,EAAE,SAAS,MAAM,SAAS,OAAO,mBAAmB,OAAO,MAAM,UAAU,QAAQ,YAAY,OAAO,UAAU;AACzH;AAEA,eAAsB,iBACpB,OACA,OACA,eACA,gBACA,gBACA,gBAC6B;AAC7B,QAAM,YAAY,2BAA2B,OAAO,OAAO,MAAM,cAAc;AAC/E,QAAM,UAAU,MAAM,WAAW;AACjC,SAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,SAAS,WAAW,UAAU,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,2BAA2B;AAClK,QAAM,EAAE,UAAU,KAAK,aAAa,IAAI,MAAM,uBAAuB,OAAO,SAAS,SAAS;AAC9F,QAAM,iBAAiB,UAAU,MAAM,SAAS,aAAa,GAAG,KAAK,IAAI,GAAG,UAAU,SAAS,CAAC,CAAC,CAAC;AAClG,QAAM,gBAAgB,UAAU,UAAU,CAAC,aAAa,SAAS,SAAS,UAAU;AAGpF,QAAM,SAAS,eAAe,aAAa;AAC3C,QAAM,eAAe,kBAAkB,MAAM;AAG7C,MAAI,cAAc;AAChB,IAAAA,eAAcD,OAAK,eAAe,WAAW,GAAG,cAAc,MAAM;AAAA,EACtE;AAGA,QAAM,WAAW,MAAM,iBAAiB,OAAO,gBAAgB,MAAM,QAAQ,eAAe,YAAY;AAExG,MAAI;AACJ,MAAI,oBAAoB;AAExB,MAAI,UAAU;AACZ,qBAAiB,SAAS;AAC1B,wBAAoB,EAAE,GAAG,gBAAgB,SAAS,SAAS,QAAQ;AACnE,gCAA4B,eAAe,QAAQ;AACnD;AAAA,MAAS;AAAA,MAAO,MAAM;AAAA,MAAI;AAAA,MACxB,qBAAqB,SAAS,KAAK,OAAO,YAAY,SAAS,KAAK,eAAe,aAAa,SAAS,KAAK,gBAAgB,KAAK,GAAG,CAAC,iBAAiB,SAAS,KAAK,mBAAmB,KAAK,GAAG,CAAC;AAAA,IAAI;AAExM,QAAI,OAAO,KAAK,SAAS,GAAG,EAAE,SAAS,GAAG;AACxC,YAAM,UAAUA,OAAK,eAAe,kBAAkB;AACtD,YAAM,WAAW,OAAO,QAAQ,SAAS,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI;AAC3G,MAAAC,eAAc,SAAS,UAAU,MAAM;AAAA,IACzC;AAAA,EACF,OAAO;AACL,qBAAiB,MAAM,wBAAwB,gBAAgB,OAAO,gBAAgB,eAAe,YAAY;AAAA,EACnH;AAEA,MAAI,CAAC,kBAAkB,QAAQ,KAAK,GAAG;AACrC,UAAM,IAAI,MAAM,sCAAsC,kBAAkB,QAAQ,KAAK,kBAAkB,IAAI,IAAI;AAAA,EACjH;AAEA,WAAS,QAAQ,KAAK,IAAI,IAAI,CAAC,aAAa,kBAAkB,IAAI,IAAI,kBAAkB,QAAQ,aAAa,SAAS,KAAK,GAAG,WAAW,KAAK,SAAS,KAAK,OAAO,cAAc,EAAE,GAAG;AACtL,QAAM,0BAA0B,cAAc,QAAQ;AAEtD,QAAM,SAAS,MAAM,gBAAgB,OAAO,OAAO,mBAAmB,SAAS,OAAO,eAAe,gBAAgB,cAAc;AAEnI,MAAI,OAAO,SAAS;AAClB,QAAI,SAAS,cAAc,UAAU,SAAS,GAAG;AAC/C,eAAS,eAAe;AACxB,eAAS,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,eAAe,IAAI,IAAI,eAAe,QAAQ,yCAAyC;AAC3H,YAAM,0BAA0B,cAAc,QAAQ;AACtD,aAAO,EAAE,SAAS,OAAO,SAAS,OAAO,mBAAmB,MAAM,MAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO,MAAM;AAAA,IAClI;AACA,aAAS,QAAQ,KAAK,IAAI,IAAI,CAAC,oBAAoB,eAAe,IAAI,IAAI,eAAe,QAAQ,uBAAuB;AACxH,UAAM,0BAA0B,cAAc,QAAQ;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,qBAAqB,eAAe,SAAS,cAAc,iBAAiB,GAAG;AACxF,aAAS,SAAS;AAClB,aAAS,cAAc;AACvB,aAAS,QAAQ,KAAK,IAAI,IAAI,CAAC,gEAAgE,SAAS,KAAK,GAAG;AAChH,UAAM,0BAA0B,cAAc,QAAQ;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,mBAAmB;AAC5B,aAAS,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,eAAe,IAAI,IAAI,eAAe,QAAQ,0BAA0B;AAC5G,UAAM,0BAA0B,cAAc,QAAQ;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS;AAClB,aAAS,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,eAAe,IAAI,IAAI,eAAe,QAAQ,wBAAwB;AAC1G,UAAM,0BAA0B,cAAc,QAAQ;AACtD,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,eAAe,IAAI,IAAI,eAAe,QAAQ,uBAAuB;AACzG,QAAM,0BAA0B,cAAc,QAAQ;AACtD,SAAO;AACT;;;AEjOO,SAAS,yBAAyB,OAA4B;AACnE,SAAO,QAAQ,MAAM,aAAa,KAAK,MAAM,UAAU;AACzD;AAEA,SAAS,kBAAkB,OAAmB,WAAkC;AAC9E,MAAI,MAAM,UAAU,WAAW,EAAG,QAAO;AACzC,QAAM,MAAM,IAAI,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AAC/D,SAAO,MAAM,UAAU,MAAM,CAAC,UAAU;AACtC,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,KAAK,UAAU;AAAA,EACxB,CAAC;AACH;AAEO,SAAS,YAAY,OAAmB,SAAsB,OAA8B;AACjG,MAAI,CAAC,MAAM,iBAAkB,QAAO;AACpC,MAAI,QAAQ,IAAI,MAAM,EAAE,EAAG,QAAO;AAClC,MAAI,gBAAgB,IAAI,MAAM,KAAK,EAAG,QAAO;AAG7C,MAAI,MAAM,UAAU,YAAY;AAC9B,QAAI,MAAM,KAAM,QAAO;AACvB,WAAO,MAAM,mBAAmB,UAAU,CAAC,MAAM;AAAA,EACnD;AAGA,QAAM,EAAE,MAAM,IAAI,oBAAoB,KAAK;AAC3C,MAAI,OAAO;AACT,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,WAAW,GAAG,uEAAkE;AACpI,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,UAAU,WAAW;AAC7B,QAAI,CAAC,MAAM,YAAa,QAAO;AAC/B,QAAI,MAAM,YAAY,MAAM,aAAa;AACvC,aAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,UAAU,MAAM,UAAU,aAAa,MAAM,YAAY,GAAG,4DAAuD;AACnL,aAAO;AAAA,IACT;AACA,QAAI,KAAK,MAAM,MAAM,WAAW,IAAI,KAAK,IAAI,EAAG,QAAO;AAAA,EACzD;AAEA,MAAI,CAAC,kBAAkB,OAAO,MAAM,MAAM,GAAG;AAC3C,WAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,WAAW,MAAM,UAAU,GAAG,uDAAkD;AAChJ,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,UAAU,SAAU,QAAO;AACrC,MAAI,MAAM,UAAU,UAAW,QAAO;AACtC,MAAI,MAAM,UAAU,aAAa,yBAAyB,KAAK,EAAG,QAAO;AACzE,MAAI,MAAM,UAAU,YAAa,QAAO;AAExC,SAAO;AACT;;;ACvGA,SAAS,WAAW,GAA2B;AAC7C,MAAI,CAAC,KAAK,OAAO,MAAM,YAAY,EAAE,SAAS,MAAM,CAAC,EAAE,OAAO,OAAQ,EAAuB,QAAQ,UAAU;AAC7G,WAAO;AAAA,EACT;AACA,QAAM,MAAO,EAAoD;AACjE,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,UAAU,UAAU;AAC7B;AAEA,SAAS,UAAU,OAAqB,SAAiB;AACvD,SAAO,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,WAAW,MAAM,eAAe,OAAO;AAC1F;AAEA,eAAe,iBAAiB,GAAY;AAC1C,QAAMC,WAAU,4BAA4B;AAC5C,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,wBAAwB,EAAE;AAAA,EAC5E;AAEA,QAAM,QAAQ,UAAUA,SAAQ,OAAO,OAAO;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,kBAAkB,EAAE;AAAA,EACtE;AAEA,QAAM,YAAY,2BAA2BA,SAAQ,OAAO,OAAO,IAAI;AACvE,QAAM,WAAW,MAAM,kCAAkC,OAAO,SAAS;AACzE,SAAO,EAAE,MAAM,EAAE,IAAI,MAAM,SAAS,MAAM,IAAI,SAAS,EAAE;AAC3D;AAEA,eAAe,iBAAiB,GAAY;AAC1C,QAAMA,WAAU,4BAA4B;AAC5C,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,wBAAwB,EAAE;AAAA,EAC5E;AAEA,QAAM,QAAQ,UAAUA,SAAQ,OAAO,OAAO;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,kBAAkB,EAAE;AAAA,EACtE;AAEA,QAAM,YAAY,2BAA2BA,SAAQ,OAAO,OAAO,IAAI;AACvE,QAAM,WAAW,MAAM,kCAAkC,OAAO,SAAS;AACzE,QAAM,WAAW,MAAM,kCAAkC,OAAO,WAAW,UAAU,IAAI;AACzF,SAAO,EAAE,MAAM,EAAE,IAAI,MAAM,SAAS,MAAM,IAAI,UAAU,SAAS,EAAE;AACrE;AAEA,eAAe,gBAAgB,GAAY;AACzC,QAAMA,WAAU,4BAA4B;AAC5C,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,wBAAwB,EAAE;AAAA,EAC5E;AAEA,QAAM,QAAQ,UAAUA,SAAQ,OAAO,OAAO;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,kBAAkB,EAAE;AAAA,EACtE;AAEA,MAAI;AACF,UAAM,UAAU,MAAO,EAAgD,IAAI,KAAK;AAChF,UAAM,iBAAiBA,SAAQ,OAAO,OAAO,OAAO;AACpD,UAAM,aAAaA,SAAQ,KAAK;AAChC,WAAO,EAAE,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,EAAE;AAAA,EAC3G;AACF;AAEA,eAAe,WAAW,GAAY;AACpC,QAAMA,WAAU,4BAA4B;AAC5C,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,wBAAwB,EAAE;AAAA,EAC5E;AAEA,QAAM,QAAQ,UAAUA,SAAQ,OAAO,OAAO;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,kBAAkB,EAAE;AAAA,EACtE;AAEA,MAAI,gBAAgB,IAAI,MAAM,KAAK,GAAG;AACpC,UAAM,YAAY;AAClB,UAAM,cAAc;AACpB,UAAM,qBAAqB,OAAO,UAAU,yBAAyB;AAAA,EACvE,OAAO;AACL,UAAM,cAAc;AACpB,UAAM,YAAY;AAClB,UAAM,YAAY,IAAI;AAAA,EACxB;AAEA,WAASA,SAAQ,OAAO,MAAM,IAAI,UAAU,8BAA8B,MAAM,EAAE,GAAG;AACrF,QAAM,aAAaA,SAAQ,KAAK;AAChC,SAAO,EAAE,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE;AACrC;AAEA,eAAe,YAAY,GAAY;AACrC,QAAMA,WAAU,4BAA4B;AAC5C,MAAI;AACF,UAAM,UAAU,MAAO,EAAgD,IAAI,KAAK;AAChF,UAAM,QAAQ,uBAAuB,SAASA,SAAQ,MAAM,QAAQA,SAAQ,MAAM,OAAO,aAAa;AACtG,IAAAA,SAAQ,MAAM,OAAO,KAAK,KAAK;AAC/B,QAAI,MAAM,KAAM,oBAAmB,MAAM,EAAE;AAC3C,aAASA,SAAQ,OAAO,MAAM,IAAI,QAAQ,SAAS,MAAM,UAAU,mBAAmB;AACtF,UAAM,aAAaA,SAAQ,KAAK;AAChC,WAAO,EAAE,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,EAAE;AAAA,EAC3G;AACF;AAEA,eAAe,YAAY,GAAY;AACrC,QAAMA,WAAU,4BAA4B;AAC5C,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,wBAAwB,EAAE;AAAA,EAC5E;AAEA,QAAM,QAAQ,UAAUA,SAAQ,OAAO,OAAO;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,QAAQ,KAAK,MAAM,EAAE,IAAI,OAAO,OAAO,kBAAkB,EAAE;AAAA,EACtE;AAEA,QAAM,qBAAqB,OAAO,aAAa,0BAA0B;AACzE,WAASA,SAAQ,OAAO,MAAM,IAAI,UAAU,+BAA+B,MAAM,EAAE,GAAG;AACtF,QAAM,aAAaA,SAAQ,KAAK;AAChC,SAAO,EAAE,MAAM,EAAE,IAAI,MAAM,MAAM,EAAE;AACrC;AAEA,IAAO,0BAAQ;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,cAAc;AAAA,IACd,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,SAAS,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE;AAAA,IACvC,sBAAsB,EAAE,QAAQ,EAAE,oBAAoB,SAAS,EAAE;AAAA,IACjE,sBAAsB;AAAA,MACpB,QAAQ,EAAE,OAAO,UAAU,oBAAoB,SAAS;AAAA,IAC1D;AAAA,IACA,gBAAgB,EAAE,QAAQ,EAAE,cAAc,SAAS,EAAE;AAAA,EACvD;AAAA,EACA,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,QAAQ,SAAS;AAAA,IACpE,aAAa;AAAA,IACb,gBAAgB,OAAO,MAAe;AACpC,YAAM,SAAS,MAAM,YAAY,CAAC;AAClC,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1C;AACA,aAAO,EAAE,KAAK,OAAO,MAAM,GAAG;AAAA,IAChC;AAAA,IACA,UAAU,OAAO,MAAe;AAC9B,YAAM,SAAS,MAAM,YAAY,CAAC;AAClC,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1C;AACA,aAAO,EAAE,KAAK,OAAO,MAAM,GAAG;AAAA,IAChC;AAAA,IACA,qBAAqB,OAAO,MAAe;AACzC,YAAM,SAAS,MAAM,iBAAiB,CAAC;AACvC,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1C;AACA,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,qBAAqB,OAAO,MAAe;AACzC,YAAM,SAAS,MAAM,iBAAiB,CAAC;AACvC,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1C;AACA,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,mBAAmB,OAAO,MAAe;AACvC,YAAM,SAAS,MAAM,gBAAgB,CAAC;AACtC,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1C;AACA,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,mBAAmB,OAAO,MAAe;AACvC,YAAM,SAAS,MAAM,WAAW,CAAC;AACjC,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1C;AACA,aAAO,OAAO;AAAA,IAChB;AAAA,IACA,oBAAoB,OAAO,MAAe;AACxC,YAAM,SAAS,MAAM,YAAY,CAAC;AAClC,UAAI,OAAO,QAAQ;AACjB,eAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,MAC1C;AACA,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACF;;;AC7QA,IAAO,+BAAQ;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AACd;;;ACXA,IAAO,0BAAQ;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,IAAI;AAAA,EACN;AAAA,EACA,YAAY;AAAA,IACV,WAAW,EAAE,QAAQ,EAAE,SAAS,SAAS,EAAE;AAAA,IAC3C,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,EAAE;AAAA,IACrC,kBAAkB,EAAE,QAAQ,EAAE,SAAS,UAAU,MAAM,SAAS,EAAE;AAAA,EACpE;AAAA,EACA,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS,CAAC,OAAO,QAAQ,SAAS;AAAA,IAClC,aAAa;AAAA,EACf;AACF;;;ACvBA,IAAO,4BAAQ;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,YAAY;AAAA,IACV,SAAS,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE;AAAA,EACzC;AAAA,EACA,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,KAAK;AAAA,IACH,SAAS;AAAA,EACX;AACF;;;ACnBA,IAAO,kCAAQ;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,WAAW,EAAE,QAAQ,EAAE,SAAS,SAAS,EAAE;AAAA,IAC3C,gBAAgB,EAAE,QAAQ,EAAE,SAAS,UAAU,SAAS,SAAS,EAAE;AAAA,IACnE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,UAAU,MAAM,SAAS,EAAE;AAAA,EACnE;AAAA,EACA,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS,CAAC,OAAO,QAAQ,SAAS;AAAA,IAClC,aAAa;AAAA,EACf;AACF;;;AC3BA,IAAO,mCAAQ;AAAA,EACb,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,IACV,WAAW,EAAE,QAAQ,EAAE,SAAS,SAAS,EAAE;AAAA,IAC3C,gBAAgB,EAAE,QAAQ,EAAE,SAAS,UAAU,SAAS,SAAS,EAAE;AAAA,EACrE;AAAA,EACA,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS,CAAC,OAAO,QAAQ,SAAS;AAAA,IAClC,aAAa;AAAA,EACf;AACF;;;ACjBO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,wBAAwB,wBAAwB,IAAI,CAAC,aAAa,SAAS,IAAI;;;ACRrF,IAAM,YAAY,oBAAI,IAAsB;AAC5C,IAAI,eAAe;AACnB,IAAI,6BAAkD,oBAAI,IAAI;AAE9D,SAAS,iBAAiB,MAAoB;AACnD,aAAW,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,SAAS,GAAG;AAC7C,QAAI;AAAE,WAAK,IAAI;AAAA,IAAG,SAAS,OAAO;AAChC,aAAO,MAAM,6BAA6B,QAAQ,0BAA0B,UAAU,OAAO,CAAC,MAAM,OAAO,KAAK,CAAC,EAAE;AACnH,gBAAU,OAAO,QAAQ;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,SAAwC;AAClF,MAAI,UAAU,SAAS,EAAG;AAE1B;AACA,SAAO,MAAM,EAAE,KAAK,cAAc,MAAM,QAAQ,MAAM,aAAa,UAAU,KAAK,GAAG,uCAAuC;AAC5H,QAAM,SAAS,QAAQ;AAEvB,MAAI,UAAU,2BAA2B,OAAO,GAAG;AAEjD,UAAM,aAAa,oBAAI,IAAY;AACnC,UAAM,gBAAgD,CAAC;AAEvD,eAAW,SAAS,QAAQ;AAC1B,YAAM,KAAK,MAAM;AACjB,iBAAW,IAAI,EAAE;AACjB,YAAM,aAAa,KAAK,UAAU,KAAK;AACvC,UAAI,2BAA2B,IAAI,EAAE,MAAM,YAAY;AACrD,sBAAc,KAAK,KAAK;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,aAAuB,CAAC;AAC9B,eAAW,UAAU,2BAA2B,KAAK,GAAG;AACtD,UAAI,CAAC,WAAW,IAAI,MAAM,GAAG;AAC3B,mBAAW,KAAK,MAAM;AAAA,MACxB;AAAA,IACF;AAGA,iCAA6B,IAAI;AAAA,MAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAc,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,IACnE;AAGA,QAAI,cAAc,SAAS,OAAO,SAAS,KAAK,cAAc,UAAU,GAAG;AACzE,YAAM,QAAiC;AAAA,QACrC,MAAM;AAAA,QACN,KAAK;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,cAAc,QAAQ;AAAA,QACtB,WAAW,QAAQ;AAAA,QACnB,aAAa;AAAA,QACb,eAAe;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB;AACA,uBAAiB,KAAK,UAAU,KAAK,CAAC;AACtC;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,iCAA6B,IAAI;AAAA,MAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAc,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,IACnE;AAAA,EACF;AAEA,mBAAiB,KAAK,UAAU;AAAA,IAC9B,GAAG;AAAA,IACH,KAAK;AAAA,EACP,CAAC,CAAC;AACJ;AAEO,SAAS,oBAAoB,OAAqB;AACvD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAc,CAAC,UAAkB,SAAmB;AAClD,gBAAU,IAAI,UAAU,IAAI;AAC5B,aAAO,MAAM,+BAA+B,QAAQ,YAAY,UAAU,IAAI,GAAG;AACjF,UAAI;AACF,aAAK,KAAK,UAAU;AAAA,UAClB,MAAM;AAAA,UACN,KAAK;AAAA,UACL,WAAW,IAAI;AAAA,UACf,SAAS,eAAe,MAAM,MAAM;AAAA,UACpC,cAAc,wBAAwB,MAAM,MAAM;AAAA,UAClD,QAAQ,MAAM;AAAA,UACd,QAAQ,MAAM,OAAO,MAAM,GAAG,EAAE;AAAA,QAClC,CAAC,CAAC;AAAA,MACJ,SAAS,OAAO;AACd,eAAO,MAAM,qCAAqC,QAAQ,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,MAChF;AAAA,IACF;AAAA,IACA,WAAW,CAAC,UAAkB,SAA0B,SAAmB;AACzE,UAAI;AACF,cAAM,MAAM,KAAK,MAAM,OAAO,YAAY,WAAW,UAAU,QAAQ,SAAS,MAAM,CAAC;AACvF,YAAI,IAAI,SAAS,QAAQ;AACvB,eAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,WAAW,IAAI,EAAE,CAAC,CAAC;AAAA,QACzD;AAAA,MACF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,IACA,SAAS,CAAC,aAAqB;AAC7B,gBAAU,OAAO,QAAQ;AACzB,aAAO,MAAM,kCAAkC,QAAQ,YAAY,UAAU,IAAI,GAAG;AAAA,IACtF;AAAA,EACF;AACF;;;AC9GA,IAAI,cAAmC;AAEhC,SAAS,eAAe,IAA+B;AAC5D,gBAAc;AAChB;AAEO,SAAS,gBAAsB;AACpC,gBAAc;AAChB;;;ACHA,IAAI,aAAiC;AACrC,IAAI,gBAAoC;AACxC,IAAI,eAAmC;AAEvC,IAAI,eAA2C;AAC/C,IAAI,kBAA8C;AAClD,IAAI,iBAA6C;AAEjD,IAAI,eAAoC;AAExC,eAAsB,iBAAiB,OAAoC;AACzE,iBAAe;AAEf,QAAM,KAAK,WAAW;AACtB,MAAI,CAAC,IAAI;AACP,WAAO,KAAK,oEAA+D;AAC3E;AAAA,EACF;AAEA,QAAM,EAAE,cAAc,IAAI,MAAM,eAAe;AAC/C,MAAI,CAAC,eAAe;AAClB,WAAO,KAAK,0EAAqE;AACjF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,gBAAgB,MAAM,GAAG,YAAY,mBAAmB;AAG9D,UAAM,qBAAqB,IAAI,cAAc;AAAA,MAC3C,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,MAAM,SAAS,YAAY,EAAE;AAAA,IAClD,CAAC;AACD,UAAM,GAAG,UAAU,oBAA+B,YAAY;AAC9D,iBAAa;AACb,mBAAe;AAGf,UAAM,wBAAwB,IAAI,cAAc;AAAA,MAC9C,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,aAAa,MAAM,OAAO;AAAA,MAC1B,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,MAAM,SAAS,YAAY,EAAE;AAAA,IAClD,CAAC;AACD,UAAM,GAAG,UAAU,uBAAkC,eAAe;AACpE,oBAAgB;AAChB,sBAAkB;AAGlB,UAAM,uBAAuB,IAAI,cAAc;AAAA,MAC7C,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,aAAa;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,iBAAiB,EAAE,MAAM,SAAS,YAAY,EAAE;AAAA,IAClD,CAAC;AACD,UAAM,GAAG,UAAU,sBAAiC,cAAc;AAClE,mBAAe;AACf,qBAAiB;AAEjB,UAAM,WAAW,gBAAgB,iBAAiB,GAAG,EAAE,aAAa,EAAE,CAAC;AACvE,UAAM,cAAc,gBAAgB,oBAAoB,GAAG,EAAE,aAAa,MAAM,OAAO,kBAAkB,CAAC;AAC1G,UAAM,aAAa,gBAAgB,mBAAmB,GAAG,EAAE,aAAa,EAAE,CAAC;AAE3E,WAAO,KAAK,oEAAoE;AAAA,EAClF,SAAS,OAAO;AACd,WAAO,KAAK,EAAE,KAAK,MAAM,GAAG,+EAA0E;AACtG,iBAAa;AACb,oBAAgB;AAChB,mBAAe;AAAA,EACjB;AACF;AAEA,eAAsB,mBAAkC;AACtD,QAAM,QAAQ;AAAA,IACZ,YAAY,eAAe;AAAA,IAC3B,eAAe,eAAe;AAAA,IAC9B,cAAc,eAAe;AAAA,EAC/B,EAAE,OAAO,OAAO;AAEhB,MAAI,MAAM,WAAW,EAAG;AAExB,MAAI;AACF,UAAM,QAAQ,WAAW,KAAK;AAC9B,WAAO,KAAK,0CAA0C;AAAA,EACxD,SAAS,OAAO;AACd,WAAO,KAAK,EAAE,KAAK,MAAM,GAAG,6CAA6C;AAAA,EAC3E,UAAE;AACA,iBAAa;AACb,oBAAgB;AAChB,mBAAe;AACf,mBAAe;AACf,sBAAkB;AAClB,qBAAiB;AACjB,mBAAe;AAAA,EACjB;AACF;AAEA,eAAsB,mBAAmB,OAAkC;AACzE,MAAI,CAAC,aAAc;AACnB,SAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,WAAW,GAAG,uCAAuC;AACzG,QAAO,aAAqB,QAAQ,EAAE,GAAG,OAAO,cAAc,WAAW,CAAC;AAC5E;AAEA,eAAsB,oBAAoB,OAAkC;AAC1E,MAAI,CAAC,gBAAiB;AACtB,SAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,WAAW,GAAG,wCAAwC;AAC1G,QAAO,gBAAwB,QAAQ,EAAE,GAAG,OAAO,cAAc,SAAS,CAAC;AAC7E;AAEA,eAAsB,iBAAiB,OAAkC;AACvE,MAAI,CAAC,eAAgB;AACrB,SAAO,MAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,WAAW,GAAG,qCAAqC;AACvG,QAAO,eAAuB,QAAQ,EAAE,GAAG,OAAO,cAAc,YAAY,CAAC;AAC/E;AAEO,SAAS,wBAAiC;AAC/C,SAAO,eAAe,QAAQ,kBAAkB,QAAQ,iBAAiB;AAC3E;AAEA,eAAsB,gBAAkD;AACtE,QAAM,CAAC,MAAM,SAAS,MAAM,IAAI,MAAM,QAAQ,WAAW;AAAA,IACvD,YAAY,SAAS;AAAA,IACrB,eAAe,SAAS;AAAA,IACxB,cAAc,SAAS;AAAA,EACzB,CAAC;AAED,SAAO;AAAA,IACL,MAAM,KAAK,WAAW,cAAc,KAAK,QAAQ;AAAA,IACjD,SAAS,QAAQ,WAAW,cAAc,QAAQ,QAAQ;AAAA,IAC1D,QAAQ,OAAO,WAAW,cAAc,OAAO,QAAQ;AAAA,EACzD;AACF;AAEA,SAAS,gBAAgB,IAAoC;AAC3D,SAAO,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACrD;AAEA,SAAS,mBAAmB;AAC1B,SAAO,OAAOC,SAAiCC,aAOzC;AACJ,UAAM,UAAUD,QAAO;AACvB,QAAI,CAAC,SAAS;AACZ,YAAMC,SAAQ,IAAI;AAClB;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,QAAI,CAAC,OAAO;AACV,YAAMA,SAAQ,KAAK,6BAA6B;AAChD;AAAA,IACF;AAEA,UAAM,QAAQ,gBAAgB,OAAO;AACrC,QAAI,CAAC,SAAS,MAAM,UAAU,YAAY;AACxC,aAAO,MAAM,EAAE,SAAS,cAAc,OAAO,MAAM,GAAG,iEAAiE;AACvH,YAAMA,SAAQ,IAAI;AAClB;AAAA,IACF;AAEA,QAAI,MAAM,mBAAmB,YAAY;AACvC,aAAO,MAAM,EAAE,QAAQ,GAAG,4DAA4D;AACtF,YAAMA,SAAQ,IAAI;AAClB;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,SAAS,YAAY,MAAM,WAAW,GAAG,6CAA6C;AAEpG,QAAI;AACF,YAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,4BAAmB;AAC3D,YAAMA,gBAAe,OAAO,KAAK;AACjC,YAAMD,SAAQ,IAAI;AAAA,IACpB,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,OAAO,QAAQ,GAAG,yCAAyC;AAC/E,YAAMA,SAAQ,KAAK,iBAAiB,QAAQ,QAAQ,OAAO,KAAK,CAAC;AAAA,IACnE;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB;AAC7B,SAAO,OAAOD,SAAiCC,aAOzC;AACJ,UAAM,UAAUD,QAAO;AACvB,QAAI,CAAC,SAAS;AACZ,YAAMC,SAAQ,IAAI;AAClB;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,QAAI,CAAC,OAAO;AACV,YAAMA,SAAQ,KAAK,6BAA6B;AAChD;AAAA,IACF;AAEA,UAAM,QAAQ,gBAAgB,OAAO;AACrC,QAAI,CAAC,SAAU,MAAM,UAAU,YAAY,MAAM,UAAU,WAAY;AACrE,aAAO,MAAM,EAAE,SAAS,cAAc,OAAO,MAAM,GAAG,oEAAoE;AAC1H,YAAMA,SAAQ,IAAI;AAClB;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,SAAS,YAAY,MAAM,YAAY,OAAO,MAAM,MAAM,GAAG,iDAAiD;AAE5H,UAAM,UAAU,oBAAI,IAAY;AAEhC,QAAI;AACF,YAAM,EAAE,cAAAE,cAAa,IAAI,MAAM,OAAO,4BAAmB;AACzD,YAAMA,cAAa,OAAO,OAAO,OAAO;AACxC,YAAMF,SAAQ,IAAI;AAAA,IACpB,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,OAAO,QAAQ,GAAG,6CAA6C;AACnF,YAAMA,SAAQ,KAAK,iBAAiB,QAAQ,QAAQ,OAAO,KAAK,CAAC;AAAA,IACnE;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB;AAC5B,SAAO,OAAOD,SAAiCC,aAOzC;AACJ,UAAM,UAAUD,QAAO;AACvB,QAAI,CAAC,SAAS;AACZ,YAAMC,SAAQ,IAAI;AAClB;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,QAAI,CAAC,OAAO;AACV,YAAMA,SAAQ,KAAK,6BAA6B;AAChD;AAAA,IACF;AAEA,UAAM,QAAQ,gBAAgB,OAAO;AACrC,QAAI,CAAC,SAAS,MAAM,UAAU,aAAa;AACzC,aAAO,MAAM,EAAE,SAAS,cAAc,OAAO,MAAM,GAAG,8DAA8D;AACpH,YAAMA,SAAQ,IAAI;AAClB;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,SAAS,YAAY,MAAM,WAAW,GAAG,6CAA6C;AAEpG,UAAM,UAAU,oBAAI,IAAY;AAEhC,QAAI;AACF,YAAM,EAAE,cAAAE,cAAa,IAAI,MAAM,OAAO,4BAAmB;AACzD,YAAMA,cAAa,OAAO,OAAO,OAAO;AACxC,YAAMF,SAAQ,IAAI;AAAA,IACpB,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,OAAO,QAAQ,GAAG,yCAAyC;AAC/E,YAAMA,SAAQ,KAAK,iBAAiB,QAAQ,QAAQ,OAAO,KAAK,CAAC;AAAA,IACnE;AAAA,EACF;AACF;;;AC/QA,IAAM,uBAAuB,oBAAI,IAAI,CAAC,YAAY,UAAU,WAAW,CAAC;AAIxE,IAAI,eAAe;AACnB,IAAI,gBAAgB;AACpB,IAAM,sBAAsB;AAG5B,IAAM,eAAe;AACrB,IAAM,iBAAiB;AAMhB,SAAS,wBACd,OACA,SACM;AACN,QAAM,UAAU,OAAO,WAAmB;AACxC,QAAI,cAAc;AAChB,aAAO,KAAK,YAAY,MAAM,uBAAuB;AACrD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,mBAAe;AACf,WAAO,KAAK,YAAY,MAAM,+BAA+B;AAC7D,aAAS,OAAO,QAAW,QAAQ,gCAAgC,MAAM,IAAI;AAG7E,eAAW,SAAS,MAAM,QAAQ;AAChC,UAAI,QAAQ,IAAI,MAAM,EAAE,MAAM,MAAM,UAAU,aAAa,MAAM,UAAU,cAAc;AACvF,YAAI;AACF,gBAAM,qBAAqB,OAAO,UAAU,kBAAkB,MAAM,4CAAuC,EAAE,iBAAiB,KAAK,CAAC;AAAA,QACtI,QAAQ;AAEN,iBAAO,KAAK,8BAA8B,MAAM,UAAU,6BAA6B;AAAA,QACzF;AACA,iBAAS,OAAO,MAAM,IAAI,QAAQ,SAAS,MAAM,UAAU,mCAAmC;AAAA,MAChG;AAIA,UAAI,MAAM,UAAU,cAAc,MAAM,mBAAmB,YAAY;AACrE,cAAM,iBAAiB;AACvB,cAAM,gBAAgB,kBAAkB,MAAM;AAC9C,cAAM,oBAAoB;AAC1B,uBAAe,MAAM,EAAE;AACvB,iBAAS,OAAO,MAAM,IAAI,QAAQ,gBAAgB,MAAM,UAAU,8CAAyC;AAAA,MAC7G;AAAA,IACF;AAEA,UAAM,YAAY,IAAI;AACtB,UAAM,UAAU,eAAe,MAAM,MAAM;AAC3C,QAAI;AACF,YAAM,aAAa,KAAK;AACxB,aAAO,KAAK,kBAAkB;AAAA,IAChC,SAAS,OAAO;AACd,aAAO,MAAM,4CAA4C,OAAO,KAAK,CAAC,EAAE;AAAA,IAC1E;AACA,WAAO,KAAK,UAAU;AACtB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,MAAM,QAAQ,QAAQ,CAAC;AAC5C,UAAQ,GAAG,WAAW,MAAM,QAAQ,SAAS,CAAC;AAChD;AAEO,SAAS,yBAAyB,QAA2C;AAClF,QAAM,OAAO,OAAO;AAAA,IAAO,CAAC,UAC1B,MAAM,UAAU,aACb,MAAM,oBACN,MAAM,UAAU,WAAW;AAAA,EAChC;AAEA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,UACrB,oBAAI,IAAI,CAAC,GAAI,MAAM,SAAS,CAAC,GAAI,GAAI,MAAM,iBAAiB,CAAC,CAAE,CAAC;AAElE,QAAM,iBAAiB,CAAC,GAAe,MAA2B;AAChE,UAAM,SAAS,cAAc,CAAC;AAC9B,UAAM,SAAS,cAAc,CAAC;AAC9B,QAAI,OAAO,SAAS,KAAK,OAAO,SAAS,EAAG,QAAO;AACnD,eAAW,KAAK,QAAQ;AACtB,UAAI,OAAO,IAAI,CAAC,EAAG,QAAO;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,CAAC,GAAe,MAC7B,EAAE,UAAU,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,SAAS,EAAE,EAAE;AAGzD,QAAM,SAAqB,CAAC;AAC5B,QAAM,WAAW,oBAAI,IAAY;AAEjC,aAAW,SAAS,MAAM;AACxB,QAAI,SAAS,IAAI,MAAM,EAAE,EAAG;AAE5B,QAAI,SAAS;AACb,eAAW,SAAS,QAAQ;AAC1B,YAAM,UAAU,MAAM,MAAM,CAAC,aAAa;AACxC,cAAM,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACjD,eAAO,CAAC,eAAe,OAAO,MAAM,KAAK,CAAC,OAAO,OAAO,MAAM;AAAA,MAChE,CAAC;AAED,UAAI,SAAS;AACX,cAAM,KAAK,MAAM,EAAE;AACnB,iBAAS,IAAI,MAAM,EAAE;AACrB,iBAAS;AACT;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,CAAC,MAAM,EAAE,CAAC;AACtB,eAAS,IAAI,MAAM,EAAE;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,UAAU,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACvD,QAAM,mBAAmB,KAAK;AAAA,IAAO,CAAC,GAAG,MACvC,KAAK,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAAA,EACpD,EAAE;AAEF,QAAM,SAAS,mBAAmB,IAC9B,GAAG,gBAAgB,6EAA6E,OAAO,MACvG,OAAO,KAAK,MAAM,sEAAsE,OAAO;AAEnG,SAAO;AAAA,IACL,gBAAgB,UAAU;AAAA,IAC1B,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,eAAe,OAAqB,gBAAuC;AAC/F,QAAM,QAAQ,KAAK,IAAI,IAAI;AAG3B,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,MAAM,UAAU,cAAc,MAAM,mBAAmB,WAAY;AACvE,QAAI,CAAC,MAAM,kBAAmB;AAC9B,UAAM,UAAU,KAAK,IAAI,IAAI,KAAK,MAAM,MAAM,iBAAiB;AAC/D,QAAI,UAAU,gBAAgB;AAC5B,YAAM,iBAAiB;AACvB,YAAM,gBAAgB;AACtB,YAAM,oBAAoB;AAC1B,qBAAe,MAAM,EAAE;AACvB,eAAS,OAAO,MAAM,IAAI,QAAQ,gBAAgB,MAAM,UAAU,wBAAwB;AAC1F,aAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,QAAQ,GAAG,0CAA0C;AAAA,IACtH;AAAA,EACF;AAEA,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,CAAC,iBAAiB,IAAI,MAAM,KAAK,EAAG;AACxC,QAAI,yBAAyB,KAAK,EAAG;AAGrC,UAAM,cAAc,oBAAoB,KAAK;AAC7C,UAAM,UAAU,YAAY,QAAQ,QAAQ,CAAC,YAAY;AAEzD,QAAI,SAAS;AACX,aAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,OAAO,MAAM,OAAO,KAAK,YAAY,KAAK,IAAI,GAAG,2DAAsD;AACtK,YAAM,YAAY;AAClB,qBAAe,MAAM,EAAE;AACvB,YAAM,qBAAqB,OAAO,UAAU,2BAA2B,YAAY,IAAK,GAAG,2BAAsB;AACjH,eAAS,OAAO,MAAM,IAAI,QAAQ,SAAS,MAAM,UAAU,4BAA4B,YAAY,IAAK,GAAG,kCAAkC;AAC7I;AAAA,IACF;AAGA,QAAI,KAAK,MAAM,MAAM,SAAS,IAAI,OAAO;AACvC,YAAM,eAAe,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,MAAM,MAAM,SAAS,KAAK,GAAM;AACnF,YAAM,SAAS,8CAAyC,YAAY,iBAAiB,MAAM,KAAK;AAChG,aAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,OAAO,MAAM,OAAO,WAAW,MAAM,UAAU,GAAG,mDAA8C;AAC/J,YAAM,YAAY;AAClB,YAAM,cAAc,eAAe,OAAO,MAAM,OAAO,YAAY;AACnE,YAAM,YAAY;AAClB,qBAAe,MAAM,EAAE;AACvB,YAAM,qBAAqB,OAAO,WAAW,MAAM;AACnD,eAAS,OAAO,MAAM,IAAI,QAAQ,SAAS,MAAM,UAAU,uBAAuB,YAAY,iBAAiB,MAAM,KAAK,qCAAqC;AAAA,IACjK;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAAmB,OAAqB,SAA+B;AAC7F,QAAM,UAAU,MAAM,OAAO;AAC7B,MAAI,CAAC,WAAW,OAAO,KAAK,OAAO,EAAE,WAAW,EAAG,QAAO;AAC1D,QAAM,WAAW,MAAM,MAAM,YAAY;AACzC,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,QAAQ,MAAM,OAAO,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,YAAY,MAAM,QAAQ,EAAE;AAClG,SAAO,SAAS;AAClB;AAEO,SAAS,eACd,OACA,SACc;AACd,QAAM,eAAe,sBAAsB;AAC3C,QAAM,aAAa,MAAM,OACtB,OAAO,CAAC,UAAU;AACjB,QAAI,gBAAgB,qBAAqB,IAAI,MAAM,KAAK,EAAG,QAAO;AAClE,WAAO,YAAY,OAAO,SAAS,KAAK,KAAK,CAAC,eAAe,OAAO,OAAO,OAAO;AAAA,EACpF,CAAC;AACH,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO,MAAM,EAAE,YAAY,WAAW,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,OAAO,EAAE,OAAO,UAAU,EAAE,SAAS,EAAE,EAAE,GAAG,8CAA8C;AAAA,EAClK;AACA,SAAO,WACJ,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,cAAc,CAAC,MACnB,EAAE,UAAU,YAAc,IAC1B,EAAE,UAAU,aAAc,IAC1B,EAAE,UAAU,cAAc,IAC1B,EAAE,UAAU,YAAc,IAAI;AAChC,UAAM,aAAa,YAAY,CAAC,IAAI,YAAY,CAAC;AACjD,QAAI,eAAe,EAAG,QAAO;AAC7B,QAAI,EAAE,aAAa,EAAE,SAAU,QAAO,EAAE,WAAW,EAAE;AACrD,UAAM,iBAAiB,2BAA2B,GAAG,IAAI,IAAI,2BAA2B,GAAG,IAAI;AAC/F,QAAI,mBAAmB,EAAG,QAAO;AACjC,WAAO,KAAK,MAAM,EAAE,SAAS,IAAI,KAAK,MAAM,EAAE,SAAS;AAAA,EACzD,CAAC;AACL;AAEA,IAAI,sBAAsB;AAE1B,SAAS,uBAAuB,OAAoC;AAClE,MAAI,CAAC,MAAM,OAAO,cAAc,KAAK,GAAG;AAEtC,UAAM,WAAW,yBAAyB;AAC1C,UAAM,WAAW,uBAAuB,QAAQ;AAChD,QAAI,UAAU;AACZ,YAAM,UAAU,0BAA0B,QAAQ;AAClD,UAAI,SAAS;AACX,cAAM,OAAO,gBAAgB;AAC7B,cAAM,OAAO,eAAe;AAC5B,eAAO,KAAK,uCAAuC,QAAQ,WAAM,OAAO,EAAE;AAC1E,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,OAAO,oBAAoB,GAAG;AACtC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAuB;AACjD,MAAI,YAAY,oBAAqB;AACrC,wBAAsB;AACtB,SAAO,KAAK,qBAAqB,OAAO,EAAE;AAC5C;AAEO,SAAS,iBAAiB,OAA8B;AAC7D,SAAO,MAAM,OAAO,MAAM,CAAC,UAAU,gBAAgB,IAAI,MAAM,KAAK,KAAK,MAAM,YAAY,MAAM,WAAW;AAC9G;AAEA,eAAsB,UACpB,OACA,SACA,YACe;AACf,MAAI,YAAY;AACd,WAAO,CAAC,cAAc;AACpB,YAAM,eAAe,OAAO,MAAM,OAAO,wBAAwB;AAGjE,YAAM,kBAAkB,uBAAuB,KAAK;AACpD,UAAI,iBAAiB;AACnB,2BAAmB,eAAe;AAAA,MACpC,OAAO;AACL,cAAM,QAAQ,eAAe,OAAO,OAAO;AAC3C,cAAM,QAAQ,MAAM,OAAO,oBAAoB,QAAQ;AACvD,YAAI,QAAQ,KAAK,MAAM,SAAS,GAAG;AACjC,gBAAM,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9C,iBAAO,MAAM,EAAE,OAAO,YAAY,MAAM,QAAQ,aAAa,KAAK,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,gCAAgC;AAC9H,gBAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,UAAU,aAAa,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,QAC5E,WAAW,MAAM,SAAS,KAAK,SAAS,GAAG;AACzC,iBAAO,MAAM,EAAE,cAAc,QAAQ,MAAM,YAAY,MAAM,QAAQ,aAAa,MAAM,OAAO,kBAAkB,GAAG,yCAAyC;AAAA,QAC/J;AAAA,MACF;AACA,YAAM,YAAY,IAAI;AACtB,YAAM,gBAAgB,cAAc,KAAK,KAAK,IAAI,IAAI,gBAAgB;AACtE,UAAI,eAAe;AACjB,cAAM,aAAa,KAAK;AACxB,wBAAgB,KAAK,IAAI;AAAA,MAC3B;AACA,aAAO,MAAM,EAAE,cAAc,QAAQ,MAAM,YAAY,MAAM,OAAO,QAAQ,OAAO,cAAc,EAAE,GAAG,4BAA4B;AAClI,YAAM,gBAAgB,QAAQ,OAAO,IAAI,iBAAiB;AAC1D,YAAM,QAAQ,KAAK;AAAA,QACjB,MAAM,aAAa;AAAA,QACnB,IAAI,QAAc,CAACG,aAAY;AAAE,yBAAeA,QAAO;AAAA,QAAG,CAAC;AAAA,MAC7D,CAAC;AACD,qBAAe,IAAI;AAAA,IACrB;AACA;AAAA,EACF;AAEA,SAAO,CAAC,iBAAiB,KAAK,KAAK,CAAC,cAAc;AAChD,UAAM,eAAe,OAAO,MAAM,OAAO,wBAAwB;AAEjE,UAAM,uBAAuB,uBAAuB,KAAK;AACzD,QAAI,sBAAsB;AACxB,yBAAmB,oBAAoB;AACvC,YAAM,MAAM,MAAM,OAAO,cAAc;AACvC;AAAA,IACF;AAEA,UAAM,QAAQ,eAAe,OAAO,OAAO;AAC3C,UAAM,QAAQ,MAAM,OAAO,oBAAoB,QAAQ;AACvD,UAAM,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAE9C,QAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,UAAI,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,aAAa,MAAM,eAAe,MAAM,WAAW,MAAM,WAAW,GAAG;AACtH,eAAO,MAAM,iFAAiF;AAC9F,cAAM,MAAM,MAAM,OAAO,cAAc;AACvC;AAAA,MACF;AACA,aAAO,MAAM,0DAA0D;AACvE;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,aAAO,MAAM,EAAE,OAAO,aAAa,KAAK,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,4CAA4C;AAAA,IAClH;AACA,UAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,UAAU,aAAa,OAAO,OAAO,OAAO,CAAC,CAAC;AAC1E,UAAM,YAAY,IAAI;AACtB,UAAM,aAAa,KAAK;AAExB,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,MAAM,MAAM,OAAO,cAAc;AAAA,IACzC;AAAA,EACF;AACF;;;AChXA,eAAsB,WACpB,OACA,UAA+D,CAAC,GACvC;AACzB,QAAM,gBAAgB,sBAAsB;AAC5C,QAAM,EAAE,SAAS,MAAM,MAAM,IAAI;AAEjC,MAAI;AACJ,MAAI,eAAe,MAAM;AACvB,UAAM,YAAY,WAAW,OAAO,qBAChC,UAAU,cACV,OAAO,WACP;AACJ,UAAM,kBAAkB,WAAW,OAAO,EAAE,SAAS,KAAK,IACtD,UAAU,EAAE,QAAQ,IACpB,OAAO,EAAE,KAAK,IACd,CAAC;AACL,cAAU,MAAM,cAAc,KAAK,EAAE,WAAW,iBAAiB,OAAO,IAAI,CAAC,GAC1E,IAAI,CAACC,YAAWA,OAAsB;AAAA,EAC3C,OAAO;AACL,aAAS,MAAM,OAAO,OAAO,CAAC,UAAU;AACtC,UAAI,WAAW,MAAM,YAAY,QAAS,QAAO;AACjD,UAAI,QAAQ,MAAM,SAAS,KAAM,QAAO;AACxC,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,UAAU,YAAY,QAChC,OAAO,OAAO,CAAC,UAAU,MAAM,KAAK,KAAK,IACzC;AACN;AAEO,SAASC,WAAU,OAAqB,SAAyC;AACtF,SAAO,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,WAAW,MAAM,eAAe,OAAO;AAC1F;AAEO,SAAS,WAAW,GAAuB;AAChD,QAAM,QAAQ,EAAE,KAAK,QAAQ,EAAE,IAAI,MAAM,IAAI,IAAI;AACjD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,UAAU,UAAU;AAC7B;AAGO,SAAS,eAAe,OAAmB,OAAmC;AACnF,MAAI,MAAM,eAAe,EAAG;AAC5B,QAAM,OAAO,MAAM,cAAc,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AACnF,QAAM,aAAa;AAAA,IACjB,aAAa,KAAK,cAAc,MAAM;AAAA,IACtC,cAAc,KAAK,eAAe,MAAM;AAAA,IACxC,aAAa,KAAK,cAAc,MAAM;AAAA,IACtC,OAAO,MAAM,SAAS,KAAK;AAAA,EAC7B;AACA,MAAI,CAAC,MAAM,cAAe,OAAM,gBAAgB,CAAC;AACjD,QAAM,cAAc,MAAM,cAAc,WAAW,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AACrG,QAAM,cAAc,UAAU;AAAA,IAC5B,aAAa,YAAY,cAAc,MAAM;AAAA,IAC7C,cAAc,YAAY,eAAe,MAAM;AAAA,IAC/C,aAAa,YAAY,cAAc,MAAM;AAAA,IAC7C,OAAO,MAAM,SAAS,YAAY;AAAA,EACpC;AACA,MAAI,CAAC,MAAM,cAAe,OAAM,gBAAgB,CAAC;AACjD,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,YAAY,MAAM,cAAc,KAAK,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,EAAE;AAClG,QAAM,cAAc,KAAK,IAAI;AAAA,IAC3B,aAAa,UAAU,cAAc,MAAM;AAAA,IAC3C,cAAc,UAAU,eAAe,MAAM;AAAA,IAC7C,aAAa,UAAU,cAAc,MAAM;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,CAAC,MAAM,MAAO,OAAM,QAAQ,EAAE,QAAQ,CAAC,EAAE;AAC7C,QAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,KAAK,MAAM;AACvE;AAGO,SAAS,qBAAqB,OAAmB,MAA4C;AAClG,MAAI,KAAK,gBAAgB,UAAU,CAAE,MAAM,OAAO,OAAS,OAAM,QAAQ,KAAK;AAC9E,MAAI,KAAK,iBAAiB,UAAU,CAAC,MAAM,QAAQ,OAAQ,OAAM,SAAS,KAAK;AAC/E,MAAI,KAAK,mBAAmB,CAAC,MAAM,OAAQ,OAAM,SAAS,KAAK;AACjE;AAEA,eAAsB,iBACpB,OACA,GACA,SACc;AACd,QAAM,UAAU,WAAW,CAAC;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAAA,EAClE;AAEA,QAAM,QAAQA,WAAU,OAAO,OAAO;AACtC,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,kBAAkB,GAAG,GAAG;AAAA,EAC5D;AAEA,MAAI;AACF,UAAM,QAAQ,KAAK;AACnB,UAAM,aAAa,KAAK;AACxB,kBAAc;AACd,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,EACnC,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,KAAK,OAAO,QAAQ,GAAG,+BAA+B;AACrE,WAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,EACjG;AACF;;;ACjHA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,cAAY,gBAAAC,eAAc,eAAAC,cAAa,gBAAAC,qBAAoB;AACpE,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,OAAAC,YAAW;AAwCpB,SAAS,6BAAuC;AAC9C,QAAM,YAAY,oBAAI,IAAY;AAAA,IAChCC,SAAQ;AAAA,IACRC,KAAI,gBAAgB,KAAK,KAAK;AAAA,IAC9BA,KAAI,eAAe,KAAK,KAAK;AAAA,EAC/B,CAAC;AAED,QAAM,WAAWA,KAAI,WAAW,KAAK;AACrC,MAAI,YAAY,aAAa,QAAQ;AACnC,cAAU,IAAI,SAAS,QAAQ,EAAE;AAAA,EACnC;AAEA,QAAM,SAAS,oBAAI,IAAY;AAAA,IAC7BA,KAAI,YAAY,KAAK,KAAK;AAAA,EAC5B,CAAC;AAED,QAAM,aAAa,CAAC,GAAG,WAAW,GAAG,MAAM,EACxC,OAAO,OAAO,EACd,QAAQ,CAAC,cAAc;AACtB,QAAI,UAAU,SAAS,SAAS,KAAK,UAAU,SAAS,QAAQ,EAAG,QAAO,CAAC,SAAS;AACpF,WAAO,CAACC,OAAK,WAAW,QAAQ,GAAGA,OAAK,WAAW,OAAO,CAAC;AAAA,EAC7D,CAAC;AAEH,SAAO,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC;AAChC;AAEA,SAAS,kBAAiC;AACxC,aAAW,aAAa,2BAA2B,GAAG;AACpD,QAAIC,aAAW,SAAS,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAiC;AAC1D,QAAM,WAAWD,OAAK,UAAU,gBAAgB;AAChD,MAAIC,aAAW,QAAQ,EAAG,QAAO;AAEjC,QAAM,aAAaC,aAAY,QAAQ,EACpC,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ,KAAK,KAAK,SAAS,SAAS,CAAC,EACtE,KAAK,EACL,QAAQ;AAEX,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAOF,OAAK,UAAU,WAAW,CAAC,CAAC;AACrC;AAIA,SAAS,oBAA0B;AACjC,QAAMG,OAAM,oBAAI,KAAK;AACrB,QAAM,SAASA,KAAI,UAAU;AAC7B,QAAM,kBAAkB,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI;AAClE,QAAM,OAAO,IAAI,KAAKA,IAAG;AACzB,OAAK,WAAW,KAAK,WAAW,IAAI,eAAe;AACnD,OAAK,YAAY,GAAG,GAAG,GAAG,CAAC;AAC3B,SAAO;AACT;AAEA,SAAS,mBAAyB;AAChC,QAAM,IAAI,oBAAI,KAAK;AACnB,IAAE,YAAY,GAAG,GAAG,GAAG,CAAC;AACxB,QAAM,SAAS,EAAE,UAAU;AAC3B,QAAM,iBAAiB,WAAW,IAAI,IAAI,SAAS;AACnD,IAAE,WAAW,EAAE,WAAW,IAAI,cAAc;AAC5C,SAAO;AACT;AAEA,SAAS,oBAA0B;AACjC,QAAM,IAAI,oBAAI,KAAK;AACnB,IAAE,YAAY,GAAG,GAAG,GAAG,CAAC;AACxB,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,QAAgB,UAAkB,OAA4B;AAC/F,SAAO,EAAE,aAAa,OAAO,cAAc,QAAQ,YAAY,QAAQ,QAAQ,UAAU,MAAM;AACjG;AAGA,IAAM,qBAA6C;AAAA,EACjD,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,OAAO;AAAA;AACT;AAIA,SAAS,qBAA2C;AAClD,QAAM,OAAOL,SAAQ;AACrB,QAAM,YAAYE,OAAK,MAAM,SAAS;AACtC,MAAI,CAACC,aAAW,SAAS,EAAG,QAAO;AAGnC,MAAI,YAAY;AAChB,MAAI;AACF,IAAAG,UAAS,gBAAgB,EAAE,UAAU,QAAQ,SAAS,IAAK,CAAC;AAC5D,gBAAY;AAAA,EACd,QAAQ;AAAA,EAAC;AAGT,QAAM,cAAcJ,OAAK,WAAW,UAAU;AAC9C,MAAI,mBAAmB;AACvB,MAAI,oBAAoB;AACxB,MAAI,gBAAgB;AACpB,MAAI,mBAAmB;AACvB,MAAI,oBAAoB;AACxB,MAAI,gBAAgB;AACpB,MAAI,kBAAkB;AACtB,MAAI,mBAAmB;AACvB,MAAI,eAAe;AAEnB,QAAM,aAAa,kBAAkB;AACrC,QAAM,UAAU,WAAW,QAAQ;AACnC,QAAM,YAAY,iBAAiB;AACnC,QAAM,SAAS,UAAU,QAAQ;AAEjC,MAAIC,aAAW,WAAW,GAAG;AAC3B,QAAI;AACF,YAAM,cAAcC,aAAY,aAAa,EAAE,eAAe,KAAK,CAAC;AACpE,iBAAW,OAAO,aAAa;AAC7B,YAAI,CAAC,IAAI,YAAY,EAAG;AACxB,cAAM,cAAcF,OAAK,aAAa,IAAI,IAAI;AAE9C,YAAI;AACJ,YAAI;AACF,yBAAeE,aAAY,WAAW,EACnC,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC;AAAA,QACvC,QAAQ;AACN;AAAA,QACF;AAEA,mBAAW,QAAQ,cAAc;AAC/B,gBAAM,WAAWF,OAAK,aAAa,IAAI;AACvC,cAAI;AACJ,cAAI;AACF,sBAAUK,cAAa,UAAU,MAAM;AAAA,UACzC,QAAQ;AACN;AAAA,UACF;AAEA,cAAI,iBAAiB;AACrB,cAAI,sBAAsB;AAC1B,cAAI,qBAAqB;AAEzB,qBAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,gBAAI,CAAC,KAAK,KAAK,EAAG;AAClB,gBAAI;AACF,oBAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,kBAAI,MAAM,SAAS,eAAe,CAAC,MAAM,SAAS,MAAO;AAEzD,oBAAM,QAAQ,MAAM,QAAQ;AAE5B,oBAAM,eAAe,MAAM,gBAAgB,MACxC,MAAM,+BAA+B;AACxC,oBAAM,eAAe,MAAM,iBAAiB;AAE5C,kCAAoB;AACpB,mCAAqB;AACrB,kBAAI,CAAC,gBAAgB;AACnB;AACA,iCAAiB;AAAA,cACnB;AAEA,oBAAM,YAAY,MAAM,YAAY,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ,IAAI;AAE1E,kBAAI,aAAa,SAAS;AACxB,oCAAoB;AACpB,qCAAqB;AACrB,oBAAI,CAAC,qBAAqB;AACxB;AACA,wCAAsB;AAAA,gBACxB;AAAA,cACF;AAEA,kBAAI,aAAa,QAAQ;AACvB,mCAAmB;AACnB,oCAAoB;AACpB,oBAAI,CAAC,oBAAoB;AACvB;AACA,uCAAqB;AAAA,gBACvB;AAAA,cACF;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,wCAAwC,OAAO,GAAG,CAAC,EAAE;AAAA,IACpE;AAAA,EACF;AAGA,QAAM,SAAsB;AAAA,IAC1B,EAAE,MAAM,mBAAmB,aAAa,mBAAmB,aAAa,uCAAuC;AAAA,IAC/G,EAAE,MAAM,qBAAqB,aAAa,qBAAqB,aAAa,iCAAiC;AAAA,IAC7G,EAAE,MAAM,oBAAoB,aAAa,oBAAoB,aAAa,2BAA2B;AAAA,EACvG;AAGA,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,QAAM,eAAeL,OAAK,WAAW,eAAe;AACpD,MAAIC,aAAW,YAAY,GAAG;AAC5B,QAAI;AACF,YAAM,WAAW,KAAK,MAAMI,cAAa,cAAc,MAAM,CAAC;AAC9D,UAAI,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS;AACxD,eAAO,SAAS;AAChB,oBAAY,SAAS,SAAS,KAAK,YAAY,CAAC;AAAA,MAClD;AACA,UAAI,OAAO,SAAS,UAAU,YAAY,SAAS,MAAM,KAAK,GAAG;AAC/D,uBAAe,SAAS,MAAM,KAAK;AAAA,MACrC;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,QAAM,cAAc,kBAAkB,EAAE,YAAY;AACpD,QAAM,cAAc,mBAAmB,IAAI,KAAK;AAChD,QAAM,aAAa,kBAAkB;AACrC,QAAM,cAAc,cAAc,KAAK,IAAI,KAAK,KAAK,MAAO,aAAa,cAAe,GAAG,CAAC,IAAI;AAEhG,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,OAAO,WAAW,kBAAkB,mBAAmB,eAAe,WAAW,YAAY,CAAC;AAAA,MAC9F,UAAU,WAAW,iBAAiB,kBAAkB,cAAc,UAAU,YAAY,CAAC;AAAA,MAC7F,SAAS,WAAW,kBAAkB,mBAAmB,eAAe,EAAE;AAAA,IAC5E;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,EACF;AACF;AAIA,SAAS,oBAA0C;AACjD,QAAM,WAAW,gBAAgB;AACjC,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,YAAY;AAChB,MAAI;AACF,IAAAD,UAAS,eAAe,EAAE,UAAU,QAAQ,SAAS,IAAK,CAAC;AAC3D,gBAAY;AAAA,EACd,QAAQ;AAAA,EAAC;AAGT,QAAM,SAAsB,CAAC;AAC7B,QAAM,kBAAkBJ,OAAK,UAAU,mBAAmB;AAC1D,MAAI,eAAe;AAEnB,MAAIC,aAAW,eAAe,GAAG;AAC/B,QAAI;AACF,YAAM,QAAQ,KAAK,MAAMI,cAAa,iBAAiB,MAAM,CAAC;AAC9D,iBAAW,KAAK,MAAM,UAAU,CAAC,GAAG;AAClC,eAAO,KAAK;AAAA,UACV,MAAM,EAAE;AAAA,UACR,aAAa,EAAE,gBAAgB,EAAE;AAAA,UACjC,cAAc,EAAE,eAAe,IAAI,MAAM,GAAG,EAAE;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAGA,QAAM,aAAaL,OAAK,UAAU,aAAa;AAC/C,MAAIC,aAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,gBAAgBI,cAAa,YAAY,MAAM;AACrD,YAAM,aAAa,cAAc,MAAM,yBAAyB;AAChE,UAAI,WAAY,gBAAe,WAAW,CAAC;AAAA,IAC7C,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,QAAM,aAAa,kBAAkB;AACrC,QAAM,YAAY,iBAAiB;AACnC,QAAM,cAAc,kBAAkB,EAAE,YAAY;AAGpD,QAAM,SAAS,kBAAkB,QAAQ;AACzC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,OAAO,WAAW,GAAG,GAAG,GAAG,WAAW,YAAY,CAAC;AAAA,QACnD,UAAU,WAAW,GAAG,GAAG,GAAG,UAAU,YAAY,CAAC;AAAA,QACrD,SAAS,WAAW,GAAG,GAAG,GAAG,EAAE;AAAA,MACjC;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,qBAAqB;AAAA,MACrB,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,gBAAgB;AACpB,MAAI,kBAAkB;AACtB,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,eAAe;AAEnB,QAAM,YAAY,KAAK,MAAM,WAAW,QAAQ,IAAI,GAAI;AACxD,QAAM,WAAW,KAAK,MAAM,UAAU,QAAQ,IAAI,GAAI;AAEtD,MAAI;AACF,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,sCAIoB,SAAS;AAAA,sCACT,SAAS;AAAA,sCACT,QAAQ;AAAA,sCACR,QAAQ;AAAA;AAAA;AAG1C,UAAM,SAASD,UAAS,YAAY,MAAM,MAAM,KAAK,KAAK;AAAA,MACxD,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC,EAAE,KAAK;AAER,QAAI,QAAQ;AACV,YAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,sBAAgB,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AAC1C,wBAAkB,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AAC5C,oBAAc,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AACxC,sBAAgB,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AAC1C,mBAAa,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AACvC,qBAAe,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AAAA,IAC3C;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,iCAAiC,OAAO,GAAG,CAAC,EAAE;AAAA,EAC7D;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,OAAO,WAAW,aAAa,GAAG,eAAe,WAAW,YAAY,CAAC;AAAA,MACzE,UAAU,WAAW,YAAY,GAAG,cAAc,UAAU,YAAY,CAAC;AAAA,MACzE,SAAS,WAAW,eAAe,GAAG,iBAAiB,EAAE;AAAA,IAC3D;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,qBAAqB;AAAA,IACrB,aAAa;AAAA,EACf;AACF;AAIA,SAAS,qBAA2C;AAClD,MAAI,YAAY;AAChB,MAAI;AACF,IAAAA,UAAS,gBAAgB,EAAE,UAAU,QAAQ,SAAS,IAAK,CAAC;AAC5D,gBAAY;AAAA,EACd,QAAQ;AAAA,EAAC;AAET,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,aAAa,kBAAkB;AACrC,QAAM,YAAY,iBAAiB;AACnC,QAAM,cAAc,kBAAkB,EAAE,YAAY;AAGpD,QAAM,SAAsB,CAAC;AAC7B,MAAI;AACF,UAAM,UAAUA,UAAS,gBAAgB,EAAE,UAAU,QAAQ,SAAS,IAAK,CAAC,EAAE,KAAK;AACnF,UAAM,UAAUE,cAAa,OAAO;AACpC,UAAM,aAAaN,OAAKO,SAAQA,SAAQ,OAAO,CAAC,GAAG,gBAAgB,WAAW,mBAAmB,QAAQ,OAAO,UAAU,WAAW;AACrI,QAAIN,aAAW,UAAU,GAAG;AAC1B,YAAM,UAAUI,cAAa,YAAY,MAAM;AAC/C,YAAM,QAAQ;AACd,YAAM,OAAO,oBAAI,IAAY;AAC7B,UAAI;AACJ,cAAQ,IAAI,MAAM,KAAK,OAAO,OAAO,MAAM;AACzC,cAAM,CAAC,EAAE,WAAW,IAAI,IAAI;AAC5B,YAAI,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,WAAW,EAAG;AAClD,aAAK,IAAI,IAAI;AACb,eAAO,KAAK;AAAA,UACV;AAAA,UACA,aAAa;AAAA,UACb,aAAa,UAAU,WAAW,UAAU,IAAI,YAAY;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAA0C;AAElD,MAAI,eAAe;AACnB,QAAM,eAAeL,OAAKF,SAAQ,GAAG,WAAW,eAAe;AAC/D,MAAIG,aAAW,YAAY,GAAG;AAC5B,QAAI;AACF,YAAM,WAAW,KAAK,MAAMI,cAAa,cAAc,MAAM,CAAC;AAC9D,UAAI,OAAO,SAAS,UAAU,YAAY,SAAS,MAAM,KAAK,GAAG;AAC/D,uBAAe,SAAS,MAAM,KAAK;AAAA,MACrC;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,OAAO,WAAW,GAAG,GAAG,GAAG,WAAW,YAAY,CAAC;AAAA,MACnD,UAAU,WAAW,GAAG,GAAG,GAAG,UAAU,YAAY,CAAC;AAAA,MACrD,SAAS,WAAW,GAAG,GAAG,GAAG,EAAE;AAAA,IACjC;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,qBAAqB;AAAA,IACrB,aAAa;AAAA,EACf;AACF;AAIO,SAAS,wBAA8C;AAC5D,QAAM,YAA6B,CAAC;AAEpC,QAAM,SAAS,mBAAmB;AAClC,MAAI,OAAQ,WAAU,KAAK,MAAM;AAEjC,QAAM,QAAQ,kBAAkB;AAChC,MAAI,MAAO,WAAU,KAAK,KAAK;AAE/B,QAAM,SAAS,mBAAmB;AAClC,MAAI,OAAQ,WAAU,KAAK,MAAM;AAEjC,SAAO;AAAA,IACL;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACF;;;ACndA,SAAS,cAAAG,cAAY,aAAAC,YAAW,YAAY,iBAAAC,sBAAqB;AACjE,SAAS,kBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,YAAAC,WAAU,WAAAC,UAAS,QAAAC,cAAY;AAEjC,SAAS,oBACd,KACA,OACM;AACN,MAAI,IAAI,cAAc,OAAO,MAAW;AACtC,UAAM,UAAU,EAAE,IAAI,MAAM,KAAK,MAAM;AACvC,QAAI,SAAS,MAAM;AAEnB,QAAI,CAAC,SAAS;AAEZ,YAAM,WAAW,QAAQ;AACzB,YAAM,eAAe,oBAAI,KAAK;AAC9B,mBAAa,WAAW,aAAa,WAAW,IAAI,CAAC;AACrD,YAAM,WAAW,QAAQ,YAAY;AACrC,YAAM,cAAc,oBAAI,IAAI,CAAC,UAAU,QAAQ,CAAC;AAEhD,eAAS,MAAM,OAAO,OAAO,CAAC,MAAM;AAClC,YAAI,CAAC,EAAE,aAAc,QAAO;AAC5B,eAAO,YAAY,IAAI,EAAE,YAAY;AAAA,MACvC,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,KAAK;AAAA,MACZ,GAAG;AAAA,MACH;AAAA,MACA,cAAc,wBAAwB,MAAM;AAAA,MAC5C,SAAS,eAAe,MAAM;AAAA,MAC9B,SAAS,UAAU,QAAQ;AAAA,MAC3B,cAAc,MAAM,OAAO;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AAED,MAAI;AAAA,IAAI;AAAA,IAAe,OAAO,MAC5B,EAAE,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,aAAa,MAAM;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,MAAI,IAAI,kBAAkB,OAAO,MAAW;AAC1C,UAAM,YAAY,yBAAyB;AAC3C,WAAO,EAAE,KAAK,EAAE,UAAU,CAAC;AAAA,EAC7B,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,MAAW;AAC5C,WAAO,EAAE,KAAK,yBAAyB,MAAM,MAAM,CAAC;AAAA,EACtD,CAAC;AAED,MAAI,IAAI,wBAAwB,OAAO,MAAW;AAChD,QAAI;AACF,YAAM,QAAQ,sBAAsB;AACpC,aAAO,EAAE,KAAK,KAAK;AAAA,IACrB,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,mCAAmC;AAChE,aAAO,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,GAAG,GAAG;AAAA,IACtC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,sBAAsB,OAAO,MAAW;AAC/C,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,aAAO,KAAK,EAAE,QAAQ,QAAQ,SAAS,IAAI,SAAS,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,+BAA+B;AACrG,YAAM,QAAQ,uBAAuB,SAAS,MAAM,QAAQ,MAAM,OAAO,aAAa;AAGtF,YAAM,aAAa,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,SAAqB,CAAC;AACjF,UAAI,WAAW,QAAQ;AACrB,cAAM,iBAAiBA,OAAK,kBAAkB,MAAM,EAAE;AACtD,QAAAL,WAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAC7C,cAAM,aAAuB,CAAC;AAC9B,mBAAW,YAAY,YAAY;AACjC,cAAI,OAAO,aAAa,YAAYD,aAAW,QAAQ,GAAG;AACxD,kBAAM,OAAOM,OAAK,gBAAgBF,UAAS,QAAQ,CAAC;AACpD,gBAAI;AAAE,yBAAW,UAAU,IAAI;AAAG,yBAAW,KAAK,IAAI;AAAA,YAAG,QAAQ;AAAE,yBAAW,KAAK,QAAQ;AAAA,YAAG;AAAA,UAChG;AAAA,QACF;AACA,YAAI,WAAW,OAAQ,OAAM,SAAS;AAAA,MACxC;AAEA,YAAM,OAAO,KAAK,KAAK;AACvB,qBAAe,MAAM,EAAE;AACvB,eAAS,OAAO,MAAM,IAAI,QAAQ,SAAS,MAAM,UAAU,mBAAmB;AAC9E,UAAI,MAAM,MAAM;AACd,iBAAS,OAAO,MAAM,IAAI,QAAQ,SAAS,MAAM,KAAK,MAAM,MAAM,uBAAuB,MAAM,KAAK,mBAAmB,GAAG;AAAA,MAC5H;AACA,YAAM,aAAa,KAAK;AACxB,oBAAc;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,MAAM,GAAG,GAAG;AAAA,IACxC,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,KAAK,yBAAyB,OAAO,MAAW;AAClD,UAAM,UAAU,WAAW,CAAC;AAC5B,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAAA,IAClE;AAEA,UAAM,QAAQG,WAAU,OAAO,OAAO;AACtC,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,kBAAkB,GAAG,GAAG;AAAA,IAC5D;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,aAAO,KAAK,EAAE,SAAS,YAAY,MAAM,YAAY,aAAa,QAAQ,MAAM,GAAG,kCAAkC;AACrH,YAAM,iBAAiB,OAAO,OAAO,OAAO;AAC5C,YAAM,aAAa,KAAK;AACxB,oBAAc;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,IACnC,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,KAAK,yBAAyB,OAAO,MAAW;AAClD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,kCAAkC;AAC1E,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,gBAAgB,IAAI,MAAM,KAAK,GAAG;AACpC,cAAM,qBAAqB,OAAO,UAAU,yBAAyB;AAAA,MACvE,OAAO;AACL,cAAM,YAAY;AAClB,cAAM,cAAc;AACpB,cAAM,YAAY,IAAI;AAAA,MACxB;AACA,eAAS,OAAO,MAAM,IAAI,UAAU,8BAA8B,MAAM,EAAE,GAAG;AAAA,IAC/E,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,0BAA0B,OAAO,MAAW;AACnD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,mCAAmC;AAC3E,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AAEjD,YAAM,UAAU,MAAM,gBAAgB,aAAa,MAAM,aAAa,IAAI;AAC1E,UAAI,SAAS;AACX,YAAI;AACF,kBAAQ,KAAK,CAAC,QAAQ,KAAK,SAAS;AACpC,iBAAO,KAAK,EAAE,KAAK,QAAQ,KAAK,SAAS,MAAM,GAAG,GAAG,2CAA2C;AAAA,QAClG,QAAQ;AACN,cAAI;AAAE,oBAAQ,KAAK,QAAQ,KAAK,SAAS;AAAA,UAAG,QAAQ;AAAA,UAAC;AAAA,QACvD;AAAA,MACF;AACA,YAAM,kBAAkB;AACxB,YAAM,qBAAqB,OAAO,aAAa,0BAA0B;AACzE,eAAS,OAAO,MAAM,IAAI,UAAU,+BAA+B,MAAM,EAAE,GAAG;AAAA,IAChF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,2BAA2B,OAAO,MAAW;AACpD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,oCAAoC;AAC5E,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,MAAM,UAAU,YAAY;AAC9B,cAAM,IAAI,MAAM,iCAAiC,MAAM,KAAK,wBAAwB;AAAA,MACtF;AACA,YAAM,qBAAqB,OAAO,WAAW,qBAAqB,MAAM,UAAU,wBAAwB;AAC1G,eAAS,OAAO,MAAM,IAAI,SAAS,wBAAmB,MAAM,UAAU,oBAAoB;AAAA,IAC5F,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,2BAA2B,OAAO,MAAW;AACpD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,oCAAoC;AAC5E,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,MAAM,UAAU,WAAW;AAC7B,cAAM,IAAI,MAAM,iCAAiC,MAAM,KAAK,uBAAuB;AAAA,MACrF;AACA,YAAM,qBAAqB,OAAO,UAAU,2BAA2B,MAAM,UAAU,GAAG;AAC1F,eAAS,OAAO,MAAM,IAAI,SAAS,4BAAuB,MAAM,UAAU,mBAAmB;AAC7F,oBAAc;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,0BAA0B,OAAO,MAAW;AACnD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,mCAAmC;AAC3E,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,MAAM,mBAAmB,YAAY;AACvC,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AACA,UAAI,gBAAgB,IAAI,MAAM,KAAK,GAAG;AACpC,cAAM,IAAI,MAAM,yCAAyC,MAAM,KAAK,GAAG;AAAA,MACzE;AACA,UAAI,MAAM,UAAU,aAAa,MAAM,UAAU,eAAe,MAAM,UAAU,UAAU;AACxF,cAAM,IAAI,MAAM,0BAA0B,MAAM,KAAK,yDAAoD;AAAA,MAC3G;AACA,oBAAc,KAAK;AACnB,oBAAc;AACd,eAAS,OAAO,MAAM,IAAI,UAAU,wBAAwB,MAAM,UAAU,wBAAmB,MAAM,WAAW,GAAG;AAAA,IACrH,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,yBAAyB,OAAO,MAAW;AAClD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,kCAAkC;AAC1E,QAAI;AACF,YAAM,UAAU,WAAW,CAAC;AAC5B,UAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC9E,YAAM,QAAQA,WAAU,OAAO,OAAO;AACtC,UAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,GAAG,GAAG;AACvE,UAAI,CAAC,CAAC,QAAQ,aAAa,UAAU,EAAE,SAAS,MAAM,KAAK,GAAG;AAC5D,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,SAAS,MAAM,UAAU,gBAAgB,MAAM,KAAK,iEAAiE,GAAG,GAAG;AAAA,MAC/J;AAEA,UAAI,MAAM,UAAU,eAAe,MAAM,UAAU,YAAY;AAC7D,cAAM,qBAAqB,OAAO,QAAQ,8BAA8B;AACxE,iBAAS,OAAO,MAAM,IAAI,SAAS,GAAG,MAAM,UAAU,8CAAyC;AAAA,MACjG;AACA,YAAM,KAAK,MAAM,gBAAgB,MAAM;AACvC,UAAI,CAAC,MAAM,CAACP,aAAW,EAAE,GAAG;AAC1B,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,qCAAqC,GAAG,GAAG;AAAA,MAC/E;AAEA,UAAI,MAAM,cAAc,MAAM,YAAY;AACxC,YAAI;AACF,gBAAMQ,QAAOL;AAAA,YACX,yBAAyB,MAAM,UAAU,QAAQ,MAAM,UAAU;AAAA,YACjE,EAAE,UAAU,QAAQ,KAAK,aAAa,OAAO,QAAQ,SAAS,IAAO;AAAA,UACvE;AACA,gBAAM,WAAWK,MAAK,MAAM,iBAAiB;AAC7C,gBAAM,WAAWA,MAAK,MAAM,gBAAgB;AAC5C,gBAAM,aAAaA,MAAK,MAAM,YAAY;AAC1C,gBAAM,aAAa,WAAW,SAAS,SAAS,CAAC,GAAG,EAAE,IAAI;AAC1D,gBAAM,eAAe,WAAW,SAAS,SAAS,CAAC,GAAG,EAAE,IAAI;AAC5D,gBAAM,eAAe,aAAa,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI;AAAA,QAClE,QAAQ;AAAA,QAAqB;AAAA,MAC/B;AAIA,UAAI;AACF,cAAM,cAAcL,UAAS,iCAAiC,EAAE,KAAK,aAAa,UAAU,QAAQ,OAAO,OAAO,CAAC,EAAE,KAAK;AAC1H,cAAM,WAAWA,UAAS,wBAAwB,EAAE,KAAK,aAAa,UAAU,QAAQ,OAAO,OAAO,CAAC,EAAE,KAAK;AAC9G,YAAI,eAAe,CAAC,UAAU;AAE5B,UAAAA,UAAS,yBAAyB,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AACrE,iBAAO,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG,uDAAuD;AAAA,QAC5F;AAAA,MACF,QAAQ;AAAA,MAAqB;AAE7B,YAAM,SAAS,eAAe,KAAK;AACnC,YAAM,cAAc;AAAA,QAClB,QAAQ,OAAO,OAAO;AAAA,QACtB,SAAS,OAAO,QAAQ;AAAA,QACxB,SAAS,OAAO,QAAQ;AAAA,QACxB,WAAW,OAAO,UAAU;AAAA,MAC9B;AACA,UAAI,OAAO,UAAU,WAAW,GAAG;AACjC,cAAM,WAAW,IAAI;AACrB,YAAI,CAAC,MAAM,aAAc,OAAM,eAAe;AAE9C,YAAI,MAAM,eAAe;AACvB,cAAI;AACF,kBAAM,eAAe,MAAM,IAAI,OAAO,KAAK;AAC3C,kBAAM,gBAAgB;AACtB,kBAAM,eAAe;AAAA,UACvB,QAAQ;AAAA,UAAqB;AAAA,QAC/B;AAAA,MACF;AACA,YAAM,cAAc,OAAO,UAAU,SAAS,IAC1C,IAAI,OAAO,UAAU,MAAM,iBAAiB,OAAO,UAAU,KAAK,IAAI,CAAC,MACvE;AACJ,eAAS,OAAO,MAAM,IAAI,SAAS,qBAAqB,OAAO,OAAO,MAAM,oBAAoB,OAAO,QAAQ,MAAM,YAAY,WAAW,EAAE;AAC9I,UAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,iBAAS,OAAO,MAAM,IAAI,SAAS,oBAAoB,OAAO,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,MACtF;AACA,YAAM,aAAa,KAAK;AACxB,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC;AAAA,IACvC,SAAS,OAAO;AACd,YAAM,UAAU,WAAW,CAAC;AAC5B,aAAO,MAAM,iCAAiC,WAAW,WAAW,KAAK,OAAO,KAAK,CAAC,EAAE;AACxF,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACxD;AAAA,EACF,CAAC;AAED,MAAI,KAAK,uBAAuB,OAAO,MAAW;AAChD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,gCAAgC;AACxE,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,CAAC,CAAC,aAAa,UAAU,EAAE,SAAS,MAAM,KAAK,GAAG;AACpD,cAAM,IAAI,MAAM,wCAAwC,MAAM,KAAK,GAAG;AAAA,MACxE;AACA,UAAI,CAAC,MAAM,YAAY;AACrB,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,UAAI;AACF,QAAAA;AAAA,UACE,uBAAuB,MAAM,UAAU;AAAA,UACvC,EAAE,UAAU,QAAQ,KAAK,aAAa,OAAO,QAAQ,SAAS,IAAO;AAAA,QACvE;AAAA,MACF,SAAS,KAAU;AACjB,cAAM,MAAM,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG;AAClD,cAAM,IAAI,MAAM,8BAA8B,GAAG,EAAE;AAAA,MACrD;AACA,eAAS,OAAO,MAAM,IAAI,UAAU,wDAAwD,MAAM,UAAU,EAAE;AAAA,IAChH,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,8BAA8B,OAAO,MAAW;AACvD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,uCAAuC;AAC/E,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI;AACF,QAAAA,UAAS,yBAAyB,EAAE,KAAK,aAAa,OAAO,QAAQ,SAAS,KAAO,CAAC;AACtF,QAAAA,UAAS,iBAAiB,EAAE,KAAK,aAAa,OAAO,QAAQ,SAAS,KAAO,CAAC;AAAA,MAChF,SAAS,KAAU;AACjB,cAAM,MAAM,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG;AAClD,cAAM,IAAI,MAAM,2BAA2B,GAAG,EAAE;AAAA,MAClD;AACA,eAAS,OAAO,MAAM,IAAI,UAAU,uDAAuD;AAAA,IAC7F,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,4BAA4B,OAAO,MAAW;AACrD,WAAO,KAAK,EAAE,SAAS,WAAW,CAAC,EAAE,GAAG,qCAAqC;AAC7E,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,CAAC,CAAC,aAAa,YAAY,MAAM,EAAE,SAAS,MAAM,KAAK,GAAG;AAC5D,cAAM,IAAI,MAAM,kCAAkC,MAAM,KAAK,4CAA4C;AAAA,MAC3G;AACA,UAAI,MAAM,eAAe;AACvB,YAAI;AACF,gBAAM,eAAe,MAAM,IAAI,OAAO,KAAK;AAC3C,gBAAM,gBAAgB;AACtB,gBAAM,eAAe;AAAA,QACvB,SAAS,OAAO;AACd,iBAAO,KAAK,EAAE,KAAK,MAAM,GAAG,sDAAsD,MAAM,EAAE,EAAE;AAAA,QAC9F;AAAA,MACF;AACA,YAAM,qBAAqB,OAAO,UAAU,8CAAyC;AACrF,eAAS,OAAO,MAAM,IAAI,UAAU,GAAG,MAAM,UAAU,4CAA4C;AACnG,oBAAc;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,0BAA0B,OAAO,MAAW;AACnD,QAAI;AACF,YAAM,UAAU,WAAW,CAAC;AAC5B,UAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC9E,YAAM,QAAQI,WAAU,OAAO,OAAO;AACtC,UAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,GAAG,GAAG;AAEvE,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ,MAAM,WAAW,GAAG;AAC/D,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,qBAAqB,GAAG,GAAG;AAAA,MAC/D;AAEA,YAAM,iBAAiBD,OAAK,kBAAkB,MAAM,EAAE;AACtD,MAAAL,WAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAC7C,YAAM,WAAqB,CAAC;AAC5B,iBAAW,QAAQ,QAAQ,OAAO;AAChC,YAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,KAAM;AACjD,cAAM,UAAUI,SAAQ,KAAK,IAAI,EAAE,QAAQ,gBAAgB,EAAE,EAAE,MAAM,GAAG,EAAE,KAAK;AAC/E,cAAM,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO;AAC1C,cAAM,OAAOC,OAAK,gBAAgB,QAAQ;AAC1C,QAAAJ,eAAc,MAAM,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC;AACpD,iBAAS,KAAK,IAAI;AAAA,MACpB;AAEA,YAAM,SAAS,CAAC,GAAI,MAAM,UAAU,CAAC,GAAI,GAAG,QAAQ;AACpD,YAAM,YAAY,IAAI;AACtB,qBAAe,MAAM,EAAE;AACvB,YAAM,aAAa,KAAK;AACxB,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,UAAU,MAAM,CAAC;AAAA,IACpD,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,iCAAiC;AAC9D,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,IAAI,oCAAoC,OAAO,MAAW;AAC5D,QAAI;AACF,YAAM,UAAU,WAAW,CAAC;AAC5B,UAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC9E,YAAM,WAAW,EAAE,IAAI,QAAQ,UAAU,KAAK,EAAE,IAAI,QAAQ,YAAY;AACxE,UAAI,CAAC,SAAU,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC/E,YAAM,WAAWE,UAAS,QAAQ;AAClC,YAAM,WAAWE,OAAK,kBAAkB,SAAS,QAAQ;AACzD,UAAI,CAACN,aAAW,QAAQ,EAAG,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,GAAG,GAAG;AACtF,YAAM,MAAMK,SAAQ,QAAQ,EAAE,YAAY;AAC1C,YAAM,UAAkC;AAAA,QACtC,QAAQ;AAAA,QAAa,QAAQ;AAAA,QAAc,SAAS;AAAA,QACpD,QAAQ;AAAA,QAAa,SAAS;AAAA,QAAc,QAAQ;AAAA,MACtD;AACA,YAAM,OAAO,QAAQ,GAAG,KAAK;AAC7B,YAAM,EAAE,cAAAI,eAAa,IAAI,MAAM,OAAO,IAAS;AAC/C,YAAM,OAAOA,eAAa,QAAQ;AAClC,aAAO,IAAI,SAAS,MAAM,EAAE,SAAS,EAAE,gBAAgB,MAAM,iBAAiB,yBAAyB,EAAE,CAAC;AAAA,IAC5G,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,KAAK,gBAAgB,OAAO,MAAW;AACzC,aAAS,OAAO,QAAW,UAAU,mCAAmC;AACxE,UAAM,aAAa,KAAK;AACxB,WAAO,EAAE,KAAK,EAAE,QAAQ,MAAM,aAAa,IAAI,EAAE,GAAG,GAAG;AAAA,EACzD,CAAC;AACH;;;ACjaA,SAAS,OAAAC,YAAW;AACpB,SAAS,cAAAC,cAAY,aAAa,gBAAAC,eAAc,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC7E,SAAS,SAAAC,cAAa;AACtB,SAAS,cAAc;AACvB,SAAS,QAAAC,cAAY;AAqBrB,SAAS,mBACP,UACA,QACQ;AACR,SAAO,oBAAoB,UAAU,OAAO,gBAAgB,IAAI,IAAI,EAAE;AACxE;AAEA,eAAeC,aAAY,OAAyB,OAAe,aAAqB,WAAoB,QAAoC;AAC9I,QAAMC,WAAU;AAAA,IACd,OAAO,SAAS;AAAA,IAChB,aAAa,eAAe;AAAA,IAC5B,WAAW,aAAa;AAAA,IACxB,QAAQ,QAAQ,SAAS,SAAS;AAAA,EACpC;AAEA,MAAI,UAAU,SAAS;AACrB,WAAO,aAAa,wBAAwBA,QAAO;AAAA,EACrD;AAEA,SAAO,aAAa,8BAA8BA,QAAO;AAC3D;AAEA,SAAS,oBAAoB,KAAa,eAAyC;AACjF,QAAM,OAAO,IAAI,KAAK;AACtB,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,aAAa;AAAA,IACjB,KAAK,MAAM,kCAAkC,IAAI,CAAC,GAAG,KAAK,KAAK;AAAA,EACjE;AACA,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,eAAe,WAAW,aAAa;AACrD,QAAI,MAAO,QAAO;AAAA,EACpB;AAEA,QAAM,aAAa,KAAK,KAAK;AAC7B,QAAM,UAAU,WAAW,QAAQ,YAAY,EAAE,EAAE,KAAK;AACxD,MAAI,SAAS;AACX,UAAM,oBAAoB,mBAAmB,OAAO;AACpD,eAAW,aAAa,mBAAmB;AACzC,YAAM,QAAQ,eAAe,WAAW,aAAa;AACrD,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,QAAQ,kBAAkB,EAAE,EAAE,KAAK;AAC/D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,eAAyC;AAC5E,QAAM,YAAY,IAAI,KAAK;AAC3B,MAAI,CAAC,UAAW,QAAO;AAEvB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,SAAS;AAMnC,UAAM,QACJ,OAAO,OAAO,UAAU,WAAW,OAAO,MAAM,KAAK,IACrD,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,KAAK,IACnD;AACF,UAAM,QAAQ,OAAO;AACrB,UAAM,gBAAgB,WAAW,KAAK,KAAK;AAC3C,QAAI,SAAS,CAAC,kBAAkB,CAAC,SAAS,UAAU,gBAAgB;AAClE,aAAO;AAAA,IACT;AACA,QAAI,OAAO,OAAO,WAAW,UAAU;AACrC,YAAM,SAAS,OAAO,OAAO,KAAK;AAClC,UAAI,QAAQ;AACV,cAAM,cAAc,OAAO,QAAQ,6BAA6B,EAAE,EAAE,KAAK;AACzE,mBAAW,mBAAmB,mBAAmB,WAAW,GAAG;AAC7D,gBAAM,eAAe,eAAe,iBAAiB,aAAa;AAClE,cAAI,aAAc,QAAO;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,YAAoB,UAA0B;AACxE,MAAIP,aAAW,UAAU,GAAG;AAC1B,QAAI;AACF,aAAOC,cAAa,YAAY,MAAM,EAAE,KAAK;AAAA,IAC/C,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,mBACb,SACA,UACA,QACA,OACA,aACA,OACA,WACA,QACiB;AACjB,QAAM,UAAU,YAAYI,OAAK,OAAO,GAAG,iBAAiB,CAAC;AAC7D,QAAM,aAAaA,OAAK,SAAS,0BAA0B;AAC3D,QAAM,mBAAmBA,OAAK,SAAS,mBAAmB;AAC1D,QAAM,aAAaA,OAAK,SAAS,mBAAmB;AACpD,EAAAF,eAAc,YAAY,GAAG,MAAM;AAAA,GAAM,MAAM;AAC/C,EAAAA,eAAc,kBAAkB,KAAK,UAAU,EAAE,OAAO,aAAa,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM;AAG9F,MAAI,mBAAmB;AACvB,MAAI,aAAa,WAAW,QAAQ,QAAQ;AAC1C,UAAM,aAAa,OAAO,IAAI,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,GAAG;AAC/D,uBAAmB,QAAQ,QAAQ,2BAA2B,GAAG,UAAU,0BAA0B;AAAA,EACvG;AAEA,QAAM,WAAW;AAAA,IACf,GAAGJ;AAAA,IACH,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,GAAI,QAAQ,SAAS,EAAE,oBAAoB,OAAO,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,EACnE;AAEA,SAAO,MAAM,IAAI,QAAQ,CAACS,UAAS,WAAW;AAC5C,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,SAAS;AACb,QAAI,UAAU;AAEd,UAAM,QAAQJ,OAAM,kBAAkB;AAAA,MACpC,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACP,CAAC;AAED,QAAI,MAAM,MAAO,OAAM,MAAM,IAAI;AAEjC,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,eAAS,eAAe,QAAQ,OAAO,KAAK,GAAG,IAAM;AAAA,IACvD,CAAC;AACD,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,eAAS,eAAe,QAAQ,OAAO,KAAK,GAAG,IAAM;AAAA,IACvD,CAAC;AAED,UAAM,QAAQ,WAAW,MAAM;AAC7B,gBAAU;AACV,YAAM,KAAK,SAAS;AAAA,IACtB,GAAG,KAAK,IAAI,WAAW,GAAK,CAAC;AAE7B,UAAM,GAAG,SAAS,MAAM;AACtB,mBAAa,KAAK;AAClB,MAAAF,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAChD,aAAO,IAAI,MAAM,+BAA+B,CAAC;AAAA,IACnD,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,mBAAa,KAAK;AAElB,UAAI,SAAS;AACX,QAAAA,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAChD,eAAO,IAAI,MAAM,iCAAiC,KAAK,IAAI,IAAI,SAAS,KAAK,CAAC;AAC9E;AAAA,MACF;AAEA,YAAM,gBAAgB,mBAAmB,YAAY,MAAM;AAC3D,MAAAA,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAEhD,UAAI,SAAS,GAAG;AACd,cAAM,iBAAiB,eAAe,eAAe,IAAI,IAAM;AAC/D,cAAM,SAAS,eAAe,KAAK,IAC/B,4BAA4B,eAAe,MAAM,GAAG,IAAI,CAAC,KACzD;AACJ,eAAO,IAAI,MAAM,gCAAgC,QAAQ,SAAS,KAAK,MAAM,EAAE,CAAC;AAChF;AAAA,MACF;AACA,MAAAM,SAAQ,aAAa;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,kBACpB,SACA,QACA,qBACwB;AACxB,QAAM,QAA0B,QAAQ,UAAU,gBAAgB,gBAAgB;AAClF,QAAM,QAAQ,OAAO,QAAQ,UAAU,WAAW,QAAQ,MAAM,KAAK,IAAI;AACzE,QAAM,cAAc,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,YAAY,KAAK,IAAI;AAC3F,QAAM,YAAY,OAAO,QAAQ,cAAc,WAAW,QAAQ,UAAU,KAAK,IAAI;AACrF,QAAM,oBAAoB;AAAA,IACxB,OAAO,QAAQ,sBAAsB,WAAW,QAAQ,oBAAoB,QAAQ,YAAY,OAAO;AAAA,EACzG;AACA,QAAM,YAAY,yBAAyB;AAC3C,QAAM,eAAe,IAAI,IAAI,UAAU,OAAO,CAAC,UAAU,MAAM,SAAS,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACpG,QAAM,mBAA6B,CAAC;AACpC,QAAM,cAAc,CAAC,cAAsB;AACzC,QAAI,aAAa,IAAI,SAAS,KAAK,CAAC,iBAAiB,SAAS,SAAS,GAAG;AACxE,uBAAiB,KAAK,SAAS;AAAA,IACjC;AAAA,EACF;AAEA,cAAY,iBAAiB;AAE7B,aAAW,SAAS,WAAW;AAC7B,QAAI,MAAM,UAAW,aAAY,MAAM,IAAI;AAAA,EAC7C;AAEA,MAAI,CAAC,iBAAiB,QAAQ;AAC5B,UAAM,QAAQ,UAAU,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,IAAI,MAAM,YAAY,cAAc,SAAS,EAAE,EAAE,KAAK,IAAI;AAC9G,UAAM,IAAI,MAAM,sDAAsD,KAAK,EAAE;AAAA,EAC/E;AAEA,QAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI;AAClH,QAAM,SAAS,MAAMF,aAAY,OAAO,OAAO,aAAa,WAAW,MAAM;AAC7E,QAAM,SAAmB,CAAC;AAG1B,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN,YAAY;AAAA,MACV,OAAO,EAAE,MAAM,SAAkB;AAAA,MACjC,OAAO,EAAE,MAAM,SAAkB;AAAA,IACnC;AAAA,IACA,UAAU,CAAC,SAAS,OAAO;AAAA,IAC3B,sBAAsB;AAAA,EACxB;AAEA,aAAW,oBAAoB,kBAAkB;AAE/C,UAAM,UAAU,mBAAmB,kBAAkB,MAAM;AAC3D,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,aAAa,gBAAgB,mBAAmB;AAC5D;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AACA,aAAO,KAAK,EAAE,UAAU,kBAAkB,OAAO,WAAW,OAAO,MAAM,GAAG,GAAI,EAAE,GAAG,oBAAoB;AACzG,YAAM,QAAQ,oBAAoB,QAAQ,KAAK;AAC/C,aAAO,KAAK,EAAE,UAAU,kBAAkB,OAAO,aAAa,MAAM,GAAG,sBAAsB;AAC7F,aAAO,EAAE,OAAO,OAAO,UAAU,iBAAiB;AAAA,IACpD,SAAS,OAAO;AACd,aAAO;AAAA,QACL,aAAa,gBAAgB,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kCAAkC,OAAO,KAAK,KAAK,CAAC,EAAE;AACxE;;;AC3RO,SAAS,mBACd,KACA,OACM;AACN,MAAI,IAAI,yBAAyB,OAAO,MAAW;AACjD,UAAM,UAAU,MAAM,oBAAoB;AAC1C,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,CAAC;AAAA,EACrC,CAAC;AAED,MAAI,KAAK,sBAAsB,OAAO,MAAW;AAC/C,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,QAAQ,cAAc,QAAQ,KAAK;AACzC,YAAM,cAAc,cAAc,QAAQ,WAAW;AACrD,YAAM,UAAU,MAAM,kBAAkB,OAAO,WAAW;AAC1D,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,CAAC;AAAA,IACrC,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,KAAK,0BAA0B,OAAO,MAAW;AACnD,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,QAAQ,cAAc,QAAQ,KAAK;AACzC,YAAM,cAAc,cAAc,QAAQ,WAAW;AACrD,UAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,qBAAqB,GAAG,GAAG;AACzE,aAAO,KAAK,EAAE,OAAO,MAAM,MAAM,GAAG,EAAE,EAAE,GAAG,mCAAmC;AAC9E,YAAM,SAAS,MAAM,aAAa,OAAO,aAAa,MAAM,QAAQ,IAAI;AACxE,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,IACpE,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,2BAA2B,OAAO,KAAK,CAAC,EAAE;AACvE,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,KAAK,uBAAuB,OAAO,MAAW;AAChD,UAAM,qBAAqB;AAC3B,WAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,EAC5B,CAAC;AAGD,MAAI,KAAK,oBAAoB,OAAO,MAAW;AAC7C,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,QAAQ,cAAc,QAAQ,KAAK;AACzC,YAAM,cAAc,cAAc,QAAQ,WAAW;AACrD,UAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,qBAAqB,GAAG,GAAG;AACzE,YAAM,SAAS,MAAM,aAAa,OAAO,aAAa,MAAM,QAAQ,IAAI;AACxE,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,IACpE,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,2BAA2B,OAAO,KAAK,CAAC,EAAE;AACvE,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,KAAK,wBAAwB,OAAO,MAAW;AACjD,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,MAAM,UAAU,YAAY;AAC9B,cAAM,IAAI,MAAM,8BAA8B,MAAM,KAAK,wBAAwB;AAAA,MACnF;AACA,UAAI,MAAM,mBAAmB,YAAY;AACvC,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAChD,YAAM,OAAO,KAAK,SAAS;AAG3B,+BAAyB,OAAO,MAAM,QAAQ,MAAM;AAAA,QAClD,UAAU,CAAC,SAAS,MAAM,YAAY,SAAS,OAAO,SAAS,MAAa,OAAO;AAAA,QACnF,cAAc,MAAM,aAAa,KAAK;AAAA,QACtC,YAAY,CAAC,KAAK,UAAU,eAAe,KAAK,KAAK;AAAA,QACrD,kBAAkB,CAAC,KAAK,SAAS,qBAAqB,KAAK,IAAI;AAAA,MACjE,GAAG,EAAE,KAAK,CAAC;AAEX,eAAS,OAAO,MAAM,IAAI,YAAY,GAAG,OAAO,cAAc,MAAM,2BAA2B,MAAM,UAAU,GAAG;AAAA,IACpH,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,+BAA+B,OAAO,MAAW;AACxD,WAAO,iBAAiB,OAAO,GAAG,OAAO,UAAU;AACjD,UAAI,MAAM,UAAU,YAAY;AAC9B,cAAM,IAAI,MAAM,yCAAyC,MAAM,KAAK,wBAAwB;AAAA,MAC9F;AACA,UAAI,CAAC,MAAM,MAAM;AACf,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AACA,UAAI,MAAM,mBAAmB,YAAY;AACvC,cAAM,IAAI,MAAM,yDAAyD;AAAA,MAC3E;AACA,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAChD,YAAM,WAAW,OAAO,KAAK,aAAa,WAAW,KAAK,SAAS,KAAK,IAAI;AAC5E,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAGA,6BAAuB,OAAO,UAAU,MAAM,QAAQ,MAAM;AAAA,QAC1D,UAAU,CAAC,SAAS,MAAM,YAAY,SAAS,OAAO,SAAS,MAAa,OAAO;AAAA,QACnF,cAAc,MAAM,aAAa,KAAK;AAAA,QACtC,YAAY,CAAC,KAAK,UAAU,eAAe,KAAK,KAAK;AAAA,QACrD,kBAAkB,CAAC,KAAK,SAAS;AAC/B,cAAI,KAAK,gBAAgB,OAAQ,KAAI,QAAQ,KAAK;AAClD,cAAI,KAAK,iBAAiB,OAAQ,KAAI,SAAS,KAAK;AACpD,cAAI,KAAK,gBAAiB,KAAI,SAAS,KAAK;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,eAAS,OAAO,MAAM,IAAI,YAAY,+BAA+B,MAAM,UAAU,GAAG;AAAA,IAC1F,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,uBAAuB,OAAO,MAAW;AAChD,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,QAAQ,QAAQ,UAAU,gBAAgB,gBAAgB,QAAQ,UAAU,UAAU,UAAU;AACtG,UAAI,CAAC,OAAO;AACV,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,oDAAoD,GAAG,GAAG;AAAA,MAC9F;AAEA,YAAM,QAAQ,cAAc,QAAQ,KAAK;AACzC,YAAM,cAAc,cAAc,QAAQ,WAAW;AACrD,YAAM,WAAW,cAAc,QAAQ,UAAU,MAAM,OAAO,aAAa;AAC3E,YAAM,YAAY,cAAc,QAAQ,SAAS;AACjD,YAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,OAAO,CAAC,MAA4B,OAAO,MAAM,QAAQ,IAAI;AAE3H,YAAM,SAAS,MAAM;AAAA,QACnB,EAAE,OAAO,OAAO,aAAa,WAAW,QAAQ,SAAS;AAAA,QACzD,MAAM;AAAA,QACN;AAAA,MACF;AAEA,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,UAAU,OAAO,SAAS,CAAC;AAAA,IACjG,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,yBAAyB,OAAO,KAAK,CAAC,EAAE;AACrE,aAAO,EAAE;AAAA,QACP,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC9IO,IAAM,8BAA8B;AACpC,IAAM,gCAAgC;AACtC,IAAM,gCAAgC;AACtC,IAAM,kCAAkC;AACxC,IAAM,uBAAuB;AAC7B,IAAM,4BAA4B;AAClC,IAAM,0CAA0C;AAChD,IAAM,4BAA4B;AAClC,IAAM,qCAAqC;AAC3C,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAClC,IAAM,gCAAgC;AAGtC,IAAM,6BAA6B;AAE1C,eAAsB,sBAAuD;AAC3E,SAAO,sBAAsB;AAC/B;AAEO,IAAM,6BAA6B,oBAAI,IAAY;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,0BAA0B,oBAAI,IAAqB,CAAC,OAAO,UAAU,QAAQ,YAAY,CAAC;AAEhG,SAAS,oBAAoB,OAA+B;AAC1D,QAAM,SAAS,OAAO,UAAU,WAC5B,QACA,OAAO,SAAS,OAAO,SAAS,EAAE,GAAG,EAAE;AAC3C,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,6BAA6B,OAA+C;AACnF,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,QAAM,SAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,KAAmB,GAAG;AACjE,UAAM,QAAQ,oBAAoB,QAAQ;AAC1C,QAAI,CAAC,SAAS,QAAQ,EAAG;AACzB,UAAM,gBAAgB,IAAI,KAAK,EAAE,YAAY;AAC7C,QAAI,CAAC,cAAe;AACpB,WAAO,aAAa,IAAI;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA6C;AAC5E,SAAO,OAAO,UAAU,YAAY,wBAAwB,IAAI,KAAwB,IACpF,QACA;AACN;AAEA,SAAS,sBAAsB,OAAqC;AAClE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,QAAM,MAAM;AACZ,QAAM,OAAqB,CAAC;AAC5B,QAAM,OAAkC,CAAC,WAAW,WAAW,YAAY,UAAU;AAErF,aAAW,OAAO,MAAM;AACtB,UAAM,SAAS,wBAAwB,IAAI,GAAG,CAAC;AAC/C,QAAI,QAAQ;AACV,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC;AAChD;AAEA,SAAS,2BACP,QACA,QACwB;AACxB,QAAM,YAAY,IAAI;AACtB,SAAO;AAAA,IACL,EAAE,IAAI,6BAA6B,OAAO,WAAW,OAAO,OAAO,gBAAgB,QAAQ,UAAU;AAAA,IACrG,EAAE,IAAI,+BAA+B,OAAO,WAAW,OAAO,OAAO,mBAAmB,QAAQ,UAAU;AAAA,IAC1G,EAAE,IAAI,+BAA+B,OAAO,WAAW,OAAO,OAAO,kBAAkB,QAAQ,UAAU;AAAA,IACzG,EAAE,IAAI,iCAAiC,OAAO,WAAW,OAAO,OAAO,oBAAoB,QAAQ,UAAU;AAAA,IAC7G,EAAE,IAAI,sBAAsB,OAAO,WAAW,OAAO,OAAO,UAAU,QAAQ,UAAU;AAAA,IACxF,EAAE,IAAI,2BAA2B,OAAO,WAAW,OAAO,OAAO,cAAc,QAAQ,UAAU;AAAA,IACjG;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,IACA,EAAE,IAAI,2BAA2B,OAAO,WAAW,OAAO,OAAO,cAAc,QAAQ,UAAU;AAAA,IACjG,EAAE,IAAI,oCAAoC,OAAO,WAAW,OAAO,OAAO,sBAAsB,QAAQ,UAAU;AAAA,IAClH,EAAE,IAAI,2BAA2B,OAAO,WAAW,OAAO,OAAO,eAAe,QAAQ,UAAU;AAAA,IAClG,EAAE,IAAI,0BAA0B,OAAO,WAAW,OAAO,OAAO,cAAc,QAAQ,UAAU;AAAA,IAChG,EAAE,IAAI,2BAA2B,OAAO,WAAW,OAAO,OAAO,eAAe,QAAQ,UAAU;AAAA,EACpG;AACF;AAEO,SAAS,uBAAuB,QAAuB,UAAiD;AAC7G,MAAI,aAAa,EAAE,GAAG,OAAO;AAC7B,MAAI,0BAA0B;AAC9B,MAAI,yBAAyB;AAE7B,aAAW,WAAW,UAAU;AAC9B,YAAQ,QAAQ,IAAI;AAAA,MAClB,KAAK,6BAA6B;AAChC,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,iBAAiB,MAAM,QAAQ,KAAK,GAAM;AAAA,QACvD;AACA;AAAA,MACF;AAAA,MACA,KAAK,+BAA+B;AAClC,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,oBAAoB,MAAM,QAAQ,GAAG,EAAE;AAAA,QACpD;AACA;AAAA,MACF;AAAA,MACA,KAAK,+BAA+B;AAClC,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,mBAAmB,MAAM,QAAQ,KAAO,IAAS;AAAA,QAC9D;AACA;AAAA,MACF;AAAA,MACA,KAAK,iCAAiC;AACpC,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,qBAAqB,MAAM,QAAQ,GAAG,EAAE;AAAA,QACrD;AACA;AAAA,MACF;AAAA,MACA,KAAK,sBAAsB;AACzB,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,WAAW,MAAM,QAAQ,GAAG,EAAE;AAAA,QAC3C;AACA;AAAA,MACF;AAAA,MACA,KAAK,2BAA2B;AAC9B,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,eAAe,KAAK,IAAI,GAAG,MAAM;AAAA,QAC9C;AACA;AAAA,MACF;AAAA,MACA,KAAK,yCAAyC;AAC5C,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,2BAA2B,KAAK,IAAI,GAAG,MAAM;AAAA,QAC1D;AACA;AAAA,MACF;AAAA,MACA,KAAK,2BAA2B;AAC9B,cAAM,SAAS,oBAAoB,QAAQ,KAAK;AAChD,YAAI,WAAW,MAAM;AACnB,qBAAW,eAAe,MAAM,QAAQ,KAAO,GAAO;AAAA,QACxD;AACA;AAAA,MACF;AAAA,MACA,KAAK,oCAAoC;AACvC,cAAM,SAAS,6BAA6B,QAAQ,KAAK;AACzD,YAAI,QAAQ;AACV,qBAAW,uBAAuB;AAAA,QACpC;AACA;AAAA,MACF;AAAA,MACA,KAAK,2BAA2B;AAC9B,YAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,qBAAW,gBAAgB,uBAAuB,QAAQ,KAAK;AAC/D,oCAA0B;AAAA,QAC5B;AACA;AAAA,MACF;AAAA,MACA,KAAK,0BAA0B;AAC7B,mBAAW,eAAe,OAAO,QAAQ,UAAU,WAAW,QAAQ,MAAM,KAAK,IAAI;AACrF,iCAAyB;AACzB;AAAA,MACF;AAAA,MACA,KAAK,2BAA2B;AAC9B,cAAM,SAAS,sBAAsB,QAAQ,KAAK;AAClD,YAAI,QAAQ;AACV,qBAAW,gBAAgB;AAAA,QAC7B;AACA;AAAA,MACF;AAAA,MACA;AACE;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,2BAA2B,CAAC,wBAAwB;AACtD,eAAW,eAAe;AAAA,MACxB,WAAW;AAAA,MACX,WAAW,eAAe;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,WAAwC;AACxE,MAAI,UAAU,WAAW,UAAU,EAAG,QAAO;AAC7C,MAAI,UAAU,WAAW,YAAY,EAAG,QAAO;AAC/C,MAAI,UAAU,WAAW,KAAK,EAAG,QAAO;AACxC,SAAO;AACT;AAEA,eAAsB,eACpB,IACA,OACA,UAGI,CAAC,GAC0B;AAC/B,QAAM,UAAgC;AAAA,IACpC;AAAA,IACA,OAAO,QAAQ,SAAS,kBAAkB,EAAE;AAAA,IAC5C;AAAA,IACA,QAAQ,QAAQ,UAAU;AAAA,IAC1B,WAAW,IAAI;AAAA,EACjB;AACA,QAAM,wBAAwB,OAAO;AACrC,SAAO;AACT;AAEA,eAAsB,gCAAgC,OAAe,SAAyC,QAAuB;AACnI,QAAM;AAAA,IACJ;AAAA,IACA,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG,EAAE;AAAA,IAC9B,EAAE,OAAO,WAAW,OAAO;AAAA,EAC7B;AACF;AAEA,eAAsB,gCAAgC,WAA8C;AAClG,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE;AAAA,MACA,YAAY,IAAI;AAAA,IAClB;AAAA,IACA,EAAE,OAAO,aAAa,QAAQ,WAAW;AAAA,EAC3C;AACF;AAEA,eAAsB,0BACpB,QACA,UACe;AACf,QAAM,eAAe,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;AAC7E,QAAM,kBAAkB,2BAA2B,QAAQ,QAAQ;AAEnE,QAAM,QAAQ;AAAA,IACZ,gBAAgB,IAAI,OAAO,YAAY;AACrC,YAAM,WAAW,aAAa,IAAI,QAAQ,EAAE;AAC5C,UAAI,UAAU,WAAW,OAAQ;AACjC,YAAM,wBAAwB;AAAA,QAC5B,GAAG;AAAA,QACH,QAAQ,UAAU,WAAW,aAAa,aAAa;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAIA,SAAS,aAAa,GAAsC;AAC1D,MAAI,CAAC,KAAK,OAAO,MAAM,SAAU,QAAO;AACxC,QAAM,IAAI;AAEV,SAAO,OAAO,EAAE,aAAa,YAAY,OAAO,EAAE,WAAW;AAC/D;AAOO,SAAS,2BACd,mBACA,kBACgB;AAChB,QAAM,YAAY,kBAAkB,OAAO,CAAC,MAAM,EAAE,SAAS;AAC7D,QAAM,YAAY,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAC3D,QAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAGzD,QAAM,cAAc,kBAAkB,SAAS,CAAC,GAAG,MAAM;AACzD,QAAM,aAAa,kBAAkB,QAAQ,CAAC,GAAG,MAAM;AAGvD,QAAM,cAAe,gBAAgB,EAAE,mBAAmD;AAE1F,QAAM,gBAAqC,EAAE,UAAU,UAAU,OAAO,aAAa,QAAQ,SAAS;AACtG,QAAM,eAAoC,EAAE,UAAU,SAAS,OAAO,YAAY,QAAQ,YAAY;AAGtG,MAAI,aAAa,UAAU;AACzB,WAAO;AAAA,MACL,MAAM,EAAE,GAAG,eAAe,QAAQ,OAAO;AAAA,MACzC,SAAS,EAAE,GAAG,aAAa;AAAA,MAC3B,QAAQ,EAAE,GAAG,cAAc;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,WAAW;AACb,WAAO,EAAE,MAAM,EAAE,GAAG,eAAe,QAAQ,OAAO,GAAG,SAAS,eAAe,QAAQ,cAAc;AAAA,EACrG;AACA,MAAI,UAAU;AACZ,WAAO,EAAE,MAAM,EAAE,GAAG,cAAc,QAAQ,OAAO,GAAG,SAAS,cAAc,QAAQ,aAAa;AAAA,EAClG;AACA,SAAO,EAAE,MAAM,eAAe,SAAS,cAAc,QAAQ,cAAc;AAC7E;AAGO,SAAS,kBAAkB,UAAyD;AACzF,QAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,0BAA0B;AACxE,MAAI,CAAC,SAAS,SAAS,OAAO,QAAQ,UAAU,SAAU,QAAO;AACjE,QAAM,KAAK,QAAQ;AACnB,MAAI,aAAa,GAAG,IAAI,KAAK,aAAa,GAAG,OAAO,KAAK,aAAa,GAAG,MAAM,GAAG;AAChF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGA,eAAsB,sBAAsB,QAAuC;AACjF,QAAM,eAAe,4BAA4B,QAAQ,EAAE,OAAO,WAAW,QAAQ,OAAO,CAAC;AAC/F;;;ACvVA,IAAM,uBAAuB,oBAAI,IAAyB,CAAC,WAAW,aAAa,MAAM,QAAQ,CAAC;AAClG,IAAM,wBAAwB,oBAAI,IAA0B,CAAC,QAAQ,YAAY,YAAY,QAAQ,CAAC;AAE/F,SAAS,uBACd,KACA,OACM;AACN,MAAI,IAAI,iBAAiB,OAAO,MAAW;AACzC,UAAM,WAAW,MAAM,oBAAoB;AAC3C,WAAO,EAAE,KAAK,EAAE,SAAS,CAAC;AAAA,EAC5B,CAAC;AAED,MAAI,IAAI,qBAAqB,OAAO,MAAW;AAC7C,UAAM,YAAY,EAAE,KAAK,QAAQ,EAAE,IAAI,MAAM,IAAI,IAAI;AACrD,UAAM,WAAW,MAAM,oBAAoB;AAC3C,UAAM,UAAU,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,SAAS;AAC/D,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,oBAAoB,GAAG,GAAG;AAAA,IAC9D;AACA,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,CAAC;AAAA,EACrC,CAAC;AAED,MAAI,KAAK,qBAAqB,OAAO,MAAW;AAC9C,UAAM,YAAY,EAAE,KAAK,QAAQ,EAAE,IAAI,MAAM,IAAI,IAAI;AACrD,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,yBAAyB,GAAG,GAAG;AAAA,IACnE;AAEA,UAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,UAAM,aAAa,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ,kBAAkB,SAAS;AAClG,UAAM,cAAc,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AAE1E,QAAI,CAAC,qBAAqB,IAAI,UAAiC,GAAG;AAChE,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAAA,IAClE;AAEA,QAAI,CAAC,sBAAsB,IAAI,WAAmC,GAAG;AACnE,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,yBAAyB,GAAG,GAAG;AAAA,IACnE;AAEA,UAAM,UAAU,MAAM,eAAe,WAAW,QAAQ,OAAO;AAAA,MAC7D,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AACD,QAAI,cAAc,yBAAyB;AACzC,YAAM,WAAW,MAAM,oBAAoB;AAC3C,YAAM,kBAAkB,uBAAuB,UAAU,MAAM,aAAa;AAC5E,YAAM,cAAc,gBAAgB;AACpC,YAAM,sBAAsB,gBAAgB;AAC5C,YAAM,oBAAoB,gBAAgB;AAC1C,YAAM,aAAa,gBAAgB;AACnC,YAAM,YAAY,IAAI;AACtB,eAAS,OAAO,QAAW,UAAU,4BAA4B,gBAAgB,UAAU,GAAG;AAC9F,YAAM,aAAa,KAAK;AAAA,IAC1B;AACA,QAAI,2BAA2B,IAAI,SAAS,GAAG;AAC7C,YAAM,SAAS,uBAAuB,MAAM,QAAQ,CAAC,OAAO,CAAC;AAC7D,YAAM,YAAY,IAAI;AACtB,eAAS,OAAO,QAAW,UAAU,mBAAmB,SAAS,WAAW;AAC5E,YAAM,aAAa,KAAK;AAAA,IAC1B;AACA,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,CAAC;AAAA,EACrC,CAAC;AAED,MAAI,KAAK,2BAA2B,OAAO,MAAW;AACpD,UAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,UAAM,QAAQ,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AAC9E,QAAI,CAAC,SAAS,QAAQ,KAAK,QAAQ,IAAI;AACrC,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,uCAAuC,GAAG,GAAG;AAAA,IACjF;AACA,UAAM,OAAO,oBAAoB,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG,EAAE;AAC/D,UAAM,YAAY,IAAI;AACtB,aAAS,OAAO,QAAW,UAAU,iCAAiC,MAAM,OAAO,iBAAiB,GAAG;AACvG,UAAM,gCAAgC,MAAM,OAAO,iBAAiB;AACpE,UAAM,aAAa,KAAK;AACxB,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,mBAAmB,MAAM,OAAO,kBAAkB,CAAC;AAAA,EAC/E,CAAC;AAED,MAAI,IAAI,wBAAwB,OAAO,MAAW;AAChD,UAAM,WAAW,MAAM,oBAAoB;AAC3C,UAAM,QAAQ,kBAAkB,QAAQ;AACxC,UAAM,iBAAiB,EAAE,IAAI,MAAM,SAAS,MAAM;AAClD,QAAI,CAAC,gBAAgB;AACnB,YAAMG,aAAY,yBAAyB;AAC3C,YAAM,WAAW,SAAS,2BAA2BA,UAAS;AAC9D,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,UAAU,WAAW,CAAC,MAAM,CAAC;AAAA,IACzD;AACA,UAAM,YAAY,yBAAyB;AAC3C,UAAM,SAAS,MAAM,eAAe,SAAS;AAC7C,UAAM,gBAAgB,2BAA2B,WAAW,MAAM;AAClE,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,UAAU,SAAS,eAAe,WAAW,CAAC,OAAO,WAAW,OAAO,CAAC;AAAA,EACpG,CAAC;AAED,MAAI,IAAI,sBAAsB,OAAO,MAAW;AAC9C,UAAM,YAAY,yBAAyB;AAC3C,UAAM,SAAS,MAAM,eAAe,SAAS;AAC7C,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC;AAAA,EACpC,CAAC;AAED,MAAI,KAAK,wBAAwB,OAAO,MAAW;AACjD,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,WAAW,QAAQ;AACzB,UAAI,CAAC,UAAU,MAAM,YAAY,CAAC,UAAU,SAAS,YAAY,CAAC,UAAU,QAAQ,UAAU;AAC5F,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,yEAAyE,GAAG,GAAG;AAAA,MACnH;AACA,YAAM,sBAAsB,QAAQ;AACpC,eAAS,OAAO,QAAW,UAAU,iCAAiC,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAK,aAAa,SAAS,QAAQ,QAAQ,IAAI,SAAS,QAAQ,KAAK,YAAY,SAAS,OAAO,QAAQ,IAAI,SAAS,OAAO,KAAK,GAAG;AACnP,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,SAAS,CAAC;AAAA,IACtC,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AACH;;;AC/HO,SAAS,wBAAwB,KAAgB;AACtD,MAAI,IAAI,yBAAyB,OAAO,MAAW;AACjD,UAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC9C,QAAQ,QAAQ,aAAkB,CAAC;AAAA,MACnC,iBAAiB;AAAA,IACnB,CAAC;AAED,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,eAAe,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACpE,YAAM,UAAU,IAAI,IAAI,UAAU,MAAM,IAAI,CAAC,MAAwB,EAAE,IAAI,CAAC;AAC5E,YAAM,SAAS,UAAU,MAAM,IAAI,CAAC,OAA0C;AAAA,QAC5E,GAAG;AAAA,QACH,SAAS,aAAa,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,UAAU;AAAA,MACzD,EAAE;AACF,iBAAW,KAAK,UAAU;AACxB,YAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,GAAG;AACxB,iBAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,EAAE,OAAO,CAAC;AAAA,QACjG;AAAA,MACF;AACA,aAAO,KAAK,CAAC,GAAqB,MAAwB,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACtF,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,WAAW,OAAO,OAAO,CAAC;AAAA,IACzD;AACA,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,UAAU,CAAC;AAAA,EAC1C,CAAC;AAED,MAAI,IAAI,gCAAgC,OAAO,MAAW;AAExD,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,aAAkB,EAAE,CAAC;AAAA,EACpD,CAAC;AAED,MAAI,IAAI,yBAAyB,OAAO,MAAW;AACjD,UAAM,QAAQ,KAAK,IAAI,SAAS,EAAE,IAAI,MAAM,OAAO,KAAK,MAAM,EAAE,KAAK,IAAI,EAAE;AAC3E,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,kBAAkB,KAAK,EAAE,CAAC;AAAA,EACzD,CAAC;AAED,MAAI,IAAI,wBAAwB,OAAO,MAAW;AAChD,QAAI;AACF,YAAM,OAAO,KAAK,IAAI,SAAS,EAAE,IAAI,MAAM,MAAM,KAAK,MAAM,EAAE,KAAK,IAAI,GAAG;AAC1E,YAAM,QAAQ,MAAM,gBAAgB,IAAI;AACxC,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,IACnC,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,mCAAmC;AAChE,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC,EAAE,CAAC;AAAA,IACvC;AAAA,EACF,CAAC;AAED,MAAI,IAAI,uBAAuB,CAAC,MAAW;AACzC,QAAI;AACF,YAAMC,WAAU,4BAA4B;AAC5C,YAAM,aAAaA,SAAQ,MAAM,OAAO;AAAA,QACtC,CAAC,MAAM,EAAE,UAAU,UAAU,EAAE;AAAA,MACjC;AAEA,YAAM,UAAU,CAAC,OAAe,MAAM,MAAO,KAAK,KAAK;AACvD,YAAM,MAAM,CAAC,QACX,IAAI,SAAS,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,SAAS;AAC7D,YAAM,SAAS,CAAC,QAAkB;AAChC,YAAI,CAAC,IAAI,OAAQ,QAAO;AACxB,cAAM,SAAS,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC5C,cAAM,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC;AACxC,eAAO,OAAO,SAAS,IAAI,OAAO,GAAG,KAAK,OAAO,MAAM,CAAC,IAAI,OAAO,GAAG,KAAK;AAAA,MAC7E;AAGA,YAAM,WAAW,WACd,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAC5C,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,WAAY,IAAI,KAAK,MAAM,EAAE,WAAY,CAAC,EAClE,OAAO,CAAC,OAAO,KAAK,CAAC;AAGxB,YAAM,UAAU,WACb,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAC1C,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,WAAY,IAAI,KAAK,MAAM,EAAE,SAAU,CAAC,EAChE,OAAO,CAAC,OAAO,KAAK,CAAC;AAGxB,YAAM,UAAU,WACb,OAAO,CAAC,MAAM,OAAO,EAAE,eAAe,YAAY,OAAO,EAAE,iBAAiB,QAAQ,EACpF,IAAI,CAAC,OAAO,EAAE,cAAc,MAAM,EAAE,gBAAgB,EAAE;AAGzD,YAAM,eAAe,WAClB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAC1C,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,WAAY,IAAI,KAAK,MAAM,EAAE,SAAS,CAAC,EAC/D,OAAO,CAAC,OAAO,KAAK,CAAC;AAExB,aAAO,EAAE,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,YAAY,WAAW;AAAA,QACvB,sBAAsB,SAAS,SAC3B,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAE,GAAG,QAAQ,QAAQ,OAAO,QAAQ,CAAE,GAAG,GAAG,SAAS,OAAO,IACvF;AAAA,QACJ,iBAAiB,QAAQ,SACrB,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAE,GAAG,QAAQ,QAAQ,OAAO,OAAO,CAAE,GAAG,GAAG,QAAQ,OAAO,IACpF;AAAA,QACJ,aAAa,QAAQ,SACjB,EAAE,KAAK,IAAI,OAAO,GAAI,QAAQ,OAAO,OAAO,GAAI,GAAG,QAAQ,OAAO,IAClE;AAAA,QACJ,oBAAoB,aAAa,SAC7B,EAAE,KAAK,QAAQ,IAAI,YAAY,CAAE,GAAG,QAAQ,QAAQ,OAAO,YAAY,CAAE,GAAG,GAAG,aAAa,OAAO,IACnG;AAAA,MACN,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,iCAAiC;AAC9D,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACxD;AAAA,EACF,CAAC;AACH;;;AChHA;AAAA,EACE,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,QAAAC,QAAM,YAAAC,iBAAgB;AAC/B,SAAS,SAAAC,cAAa;AACtB,SAAS,UAAAC,eAAc;AACvB,SAAS,OAAAC,YAAW;AAqUpB,SAAS,kBAAkB;AA7RpB,SAAS,iBAAiB,YAAuC;AACtE,QAAM,QAAQ,CAAC,QAAgBC,aAAWC,OAAK,YAAY,GAAG,CAAC;AAE/D,QAAM,QAAQ;AAAA,IACZ,UAAU,MAAM,WAAW;AAAA,IAC3B,WAAW,MAAM,SAAS;AAAA,IAC1B,UAAU,MAAM,QAAQ;AAAA,IACxB,UAAU,MAAM,WAAW;AAAA,IAC3B,aAAa,MAAM,cAAc;AAAA,IACjC,WAAW,MAAM,YAAY;AAAA,IAC7B,eAAe,MAAM,gBAAgB;AAAA,IACrC,OAAO,MAAM,QAAQ;AAAA,IACrB,aAAa,MAAM,cAAc,KAAK,MAAM,kBAAkB;AAAA,IAC9D,SAAS,MAAM,SAAS;AAAA,IACxB,YAAY,MAAM,YAAY;AAAA,IAC9B,UAAU,MAAM,WAAW;AAAA,IAC3B,iBAAiB,MAAM,gBAAgB;AAAA,IACvC,iBAAiB,MAAM,gBAAgB;AAAA,IACvC,gBAAgB,MAAM,eAAe;AAAA,IACrC,gBAAgB,MAAM,eAAe;AAAA,EACvC;AAGA,QAAM,iBAA2B,CAAC;AAClC,aAAW,YAAY,CAAC,kBAAkB,eAAe,GAAG;AAC1D,UAAM,WAAWA,OAAK,YAAY,QAAQ;AAC1C,QAAI,CAACD,aAAW,QAAQ,EAAG;AAC3B,QAAI;AACF,YAAM,UAAUE,aAAY,QAAQ;AACpC,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,SAAS,KAAK,GAAG;AACzB,yBAAe,KAAKC,UAAS,OAAO,KAAK,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,iBAA2B,CAAC;AAClC,aAAW,YAAY,CAAC,kBAAkB,eAAe,GAAG;AAC1D,UAAM,WAAWF,OAAK,YAAY,QAAQ;AAC1C,QAAI,CAACD,aAAW,QAAQ,EAAG;AAC3B,QAAI;AACF,YAAM,UAAUE,aAAY,QAAQ;AACpC,iBAAW,SAAS,SAAS;AAC3B,cAAM,YAAYD,OAAK,UAAU,OAAO,UAAU;AAClD,YAAID,aAAW,SAAS,GAAG;AACzB,yBAAe,KAAK,KAAK;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,gBAAgB;AACpB,QAAM,aAAaC,OAAK,YAAY,WAAW;AAC/C,MAAID,aAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,UAAUI,eAAa,YAAY,MAAM;AAC/C,sBAAgB,QAAQ,MAAM,GAAG,GAAG,EAAE,KAAK;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,cAAc;AAClB,MAAI,qBAAqB;AACzB,QAAM,UAAUH,OAAK,YAAY,cAAc;AAC/C,MAAID,aAAW,OAAO,GAAG;AACvB,QAAI;AACF,YAAM,MAAM,KAAK,MAAMI,eAAa,SAAS,MAAM,CAAC;AACpD,oBAAc,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AACxD,2BAAqB,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,IAC/E,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,gBAAgB,CAAC,GAAG,IAAI,IAAI,cAAc,CAAC;AAAA,IAC3C,gBAAgB,CAAC,GAAG,IAAI,IAAI,cAAc,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,IAAM,qBAA4E;AAAA,EAChF,gBAAgB,EAAE,UAAU,cAAc,OAAO,CAAC,MAAM,EAAE;AAAA,EAC1D,cAAc,EAAE,UAAU,QAAQ,OAAO,CAAC,OAAO,EAAE;AAAA,EACnD,kBAAkB,EAAE,UAAU,UAAU,OAAO,CAAC,QAAQ,EAAE;AAAA,EAC1D,YAAY,EAAE,UAAU,UAAU,OAAO,CAAC,QAAQ,EAAE;AAAA,EACpD,oBAAoB,EAAE,UAAU,UAAU,OAAO,CAAC,KAAK,EAAE;AAAA,EACzD,WAAW,EAAE,UAAU,UAAU,OAAO,CAAC,QAAQ,EAAE;AAAA,EACnD,UAAU,EAAE,UAAU,MAAM,OAAO,CAAC,IAAI,EAAE;AAAA,EAC1C,gBAAgB,EAAE,UAAU,QAAQ,OAAO,CAAC,QAAQ,EAAE;AAAA,EACtD,oBAAoB,EAAE,UAAU,UAAU,OAAO,CAAC,QAAQ,EAAE;AAAA,EAC5D,WAAW,EAAE,UAAU,QAAQ,OAAO,CAAC,OAAO,EAAE;AAAA,EAChD,WAAW,EAAE,UAAU,QAAQ,OAAO,CAAC,SAAS,EAAE;AAAA,EAClD,WAAW,EAAE,UAAU,UAAU,OAAO,CAAC,KAAK,EAAE;AAAA,EAChD,gBAAgB,EAAE,UAAU,QAAQ,OAAO,CAAC,SAAS,EAAE;AAAA,EACvD,kBAAkB,EAAE,UAAU,OAAO,OAAO,CAAC,OAAO,EAAE;AAAA,EACtD,YAAY,EAAE,UAAU,WAAW,OAAO,CAAC,MAAM,EAAE;AAAA,EACnD,cAAc,EAAE,UAAU,WAAW,OAAO,CAAC,QAAQ,EAAE;AAAA,EACvD,iBAAiB,EAAE,UAAU,OAAO,OAAO,CAAC,UAAU,EAAE;AAAA,EACxD,iBAAiB,EAAE,UAAU,SAAS,OAAO,CAAC,KAAK,EAAE;AAAA,EACrD,aAAa,EAAE,UAAU,cAAc,OAAO,CAAC,MAAM,EAAE;AAAA,EACvD,aAAa,EAAE,UAAU,cAAc,OAAO,CAAC,KAAK,EAAE;AACxD;AAEA,SAAS,sBAAsB,YAAqC;AAElE,MAAI,cAAc;AAClB,MAAI,gBAAgB;AAEpB,aAAW,cAAc,CAAC,aAAa,cAAc,cAAc,QAAQ,GAAG;AAC5E,UAAM,IAAIH,OAAK,YAAY,UAAU;AACrC,QAAID,aAAW,CAAC,GAAG;AACjB,UAAI;AACF,wBAAgBI,eAAa,GAAG,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK;AAC3D;AAAA,MACF,QAAQ;AAAA,MAAe;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,UAAUH,OAAK,YAAY,cAAc;AAC/C,MAAID,aAAW,OAAO,GAAG;AACvB,QAAI;AACF,YAAM,MAAM,KAAK,MAAMI,eAAa,SAAS,MAAM,CAAC;AACpD,YAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AACvD,YAAM,OAAO,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AACrE,UAAI,KAAM,eAAc,OAAO,GAAG,IAAI,KAAK,IAAI,KAAK;AAAA,IACtD,QAAQ;AAAA,IAAe;AAAA,EACzB;AAGA,QAAM,YAAYH,OAAK,YAAY,YAAY;AAC/C,MAAI,CAAC,eAAeD,aAAW,SAAS,GAAG;AACzC,QAAI;AACF,YAAM,UAAUI,eAAa,WAAW,MAAM;AAC9C,YAAM,YAAY,QAAQ,MAAM,+BAA+B;AAC/D,YAAM,YAAY,QAAQ,MAAM,wBAAwB;AACxD,UAAI,UAAW,eAAc,YAAY,GAAG,UAAU,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,KAAK,UAAU,CAAC;AAAA,IAC3F,QAAQ;AAAA,IAAe;AAAA,EACzB;AAGA,QAAM,gBAAgBH,OAAK,YAAY,gBAAgB;AACvD,MAAI,CAAC,eAAeD,aAAW,aAAa,GAAG;AAC7C,QAAI;AACF,YAAM,UAAUI,eAAa,eAAe,MAAM;AAClD,YAAM,YAAY,QAAQ,MAAM,+BAA+B;AAC/D,YAAM,YAAY,QAAQ,MAAM,wBAAwB;AACxD,UAAI,UAAW,eAAc,YAAY,GAAG,UAAU,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,KAAK,UAAU,CAAC;AAAA,IAC3F,QAAQ;AAAA,IAAe;AAAA,EACzB;AAEA,MAAI,CAAC,aAAa;AAChB,kBAAc,gBACV,cAAc,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,IAC/D;AAAA,EACN;AAGA,MAAI,WAAW;AACf,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AAC/D,QAAIJ,aAAWC,OAAK,YAAY,IAAI,CAAC,GAAG;AACtC,UAAI,aAAa,aAAa,OAAO,aAAa,WAAW;AAC3D,mBAAW,OAAO;AAAA,MACpB;AACA,iBAAW,KAAK,OAAO,OAAO;AAC5B,YAAI,CAAC,MAAM,SAAS,CAAC,EAAG,OAAM,KAAK,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,IACV,OAAO,MAAM,SAAS,QAAQ,CAAC,QAAQ;AAAA,IACvC,iBAAiB,CAAC,iBAAiB,oBAAoB;AAAA,IACvD,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,oBAAoB,KAAqC;AAChE,QAAM,OAAO,IAAI,KAAK;AACtB,MAAI,CAAC,KAAM,QAAO;AAGlB,MAAI,WAAW;AAGf,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,IAAI;AAChC,QAAI,OAAO,SAAS,WAAW,UAAU;AACvC,iBAAW,SAAS,OAAO,KAAK;AAAA,IAClC,WAAW,SAAS,eAAe,SAAS,SAAS;AAEnD,aAAO,iBAAiB,QAAQ;AAAA,IAClC;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,SAAS,SAAS,MAAM,kCAAkC;AAChE,MAAI,QAAQ;AACV,eAAW,OAAO,CAAC,EAAE,KAAK;AAAA,EAC5B;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,WAAO,iBAAiB,MAAM;AAAA,EAChC,QAAQ;AAEN,UAAM,QAAQ,SAAS,MAAM,aAAa;AAC1C,QAAI,OAAO;AACT,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC;AAClC,eAAO,iBAAiB,MAAM;AAAA,MAChC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,QAAyD;AACjF,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAElD,QAAM,cAAc,OAAO,OAAO,gBAAgB,WAAW,OAAO,YAAY,KAAK,IAAI;AACzF,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,SAAS,KAAK,EAAE,YAAY,IAAI;AAC9F,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IACvC,OAAO,QAAsB,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAC9E,CAAC;AACL,QAAM,QAAQ,MAAM,QAAQ,OAAO,KAAK,IACnC,OAAO,MAAoB,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAC5E,CAAC;AACL,QAAM,kBAAkB,MAAM,QAAQ,OAAO,eAAe,IACvD,OAAO,gBAA8B,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IACtF,CAAC;AAEL,MAAI,CAAC,eAAe,QAAQ,WAAW,KAAK,MAAM,WAAW,EAAG,QAAO;AAEvE,SAAO;AAAA,IACL,aAAa,eAAe;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,iCAAiC,UAAoC;AAC5E,QAAM,aAAa,GAAG,SAAS,eAAe,EAAE,GAAG,YAAY;AAC/D,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,WAAW,KAAK,CAAC,cAAc,WAAW,SAAS,SAAS,CAAC;AACtE;AAOA,IAAM,wBAAwB,KAAK,KAAK,KAAK;AAE7C,SAAS,mBAAmB,YAA4B;AACtD,QAAM,aAAa,OAAO,KAAK,kBAAkB;AACjD,QAAM,QAAQ,WAAW,OAAO,CAAC,MAAMD,aAAWC,OAAK,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK;AAC7E,SAAO,WAAW,QAAQ,EAAE,OAAO,MAAM,KAAK,GAAG,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC/E;AAEA,eAAe,mBAAmB,YAAqD;AACrF,QAAM,WAAW,wBAAwB;AACzC,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,OAAO,mBAAmB,UAAU;AAC1C,QAAM,MAAM,oBAAoB,IAAI;AACpC,MAAI;AACF,UAAMI,UAAS,MAAM,SAAS,IAAI,GAAG;AACrC,QAAI,CAACA,SAAQ,MAAO,QAAO;AAC3B,UAAM,SAASA,QAAO;AACtB,QAAI,CAAC,OAAO,YAAY,CAAC,OAAO,UAAW,QAAO;AAClD,QAAI,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,SAAS,IAAI,sBAAuB,QAAO;AAC9E,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBAAmB,YAAoB,UAA0C;AAC9F,QAAM,WAAW,wBAAwB;AACzC,MAAI,CAAC,SAAU;AACf,QAAM,OAAO,mBAAmB,UAAU;AAC1C,QAAM,MAAM,oBAAoB,IAAI;AACpC,MAAI;AACF,UAAM,SAAS,QAAQ,KAAK;AAAA,MAC1B,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,EAAE,UAAU,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AAAA,IACzD,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAIA,eAAsB,sBACpB,UACA,YACA,SAC0B;AAE1B,MAAI,CAAC,SAAS,cAAc;AAC1B,UAAM,SAAS,MAAM,mBAAmB,UAAU;AAClD,QAAI,QAAQ;AACV,aAAO,KAAK,gCAAgC;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,qBAAqB,SAAS,KAAK,EAAE,YAAY;AACvD,QAAM,YAAY,yBAAyB;AAC3C,QAAM,eAAe,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,SAAS;AAEvF,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL,EAAE,UAAU,mBAAmB;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,sBAAsB,UAAU;AAAA,EACzC;AAEA,QAAM,UAAUC,aAAYC,OAAKC,QAAO,GAAG,cAAc,CAAC;AAC1D,QAAM,aAAaD,OAAK,SAAS,wBAAwB;AACzD,QAAM,iBAAiB,MAAM,aAAa,kBAAkB;AAC5D,EAAAE,eAAc,YAAY,gBAAgB,MAAM;AAGhD,QAAM,aAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQC,IAAG,GAAG;AAC9C,QAAI,OAAO,UAAU,SAAU,YAAW,GAAG,IAAI;AAAA,EACnD;AACA,aAAW,qBAAqB;AAEhC,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,QAAgB,CAACC,UAAS,WAAW;AAC5D,UAAIC,UAAS;AACb,UAAI,SAAS;AACb,UAAI,WAAW;AAEf,UAAI;AACJ,UAAI;AAEJ,UAAI,uBAAuB,UAAU;AACnC,kBAAU;AACV,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UAAmB;AAAA,UACnB;AAAA,UAAM;AAAA,QACR;AAAA,MACF,WAAW,uBAAuB,SAAS;AACzC,kBAAU;AACV,eAAO,CAAC,MAAM,uCAAuC,UAAU,GAAG;AAAA,MACpE,OAAO;AACL,eAAO,IAAI,MAAM,yBAAyB,kBAAkB,EAAE,CAAC;AAC/D;AAAA,MACF;AAEA,YAAM,QAAQC,OAAM,SAAS,MAAM;AAAA,QACjC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC,CAAC;AAED,UAAI,MAAM,MAAO,OAAM,MAAM,IAAI;AAEjC,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,QAAAD,UAAS,eAAeA,SAAQ,MAAM,SAAS,MAAM,GAAG,IAAM;AAAA,MAChE,CAAC;AAED,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,iBAAS,eAAe,QAAQ,MAAM,SAAS,MAAM,GAAG,IAAM;AAAA,MAChE,CAAC;AAED,YAAM,QAAQ,WAAW,MAAM;AAC7B,mBAAW;AACX,cAAM,KAAK,SAAS;AAAA,MACtB,GAAG,IAAO;AAEV,YAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,qBAAa,KAAK;AAClB,eAAO,IAAI,MAAM,mBAAmB,kBAAkB,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,MAC3E,CAAC;AAED,YAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,qBAAa,KAAK;AAClB,YAAI,UAAU;AACZ,iBAAO,IAAI,MAAM,mCAAmC,CAAC;AACrD;AAAA,QACF;AACA,YAAI,SAAS,GAAG;AACd,iBAAO;AAAA,YACL,EAAE,UAAU,oBAAoB,MAAM,QAAQ,OAAO,MAAM,GAAG,GAAG,EAAE;AAAA,YACnE;AAAA,UACF;AAAA,QACF;AACA,QAAAD,SAAQC,OAAM;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,WAAW,oBAAoB,MAAM;AAC3C,QAAI,YAAY,CAAC,iCAAiC,QAAQ,GAAG;AAC3D,aAAO;AAAA,QACL,EAAE,UAAU,oBAAoB,SAAS,SAAS,SAAS,OAAO,SAAS,MAAM;AAAA,QACjF;AAAA,MACF;AAEA,YAAM,mBAAmB,YAAY,QAAQ;AAC7C,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,EAAE,UAAU,oBAAoB,WAAW,OAAO,MAAM,GAAG,GAAG,EAAE;AAAA,QAChE;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,EAAE,UAAU,oBAAoB,iBAAiB,SAAS,YAAY;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AACA,WAAO,sBAAsB,UAAU;AAAA,EACzC,SAAS,OAAO;AACd,WAAO;AAAA,MACL,EAAE,KAAK,OAAO,UAAU,mBAAmB;AAAA,MAC3C;AAAA,IACF;AACA,WAAO,sBAAsB,UAAU;AAAA,EACzC,UAAE;AACA,QAAI;AACF,MAAAE,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AC5gBA,SAAS,gBAAAC,qBAAoB;AAsB7B,IAAM,eAAe;AAErB,IAAM,eAAe;AAAA,EACnB;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAQ;AAAA,EAC3C;AAAA,EAAU;AAAA,EAAS;AAAA,EAAS;AAAA,EAAY;AAAA,EACxC;AAAA,EAAU;AAAA,EAAO;AAAA,EAAQ;AAC3B;AAEO,SAAS,aAAa,YAAoC;AAC/D,QAAM,cAAc,aAAa,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,GAAG,CAAC;AAExE,MAAI;AACJ,MAAI;AACF,aAASC,cAAa,QAAQ;AAAA,MAC5B;AAAA,MACA;AAAA,MAAM;AAAA,MACN,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AAAA,MACD,UAAU;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAAA,EACH,SAAS,OAAY;AAEnB,QAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,QAAI,MAAM,OAAQ,UAAS,MAAM;AAAA,SAC5B;AACH,aAAO,KAAK,qBAAqB,OAAO,KAAK,CAAC,EAAE;AAChD,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,UAA0B,CAAC;AACjC,QAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAE/C,aAAW,QAAQ,OAAO;AAExB,UAAM,QAAQ,KAAK,MAAM,oBAAoB;AAC7C,QAAI,CAAC,MAAO;AAEZ,UAAM,CAAC,EAAE,MAAM,QAAQ,OAAO,IAAI;AAClC,UAAM,YAAY,QAAQ,MAAM,YAAY;AAC5C,QAAI,CAAC,UAAW;AAEhB,UAAM,CAAC,EAAE,KAAK,IAAI,IAAI;AACtB,UAAM,SAAS,IAAI,YAAY;AAC/B,UAAM,cAAc,KAAK,KAAK;AAC9B,QAAI,CAAC,eAAe,YAAY,SAAS,EAAG;AAE5C,UAAM,eAAe,KAAK,WAAW,UAAU,IAC3C,KAAK,MAAM,WAAW,SAAS,CAAC,IAChC;AAEJ,YAAQ,KAAK;AAAA,MACX,QAAQ,WAAW,QAAQ,SAAS;AAAA,MACpC,OAAO,YAAY,SAAS,MAAM,GAAG,YAAY,MAAM,GAAG,GAAG,CAAC,QAAQ;AAAA,MACtE,MAAM;AAAA,MACN,MAAM,SAAS,QAAQ,EAAE;AAAA,MACzB,SAAS,QAAQ,KAAK;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKO,SAAS,wBACd,QACgB;AAChB,QAAM,UAAU,4BAA4B;AAE5C,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,aAAa,wBAAwB;AAAA,MACzC,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,MACpC,YAAY,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,MACvD,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,QAAQ,CAAC,MAAM,MAAM;AAAA,MACrB,OAAO,CAAC,MAAM,IAAI;AAAA,IACpB,GAAG,OAAO;AAEV,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,WAAW;AAAA,MACrB,UAAU,WAAW;AAAA,MACrB,WAAW,WAAW;AAAA,MACtB,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,WAAW,WAAW,cAAc,WAAW,QAAQ,KAAK;AAAA,MAC9D,EAAE,OAAO,OAAO;AAAA,MAChB,gBAAgB,CAAC,MAAM,IAAI;AAAA,IAC7B;AAAA,EACF,CAAC;AACH;;;ACrIA,SAAS,gBAAgB;AAiBzB,eAAsB,kBAAkB,YAA6C;AACnF,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B;AAAA,MACE;AAAA,MACA;AAAA,QACE;AAAA,QAAS;AAAA,QACT;AAAA,QAAU;AAAA,QACV;AAAA,QAAW;AAAA,QACX;AAAA,QAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MACA,CAAC,OAAOC,YAAW;AACjB,YAAI,OAAO;AACT,iBAAO,KAAK,kCAAkC,OAAO,KAAK,CAAC,EAAE;AAC7D,UAAAD,SAAQ,CAAC,CAAC;AACV;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAAS,KAAK,MAAMC,QAAO,KAAK,CAAC;AACvC,gBAAM,UAA0B,OAAO,IAAI,CAAC,WAAW;AAAA,YACrD,QAAQ;AAAA,YACR,OAAO,MAAM;AAAA,YACb,MAAM;AAAA,YACN,MAAM;AAAA,YACN,UAAU,MAAM,QAAQ,IAAI,MAAM,GAAG,GAAG;AAAA,YACxC,iBAAiB,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,YAC/C,gBAAgB,CAAC;AAAA,UACnB,EAAE;AACF,UAAAD,SAAQ,OAAO;AAAA,QACjB,SAAS,YAAY;AACnB,iBAAO,KAAK,kCAAkC,OAAO,UAAU,CAAC,EAAE;AAClE,UAAAA,SAAQ,CAAC,CAAC;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AClDO,SAAS,uBACd,KACA,OACM;AACN,MAAI,IAAI,qBAAqB,OAAO,MAAW;AAC7C,QAAI;AACF,YAAM,SAAS,iBAAiB,WAAW;AAC3C,aAAO,EAAE,KAAK,MAAM;AAAA,IACtB,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,8BAA8B;AAC3D,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,0BAA0B,GAAG,GAAG;AAAA,IACpE;AAAA,EACF,CAAC;AAED,MAAI,KAAK,qBAAqB,OAAO,MAAW;AAC9C,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,WAAW,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,MAAM,OAAO;AACxF,YAAM,SAAS,MAAM,sBAAsB,UAAU,WAAW;AAChE,aAAO,EAAE,KAAK,MAAM;AAAA,IACtB,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,oCAAoC;AACjE,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,6BAA6B,GAAG,GAAG;AAAA,IACvE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,MAAW;AAC5C,QAAI;AACF,YAAM,QAAQ,aAAa,WAAW;AACtC,YAAM,cAAc,wBAAwB,KAAK;AACjD,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,aAAa,OAAO,YAAY,OAAO,CAAC;AAAA,IAC5E,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,0BAA0B;AACvD,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,6BAA6B,GAAG,GAAG;AAAA,IACvE;AAAA,EACF,CAAC;AAED,MAAI,KAAK,uBAAuB,OAAO,MAAW;AAChD,gCAA4B,EAAE,MAAM,oBAAoB,CAAC;AACzD,WAAO,EAAE,KAAK,EAAE,IAAI,MAAM,SAAS,gBAAgB,CAAC;AAAA,EACtD,CAAC;AAED,MAAI,IAAI,2BAA2B,OAAO,MAAW;AACnD,QAAI;AACF,YAAM,SAAS,MAAM,kBAAkB,WAAW;AAClD,YAAM,cAAc,wBAAwB,MAAM;AAClD,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,QAAQ,aAAa,OAAO,YAAY,OAAO,CAAC;AAAA,IAC5E,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,+BAA+B;AAC5D,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iCAAiC,GAAG,GAAG;AAAA,IAC3E;AAAA,EACF,CAAC;AACH;;;AC5DA,SAAS,cAAAE,cAAY,aAAAC,YAAW,gBAAAC,gBAAc,iBAAAC,uBAAqB;AACnE,SAAS,QAAAC,cAAY;AAmCrB,SAAS,iBAAiB,SAAyC;AACjE,QAAM,QAAQ,QAAQ,MAAM,6BAA6B;AACzD,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,SAAiC,CAAC;AACxC,aAAW,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG;AACvC,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,QAAQ,GAAI;AAChB,UAAM,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK;AACpC,UAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACnE,QAAI,IAAK,QAAO,GAAG,IAAI;AAAA,EACzB;AACA,SAAO;AACT;AAEO,SAAS,mBAAwC;AACtD,QAAM,UAA+B,CAAC;AACtC,MAAI;AACF,UAAM,QAAQ,0BAA0B;AACxC,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,OAAQ;AACnC,YAAM,YAAY,iBAAiB,KAAK,MAAM,KAAK,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AACvF,iBAAW,YAAY,WAAW;AAChC,YAAI;AACF,gBAAM,UAAUC,eAAa,SAAS,YAAY,MAAM;AACxD,gBAAM,KAAK,iBAAiB,OAAO;AACnC,kBAAQ,KAAK;AAAA,YACX,MAAM,SAAS;AAAA,YACf,aAAa,GAAG,QAAQ,SAAS;AAAA,YACjC,aAAa,GAAG,eAAe;AAAA,YAC/B,OAAO,GAAG,SAAS;AAAA,YACnB,SAAS,GAAG,UAAU,GAAG,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,YACpF,QAAQ,KAAK;AAAA,YACb;AAAA,UACF,CAAC;AAAA,QACH,SAAS,KAAK;AACZ,iBAAO,KAAK,EAAE,KAAK,MAAM,SAAS,WAAW,GAAG,2BAA2B;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,KAAK,MAAM,GAAG,gDAAgD;AAAA,EAC/E;AACA,SAAO;AACT;AAEO,SAAS,mBAAwC;AACtD,SAAO,CAAC;AACV;AAIO,SAAS,gBACd,SACA,SACK;AACL,QAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AACpE,MAAI,UAAU,SAAS,EAAG,QAAO;AAEjC,QAAM,SAAS,QAAQ,IAAI,CAAC,UAAU;AACpC,UAAM,aAAa,MAAM,QAAQ,OAAO,CAAC,MAAM,UAAU,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE;AAC/E,WAAO,EAAE,OAAO,WAAW;AAAA,EAC7B,CAAC;AAGD,SAAO,OACJ,OAAO,CAAC,SAAS,KAAK,aAAa,CAAC,EACpC,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAC1C,IAAI,CAAC,SAAS,KAAK,KAAK;AAC7B;AAIO,SAAS,cACd,YACA,YACA,SACe;AACf,QAAM,SAAwB,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AACvE,QAAM,aAAa,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AACtE,QAAM,YAAYC,OAAK,YAAY,WAAW,QAAQ;AAGtD,MAAI;AACF,IAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,KAAK,OAAO,MAAM,UAAU,GAAG,mCAAmC;AACjF,WAAO,OAAO,KAAK,EAAE,MAAM,cAAc,OAAO,oBAAoB,SAAS,GAAG,CAAC;AACjF,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,YAAY;AAC7B,UAAM,QAAQ,WAAW,IAAI,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,OAAO,KAAK,EAAE,MAAM,OAAO,6BAA6B,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,WAAWD,OAAK,WAAW,GAAG,IAAI,KAAK;AAC7C,QAAIE,aAAW,QAAQ,GAAG;AACxB,aAAO,QAAQ,KAAK,IAAI;AACxB;AAAA,IACF;AAEA,QAAI;AACF,MAAAC,gBAAc,UAAU,MAAM,SAAS,MAAM;AAC7C,aAAO,UAAU,KAAK,IAAI;AAC1B,aAAO,KAAK,EAAE,OAAO,MAAM,MAAM,SAAS,GAAG,iBAAiB;AAAA,IAChE,SAAS,OAAO;AACd,aAAO,OAAO,KAAK;AAAA,QACjB;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAIO,SAAS,cACd,YACA,YACA,SACe;AACf,QAAM,SAAwB,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AACvE,QAAM,aAAa,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AACtE,QAAM,YAAYH,OAAK,YAAY,WAAW,QAAQ;AAGtD,MAAI;AACF,IAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C,SAAS,OAAO;AACd,WAAO,MAAM,EAAE,KAAK,OAAO,MAAM,UAAU,GAAG,mCAAmC;AACjF,WAAO,OAAO,KAAK,EAAE,MAAM,cAAc,OAAO,oBAAoB,SAAS,GAAG,CAAC;AACjF,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,YAAY;AAC7B,UAAM,QAAQ,WAAW,IAAI,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,OAAO,KAAK,EAAE,MAAM,OAAO,6BAA6B,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,WAAWD,OAAK,WAAW,IAAI;AACrC,UAAM,WAAWA,OAAK,UAAU,UAAU;AAC1C,QAAIE,aAAW,QAAQ,GAAG;AACxB,aAAO,QAAQ,KAAK,IAAI;AACxB;AAAA,IACF;AAEA,QAAI;AACF,MAAAD,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAEvC,UAAI,MAAM,gBAAgB,aAAa,MAAM,SAAS;AACpD,QAAAE,gBAAc,UAAU,MAAM,SAAS,MAAM;AAAA,MAC/C,OAAO;AAEL,cAAM,mBAAmB;AAAA,UACvB,KAAK,MAAM,WAAW;AAAA,UACtB;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,eAAe,MAAM,MAAM;AAAA,UAC3B,MAAM,MAAM,YAAY,MAAM,GAAG,KAAK;AAAA,UACtC;AAAA,UACA;AAAA,QACF,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,QAAAA,gBAAc,UAAU,kBAAkB,MAAM;AAAA,MAClD;AAEA,aAAO,UAAU,KAAK,IAAI;AAC1B,aAAO,KAAK,EAAE,OAAO,MAAM,MAAM,UAAU,MAAM,MAAM,YAAY,GAAG,iBAAiB;AAAA,IACzF,SAAS,OAAO;AACd,aAAO,OAAO,KAAK;AAAA,QACjB;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACnNO,SAAS,sBAAsB,KAAgB;AACpD,MAAI,IAAI,uBAAuB,OAAO,MAAW;AAC/C,UAAM,eAAe,EAAE,IAAI,MAAM,SAAS;AAC1C,UAAM,UAAU,OAAO,iBAAiB,WACpC,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IACnE,CAAC;AACL,UAAM,UAAU,iBAAiB;AACjC,WAAO,EAAE,KAAK,EAAE,QAAQ,QAAQ,SAAS,gBAAgB,SAAS,OAAO,IAAI,QAAQ,CAAC;AAAA,EACxF,CAAC;AAED,MAAI,IAAI,uBAAuB,OAAO,MAAW;AAC/C,UAAM,UAAU,iBAAiB;AACjC,WAAO,EAAE,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACnC,CAAC;AAED,MAAI,KAAK,uBAAuB,OAAO,MAAW;AAChD,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,aAAa,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;AACvH,UAAI,WAAW,WAAW,GAAG;AAC3B,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,2BAA2B,GAAG,GAAG;AAAA,MACrE;AACA,YAAM,UAAU,iBAAiB;AACjC,YAAM,SAAS,cAAc,aAAa,YAAY,OAAO;AAC7D,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC;AAAA,IACvC,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,0BAA0B;AACvD,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,4BAA4B,GAAG,GAAG;AAAA,IACtE;AAAA,EACF,CAAC;AAED,MAAI,KAAK,uBAAuB,OAAO,MAAW;AAChD,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,YAAM,aAAa,MAAM,QAAQ,QAAQ,MAAM,IAAI,QAAQ,OAAO,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAAI,CAAC;AACvH,UAAI,WAAW,WAAW,GAAG;AAC3B,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,2BAA2B,GAAG,GAAG;AAAA,MACrE;AACA,YAAM,UAAU,iBAAiB;AACjC,YAAM,SAAS,cAAc,aAAa,YAAY,OAAO;AAC7D,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,GAAG,OAAO,CAAC;AAAA,IACvC,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,0BAA0B;AACvD,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,4BAA4B,GAAG,GAAG;AAAA,IACtE;AAAA,EACF,CAAC;AACH;;;AC/CA,SAAS,uBAAuB,OAAqC;AACnE,QAAM,aAAa,OAAO,UAAU,WAAW,MAAM,KAAK,EAAE,YAAY,IAAI;AAC5E,MAAI,eAAe,SAAS,eAAe,MAAM,OAAO,UAAU,aAAa;AAC7E,WAAO;AAAA,EACT;AACA,MAAI,eAAe,YAAY,eAAe,SAAS;AACrD,WAAO;AAAA,EACT;AACA,MAAI,eAAe,YAAY,eAAe,SAAS;AACrD,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,wBAAwB,UAAU,EAAE;AACtD;AAEO,SAAS,kCAAkC,KAAgB;AAChE,MAAI,IAAI,+BAA+B,OAAO,MAAW;AACvD,UAAM,eAAe,0BAA0B;AAC/C,WAAO,EAAE,KAAK;AAAA,MACZ,IAAI;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,KAAK,oCAAoC,OAAO,MAAW;AAC7D,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,YAAM,aAAa,OAAO,SAAS,eAAe,WAC9C,QAAQ,WAAW,KAAK,KAAK,SAC7B;AAEJ,YAAM,UAAU,0BAA0B,UAAU;AACpD,YAAM,YAAY,QAAQ,KAAK,CAAC,SAAS,KAAK,WAAW,QAAQ;AACjE,aAAO,EAAE,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,uCAAuC;AACpE,YAAM,SAAS,QAAQ,WAAW,8BAA8B,IAAI,MAAM;AAC1E,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,QAAQ,GAAG,MAAM;AAAA,IACrD;AAAA,EACF,CAAC;AAED,MAAI,KAAK,sCAAsC,OAAO,MAAW;AAC/D,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AAQjC,YAAM,aAAa,OAAO,SAAS,eAAe,WAAW,QAAQ,WAAW,KAAK,IAAI;AACzF,UAAI,CAAC,YAAY;AACf,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,0BAA0B,GAAG,GAAG;AAAA,MACpE;AAEA,YAAM,OAAO,uBAAuB,SAAS,IAAI;AACjD,YAAM,UAAU,yBAAyB,YAAY,aAAa;AAAA,QAChE;AAAA,QACA,WAAW,SAAS,cAAc;AAAA,QAClC,QAAQ,SAAS,WAAW;AAAA,QAC5B,gBAAgB,SAAS,WAAW;AAAA,MACtC,CAAC;AAED,aAAO,EAAE,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,GAAG;AAAA,MACL,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,iDAAiD;AAC9E,YAAM,SAAS,QAAQ,WAAW,8BAA8B,KAAK,QAAQ,WAAW,uBAAuB,IAC3G,MACA;AACJ,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,QAAQ,GAAG,MAAM;AAAA,IACrD;AAAA,EACF,CAAC;AACH;;;AClFA,SAAS,YAAAC,iBAAgB;AACzB;AAAA,EACE,kBAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,cAAAC,mBAAkB;AAC3B,SAAmB,WAAAC,UAAS,QAAAC,cAAY;AAGjC,SAAS,mBACd,KACA,OACM;AACN,MAAI,KAAK,wBAAwB,OAAO,MAAW;AACjD,UAAM,UAAU,WAAW,CAAC;AAC5B,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC9E,UAAM,QAAQC,WAAU,OAAO,OAAO;AACtC,QAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,GAAG,GAAG;AACvE,QAAI,MAAM,UAAU,QAAQ;AAC1B,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,SAAS,MAAM,UAAU,kDAAkD,MAAM,KAAK,IAAI,GAAG,GAAG;AAAA,IACpI;AACA,QAAI;AACF,YAAM,QAAQ,mBAAmB,KAAK;AACtC,YAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,eAAS,OAAO,MAAM,IAAI,SAAS,UAAU,MAAM,UAAU,0BAA0B,KAAK,EAAE;AAC9F,YAAM,aAAa,KAAK;AACxB,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,IACnC,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,mCAAmC,OAAO,EAAE;AACzE,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,IAAI,wBAAwB,CAAC,MAAW;AAC1C,UAAM,UAAU,WAAW,CAAC;AAC5B,QAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC9E,UAAM,QAAQA,WAAU,OAAO,OAAO;AACtC,QAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,GAAG,GAAG;AAEvE,UAAM,MAAM,IAAI,YAAY;AAC5B,UAAM,SAAS,CAAC,SAAkB,IAAI,OAAO,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA,CAAM;AAChF,UAAM,aAAa,MAAM,IAAI,OAAO,iBAAiB;AAErD,QAAI;AACJ,QAAI;AAEJ,UAAM,SAAS,IAAI,eAAe;AAAA,MAChC,MAAM,MAAM;AAEV,cAAM,KAAK,MAAM;AACjB,cAAM,UAAU,KAAK,GAAG,EAAE,qBAAqB;AAC/C,YAAI,WAAW;AAEf,YAAI,WAAWC,aAAW,OAAO,GAAG;AAClC,cAAI;AACF,kBAAMC,QAAOC,UAAS,OAAO;AAC7B,uBAAWD,MAAK;AAChB,kBAAM,WAAW,KAAK,IAAI,UAAU,KAAM;AAC1C,kBAAM,KAAK,SAAS,SAAS,GAAG;AAChC,kBAAM,MAAM,OAAO,MAAM,QAAQ;AACjC,qBAAS,IAAI,KAAK,GAAG,UAAU,KAAK,IAAI,GAAG,WAAW,QAAQ,CAAC;AAC/D,sBAAU,EAAE;AACZ,iBAAK,QAAQ,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,SAAS,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC;AAAA,UACnF,QAAQ;AAAA,UAAC;AAAA,QACX,OAAO;AACL,eAAK,QAAQ,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;AAAA,QAC1D;AAGA,qBAAa,YAAY,MAAM;AAC7B,gBAAM,eAAeF,WAAU,OAAO,OAAO;AAC7C,cAAI,CAAC,gBAAiB,aAAa,UAAU,aAAa,aAAa,UAAU,eAAe,aAAa,UAAU,YAAa;AAClI,iBAAK,QAAQ,OAAO,EAAE,MAAM,QAAQ,OAAO,cAAc,MAAM,CAAC,CAAC;AACjE,0BAAc,UAAU;AACxB,0BAAc,WAAW;AACzB,gBAAI;AAAE,mBAAK,MAAM;AAAA,YAAG,QAAQ;AAAA,YAAC;AAC7B;AAAA,UACF;AACA,gBAAM,UAAU,aAAa,gBAAgB,GAAG,aAAa,aAAa,qBAAqB;AAC/F,cAAI,WAAWC,aAAW,OAAO,GAAG;AAClC,gBAAI;AACF,oBAAMC,QAAOC,UAAS,OAAO;AAC7B,kBAAID,MAAK,OAAO,UAAU;AACxB,sBAAM,WAAWA,MAAK,OAAO;AAC7B,sBAAM,KAAK,SAAS,SAAS,GAAG;AAChC,sBAAM,MAAM,OAAO,MAAM,QAAQ;AACjC,yBAAS,IAAI,KAAK,GAAG,UAAU,QAAQ;AACvC,0BAAU,EAAE;AACZ,2BAAWA,MAAK;AAChB,qBAAK,QAAQ,OAAO,EAAE,MAAM,SAAS,MAAM,IAAI,SAAS,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC;AAAA,cACpF;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF,GAAG,GAAK;AAGR,sBAAc,YAAY,MAAM;AAC9B,cAAI;AAAE,iBAAK,QAAQ,WAAW,CAAC;AAAA,UAAG,QAAQ;AAAA,UAAC;AAAA,QAC7C,GAAG,IAAM;AAAA,MACX;AAAA,MACA,SAAS;AACP,sBAAc,UAAU;AACxB,sBAAc,WAAW;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,WAAO,EAAE,KAAK,QAAQ,KAAK;AAAA,MACzB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,qBAAqB;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,IAAI,iBAAiB,OAAO,MAAW;AACzC,QAAI;AACF,YAAM,UAAU,WAAW,CAAC;AAC5B,UAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC9E,YAAM,QAAQF,WAAU,OAAO,OAAO;AACtC,UAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,GAAG,GAAG;AAEvE,YAAM,iBAAiB,CAAC,UAAkC;AACxD,cAAM,YAAY,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI;AAC7D,YAAI,CAAC,UAAW,QAAO;AACvB,cAAM,KAAK,KAAK,MAAM,SAAS;AAC/B,eAAO,OAAO,SAAS,EAAE,IAAI,KAAK;AAAA,MACpC;AAEA,YAAM,gBAAgB,cAAc,MAAM,WAAW,EAAE;AACvD,YAAM,gBAAgB,cAAc,MAAM,WAAW,EAAE;AACvD,YAAM,cAAc,eAAe,aAAa,KAAK,eAAe,aAAa;AACjF,YAAM,UAAU,cAAc,KAAK,IAAI,IAAI,cAAc;AAEzD,YAAM,KAAK,MAAM;AACjB,YAAM,UAAU,KAAK,GAAG,EAAE,qBAAqB;AAC/C,UAAI,UAAU;AACd,UAAI,UAAU;AACd,UAAI,WAAWC,aAAW,OAAO,GAAG;AAClC,YAAI;AACF,gBAAMC,QAAOC,UAAS,OAAO;AAC7B,oBAAUD,MAAK;AAEf,gBAAM,KAAK,SAAS,SAAS,GAAG;AAChC,gBAAM,WAAW,KAAK,IAAI,SAAS,IAAI;AACvC,gBAAM,MAAM,OAAO,MAAM,QAAQ;AACjC,mBAAS,IAAI,KAAK,GAAG,UAAU,KAAK,IAAI,GAAG,UAAU,QAAQ,CAAC;AAC9D,oBAAU,EAAE;AACZ,oBAAU,IAAI,SAAS,MAAM;AAAA,QAC/B,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,YAAM,cAAc,oBAAoB,KAAK;AAC7C,aAAO,EAAE,KAAK;AAAA,QACZ,IAAI;AAAA,QACJ,SAAS,MAAM;AAAA,QACf,OAAO,MAAM;AAAA,QACb,SAAS,MAAM,UAAU,aAAa,MAAM,UAAU;AAAA,QACtD,YAAY,YAAY;AAAA,QACxB,UAAU,YAAY,KAAK,OAAO;AAAA,QAClC,WAAW,iBAAiB,iBAAiB,IAAI;AAAA,QACjD,SAAS,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,QAC9C;AAAA,QACA;AAAA,QACA,YAAY,MAAM,qBAAqB;AAAA,MACzC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,WAAW,CAAC;AAC5B,aAAO,MAAM,uCAAuC,WAAW,WAAW,KAAK,OAAO,KAAK,CAAC,EAAE;AAC9F,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mCAAmC,GAAG,GAAG;AAAA,IAC7E;AAAA,EACF,CAAC;AAED,MAAI,IAAI,iBAAiB,OAAO,MAAW;AACzC,QAAI;AACF,YAAM,UAAU,WAAW,CAAC;AAC5B,UAAI,CAAC,QAAS,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,wBAAwB,GAAG,GAAG;AAC9E,YAAM,QAAQF,WAAU,OAAO,OAAO;AACtC,UAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,GAAG,GAAG;AACvE,YAAM,KAAK,MAAM;AACjB,UAAI,CAAC,MAAM,CAACC,aAAW,EAAE,GAAG;AAC1B,eAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,SAAS,sBAAsB,CAAC;AAAA,MACjF;AACA,UAAI,MAAM;AACV,UAAI,MAAM,cAAc,MAAM,YAAY;AAExC,YAAI;AACF,gBAAMG;AAAA,YACJ,wBAAwB,MAAM,UAAU,QAAQ,MAAM,UAAU;AAAA,YAChE,EAAE,UAAU,QAAQ,WAAW,IAAI,OAAO,MAAM,SAAS,MAAQ,KAAK,aAAa,OAAO,OAAO;AAAA,UACnG;AAAA,QACF,SAAS,KAAU;AACjB,gBAAM,IAAI,UAAU;AAAA,QACtB;AAAA,MACF,OAAO;AAEL,YAAI,CAACH,aAAW,WAAW,GAAG;AAC5B,iBAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,SAAS,yBAAyB,CAAC;AAAA,QACpF;AACA,YAAI;AACF,gBAAMG;AAAA,YACJ,sCAAsC,WAAW,MAAM,EAAE;AAAA,YACzD,EAAE,UAAU,QAAQ,WAAW,IAAI,OAAO,MAAM,SAAS,KAAO;AAAA,UAClE;AAAA,QACF,SAAS,KAAU;AACjB,gBAAM,IAAI,UAAU;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,CAAC,IAAI,KAAK,GAAG;AACf,eAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,SAAS,aAAa,CAAC;AAAA,MACxE;AAGA,UAAI,UAAU;AACd,UAAI,CAAC,MAAM,cAAc,CAAC,MAAM,YAAY;AAC1C,cAAM,MAAM,CAAC,MAAc,EAAE,QAAQ,uBAAuB,MAAM;AAClE,cAAM,eAAe,YAAY,SAAS,GAAG,IAAI,cAAc,GAAG,WAAW;AAC7E,cAAM,WAAW,GAAG,SAAS,GAAG,IAAI,KAAK,GAAG,EAAE;AAC9C,kBAAU,IACP,QAAQ,IAAI,OAAO,IAAI,QAAQ,GAAG,GAAG,GAAG,IAAI,EAC5C,QAAQ,IAAI,OAAO,IAAI,YAAY,GAAG,GAAG,GAAG,IAAI;AAAA,MACrD;AAGA,YAAM,aAAa;AACnB,YAAM,SAAS,QAAQ,MAAM,mBAAmB;AAChD,YAAM,WAAW,OAAO,OAAO,CAAC,UAAU;AACxC,cAAM,IAAI,MAAM,MAAM,0BAA0B;AAChD,YAAI,CAAC,EAAG,QAAO;AACf,cAAMC,YAAW,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAC1C,eAAO,CAAC,WAAW,KAAKA,SAAQ;AAAA,MAClC,CAAC;AAED,YAAM,OAAO,SAAS,KAAK,EAAE,EAAE,KAAK;AAGpC,YAAM,QAAQ,SAAS,IAAI,CAAC,UAAU;AACpC,cAAM,YAAY,MAAM,MAAM,0BAA0B;AACxD,cAAM,OAAO,YAAY,CAAC,KAAK;AAC/B,cAAM,aAAa,MAAM,MAAM,WAAW,KAAK,CAAC,GAAG;AACnD,cAAM,aAAa,MAAM,MAAM,UAAU,KAAK,CAAC,GAAG;AAClD,cAAM,QAAQ,MAAM,SAAS,eAAe;AAC5C,cAAM,YAAY,MAAM,SAAS,mBAAmB;AACpD,cAAM,SAAS,QAAQ,UAAU,YAAY,YAAY;AACzD,eAAO,EAAE,MAAM,QAAQ,WAAW,UAAU;AAAA,MAC9C,CAAC;AAED,YAAM,iBAAiB,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,WAAW,CAAC;AAChE,YAAM,iBAAiB,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,WAAW,CAAC;AAEhE,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,MAAM,gBAAgB,eAAe,CAAC;AAAA,IACzE,SAAS,OAAO;AACd,YAAM,UAAU,WAAW,CAAC;AAC5B,aAAO,MAAM,iCAAiC,WAAW,WAAW,KAAK,OAAO,KAAK,CAAC,EAAE;AACxF,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,6BAA6B,GAAG,GAAG;AAAA,IACvE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,mBAAmB,OAAO,MAAW;AAC3C,QAAI;AACF,YAAM,SAAS,MAAM;AACnB,YAAI;AAAE,UAAAD,UAAS,2BAA2B,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAAG,iBAAO;AAAA,QAAM,QAAQ;AAAE,iBAAO;AAAA,QAAO;AAAA,MACvH,GAAG;AACH,UAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,OAAO,OAAO,QAAQ,MAAM,YAAY,MAAM,CAAC;AAC3E,YAAM,UAAU,MAAM;AACpB,YAAI;AAAE,iBAAOA,UAAS,mCAAmC,EAAE,KAAK,aAAa,UAAU,QAAQ,OAAO,OAAO,CAAC,EAAE,KAAK;AAAA,QAAG,QAAQ;AAAE,iBAAO;AAAA,QAAM;AAAA,MACjJ,GAAG;AACH,YAAM,cAAc,MAAM;AACxB,YAAI;AAAE,UAAAA,UAAS,sBAAsB,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAAG,iBAAO;AAAA,QAAM,QAAQ;AAAE,iBAAO;AAAA,QAAO;AAAA,MAClH,GAAG;AACH,aAAO,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,WAAW,CAAC;AAAA,IACnD,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACxD;AAAA,EACF,CAAC;AAED,MAAI,KAAK,iBAAiB,OAAO,MAAW;AAC1C,QAAI;AACF,MAAAA,UAAS,YAAY,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAExD,MAAAA,UAAS,gDAAgD,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAC5F,YAAM,SAASA,UAAS,mCAAmC,EAAE,KAAK,aAAa,UAAU,QAAQ,OAAO,OAAO,CAAC,EAAE,KAAK;AACvH,YAAM,OAAO,gBAAgB;AAC7B,YAAM,aAAa,KAAK;AACxB,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC;AAAA,IACpC,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,KAAK,mBAAmB,OAAO,MAAW;AAC5C,QAAI;AACF,YAAM,EAAE,WAAW,IAAI,MAAM,EAAE,IAAI,KAAK;AACxC,UAAI,CAAC,cAAc,CAAC,qBAAqB,KAAK,UAAU,GAAG;AACzD,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,MACjE;AACA,MAAAA,UAAS,oBAAoB,UAAU,KAAK,EAAE,KAAK,aAAa,OAAO,OAAO,CAAC;AAC/E,YAAM,OAAO,gBAAgB;AAC7B,YAAM,aAAa,KAAK;AACxB,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,eAAe,WAAW,CAAC;AAAA,IACvD,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,MAAW;AAC5C,UAAM,QAAQ,EAAE,IAAI,MAAM,OAAO;AACjC,UAAM,UAAU,EAAE,IAAI,MAAM,SAAS;AACrC,UAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,UAAM,SAAS,MAAM,WAAW,OAAO;AAAA,MACrC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC3C,SAAS,OAAO,YAAY,YAAY,UAAU,UAAU;AAAA,MAC5D,MAAM,OAAO,SAAS,YAAY,OAAO,OAAO;AAAA,IAClD,CAAC;AACD,WAAO,EAAE,KAAK,EAAE,QAAQ,OAAO,MAAM,GAAG,GAAG,EAAE,CAAC;AAAA,EAChD,CAAC;AAED,MAAI,IAAI,yBAAyB,OAAO,MAAW;AACjD,QAAI;AACF,YAAM,gBAAgBE,OAAK,aAAa,YAAY;AACpD,UAAI,CAACL,aAAW,aAAa,GAAG;AAC9B,eAAO,EAAE,KAAK,EAAE,QAAQ,OAAO,WAAW,MAAM,CAAC;AAAA,MACnD;AACA,YAAM,UAAUM,eAAa,eAAe,OAAO;AACnD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAC7D,YAAM,YAAY,MAAM,KAAK,CAAC,MAAc,MAAM,aAAa,MAAM,cAAc,MAAM,cAAc,MAAM,WAAW;AACxH,aAAO,EAAE,KAAK,EAAE,QAAQ,MAAM,UAAU,CAAC;AAAA,IAC3C,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,4BAA4B;AACzD,aAAO,EAAE,KAAK,EAAE,QAAQ,OAAO,WAAW,OAAO,OAAO,6BAA6B,GAAG,GAAG;AAAA,IAC7F;AAAA,EACF,CAAC;AAED,MAAI,KAAK,sBAAsB,OAAO,MAAW;AAC/C,QAAI;AACF,YAAM,gBAAgBD,OAAK,aAAa,YAAY;AACpD,UAAI,CAACL,aAAW,aAAa,GAAG;AAC9B,QAAAO,gBAAc,eAAe,wCAAwC,OAAO;AAC5E,eAAO,EAAE,KAAK,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC;AAAA,MAC3C;AACA,YAAM,UAAUD,eAAa,eAAe,OAAO;AACnD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAC7D,YAAM,YAAY,MAAM,KAAK,CAAC,MAAc,MAAM,aAAa,MAAM,cAAc,MAAM,cAAc,MAAM,WAAW;AACxH,UAAI,WAAW;AACb,eAAO,EAAE,KAAK,EAAE,IAAI,MAAM,gBAAgB,KAAK,CAAC;AAAA,MAClD;AACA,YAAM,SAAS,QAAQ,SAAS,IAAI,IAAI,KAAK;AAC7C,MAAAE,gBAAe,eAAe,GAAG,MAAM;AAAA;AAAA;AAAA,GAA0C,OAAO;AACxF,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACzC,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,6BAA6B;AAC1D,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,8BAA8B,GAAG,GAAG;AAAA,IACxE;AAAA,EACF,CAAC;AAED,MAAI,KAAK,2BAA2B,OAAO,MAAW;AACpD,QAAI;AACF,YAAM,UAAU,MAAM,EAAE,IAAI,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ,MAAM,WAAW,GAAG;AAC/D,eAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,qBAAqB,GAAG,GAAG;AAAA,MAC/D;AACA,YAAM,WAAWC,YAAW;AAC5B,YAAM,YAAYJ,OAAK,kBAAkB,QAAQ,QAAQ;AACzD,MAAAK,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,YAAM,QAAkB,CAAC;AACzB,iBAAW,QAAQ,QAAQ,OAAO;AAChC,YAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,KAAM;AACjD,cAAM,UAAUC,SAAQ,KAAK,IAAI,EAAE,QAAQ,gBAAgB,EAAE,EAAE,MAAM,GAAG,EAAE,KAAK;AAC/E,cAAM,WAAW,GAAGF,YAAW,CAAC,GAAG,OAAO;AAC1C,cAAM,OAAOJ,OAAK,WAAW,QAAQ;AACrC,QAAAE,gBAAc,MAAM,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC;AACpD,cAAM,KAAK,IAAI;AAAA,MACjB;AACA,aAAO,EAAE,KAAK,EAAE,IAAI,MAAM,OAAO,SAAS,CAAC;AAAA,IAC7C,SAAS,OAAO;AACd,aAAO,MAAM,EAAE,KAAK,MAAM,GAAG,gCAAgC;AAC7D,aAAO,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAAG,GAAG;AAAA,IACjG;AAAA,EACF,CAAC;AACH;;;AvCjWA,IAAM,iBAAN,MAAqB;AAAA,EACV,SAA0C,CAAC;AAAA,EAEpD,IAAI,MAAc,SAA0B;AAAE,SAAK,OAAO,OAAO,IAAI,EAAE,IAAI;AAAA,EAAS;AAAA,EACpF,KAAK,MAAc,SAA0B;AAAE,SAAK,OAAO,QAAQ,IAAI,EAAE,IAAI;AAAA,EAAS;AAAA,EACtF,IAAI,MAAc,SAA0B;AAAE,SAAK,OAAO,OAAO,IAAI,EAAE,IAAI;AAAA,EAAS;AAAA,EACpF,MAAM,MAAc,SAA0B;AAAE,SAAK,OAAO,SAAS,IAAI,EAAE,IAAI;AAAA,EAAS;AAAA,EACxF,OAAO,MAAc,SAA0B;AAAE,SAAK,OAAO,UAAU,IAAI,EAAE,IAAI;AAAA,EAAS;AAC5F;AAIA,eAAsB,eACpB,OACA,MACe;AACf,SAAO,KAAK,EAAE,KAAK,GAAG,2BAA2B;AACjD,QAAMK,WAAU,WAAW;AAC3B,MAAI,CAACA,UAAS;AACZ,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AAEA,QAAM,EAAE,UAAU,IAAI,MAAM,eAAe;AAE3C,QAAM,kBAA2D,OAAO;AAAA,IACtE,wBAAwB,IAAI,CAAC,mBAAmB;AAAA,MAC9C,eAAe;AAAA,MACf;AAAA,QACE,GAAI,eAAe,OAAO,CAAC;AAAA,QAC3B,eAAe;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,sBAAsB,IAAI,IAAI,OAAO,KAAK,eAAe,CAAC;AAEhE,QAAM,oBAAoB,MAAOA,SAAuE,gBAAgB;AACxH,aAAW,QAAQ,qBAAqB,CAAC,GAAG;AAC1C,QACE,OAAO,MAAM,SAAS,YACtB,KAAK,KAAK,WAAW,SAAS,KAC9B,CAAC,oBAAoB,IAAI,KAAK,IAAI,GAClC;AACA,sBAAgB,KAAK,IAAI,IAAI,EAAE,SAAS,MAAM;AAAA,IAChD;AAAA,EACF;AAEA,uBAAqB,KAAK;AAE1B,QAAM,gBAAgB,CAAC,UAAkB,aAAqB,eAAe,eAAe;AAC1F,QAAI,CAACC,aAAW,QAAQ,GAAG;AACzB,aAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,IAClD;AACA,WAAO,IAAI,SAASC,eAAa,QAAQ,GAAG;AAAA,MAC1C,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAACD,aAAW,cAAc,GAAG;AAC/B,aAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,IAClD;AACA,UAAM,OAAOC,eAAa,gBAAgB,MAAM,EAC7C,QAAQ,uCAAuC,8BAA8B,EAC7E,WAAW,2BAA2B,kBAAkB;AAC3D,WAAO,IAAI,SAAS,MAAM;AAAA,MACxB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,YAAY,IAAI,eAAe;AACrC,sBAAoB,WAAW,KAAK;AACpC,qBAAmB,WAAW,KAAK;AACnC,yBAAuB,WAAW,KAAK;AACvC,0BAAwB,SAAS;AACjC,yBAAuB,WAAW,KAAK;AACvC,wBAAsB,SAAS;AAC/B,oCAAkC,SAAS;AAC3C,qBAAmB,WAAW,KAAK;AAEnC,QAAM,YAAY,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA,MAAM;AAAA,IACN,eAAe;AAAA;AAAA,IAEf,WAAW,CAAC;AAAA,MACV,MAAM,EAAE,MAAM,WAAW,KAAK;AAAA,MAC9B,WAAW;AAAA,QACT,MAAM;AAAA,QACN,WAAW,oBAAoB,KAAK;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,IACD,WAAW,MAAM,IAAI,SAAS,MAAM;AAAA,MAClC,QAAQ;AAAA,MACR,SAAS,EAAE,UAAU,UAAU;AAAA,IACjC,CAAC;AAAA,IACD,QAAQ,CAAC;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ,EAAE,MAAM,KAAK;AAAA,IACvB,CAAC;AAAA,IACD,MAAM,EAAE,SAAS,MAAM,OAAO,cAAc,SAAS,SAAS,aAAa,qCAAqC;AAAA,IAChH,MAAM,EAAE,SAAS,MAAM,QAAQ,IAAI;AAAA,IACnC,UAAU,EAAE,SAAS,MAAM;AAAA,IAC3B,SAAS,EAAE,SAAS,MAAM,cAAc,CAAC,WAAW,WAAW,YAAY,aAAa,WAAW,EAAE;AAAA,IACrG,aAAa,EAAE,SAAS,MAAM,WAAW,KAAK;AAAA,IAC9C,QAAQ,EAAE,SAAS,KAAK;AAAA,IACxB,WAAW;AAAA,MACT,GAAG;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,UAAU;AAAA,MACb,6BAA6B,MAC3B,cAAc,wBAAwB,0CAA0C;AAAA,MAClF,0BAA0B,MACxB,cAAc,4BAA4B,yCAAyC,UAAU;AAAA,MAC/F,qBAAqB,MACnB,cAAc,uBAAuB,0BAA0B;AAAA,MACjE,iBAAiB,MACf,cAAc,mBAAmB,iBAAiB,mCAAmC;AAAA,MACvF,0BAA0B,MACxB,cAAc,4BAA4B,iBAAiB,mCAAmC;AAAA,MAChG,mBAAmB,MAAM,cAAc;AAAA,MACvC,eAAe,MAAM,cAAc;AAAA,MACnC,eAAe,MAAM,cAAc;AAAA,MACnC,iBAAiB,MAAM,cAAc;AAAA,MACrC,eAAe,MAAM,cAAc;AAAA,MACnC,iBAAiB,MAAM,cAAc;AAAA,MACrC,yBAAyB,MAAM,cAAc;AAAA,MAC7C,+BAA+B,MAAM,cAAc;AAAA,MACnD,0BAA0B,MAAM,cAAc;AAAA,MAC9C,2BAA2B,MAAM,cAAc;AAAA,MAC/C,mBAAmB,CAAC,MAClB,EAAE,KAAK,EAAE,QAAQ,MAAM,UAAU,YAAY,QAAQ,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAMF,SAAQ,UAAU,WAAW,KAAK;AACvD,qBAAmB,MAAM;AACzB,SAAO,KAAK,iDAAiD,IAAI,EAAE;AACnE,SAAO,KAAK,yCAAyC,IAAI,KAAK;AAC9D,SAAO,KAAK,+BAA+B,IAAI,YAAY;AAC3D,SAAO,KAAK,8CAA8C,IAAI,OAAO;AACvE;;;AF/JA,IAAI,mBAAsC;AAC1C,IAAI,UAA+B;AACnC,IAAI,uBAA4C;AAChD,IAAI,qBAA0C;AAC9C,IAAI,oBAAyC;AAC7C,IAAI,qBAA0C;AAC9C,IAAI,uBAA4C;AAChD,IAAI,uBAA4C;AAChD,IAAI,wBAA6C;AACjD,IAAI,kBAAyD;AAC7D,IAAI,2BAAkE;AACtE,IAAI,iBAAmH;AAoBhH,SAAS,aAAkC;AAAE,SAAO;AAAS;AAE7D,SAAS,wBAA6C;AAAE,SAAO;AAAoB;AACnF,SAAS,0BAA+C;AAAE,SAAO;AAAsB;AACvF,SAAS,0BAA+C;AAAE,SAAO;AAAsB;AACvF,SAAS,2BAAgD;AAAE,SAAO;AAAuB;AACzF,SAAS,mBAAmB,QAAqD;AAAE,oBAAkB;AAAQ;AACpH,IAAI,wBAA+D;AAEnE,eAAsB,iBAAsC;AAC1D,MAAI,iBAAkB,QAAO;AAE7B,MAAI;AACF,UAAM,WAAW,MAAM,OAAO,cAAc;AAC5C,UAAM,eAAe,MAAM,OAAO,uBAAuB;AAEzD,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAQ,aAAyC,cAAc,YAAY;AAC7E,sBAAiB,aAAwD;AAAA,IAC3E,WAAW,OAAQ,aAAyC,kBAAkB,YAAY;AACxF,sBAAgB,MAAO,aAA2E,cAAc;AAAA,IAClH;AAEA,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,QAAI,OAAQ,aAAyC,oBAAoB,YAAY;AACnF,4BAAuB,aAAoE;AAAA,IAC7F,WAAW,OAAQ,aAAyC,wBAAwB,YAAY;AAC9F,4BAAsB,MAAO,aAAuF,oBAAoB;AAAA,IAC1I;AAEA,QAAI,OAAQ,aAAyC,uBAAuB,YAAY;AACtF,+BAA0B,aAA0E;AAAA,IACtG;AAEA,QAAI;AACJ,QAAI,OAAQ,aAAyC,8BAA8B,YAAY;AAC7F,sCAAiC,aAAwF;AAAA,IAC3H;AAEA,QAAI;AACJ,QAAI,OAAQ,aAAyC,kBAAkB,YAAY;AACjF,0BAAqB,aAAgE;AAAA,IACvF;AAEA,uBAAmB;AAAA,MACjB,MAAM,SAAS;AAAA,MACf,kBAAkB,SAAS;AAAA,MAC3B,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,2BAA2B;AAAA,MAC3B,eAAe;AAAA,IACjB;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,SAAK,2BAA2B,OAAO,KAAK,CAAC,EAAE;AAAA,EACjD;AACF;AAEA,eAAsB,iBAAgC;AACpD,YAAU,sBAAsB;AAChC,QAAM,EAAE,MAAM,kBAAkB,mBAAmB,IAAI,MAAM,eAAe;AAC5E,YAAU,8BAA8B;AAExC,EAAAG,WAAU,oBAAoB,EAAE,WAAW,KAAK,CAAC;AAEjD,YAAU,IAAI,KAAK;AAAA,IACjB,QAAQ,IAAI,iBAAiB;AAAA,MAC3B,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAED,QAAM,QAAQ,QAAQ;AACtB,YAAU,0BAA0B;AAEpC,aAAW,kBAAkB,yBAAyB;AACpD,UAAM,QAAQ,eAAe,cAAc;AAAA,EAC7C;AAEA,MAAI,oBAAoB;AACtB,UAAM,qBAAqB,MAAM,QAAQ;AAAA,MACvC,IAAI,mBAAmB;AAAA,QACrB,eAAe;AAAA,UACb,CAAC,sBAAsB,GAAG;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AAEA,+BAA2B;AAC3B,UAAM,mBAAmB,CAA0C,WAAmC;AACpG,aAAO,OAAO,WAAW,aAAa,OAAO,KAAK,kBAAkB,IAAS;AAAA,IAC/E;AACA,+BAA2B;AAAA,MACzB,MAAM,iBAA4H,mBAAmB,IAAI;AAAA,MACzJ,sBAAsB,iBAA4I,mBAAmB,oBAAoB;AAAA,MACzM,UAAU,iBAAgI,mBAAmB,QAAQ;AAAA,MACrK,kBAAkB,iBAAwI,mBAAmB,gBAAgB;AAAA,MAC7L,gBAAgB,iBAAsI,mBAAmB,cAAc;AAAA,IACzL,CAAC;AAAA,EACH,OAAO;AACL,WAAO,KAAK,gFAAgF;AAAA,EAC9F;AAGA,QAAM,EAAE,0BAA0B,IAAI,MAAM,eAAe;AAC3D,MAAI,2BAA2B;AAC7B,QAAI;AACF,YAAM,WAAW,IAAI,0BAA0B;AAAA,QAC7C,WAAW;AAAA,UACT,CAAC,mBAAmB,GAAG;AAAA;AAAA,YAErB,EAAE,OAAO,gBAAgB,WAAW,gBAAgB,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA;AAAA,YAEpG,EAAE,OAAO,0BAA0B,WAAW,0BAA0B,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,YACxH,EAAE,OAAO,0BAA0B,WAAW,0BAA0B,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,YACxH,EAAE,OAAO,2BAA2B,WAAW,2BAA2B,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA;AAAA,YAE1H,EAAE,OAAO,qCAAqC,WAAW,qCAAqC,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,YAC9I,EAAE,OAAO,sCAAsC,WAAW,sCAAsC,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,YAChJ,EAAE,OAAO,sCAAsC,WAAW,sCAAsC,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA;AAAA,YAEhJ,EAAE,OAAO,eAAe,WAAW,eAAe,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA;AAAA,YAElG,EAAE,OAAO,cAAc,WAAW,cAAc,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,YAChG,EAAE,OAAO,gBAAgB,WAAW,gBAAgB,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,YACpG,EAAE,OAAO,gBAAgB,WAAW,gBAAgB,cAAc,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,UACtG;AAAA,QACF;AAAA,QACA,iBAAiB;AAAA,QACjB,WAAW,EAAE,SAAS,KAAK;AAAA,QAC3B,QAAQ,EAAE,aAAa,OAAO,UAAU,MAAM;AAAA,QAC9C,iBAAiB,EAAE,gBAAgB,eAAe,eAAe,GAAG;AAAA,QACpE,iBAAiB;AAAA,QACjB,uBAAuB;AAAA,MACzB,CAAC;AACD,YAAM,QAAQ,UAAU,UAAqB,sBAAsB;AACnE,uBAAiB;AACjB,aAAO,KAAK,iEAAiE;AAAA,IAC/E,SAAS,OAAO;AACd,aAAO,KAAK,iDAAiD,OAAO,KAAK,CAAC,EAAE;AAAA,IAC9E;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,yBAAuB,MAAM,QAAQ,YAAY,wBAAwB;AACzE,uBAAqB,MAAM,QAAQ,YAAY,iBAAiB;AAChE,sBAAoB,MAAM,QAAQ,YAAY,qBAAqB;AACnE,uBAAqB,MAAM,QAAQ,YAAY,iBAAiB;AAChE,yBAAuB,MAAM,QAAQ,YAAY,mBAAmB;AACpE,yBAAuB,MAAM,QAAQ,YAAY,wBAAwB;AACzE,0BAAwB,MAAM,QAAQ,YAAY,yBAAyB;AAC3E,YAAU,gCAAgC;AAC5C;AAEO,SAAS,qBAAqB,OAAyB;AAC5D,MAAI,iBAAiB,OAAO;AAC1B,WAAO,wCAAwC,KAAK,MAAM,OAAO;AAAA,EACnE;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,wCAAwC,KAAK,KAAK;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,eAAsB,qBAAmD;AACvE,MAAI,CAAC,sBAAsB;AACzB,WAAO,MAAM,4DAA4D;AACzE,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,2CAA2C;AACxD,MAAI;AACF,UAAMC,UAAS,MAAM,qBAAqB,IAAI,sBAAsB;AACpE,QAAIA,SAAQ,SAAS,OAAOA,QAAO,UAAU,UAAU;AACrD,YAAM,QAAQA,QAAO;AACrB,UAAI,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,GAAG;AAC1D,eAAO;AAAA,MACT;AAEA,aAAO,KAAK,8EAA8E;AAAA,IAC5F;AAAA,EACF,SAAS,OAAO;AACd,QAAI,CAAC,qBAAqB,KAAK,GAAG;AAChC,aAAO,KAAK,2EAA2E,OAAO,KAAK,CAAC,EAAE;AAAA,IACxG;AAAA,EACF;AAGA,SAAO,8BAA8B;AACvC;AAEA,eAAe,gCAA8D;AAC3E,MAAI,CAAC,mBAAoB,QAAO;AAEhC,MAAI;AACF,UAAM,UAAU,MAAO,mBAA2B,KAAK,EAAE,OAAO,IAAI,CAAC;AACrE,QAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAE5D,UAAM,SAAS,QACZ,OAAO,CAAC,MAAW,GAAG,MAAM,GAAG,cAAc,GAAG,KAAK,EACrD,IAAI,CAAC,MAAW,CAAmC;AAEtD,QAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,WAAO,KAAK,aAAa,OAAO,MAAM,qCAAqC;AAE3E,QAAI,mBAAmB;AACrB,iBAAW,SAAS,QAAQ;AAC1B,YAAI;AACF,gBAAM,aAAa,MAAM,kBAAkB,IAAI,MAAM,EAAE;AACvD,cAAI,YAAY,KAAM,OAAM,OAAO,WAAW;AAC9C,cAAI,YAAY,YAAa,OAAM,cAAc,WAAW;AAAA,QAC9D,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,MACf,aAAa;AAAA,MACb,eAAe;AAAA,MACf,WAAW;AAAA,MACX,QAAQ,CAAC;AAAA,MACT;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,SAAS,WAAW,MAAM;AAAA,MAC1B,OAAO,CAAC,iEAAiE;AAAA,IAC3E;AAAA,EACF,SAAS,OAAO;AACd,WAAO,KAAK,uCAAuC,OAAO,KAAK,CAAC,EAAE;AAClE,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aAAa,OAAoC;AACrE,QAAM,UAAU;AAAA,IACd,GAAG,WAAW,MAAM,MAAM;AAAA,IAC1B,eAAe,MAAM,QAAQ;AAAA,EAC/B;AAEA,MAAI,CAAC,qBAAsB;AAG3B,QAAM,QAAQ,cAAc;AAC5B,QAAM,kBAAkB,iBAAiB,EAAE;AAC3C,QAAM,kBAAkB,iBAAiB,EAAE;AAC3C,MAAI,SAAS,kBAAkB,KAAK,kBAAkB,GAAG;AACvD,WAAO,MAAM,EAAE,OAAO,aAAa,iBAAiB,aAAa,gBAAgB,GAAG,0BAA0B;AAAA,EAChH;AAEA,MAAI,OAAO;AACT,UAAM,qBAAqB,QAAQ,wBAAwB;AAAA,MACzD,IAAI;AAAA,MACJ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,WAAW,IAAI;AAAA,MACf;AAAA,IACF,CAA8B;AAAA,EAChC;AAEA,QAAM,cAAc,iBAAiB;AACrC,MAAI,sBAAsB,YAAY,OAAO,GAAG;AAC9C,eAAW,SAAS,MAAM,QAAQ;AAChC,UAAI,CAAC,YAAY,IAAI,MAAM,EAAE,EAAG;AAGhC,YAAM,EAAE,MAAM,OAAO,aAAa,cAAc,GAAG,UAAU,IAAI;AACjE,YAAM,QAAQ;AAAA,QACZ,GAAG;AAAA,QACH,aAAa,MAAM,eAAe;AAAA,QAClC,WAAW,MAAM,aAAa;AAAA,QAC9B,aAAa,MAAM,eAAe;AAAA,QAClC,qBAAqB,MAAM,uBAAuB;AAAA,QAClD,iBAAiB,OAAO,MAAM,oBAAoB,WAAW,MAAM,kBAAkB;AAAA,MACvF;AACA,UAAI;AACF,cAAM,mBAAmB,QAAQ,MAAM,IAAI,KAAK;AAAA,MAClD,SAAS,OAAO;AACd,eAAO,KAAK,2BAA2B,MAAM,EAAE,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,MACrE;AAAA,IACF;AACA,uBAAmB;AAAA,EACrB;AAEA,QAAM,kBAAkB,qBAAqB;AAC7C,MAAI,qBAAqB,gBAAgB,OAAO,GAAG;AACjD,eAAW,SAAS,MAAM,QAAQ;AAChC,UAAI,CAAC,gBAAgB,IAAI,MAAM,EAAE,EAAG;AACpC,UAAI;AACF,cAAM,kBAAkB,QAAQ,MAAM,IAAI;AAAA,UACxC,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM;AAAA,UACnB,aAAa,MAAM,eAAe;AAAA,QACpC,CAAC;AAAA,MACH,SAAS,OAAO;AACd,eAAO,KAAK,gCAAgC,MAAM,EAAE,KAAK,OAAO,KAAK,CAAC,EAAE;AAAA,MAC1E;AAAA,IACF;AACA,2BAAuB;AAAA,EACzB;AAEA,QAAM,cAAc,iBAAiB;AACrC,MAAI,sBAAsB,YAAY,OAAO,GAAG;AAC9C,eAAW,SAAS,MAAM,QAAQ;AAChC,UAAI,CAAC,YAAY,IAAI,MAAM,EAAE,EAAG;AAChC,YAAM,mBAAmB,QAAQ,MAAM,IAAI,KAA4B;AAAA,IACzE;AACA,uBAAmB;AAAA,EACrB;AAGA,8BAA4B;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IACf,cAAc,wBAAwB,MAAM,MAAM;AAAA,IAClD,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM,OAAO,MAAM,GAAG,EAAE;AAAA,IAChC,WAAW,MAAM;AAAA,EACnB,CAAC;AACH;AAGA,eAAsB,iBAAiB,OAAoC;AACzE,qBAAmB,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAChD,yBAAuB,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACpD,qBAAmB,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAChD,QAAM,aAAa,KAAK;AAC1B;AAEA,eAAsB,wBAAyD;AAC7E,MAAI,CAAC,sBAAsB,KAAM,QAAO,CAAC;AAEzC,MAAI;AACF,UAAM,UAAU,MAAM,qBAAqB,KAAK,EAAE,OAAO,IAAI,CAAC;AAC9D,WAAO,MAAM,QAAQ,OAAO,IACxB,QAAQ;AAAA,MAAO,CAACA,YAChB;AAAA,QACEA,WACA,OAAOA,QAAO,OAAO,YACrB,OAAOA,QAAO,UAAU;AAAA,MAC1B;AAAA,IACF,IACE,CAAC;AAAA,EACP,SAAS,OAAO;AACd,WAAO,KAAK,gDAAgD,OAAO,KAAK,CAAC,EAAE;AAC3E,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,wBAAwB,SAA8C;AAC1F,MAAI,CAAC,qBAAsB;AAC3B,QAAM,qBAAqB,QAAQ,QAAQ,IAAI,OAAO;AACxD;AAMA,eAAsB,iBAAiB,OAAO,IAAsD;AAClG,MAAI,CAAC,gBAAgB,aAAc,QAAO,CAAC;AAC3C,MAAI;AACF,UAAM,MAAM,MAAM,eAAe,aAAa,qBAAqB,eAAe,IAAI;AACtF,QAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,WAAO,IACJ,IAAI,CAAC,MAAe;AACnB,YAAM,MAAM;AACZ,YAAM,OAAQ,IAAI,QAAQ,IAAI,UAAU,IAAI,OAAO;AACnD,YAAM,SAAS,OAAO,IAAI,SAAS,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,CAAC;AACzE,aAAO,EAAE,MAAM,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE,GAAG,OAAO;AAAA,IACnD,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;AAAA,EACzC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAKA,eAAsB,gBAAgB,OAAO,IAAsG;AACjJ,MAAI,CAAC,gBAAgB,aAAc,QAAO,CAAC;AAC3C,MAAI;AACF,UAAM,CAAC,UAAU,YAAY,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MACzD,eAAe,aAAa,qBAAqB,cAAc,IAAI;AAAA,MACnE,eAAe,aAAa,qBAAqB,gBAAgB,IAAI;AAAA,MACrE,eAAe,aAAa,qBAAqB,gBAAgB,IAAI;AAAA,IACvE,CAAC;AAED,UAAM,QAAQ,CAAC,QAAsC;AACnD,UAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,oBAAI,IAAI;AACxC,aAAO,IAAI;AAAA,QACT,IACG,IAAI,CAAC,MAAe;AACnB,gBAAM,MAAM;AACZ,gBAAM,OAAO,OAAO,IAAI,QAAQ,IAAI,UAAU,IAAI,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE;AACxE,gBAAM,QAAQ,OAAO,IAAI,SAAS,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,CAAC;AACxE,iBAAO,CAAC,MAAM,KAAK;AAAA,QACrB,CAAC,EACA,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,WAAW,EAAE;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,QAAQ;AAC/B,UAAM,aAAa,MAAM,UAAU;AACnC,UAAM,WAAW,MAAM,QAAQ;AAC/B,UAAM,WAAW,oBAAI,IAAI,CAAC,GAAG,SAAS,KAAK,GAAG,GAAG,WAAW,KAAK,GAAG,GAAG,SAAS,KAAK,CAAC,CAAC;AAEvF,WAAO,MAAM,KAAK,QAAQ,EACvB,IAAI,CAAC,UAAU;AAAA,MACd;AAAA,MACA,YAAY,SAAS,IAAI,IAAI,KAAK;AAAA,MAClC,cAAc,WAAW,IAAI,IAAI,KAAK;AAAA,MACtC,cAAc,SAAS,IAAI,IAAI,KAAK;AAAA,IACtC,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,EAAE,eAAe,CAAC,EACpD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EAChD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,kBAAiC;AACrD,SAAO,KAAK,yCAAyC;AACrD,yBAAuB;AAEvB,MAAI;AACF,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM,OAAO,6BAAoB;AAC9D,UAAMA,kBAAiB;AAAA,EACzB,SAAS,OAAO;AACd,WAAO,KAAK,iCAAiC,OAAO,KAAK,CAAC,EAAE;AAAA,EAC9D;AAEA,MAAI,gBAAgB,MAAM;AACxB,QAAI;AACF,YAAM,eAAe,KAAK;AAAA,IAC5B,SAAS,OAAO;AACd,aAAO,KAAK,8CAA8C,OAAO,KAAK,CAAC,EAAE;AAAA,IAC3E,UAAE;AACA,uBAAiB;AAAA,IACnB;AAAA,EACF;AACA,MAAI,0BAA0B,MAAM;AAClC,QAAI;AACF,YAAM,yBAAyB,KAAK;AAAA,IACtC,SAAS,OAAO;AACd,aAAO,KAAK,uCAAuC,OAAO,KAAK,CAAC,EAAE;AAAA,IACpE,UAAE;AACA,iCAA2B;AAC3B,iCAA2B,IAAI;AAAA,IACjC;AAAA,EACF;AACA,MAAI,uBAAuB,MAAM;AAC/B,QAAI;AACF,YAAM,sBAAsB,KAAK;AAAA,IACnC,SAAS,OAAO;AACd,aAAO,KAAK,oCAAoC,OAAO,KAAK,CAAC,EAAE;AAAA,IACjE,UAAE;AACA,8BAAwB;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,iBAAiB,MAAM;AACzB,QAAI;AACF,YAAM,gBAAgB,KAAK;AAAA,IAC7B,SAAS,OAAO;AACd,aAAO,KAAK,8BAA8B,OAAO,KAAK,CAAC,EAAE;AAAA,IAC3D,UAAE;AACA,wBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,CAAC,QAAS;AAEd,MAAI;AACF,UAAM,QAAQ,WAAW;AAAA,EAC3B,SAAS,OAAO;AACd,WAAO,KAAK,uCAAuC,OAAO,KAAK,CAAC,EAAE;AAAA,EACpE,UAAE;AACA,cAAU;AACV,2BAAuB;AACvB,yBAAqB;AACrB,wBAAoB;AACpB,yBAAqB;AACrB,2BAAuB;AACvB,2BAAuB;AACvB,4BAAwB;AAAA,EAC1B;AACF;;;A0CthBA,IAAM,sBAAsB;AAE5B,SAAS,eAAgC;AACvC,SAAO;AAAA,IACL,OAAO;AAAA,IAAI,aAAa;AAAA,IAAI,QAAQ;AAAA,IACpC,MAAM;AAAA,IAAM,OAAO;AAAA,IAAM,KAAK;AAAA,IAAM,UAAU;AAAA,IAC9C,WAAW;AAAA,IAAM,aAAa;AAAA,IAAM,WAAW,IAAI;AAAA,IACnD,aAAa;AAAA,IAAG,OAAO;AAAA,EACzB;AACF;AAEA,eAAsB,eAAe,SAAyC;AAC5E,UAAQ,YAAY,IAAI;AACxB,MAAI;AACF,UAAM,wBAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,KAAK,uCAAuC,OAAO,KAAK,CAAC,EAAE;AAAA,EACpE;AACF;AAEA,eAAsB,sBAAuD;AAC3E,QAAM,WAAW,wBAAwB;AACzC,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI;AACF,UAAMC,UAAS,MAAM,SAAS,IAAI,mBAAmB;AACrD,QAAIA,SAAQ,SAAS,OAAOA,QAAO,UAAU,UAAU;AACrD,aAAOA,QAAO;AAAA,IAChB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,eAAsB,uBAAsC;AAC1D,QAAM,eAAe,aAAa,CAAC;AACrC;AAGA,eAAsB,yBAAwC;AAC5D,QAAM,UAAU,MAAM,oBAAoB;AAC1C,MAAI,CAAC,WAAW,QAAQ,WAAW,WAAY;AAE/C,MAAI,QAAQ,KAAK;AACf,QAAI,QAAQ;AACZ,QAAI;AAAE,cAAQ,KAAK,QAAQ,KAAK,CAAC;AAAG,cAAQ;AAAA,IAAM,QAAQ;AAAA,IAAC;AAE3D,QAAI,OAAO;AACT,aAAO,KAAK,qCAAqC,QAAQ,GAAG,oBAAoB;AAChF;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,SAAS;AACjB,UAAQ,QAAQ;AAChB,UAAQ,MAAM;AACd,QAAM,eAAe,OAAO;AAC5B,SAAO,KAAK,6DAA6D;AAC3E;;;ACrGA,SAAS,iBAAAC,uBAAqB;AAC9B,SAAS,QAAAC,cAAY;AACrB,SAAS,eAAAC,cAAa,UAAAC,eAAc;AACpC,SAAS,UAAAC,eAAc;;;ACGhB,SAAS,aAAa,QAA+B;AAC1D,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,WAAW,EAAG,QAAO;AAEtE,QAAM,UAAU,OAAO,WAAW,OAAO,cAAc,OAAO,SAAS,OAAO,eAAe,OAAO,eAAe;AAEnH,QAAM,eAAe,CAAC,WAAW,OAAO,UAAU,MAAM;AAExD,SAAO;AAAA,IACL,SAAS,OAAO,OAAO;AAAA,IACvB,qBAAqB,aAAa,SAAS,OAAO,mBAAmB,IAAI,OAAO,sBAC5E,aAAa,SAAS,OAAO,UAAU,IAAI,OAAO,aAAa;AAAA,IAEnE,OAAO,OAAO,MAAM,IAAI,CAAC,GAAQ,OAAe;AAAA,MAC9C,MAAM,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO,OAAO,EAAE,OAAO,WAAW,EAAE,KAAK,IAAI;AAAA,MAClF,QAAQ,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO,OAAO,EAAE;AAAA,MAChI,OAAO,cAAc,EAAE,KAAK;AAAA,MAC5B,SAAS,EAAE,UAAU,OAAO,EAAE,OAAO,IAAI;AAAA,MACzC,WAAW,EAAE,aAAa,EAAE,cAAc;AAAA,MAC1C,UAAU,MAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,KAAK,IAAI,IAAK,EAAE,YAAY,EAAE,aAAa;AAAA,IAC9F,EAAE;AAAA,IAEF,aAAa,cAAc,OAAO,WAAW;AAAA,IAC7C,aAAa,cAAc,OAAO,WAAW;AAAA,IAC7C,UAAU,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,SAAS,IAAI,CAAC,OAAY;AAAA,MAC1E,UAAU,OAAO,EAAE,YAAY,EAAE;AAAA,MACjC,cAAc,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE;AAAA,MAC7D,cAAc,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE;AAAA,IAC/D,EAAE,IAAI;AAAA,IACN,iBAAiB,cAAc,OAAO,mBAAmB,OAAO,gBAAgB;AAAA,IAChF,OAAO,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,MAAM,IAAI,CAAC,OAAY;AAAA,MACjE,MAAM,OAAO,EAAE,QAAQ,EAAE;AAAA,MACzB,QAAQ,OAAO,EAAE,UAAU,EAAE;AAAA,MAC7B,YAAY,OAAO,EAAE,cAAc,EAAE;AAAA,IACvC,EAAE,IAAI;AAAA,IACN,YAAY,cAAc,OAAO,UAAU;AAAA,IAC3C,cAAc,cAAc,OAAO,YAAY;AAAA,IAE/C,mBAAmB,OAAO,qBAAqB,OAAO,sBAAsB;AAAA,IAC5E,iBAAiB,OAAO,mBAAmB,OAAO,oBAAoB;AAAA,IAEtE,gBAAgB,cAAc,OAAO,kBAAkB,OAAO,mBAAmB,OAAO,sBAAsB,OAAO,aAAa,OAAO,cAAc,OAAO,KAAK;AAAA,IACnK,iBAAiB,cAAc,OAAO,mBAAmB,OAAO,oBAAoB,OAAO,MAAM;AAAA,IACjG,iBAAiB,OAAO,mBAAmB,OAAO,oBAAoB,OAAO,oBAAoB,OAAO,qBAAqB,OAAO,UAAU,EAAE,SAAS,SAAS;AAAA,IAElK,UAAU;AAAA,IACV,WAAW,IAAI;AAAA,EACjB;AACF;AAEO,SAAS,gBAAgB,KAA+B;AAC7D,QAAM,OAAO,IAAI,KAAK;AACtB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,aAAuB,CAAC;AAG9B,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,IAAI;AAG7B,QAAI,OAAO,qBAAqB,OAAO,MAAM,sBAAsB,UAAU;AAC3E,YAAM,OAAO,aAAa,MAAM,iBAAiB;AACjD,UAAI,KAAM,QAAO;AAEjB,iBAAW,KAAK,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAAA,IACzD;AAEA,QAAI,OAAO,UAAU,OAAO,MAAM,WAAW,UAAU;AACrD,YAAM,SAAS,MAAM;AACrB,iBAAW,KAAK,MAAM;AAEtB,iBAAW,KAAK,GAAG,mBAAmB,MAAM,CAAC;AAE7C,YAAM,mBAAmB,OAAO,SAAS,mCAAmC;AAC5E,iBAAW,SAAS,iBAAkB,YAAW,KAAK,MAAM,CAAC,CAAC;AAAA,IAChE;AAEA,QAAI,OAAO,QAAS,YAAW,KAAK,IAAI;AAAA,EAC1C,QAAQ;AAAA,EAAC;AAGT,QAAM,aAAa,KAAK,SAAS,mCAAmC;AACpE,aAAW,SAAS,WAAY,YAAW,KAAK,MAAM,CAAC,CAAC;AAGxD,aAAW,KAAK,GAAG,mBAAmB,IAAI,CAAC;AAE3C,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,UAAU,KAAK,CAAC;AAE1C,YAAM,OAAO,aAAa,MAAM;AAChC,UAAI,KAAM,QAAO;AAEjB,UAAI,QAAQ,qBAAqB,OAAO,OAAO,sBAAsB,UAAU;AAC7E,cAAM,YAAY,aAAa,OAAO,iBAAiB;AACvD,YAAI,UAAW,QAAO;AAAA,MACxB;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAGA,QAAM,WAAW,oBAAoB,IAAI;AACzC,MAAI,UAAU;AACZ,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,YAAM,OAAO,aAAa,MAAM;AAChC,UAAI,MAAM;AACR,eAAO,KAAK,2DAA2D;AACvE,eAAO;AAAA,MACT;AAEA,UAAI,QAAQ,qBAAqB,OAAO,OAAO,sBAAsB,UAAU;AAC7E,cAAM,YAAY,aAAa,OAAO,iBAAiB;AACvD,YAAI,WAAW;AACb,iBAAO,KAAK,6DAA6D;AACzE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO,MAAM,gEAAgE;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,sBAAsB,KAAuG;AAE3I,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC;AAGpC,QAAI,QAAQ,cAAc,OAAO,OAAO,eAAe,UAAU;AAC/D,UAAI,aAAa,GAAG,cAAc,GAAG,eAAe;AACpD,UAAI,YAAY;AAChB,iBAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAa,OAAO,UAAU,GAAG;AAClE,cAAM,MAAM,OAAO,MAAM,eAAe,CAAC,IAAI,OAAO,MAAM,wBAAwB,CAAC,IAAI,OAAO,MAAM,4BAA4B,CAAC;AACjI,cAAM,MAAM,OAAO,MAAM,gBAAgB,CAAC;AAC1C,sBAAc;AACd,uBAAe;AACf,YAAI,MAAM,MAAM,WAAW;AACzB,sBAAY,MAAM;AAClB,yBAAe;AAAA,QACjB;AAAA,MACF;AACA,UAAI,aAAa,KAAK,cAAc,GAAG;AACrC,eAAO,EAAE,aAAa,YAAY,cAAc,aAAa,aAAa,aAAa,aAAa,OAAO,aAAa;AAAA,MAC1H;AAAA,IACF;AAGA,UAAM,QAAQ,QAAQ;AACtB,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,QAAQ,OAAO,MAAM,YAAY,KAAK;AAC5C,YAAM,SAAS,OAAO,MAAM,aAAa,KAAK;AAC9C,UAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,eAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,aAAa,QAAQ;AAAA,UACrB,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EAGF,QAAQ;AAAA,EAAoC;AAG5C,QAAM,aAAa,IAAI,MAAM,iCAAiC;AAC9D,MAAI,YAAY;AACd,UAAM,QAAQ,SAAS,WAAW,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,EAAE;AAC1D,UAAM,aAAa,IAAI,MAAM,mBAAmB;AAChD,QAAI,QAAQ,GAAG;AACb,aAAO,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,OAAO,OAAO,aAAa,CAAC,GAAG,KAAK,KAAK,GAAG;AAAA,IACrG;AAAA,EACF;AAEA,SAAO;AACT;;;AC5LA,SAAS,aAAAC,YAAW,iBAAAC,uBAAqB;AACzC,SAAS,SAAAC,cAAa;AACtB,SAAS,QAAAC,cAAY;;;ACCd,IAAM,cAAc;AAAA,EACzB,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,UAAU,CAAC,QAAQ,UAAU,SAAS,WAAW,aAAa,UAAU;AAAA,EACxE,YAAY;AAAA,IACV,MAAM,EAAE,MAAM,SAAS;AAAA,IACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,IACzB,OAAO,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IAClD,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,SAAS,SAAS,YAAY,MAAM,EAAE;AAAA,IACnF,UAAU,EAAE,MAAM,SAAS;AAAA,EAC7B;AACF;AAEO,IAAM,mBAAmB,KAAK,UAAU;AAAA,EAC7C,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,UAAU,CAAC,WAAW,SAAS,UAAU,uBAAuB,kBAAkB,mBAAmB,eAAe,eAAe,YAAY,mBAAmB,qBAAqB,mBAAmB,SAAS,cAAc,gBAAgB,iBAAiB;AAAA,EAClQ,YAAY;AAAA,IACV,SAAS,EAAE,MAAM,SAAS;AAAA,IAC1B,qBAAqB,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,OAAO,UAAU,MAAM,EAAE;AAAA,IAClF,aAAa,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IACxD,aAAa,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IACxD,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,UAAU,sBAAsB,OAAO,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,GAAG,cAAc,EAAE,MAAM,SAAS,GAAG,cAAc,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,YAAY,gBAAgB,cAAc,EAAE,EAAE;AAAA,IAC5P,iBAAiB,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IAC5D,mBAAmB,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,YAAY,mBAAmB,wBAAwB,GAAG,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,GAAG,iBAAiB,EAAE,MAAM,SAAS,GAAG,wBAAwB,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE,EAAE,EAAE;AAAA,IAC/R,iBAAiB,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,mBAAmB,eAAe,sBAAsB,kBAAkB,iBAAiB,GAAG,YAAY;AAAA,MACnL,iBAAiB,EAAE,MAAM,UAAU;AAAA,MACnC,aAAa,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,UAAU,sBAAsB,OAAO,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,KAAK,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,QAAQ,KAAK,EAAE,EAAE;AAAA,MACnL,oBAAoB,EAAE,MAAM,UAAU;AAAA,MACtC,gBAAgB,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,UAAU,sBAAsB,OAAO,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,SAAS,GAAG,KAAK,EAAE,MAAM,SAAS,EAAE,GAAG,UAAU,CAAC,QAAQ,QAAQ,KAAK,EAAE,EAAE;AAAA,MACxN,iBAAiB,EAAE,MAAM,SAAS;AAAA,IACpC,EAAE;AAAA,IACF,OAAO,EAAE,MAAM,SAAS,OAAO,YAAY;AAAA,IAC3C,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,aAAa,QAAQ,SAAS,gBAAgB,SAAS,GAAG,YAAY;AAAA,MAC9J,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,MAAM,EAAE,MAAM,SAAS;AAAA,MACvB,OAAO,EAAE,MAAM,SAAS,OAAO,YAAY;AAAA,MAC3C,cAAc,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,MACzD,SAAS,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IACtD,EAAE,EAAE;AAAA,IACJ,OAAO,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,QAAQ,UAAU,YAAY,GAAG,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,QAAQ,EAAE,MAAM,SAAS,GAAG,YAAY,EAAE,MAAM,SAAS,EAAE,EAAE,EAAE;AAAA,IACjO,YAAY,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IACvD,cAAc,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IACzD,gBAAgB,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IAC3D,iBAAiB,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,IAC5D,iBAAiB,EAAE,MAAM,UAAU,sBAAsB,OAAO,UAAU,CAAC,WAAW,WAAW,YAAY,UAAU,GAAG,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,GAAG,SAAS,EAAE,MAAM,SAAS,GAAG,UAAU,EAAE,MAAM,SAAS,GAAG,UAAU,EAAE,MAAM,SAAS,EAAE,EAAE;AAAA,EACjQ;AACF,CAAC;AAGM,IAAM,qBAAqB,KAAK,MAAM,gBAAgB;;;ADvC7D,eAAsB,gBAAgB,OAAe,aAAqB,OAAO,OAAO,QAAoC;AAC1H,SAAO,aAAa,iBAAiB;AAAA,IACnC;AAAA,IACA,aAAa,eAAe;AAAA,IAC5B;AAAA,IACA,QAAQ,QAAQ,SAAS,SAAS;AAAA,EACpC,CAAC;AACH;AAEA,eAAsB,kBACpB,OACA,aACA,aACA,UACiB;AACjB,SAAO,aAAa,wBAAwB;AAAA,IAC1C;AAAA,IACA,aAAa,eAAe;AAAA,IAC5B,aAAa,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAIO,SAAS,eAAe,UAAkB,OAAgB,YAA+B;AAC9F,QAAM,UAAU,SAAS,QAAQ;AACjC,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,aAAa,aAAa,WAAW,mBAAmB;AAC9D,SAAO,QAAQ,aAAa,EAAE,OAAO,YAAY,YAAY,cAAc,aAAa,SAAS,CAAC;AACpG;AAIO,SAAS,mBAAmB,MAAc,QAAgB,QAAsB;AACrF,MAAI;AACF,UAAM,WAAWC,OAAK,YAAY,OAAO;AACzC,IAAAC,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,UAAM,MAAK,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE,MAAM,GAAG,EAAE;AACrE,IAAAC,gBAAcF,OAAK,UAAU,QAAQ,IAAI,IAAI,EAAE,YAAY,GAAG,QAAQ,MAAM;AAC5E,QAAI,OAAQ,CAAAE,gBAAcF,OAAK,UAAU,QAAQ,IAAI,IAAI,EAAE,aAAa,GAAG,QAAQ,MAAM;AAAA,EAC3F,QAAQ;AAAA,EAER;AACF;AAUA,eAAsB,uBAAuB,QAAiD;AAC5F,QAAM,YAAY,yBAAyB;AAC3C,QAAM,YAAY,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAExE,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,UAAM,WAAW,MAAM,oBAAoB;AAC3C,UAAM,iBAAiB,kBAAkB,QAAQ;AACjD,QAAI,gBAAgB,MAAM;AACxB,2BAAqB,eAAe,KAAK;AACzC,wBAAkB,eAAe,KAAK;AACtC,yBAAmB,eAAe,KAAK;AAAA,IACzC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,WACH,sBAAsB,UAAU,SAAS,kBAAkB,IAAK,qBAChE,OAAO,iBAAiB,UAAU,SAAS,OAAO,aAAa,IAAK,OAAO,gBAC5E,UAAU,CAAC;AAEb,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAIvE,QAAM,QAAQ,aAAa,qBAAqB,kBAAkB;AAElE,SAAO,EAAE,UAAU,OAAO,QAAQ,iBAAiB;AACrD;AAIA,IAAM,kBAAkB;AACxB,IAAM,uBAAuB;AAE7B,eAAsB,mBAAmB,SAQrB;AAClB,QAAM,EAAE,SAAS,SAAS,YAAY,UAAU,WAAW,CAAC,GAAG,OAAO,QAAQ,IAAI;AAElF,SAAO,IAAI,QAAgB,CAACG,UAAS,WAAW;AAC9C,QAAIC,UAAS;AACb,UAAM,QAAQC,OAAM,SAAS;AAAA,MAC3B,OAAO;AAAA,MACP,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK,EAAE,GAAG,QAAQ,KAAK,oBAAoB,YAAY,uBAAuB,UAAU,GAAG,SAAS;AAAA,IACtG,CAAC;AACD,UAAM,MAAM;AACZ,UAAM,OAAO,IAAI;AAEjB,QAAI,MAAM,IAAK,SAAQ,MAAM,GAAG;AAEhC,QAAI,cAAc;AAClB,UAAM,SAAS,CAAC,UAA2B;AACzC,YAAM,OAAO,OAAO,KAAK;AACzB,MAAAD,UAAS,eAAeA,SAAQ,MAAM,IAAM;AAC5C,qBAAe,KAAK;AACpB,gBAAU,WAAW;AAAA,IACvB;AACA,UAAM,QAAQ,GAAG,QAAQ,MAAM;AAC/B,UAAM,QAAQ,GAAG,QAAQ,MAAM;AAE/B,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,MAAM,KAAK;AAAE,YAAI;AAAE,kBAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,QAAG,QAAQ;AAAA,QAAC;AAAA,MAAE,OAClE;AAAE,cAAM,KAAK,SAAS;AAAA,MAAG;AAC9B,aAAO,IAAI,MAAM,6CAA6C,CAAC;AAAA,IACjE,GAAG,eAAe;AAElB,QAAI,oBAAoB;AACxB,QAAI,eAAe,KAAK,IAAI;AAC5B,UAAM,WAAW,YAAY,MAAM;AACjC,UAAI,MAAM,KAAK;AACb,YAAI;AAAE,kBAAQ,KAAK,MAAM,KAAK,CAAC;AAAA,QAAG,QAAQ;AACxC,wBAAc,QAAQ;AACtB,uBAAa,KAAK;AAClB,iBAAO,IAAI,MAAM,2CAA2C,MAAM,GAAG,IAAI,CAAC;AAC1E;AAAA,QACF;AAAA,MACF;AACA,UAAI,cAAc,mBAAmB;AACnC,4BAAoB;AACpB,uBAAe,KAAK,IAAI;AAAA,MAC1B,WAAW,KAAK,IAAI,IAAI,eAAe,sBAAsB;AAC3D,sBAAc,QAAQ;AACtB,qBAAa,KAAK;AAClB,YAAI,MAAM,KAAK;AAAE,cAAI;AAAE,oBAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,UAAG,QAAQ;AAAA,UAAC;AAAA,QAAE,OAClE;AAAE,gBAAM,KAAK,SAAS;AAAA,QAAG;AAC9B,eAAO,IAAI,MAAM,+CAA0C,KAAK,MAAM,uBAAuB,GAAM,CAAC,WAAW,CAAC;AAAA,MAClH;AAAA,IACF,GAAG,GAAM;AAET,UAAM,GAAG,SAAS,MAAM;AAAE,oBAAc,QAAQ;AAAG,mBAAa,KAAK;AAAG,aAAO,IAAI,MAAM,qCAAqC,CAAC;AAAA,IAAG,CAAC;AACnI,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,oBAAc,QAAQ;AACtB,mBAAa,KAAK;AAClB,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,yBAAyB,IAAI,MAAMA,QAAO,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;AAC3E;AAAA,MACF;AACA,MAAAD,SAAQC,OAAM;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AACH;;;AF3JA,eAAsB,kBAAkB,OAAe,aAA+C;AACpG,QAAM,UAA2B;AAAA,IAC/B;AAAA,IAAO;AAAA,IAAa,QAAQ;AAAA,IAC5B,MAAM;AAAA,IAAM,OAAO;AAAA,IAAM,KAAK;AAAA,IAAM,UAAU;AAAA,IAC9C,WAAW;AAAA,IAAM,aAAa;AAAA,IAAM,WAAW,IAAI;AAAA,IACnD,aAAa;AAAA,IAAG,OAAO;AAAA,EACzB;AACA,QAAM,eAAe,OAAO;AAC5B,SAAO;AACT;AAIA,eAAsB,aACpB,OACA,aACA,QACA,qBACA,SAC6B;AAC7B,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,SAAS,SAAS;AACxB,QAAM,uBAAuB,SAAS,mBAAmB;AACzD,SAAO,KAAK,EAAE,OAAO,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,GAAG,oCAAoC;AAErF,QAAM,EAAE,UAAU,WAAW,OAAO,gBAAgB,QAAQ,gBAAgB,IAAI,MAAM,uBAAuB,MAAM;AAGnH,QAAM,kBAAkB,OAAO,QAAS,mBAAmB;AAC3D,OAAK;AAGL,QAAM,cAAc,KAAK,IAAI;AAC7B,QAAM,UAA2B;AAAA,IAC/B;AAAA,IAAO;AAAA,IAAa,QAAQ;AAAA,IAC5B,MAAM;AAAA,IAAM,OAAO;AAAA,IAAM,KAAK;AAAA,IAAM,UAAU;AAAA,IAC9C,WAAW,IAAI;AAAA,IAAG,aAAa;AAAA,IAAM,WAAW,IAAI;AAAA,IACpD,aAAa;AAAA,IAAG,OAAO;AAAA,EACzB;AACA,MAAI,qBAAsB,OAAM,eAAe,OAAO;AAEtD,QAAM,SAAS,MAAM,gBAAgB,OAAO,aAAa,MAAM,MAAM;AAErE,MAAI,OAAyB;AAC7B,MAAI;AAEJ;AACE,UAAM,UAAU,eAAe,WAAW,gBAAgB,MAAM;AAChE,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,sCAAsC,SAAS,GAAG;AAEhF,WAAO,MAAM,EAAE,UAAU,WAAW,OAAO,gBAAgB,SAAS,QAAQ,MAAM,GAAG,GAAG,EAAE,GAAG,iDAAiD;AAE9I,UAAM,UAAUE,aAAYC,OAAKC,QAAO,GAAG,cAAc,CAAC;AAC1D,UAAM,aAAaD,OAAK,SAAS,uBAAuB;AACxD,IAAAE,gBAAc,YAAY,GAAG,MAAM;AAAA,GAAM,MAAM;AAG/C,QAAI,sBAAsB;AAC1B,UAAM,uBAAuB;AAE7B,UAAM,SAAS,MAAM,mBAAmB;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU,QAAQ,SAAS,EAAE,oBAAoB,OAAO,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,MACvE,OAAO,CAAC,QAAQ;AACd,gBAAQ,MAAM;AACd,YAAI,qBAAsB,gBAAe,OAAO,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAClE;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,gBAAQ,cAAc;AACtB,YAAI,sBAAsB;AACxB,gBAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,cAAI,UAAU,sBAAsB,sBAAsB;AACxD,kCAAsB;AACtB,2BAAe,OAAO,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,EAAE,QAAQ,MAAM;AACf,MAAAC,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD,CAAC;AAED,WAAO,KAAK,EAAE,WAAW,OAAO,MAAM,GAAG,GAAI,EAAE,GAAG,wBAAwB,SAAS,EAAE;AACrF,uBAAmB,OAAO,QAAQ,MAAM;AAExC,WAAO,MAAM,EAAE,cAAc,OAAO,OAAO,GAAG,kDAAkD;AAChG,WAAO,gBAAgB,MAAM;AAE7B,UAAM,aAAa,KAAK,IAAI,IAAI;AAChC,UAAM,YAAY,sBAAsB,MAAM;AAC9C,gBAAY;AAAA,MACV,aAAa,WAAW,eAAe;AAAA,MACvC,cAAc,WAAW,gBAAgB;AAAA,MACzC,aAAa,WAAW,eAAe;AAAA,MACvC,OAAO,WAAW,SAAS,kBAAkB;AAAA,MAC7C,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,UAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAQ,SAAS;AACjB,YAAQ,QAAQ,kDAAkD,UAAU;AAC5E,YAAQ,MAAM;AACd,QAAI,qBAAsB,OAAM,eAAe,OAAO;AACtD,WAAO,MAAM,EAAE,WAAW,GAAG,+CAA+C;AAC5E,UAAM,IAAI,MAAM,QAAQ,KAAK;AAAA,EAC/B;AAEA,OAAK,WAAW,iBAAiB,GAAG,SAAS,IAAI,cAAc,KAAK;AAEpE,MAAI,UAAU,cAAc,GAAG;AAC7B,UAAM,aAA8B;AAAA,MAClC,aAAa,UAAU;AAAA,MACvB,cAAc,UAAU;AAAA,MACxB,aAAa,UAAU;AAAA,MACvB,OAAO,UAAU;AAAA,IACnB;AACA,WAAa,EAAE,IAAI,YAAY,YAAY,QAAQ,MAAM,GAAiB,YAAY,SAAS;AAAA,EACjG;AAEA,UAAQ,SAAS;AACjB,UAAQ,OAAO;AACf,UAAQ,MAAM;AACd,UAAQ,cAAc,IAAI;AAC1B,UAAQ,QAAQ;AAChB,UAAQ,QAAQ;AAChB,MAAI,qBAAsB,OAAM,eAAe,OAAO;AAEtD,QAAM,eAAe,UAAU,cAAc,IACzC,KAAK,UAAU,YAAY,eAAe,CAAC,gBAAgB,UAAU,YAAY,eAAe,CAAC,UAAU,UAAU,aAAa,eAAe,CAAC,MAClJ,KAAK,UAAU,YAAY,eAAe,CAAC;AAC/C,SAAO,KAAK,uBAAuB,KAAK,SAAS,UAAU,KAAK,KAAK,KAAK,MAAM,MAAM,uBAAuB,KAAK,mBAAmB,GAAG,YAAY,KAAK,UAAU,UAAU,IAAI;AACjL,SAAO,EAAE,MAAM,OAAO,WAAW,OAAO;AAC1C;;;AItKA,SAAS,iBAAAC,uBAAqB;AAC9B,SAAS,QAAAC,cAAY;AACrB,SAAS,eAAAC,cAAa,UAAAC,eAAc;AACpC,SAAS,UAAAC,eAAc;AAwBvB,eAAsBC,YACpB,OACA,UACA,QACA,qBAC2B;AAC3B,MAAI,CAAC,MAAM,KAAM,OAAM,IAAI,MAAM,8BAA8B;AAE/D,QAAM,EAAE,UAAU,WAAW,OAAO,eAAe,IAAI,MAAM,uBAAuB,MAAM;AAE1F,QAAM,gBAAgB,KAAK,IAAI;AAC/B,QAAM,SAAS,MAAM,kBAAkB,MAAM,OAAO,MAAM,aAAa,MAAM,MAAM,QAAQ;AAE3F,MAAI,OAAyB;AAC7B,MAAI;AAEJ;AACE,UAAM,UAAU,eAAe,WAAW,cAAc;AACxD,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,sCAAsC,SAAS,GAAG;AAEhF,UAAM,UAAUC,aAAYC,OAAKC,QAAO,GAAG,gBAAgB,CAAC;AAC5D,UAAM,aAAaD,OAAK,SAAS,yBAAyB;AAC1D,IAAAE,gBAAc,YAAY,GAAG,MAAM;AAAA,GAAM,MAAM;AAE/C,UAAM,SAAS,MAAM,mBAAmB;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ,CAAC,EAAE,QAAQ,MAAM;AACf,MAAAC,QAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClD,CAAC;AAED,WAAO,KAAK,EAAE,WAAW,OAAO,MAAM,GAAG,GAAI,EAAE,GAAG,0BAA0B,SAAS,EAAE;AACvF,uBAAmB,cAAc,QAAQ,MAAM;AAE/C,WAAO,gBAAgB,MAAM;AAE7B,UAAMC,cAAa,KAAK,IAAI,IAAI;AAChC,UAAM,YAAY,sBAAsB,MAAM;AAC9C,kBAAc;AAAA,MACZ,aAAa,WAAW,eAAe;AAAA,MACvC,cAAc,WAAW,gBAAgB;AAAA,MACzC,aAAa,WAAW,eAAe;AAAA,MACvC,OAAO,WAAW,SAAS,kBAAkB;AAAA,MAC7C,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,MACpB,YAAAA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,WAAO,MAAM,uDAAuD;AACpE,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,OAAK,WAAW,iBAAiB,GAAG,SAAS,IAAI,cAAc,KAAK;AAEpE,QAAM,sBAAsB,MAAM,KAAK,eAAe,CAAC;AACvD,QAAM,cAAc,oBAAoB,SAAS;AACjD,OAAK,cAAc;AAAA,IACjB,GAAG;AAAA,IACH,EAAE,UAAU,IAAI,IAAI,GAAG,SAAS,YAAY;AAAA,EAC9C;AAEA,QAAM,aAAa,KAAK,IAAI,IAAI;AAChC,cAAY,aAAa;AAEzB,MAAI,YAAY,cAAc,GAAG;AAC/B,UAAM,aAA8B;AAAA,MAClC,aAAa,YAAY;AAAA,MACzB,cAAc,YAAY;AAAA,MAC1B,aAAa,YAAY;AAAA,MACzB,OAAO,YAAY;AAAA,IACrB;AACA,WAAa,EAAE,IAAI,MAAM,IAAI,YAAY,MAAM,YAAY,OAAO,MAAM,MAAM,GAAiB,YAAY,SAAS;AAAA,EACtH;AAEA,QAAM,eAAe,YAAY,cAAc,IAC3C,KAAK,YAAY,YAAY,eAAe,CAAC,gBAAgB,YAAY,YAAY,eAAe,CAAC,UAAU,YAAY,aAAa,eAAe,CAAC,MACxJ,KAAK,YAAY,YAAY,eAAe,CAAC;AACjD,SAAO,KAAK,qBAAqB,MAAM,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,MAAM,MAAM,uBAAuB,KAAK,mBAAmB,GAAG,YAAY,KAAK,UAAU,IAAI;AAC7K,SAAO,EAAE,MAAM,OAAO,YAAY;AACpC;;;ACzFO,SAAS,yBACd,OACA,QACA,qBACA,WACA,SACM;AACN,QAAM,EAAE,UAAAC,WAAU,cAAAC,eAAc,YAAY,iBAAiB,IAAI;AACjE,QAAM,OAAO,SAAS,QAAQ;AAE9B,QAAM,iBAAiB;AACvB,QAAM,oBAAoB,IAAI;AAC9B,QAAM,gBAAgB;AACtB,QAAM,YAAY,IAAI;AAEtB,EAAAD,UAAS,MAAM,IAAI,QAAQ,GAAG,OAAO,cAAc,MAAM,4BAA4B,MAAM,UAAU,oCAAoC;AAGzI,eAAa,MAAM,OAAO,MAAM,aAAa,QAAQ,MAAM,EAAE,KAAK,CAAC,EAChE,KAAK,OAAO,EAAE,MAAM,MAAM,MAAM;AAC/B,UAAM,OAAO;AACb,uBAAmB,MAAM,EAAE;AAC3B,UAAM,iBAAiB;AACvB,UAAM,oBAAoB;AAC1B,UAAM,gBAAgB;AACtB,UAAM,YAAY,IAAI;AAEtB,eAAW,OAAO,KAAK;AACvB,qBAAiB,OAAO,IAAI;AAE5B,IAAAA,UAAS,MAAM,IAAI,YAAY,GAAG,OAAO,cAAc,MAAM,kBAAkB,MAAM,UAAU,KAAK,KAAK,MAAM,MAAM,uBAAuB,KAAK,mBAAmB,GAAG;AACvK,QAAI,MAAM,cAAc,GAAG;AACzB,MAAAA,UAAS,MAAM,IAAI,QAAQ,gBAAgB,MAAM,UAAU,MAAM,MAAM,YAAY,eAAe,CAAC,SAAS,MAAM,YAAY,eAAe,CAAC,UAAU,MAAM,aAAa,eAAe,CAAC,MAAM,MAAM,KAAK,GAAG;AAAA,IACjN;AACA,UAAMC,cAAa;AAAA,EACrB,CAAC,EACA,MAAM,OAAO,QAAQ;AACpB,UAAM,iBAAiB;AACvB,UAAM,oBAAoB;AAC1B,UAAM,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACrE,UAAM,YAAY,IAAI;AACtB,IAAAD,UAAS,MAAM,IAAI,SAAS,8BAA8B,MAAM,UAAU,KAAK,MAAM,aAAa,EAAE;AACpG,UAAMC,cAAa;AACnB,WAAO,MAAM,EAAE,IAAI,GAAG,yCAAyC,MAAM,UAAU,EAAE;AAAA,EACnF,CAAC;AACL;AAMO,SAAS,uBACd,OACA,UACA,QACA,qBACA,WACM;AACN,QAAM,EAAE,UAAAD,WAAU,cAAAC,eAAc,YAAY,iBAAiB,IAAI;AAEjE,QAAM,iBAAiB;AACvB,QAAM,oBAAoB,IAAI;AAC9B,QAAM,gBAAgB;AACtB,QAAM,YAAY,IAAI;AAEtB,QAAM,kBAAkB,SAAS,SAAS,KAAK,GAAG,SAAS,MAAM,GAAG,EAAE,CAAC,QAAQ;AAC/E,EAAAD,UAAS,MAAM,IAAI,QAAQ,gCAAgC,MAAM,UAAU,MAAM,eAAe,IAAI;AAEpG,EAAAE,YAAW,OAAO,UAAU,QAAQ,IAAI,EACrC,KAAK,OAAO,EAAE,MAAM,MAAM,MAAM;AAC/B,UAAM,OAAO;AACb,uBAAmB,MAAM,EAAE;AAC3B,UAAM,iBAAiB;AACvB,UAAM,oBAAoB;AAC1B,UAAM,gBAAgB;AACtB,UAAM,YAAY,IAAI;AAEtB,eAAW,OAAO,KAAK;AACvB,qBAAiB,OAAO,IAAI;AAE5B,UAAM,kBAAkB,SAAS,SAAS,KAAK,GAAG,SAAS,MAAM,GAAG,EAAE,CAAC,QAAQ;AAC/E,IAAAF,UAAS,MAAM,IAAI,YAAY,oBAAoB,MAAM,UAAU,MAAM,eAAe,YAAO,KAAK,MAAM,MAAM,uBAAuB,KAAK,mBAAmB,GAAG;AAClK,QAAI,MAAM,cAAc,GAAG;AACzB,MAAAA,UAAS,MAAM,IAAI,QAAQ,sBAAsB,MAAM,UAAU,MAAM,MAAM,YAAY,eAAe,CAAC,SAAS,MAAM,YAAY,eAAe,CAAC,UAAU,MAAM,aAAa,eAAe,CAAC,MAAM,MAAM,KAAK,GAAG;AAAA,IACvN;AACA,UAAMC,cAAa;AAAA,EACrB,CAAC,EACA,MAAM,OAAO,QAAQ;AACpB,UAAM,iBAAiB;AACvB,UAAM,oBAAoB;AAC1B,UAAM,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACrE,UAAM,YAAY,IAAI;AACtB,IAAAD,UAAS,MAAM,IAAI,SAAS,8BAA8B,MAAM,UAAU,KAAK,MAAM,aAAa,EAAE;AACpG,UAAMC,cAAa;AACnB,WAAO,MAAM,EAAE,IAAI,GAAG,yCAAyC,MAAM,UAAU,EAAE;AAAA,EACnF,CAAC;AACL;;;AjElFA,eAAsB,eACpB,OACA,OACe;AACf,QAAM,iBAAiB;AACvB,QAAM,oBAAoB,IAAI;AAC9B,QAAM,gBAAgB;AACtB,QAAM,YAAY,IAAI;AACtB,iBAAe,MAAM,EAAE;AAGvB,QAAM,SAAS,aAAa,MAAM,EAAE;AACpC,QAAM,eAAeE,OAAK,gBAAgB,MAAM;AAChD,EAAAC,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAE3C,WAAS,OAAO,MAAM,IAAI,QAAQ,+BAA+B,MAAM,UAAU,OAAO,MAAM,eAAe,KAAK,CAAC,IAAI;AAEvH,MAAI;AACF,UAAM,EAAE,MAAM,OAAO,OAAO,IAAI,MAAM;AAAA,MACpC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,EAAE,gBAAgB,MAAM;AAAA,IAC1B;AAEA,UAAM,OAAO;AACb,uBAAmB,MAAM,EAAE;AAC3B,UAAM,cAAc,KAAK,IAAK,MAAM,eAAe,GAAI,CAAC;AAGxD,QAAI,KAAK,gBAAgB,UAAU,CAAE,MAAM,OAAO,OAAS,OAAM,QAAQ,KAAK;AAC9E,QAAI,KAAK,iBAAiB,UAAU,CAAC,MAAM,QAAQ,OAAQ,OAAM,SAAS,KAAK;AAC/E,QAAI,KAAK,mBAAmB,CAAC,MAAM,OAAQ,OAAM,SAAS,KAAK;AAG/D,QAAI,MAAM,cAAc,GAAG;AACzB,oBAAc,OAAO;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB,cAAc,MAAM;AAAA,QACpB,aAAa,MAAM;AAAA,QACnB,OAAO,MAAM;AAAA,MACf,GAAG,SAAS;AAAA,IACd;AAGA,UAAM,KAAK,MAAM;AACjB,QAAI;AACF,MAAAC,gBAAcF,OAAK,cAAc,SAAS,EAAE,OAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AAC3F,MAAAE,gBAAcF,OAAK,cAAc,SAAS,EAAE,YAAY,GAAG,QAAQ,MAAM;AAAA,IAC3E,SAAS,aAAa;AACpB,aAAO,KAAK,EAAE,KAAK,OAAO,WAAW,EAAE,GAAG,kDAAkD;AAAA,IAC9F;AAEA,UAAM,iBAAiB;AACvB,UAAM,oBAAoB;AAC1B,UAAM,YAAY,IAAI;AACtB,mBAAe,MAAM,EAAE;AAEvB,aAAS,OAAO,MAAM,IAAI,YAAY,SAAS,EAAE,kBAAkB,MAAM,UAAU,KAAK,KAAK,MAAM,MAAM,uBAAuB,KAAK,mBAAmB,GAAG;AAC3J,QAAI,MAAM,cAAc,GAAG;AACzB,eAAS,OAAO,MAAM,IAAI,QAAQ,gBAAgB,MAAM,UAAU,MAAM,MAAM,YAAY,eAAe,CAAC,KAAK,MAAM,KAAK,GAAG;AAAA,IAC/H;AAAA,EACF,SAAS,OAAO;AACd,UAAM,iBAAiB;AACvB,UAAM,oBAAoB;AAC1B,UAAM,gBAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC3E,UAAM,YAAY,IAAI;AACtB,mBAAe,MAAM,EAAE;AACvB,aAAS,OAAO,MAAM,IAAI,SAAS,8BAA8B,MAAM,UAAU,KAAK,MAAM,aAAa,EAAE;AAC3G,WAAO,MAAM,EAAE,KAAK,MAAM,GAAG,mCAAmC,MAAM,UAAU,EAAE;AAAA,EACpF;AACF;AAEA,eAAe,kBACb,OACA,OACA,eACA,SACA,iBACe;AACf,QAAM,iBAAiB,MAAM,iBAAiB,KAAK;AACnD,iBAAe,MAAM,EAAE;AAEvB,QAAM,WAAW,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAClE,MAAI,CAAC,UAAU;AAEb,UAAM,eAAe;AACrB,UAAM,qBAAqB,OAAO,QAAQ,6CAA6C,MAAM,UAAU,GAAG;AAC1G,aAAS,OAAO,MAAM,IAAI,UAAU,SAAS,MAAM,UAAU,wCAAwC;AACrG,UAAM,cAAc,IAAI;AACxB,UAAM,YAAY;AAClB;AAAA,EACF;AAEA,WAAS,OAAO,MAAM,IAAI,QAAQ,oBAAoB,SAAS,IAAI,IAAI,SAAS,QAAQ,GAAG,SAAS,QAAQ,IAAI,SAAS,KAAK,KAAK,EAAE,GAAG,SAAS,UAAU,IAAI,SAAS,OAAO,KAAK,EAAE,GAAG;AAGzL,MAAI,cAAc;AAClB,MAAI;AACF,QAAI,MAAM,cAAc,MAAM,YAAY;AACxC,YAAM,aAAaG;AAAA,QACjB,oBAAoB,MAAM,UAAU,QAAQ,MAAM,UAAU;AAAA,QAC5D,EAAE,KAAK,aAAa,UAAU,QAAQ,WAAW,OAAS,SAAS,IAAO;AAAA,MAC5E;AACA,oBAAc,WAAW,KAAK;AAAA,IAChC,OAAO;AACL,YAAM,aAAa,MAAM,gBAAgB;AACzC,YAAM,aAAaA;AAAA,QACjB,kCAAkC,WAAW,MAAM,UAAU;AAAA,QAC7D,EAAE,UAAU,QAAQ,WAAW,OAAS,SAAS,IAAO;AAAA,MAC1D;AACA,oBAAc,WAAW,KAAK;AAAA,IAChC;AAAA,EACF,SAAS,KAAU;AACjB,mBAAe,IAAI,UAAU,IAAI,KAAK;AAAA,EACxC;AAEA,QAAM,WAAW,MAAM,cAAc,OAAO,UAAU,eAAe,WAAW;AAChF,QAAM,oBAAoB,EAAE,GAAG,UAAU,SAAS,SAAS,WAAW,SAAS,QAAQ;AACvF,QAAM,mBAAmBH,OAAK,eAAe,kBAAkB;AAC/D,EAAAE,gBAAc,kBAAkB,GAAG,SAAS,MAAM;AAAA,GAAM,MAAM;AAC9D,QAAM,eAAe,MAAM,gBAAgB,OAAO,OAAO,mBAAmB,GAAG,eAAe,SAAS,QAAQ,gBAAgB;AAC/H,QAAM,cAAc,MAAM,cAAc,MAAM,KAAK,IAAI,IAAI;AAC3D,QAAM,kBAAkB,aAAa;AACrC,QAAM,oBAAoB,aAAa;AACvC,QAAM,cAAc,oBAAoB,mBAAmB,MAAM,OAAO,KAAK,IAAI,IAAI,SAAS,aAAa,UAAU,aAAa,aAAa,oBAAoB,WAAW,UAAU;AACxL,wBAAsB,eAAe,WAAW;AAChD,MAAI;AACF,UAAM,MAAM,MAAM,eAAe;AACjC,UAAM,MAAM,MAAM,iBAAiB;AACnC,UAAM,mBAAmBF,OAAK,eAAe,kBAAkB;AAC/D,UAAM,kBAAkBA,OAAK,eAAe,sBAAsB;AAClE,QAAII,aAAW,gBAAgB,GAAG;AAChC,MAAAF,gBAAcF,OAAK,eAAe,WAAW,GAAG,IAAI,GAAG,YAAY,GAAGK,eAAa,kBAAkB,MAAM,GAAG,MAAM;AAAA,IACtH;AACA,QAAID,aAAW,eAAe,GAAG;AAC/B,MAAAF,gBAAcF,OAAK,eAAe,WAAW,GAAG,IAAI,GAAG,aAAa,GAAGK,eAAa,iBAAiB,MAAM,GAAG,MAAM;AAAA,IACtH;AAAA,EACF,SAAS,MAAM;AACb,WAAO,KAAK,EAAE,KAAK,OAAO,IAAI,EAAE,GAAG,oDAAoD;AAAA,EACzF;AAEA,MAAI,aAAa,SAAS;AACxB,UAAM,eAAe,gCAAgC,aAAa,KAAK;AACvE,UAAM,qBAAqB,OAAO,YAAY,0BAA0B,MAAM,UAAU,GAAG;AAC3F,UAAM,qBAAqB,OAAO,QAAQ,qBAAqB,MAAM,UAAU,OAAO,aAAa,KAAK,WAAW;AACnH,aAAS,OAAO,MAAM,IAAI,UAAU,SAAS,MAAM,UAAU,oCAA+B;AAC5F,UAAM,cAAc,IAAI;AACxB,UAAM,YAAY;AAAA,EACpB,WAAW,aAAa,mBAAmB;AACzC,UAAM,qBAAqB,OAAO,YAAY,0BAA0B,MAAM,UAAU,GAAG;AAC3F,UAAM,qBAAqB,OAAO,UAAU,iCAAiC,MAAM,UAAU,GAAG;AAChG,UAAM,cAAc,IAAI,KAAK,KAAK,IAAI,IAAI,GAAI,EAAE,YAAY;AAC5D,UAAM,YAAY;AAClB,aAAS,OAAO,MAAM,IAAI,UAAU,SAAS,MAAM,UAAU,oCAAoC;AAAA,EACnG,OAAO;AAEL,UAAM,YAAY,aAAa;AAC/B,UAAM,YAAY;AAClB,QAAI,MAAM,YAAY,MAAM,aAAa;AACvC,YAAM,kBAAkB,yBAAyB,MAAM,QAAQ,IAAI,MAAM,WAAW;AACpF,YAAM,qBAAqB,OAAO,aAAa,2CAA2C,MAAM,UAAU,GAAG;AAC7G,eAAS,OAAO,MAAM,IAAI,SAAS,SAAS,MAAM,UAAU,kCAAkC;AAAA,IAChG,OAAO;AACL,YAAM,cAAc,eAAe,OAAO,MAAM,OAAO,YAAY;AACnE,YAAM,qBAAqB,OAAO,WAAW,qBAAqB,MAAM,UAAU,cAAc,MAAM,WAAW,GAAG;AACpH,eAAS,OAAO,MAAM,IAAI,SAAS,SAAS,MAAM,UAAU,gCAAgC;AAAA,IAC9F;AAAA,EACF;AACF;AAEA,eAAe,qBACb,OACA,OACA,eACA,YACA,YACA,gBACA,uBACA,SACA,iBACe;AACf,QAAM,kBAAkB,MAAM,kBAAkB,KAAK;AACrD,iBAAe,MAAM,EAAE;AAEvB;AAAA,IAAS;AAAA,IAAO,MAAM;AAAA,IAAI;AAAA,IACxB,+BAA+B,gBAAgB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,GAAG,EAAE,QAAQ,IAAI,EAAE,KAAK,KAAK,EAAE,GAAG,EAAE,UAAU,IAAI,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,kBAAkB,KAAK,EAAE,eAAe,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EAAG;AAE3N,QAAM,iBAAiB,uBAAuB,OAAO,qBAAqB;AAC1E,MAAI,gBAAgB;AAClB,aAAS,OAAO,MAAM,IAAI,QAAQ,+BAA+B,cAAc,GAAG;AAAA,EACpF;AAEA,QAAM,YAAY,MAAM,iBAAiB,OAAO,OAAO,eAAe,YAAY,YAAY,cAAc;AAE5G,QAAM,aAAa,KAAK,IAAI,IAAI;AAChC,QAAM,kBAAkB,UAAU;AAClC,QAAM,oBAAoB,UAAU;AAEpC,MAAI,UAAU,SAAS;AACrB,4BAAwB,KAAK;AAE7B,qBAAiB,KAAK;AACtB,QAAI,MAAM,cAAc;AACtB,eAAS,OAAO,MAAM,IAAI,QAAQ,SAAS,MAAM,YAAY,YAAY,MAAM,cAAc,CAAC,KAAK,MAAM,gBAAgB,CAAC,SAAS;AAAA,IACrI;AAEA,aAAS,OAAO,MAAM,IAAI,QAAQ,2CAA2C,MAAM,cAAc,WAAW,GAAG;AAE/G,UAAM,WAAW,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,KAAK,gBAAgB,CAAC;AACxF,QAAI,YAAY,eAAe;AAC7B,YAAM,QAAQ,oBAAoB,UAAU,MAAM,OAAO,KAAK,IAAI,IAAI,SAAS,SAAS;AACxF,4BAAsB,eAAe,KAAK;AAE1C,UAAI;AACF,cAAM,MAAM,MAAM,eAAe;AACjC,cAAM,MAAM,MAAM,kBAAkB;AACpC,cAAM,iBAAiBL,OAAK,eAAe,WAAW;AACtD,cAAM,gBAAgBA,OAAK,eAAe,sBAAsB;AAChE,YAAII,aAAW,cAAc,GAAG;AAC9B,UAAAF,gBAAcF,OAAK,eAAe,YAAY,GAAG,IAAI,GAAG,YAAY,GAAGK,eAAa,gBAAgB,MAAM,GAAG,MAAM;AAAA,QACrH;AACA,YAAID,aAAW,aAAa,GAAG;AAC7B,UAAAF,gBAAcF,OAAK,eAAe,YAAY,GAAG,IAAI,GAAG,aAAa,GAAGK,eAAa,eAAe,MAAM,GAAG,MAAM;AAAA,QACrH;AAAA,MACF,SAAS,MAAM;AACb,eAAO,KAAK,EAAE,KAAK,OAAO,IAAI,EAAE,GAAG,qDAAqD;AAAA,MAC1F;AAAA,IACF;AAEA,UAAM,qBAAqB,OAAO,aAAa,+BAA+B,UAAU,KAAK,gBAAgB,MAAM,UAAU,oBAAoB;AACjJ,UAAM,YAAY;AAClB,aAAS,OAAO,MAAM,IAAI,UAAU,SAAS,MAAM,UAAU,sBAAsB;AAAA,EACrF,WAAW,UAAU,mBAAmB;AACtC,UAAM,YAAY,IAAI;AACtB,UAAM,kBAAkB,UAAU;AAClC,UAAM,oBAAoB,UAAU;AACpC,UAAM,YAAY;AAClB,UAAM,cAAc,IAAI,KAAK,KAAK,IAAI,IAAI,GAAI,EAAE,YAAY;AAC5D,UAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,mCAAmC,UAAU,KAAK,IAAI,MAAM,OAAO,QAAQ,IAAI;AACrH,aAAS,OAAO,MAAM,IAAI,UAAU,SAAS,MAAM,UAAU,wBAAwB;AAAA,EACvF,OAAO;AACL,UAAM,YAAY,UAAU;AAC5B,UAAM,YAAY;AAElB,QAAI,MAAM,YAAY,MAAM,aAAa;AACvC,YAAM,kBAAkB,UAAU;AAClC,YAAM,kBAAkB,yBAAyB,MAAM,QAAQ,IAAI,MAAM,WAAW;AACpF,YAAM,qBAAqB,OAAO,aAAa,yBAAyB,MAAM,QAAQ,IAAI,MAAM,WAAW,IAAI;AAC/G,eAAS,OAAO,MAAM,IAAI,SAAS,SAAS,MAAM,UAAU,qCAAqC;AAAA,IACnG,OAAO;AACL,YAAM,cAAc,eAAe,OAAO,MAAM,OAAO,YAAY;AACnE,YAAM;AAAA,QAAqB;AAAA,QACzB;AAAA,QACA,GAAG,UAAU,UAAU,wCAAwC,SAAS,eAAe,MAAM,QAAQ,IAAI,MAAM,WAAW,wBAAwB,MAAM,WAAW;AAAA,MAAG;AACxK,eAAS,OAAO,MAAM,IAAI,SAAS,SAAS,MAAM,UAAU,6BAA6B;AAAA,IAC3F;AAAA,EACF;AACF;AAEA,eAAsB,aACpB,OACA,OACA,SACe;AACf,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,cAAc,MAAM,UAAU;AACpC,QAAM,aAAa,MAAM,UAAU;AACnC,SAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,OAAO,MAAM,OAAO,aAAa,YAAY,SAAS,MAAM,WAAW,GAAG,aAAa,MAAM,YAAY,GAAG,kCAAkC;AAK7M,MAAI,MAAM,UAAU,YAAY;AAC9B,UAAM,YAAY,MAAM,aAAa,IAAI;AACzC,mBAAe,OAAO,KAAK,EACxB,MAAM,CAAC,QAAQ,OAAO,MAAM,EAAE,KAAK,SAAS,MAAM,IAAI,YAAY,MAAM,WAAW,GAAG,qDAAqD,CAAC,EAC5I,QAAQ,MAAM;AACb,YAAM,UAAU,eAAe,MAAM,MAAM;AAC3C,YAAM,YAAY,IAAI;AACtB,mBAAa,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAClC,oBAAc;AAAA,IAChB,CAAC;AACH;AAAA,EACF;AAEA,UAAQ,IAAI,MAAM,EAAE;AACpB,QAAM,QAAQ,iBAAiB;AAC/B,QAAM,YAAY,MAAM,aAAa,IAAI;AAEzC,MAAI,iBAAwC;AAC5C,MAAI;AACF,UAAM,WAAW,MAAM,oBAAoB;AAC3C,qBAAiB,kBAAkB,QAAQ;AAAA,EAC7C,QAAQ;AAAA,EAER;AAEA,MAAI,aAAa;AACf,UAAM,YAAY,IAAI;AACtB,UAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,8BAA8B,MAAM,UAAU,GAAG;AACvF,aAAS,OAAO,MAAM,IAAI,YAAY,sBAAsB,MAAM,UAAU,GAAG;AAAA,EACjF,WAAW,YAAY;AACrB,UAAM,qBAAqB,OAAO,WAAW,uBAAuB,MAAM,UAAU,GAAG;AACvF,aAAS,OAAO,MAAM,IAAI,YAAY,sBAAsB,MAAM,UAAU,GAAG;AAAA,EACjF,OAAO;AACL,QAAI,MAAM,UAAU,UAAU;AAC5B,YAAM,qBAAqB,OAAO,UAAU,SAAS,MAAM,UAAU,wBAAwB;AAAA,IAC/F;AACA,UAAM,qBAAqB,OAAO,WAAW,qBAAqB,MAAM,UAAU,GAAG;AACrF,aAAS,OAAO,MAAM,IAAI,YAAY,sBAAsB,MAAM,UAAU,GAAG;AAAA,EACjF;AAEA,MAAI;AACF,UAAM,wBAAwB,+BAA+B,KAAK;AAClE,SAAK,MAAM,SAAS,CAAC,GAAG,SAAS,GAAG;AAClC,YAAM,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,MAAM,iBAAiB,CAAC,GAAI,GAAG,qBAAqB;AAAA,QACzF,IAAI,MAAM;AAAA,QACV,YAAY,MAAM;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,MACf,CAAC,CAAC,CAAC,CAAC;AAAA,IACN;AAEA,UAAM,EAAE,eAAe,YAAY,WAAW,IAAI,MAAM,iBAAiB,OAAO,OAAO,MAAM,OAAO,aAAa;AACjH,aAAS,OAAO,MAAM,IAAI,QAAQ,sBAAsB,aAAa,GAAG;AAExE,UAAM,kBAAkB,2BAA2B,OAAO,OAAO,MAAM,cAAc;AAErF,QAAI,aAAa;AACf,YAAM,kBAAkB,OAAO,OAAO,eAAe,SAAS,eAAe;AAC7E;AAAA,IACF;AAEA,UAAM,qBAAqB,OAAO,OAAO,eAAe,YAAY,YAAY,gBAAgB,uBAAuB,SAAS,eAAe;AAAA,EACjJ,SAAS,OAAO;AACd,UAAM,YAAY;AAClB,UAAM,YAAY,OAAO,KAAK;AAE9B,QAAI,MAAM,YAAY,MAAM,aAAa;AACvC,YAAM,kBAAkB,yBAAyB,MAAM,QAAQ,IAAI,MAAM,WAAW,gCAA2B,MAAM,WAAW,MAAM,GAAG,GAAG,KAAK,eAAe;AAChK,YAAM,qBAAqB,OAAO,aAAa,8BAA8B,MAAM,SAAS,EAAE;AAC9F,eAAS,OAAO,MAAM,IAAI,SAAS,SAAS,MAAM,UAAU,0BAA0B;AAAA,IACxF,OAAO;AACL,YAAM,cAAc,eAAe,OAAO,MAAM,OAAO,YAAY;AACnE,YAAM,qBAAqB,OAAO,WAAW,0CAA0C,MAAM,WAAW,GAAG;AAC3G,eAAS,OAAO,MAAM,IAAI,SAAS,SAAS,MAAM,UAAU,oCAAoC;AAAA,IAClG;AAAA,EACF,UAAE;AACA,UAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,WAAO,KAAK,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,YAAY,YAAY,MAAM,OAAO,WAAW,UAAU,MAAM,SAAS,GAAG,kCAAkC;AACjK,UAAM,YAAY,IAAI;AACtB,mBAAe,MAAM,EAAE;AACvB,UAAM,QAAQ,gBAAgB,KAAK,IAAI,MAAM,QAAQ,gBAAgB,GAAG,CAAC;AACzE,YAAQ,OAAO,MAAM,EAAE;AACvB,UAAM,UAAU,eAAe,MAAM,MAAM;AAC3C,UAAM,QAAQ,gBAAgB,KAAK,IAAI,MAAM,QAAQ,eAAe,CAAC;AACrE,UAAM,YAAY,IAAI;AACtB,UAAM,aAAa,KAAK;AAAA,EAC1B;AACF;","names":["existsSync","mkdirSync","readFileSync","writeFileSync","join","execSync","existsSync","join","join","join","env","existsSync","join","compile","existsSync","join","env","existsSync","join","compile","existsSync","join","env","join","existsSync","join","existsSync","env","now","event","env","join","join","mkdirSync","existsSync","readFileSync","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","existsSync","readFileSync","writeFileSync","join","execSync","execSync","execSync","execSync","agentSessionResource","record","agentPipelineResource","rmSync","writeFileSync","join","env","spawn","resolve","rmSync","join","writeFileSync","spawn","env","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","join","execSync","existsSync","readFileSync","writeFileSync","existsSync","execSync","readFileSync","join","mkdirSync","writeFileSync","existsSync","rmSync","writeFileSync","join","existsSync","readdirSync","readFileSync","homedir","join","resolve","join","writeFileSync","context","record","context","runPlanningJob","runIssueOnce","resolve","record","findIssue","execSync","existsSync","readFileSync","readdirSync","realpathSync","join","dirname","homedir","env","homedir","env","join","existsSync","readdirSync","now","execSync","readFileSync","realpathSync","dirname","existsSync","mkdirSync","writeFileSync","execSync","basename","extname","join","findIssue","stat","readFileSync","env","existsSync","readFileSync","rmSync","writeFileSync","spawn","join","buildPrompt","context","resolve","providers","context","existsSync","mkdtempSync","readdirSync","readFileSync","rmSync","writeFileSync","join","basename","spawn","tmpdir","env","existsSync","join","readdirSync","basename","readFileSync","record","mkdtempSync","join","tmpdir","writeFileSync","env","resolve","stdout","spawn","rmSync","execFileSync","execFileSync","resolve","stdout","existsSync","mkdirSync","readFileSync","writeFileSync","join","readFileSync","join","mkdirSync","existsSync","writeFileSync","execSync","appendFileSync","existsSync","mkdirSync","readFileSync","statSync","writeFileSync","randomUUID","extname","join","findIssue","existsSync","stat","statSync","execSync","basename","join","readFileSync","writeFileSync","appendFileSync","randomUUID","mkdirSync","extname","stateDb","existsSync","readFileSync","mkdirSync","record","stopQueueWorkers","record","writeFileSync","join","mkdtempSync","rmSync","tmpdir","mkdirSync","writeFileSync","spawn","join","join","mkdirSync","writeFileSync","resolve","stdout","spawn","mkdtempSync","join","tmpdir","writeFileSync","rmSync","writeFileSync","join","mkdtempSync","rmSync","tmpdir","refinePlan","mkdtempSync","join","tmpdir","writeFileSync","rmSync","durationMs","addEvent","persistState","refinePlan","join","mkdirSync","writeFileSync","execSync","existsSync","readFileSync"]}
|