@tomkapa/tayto 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +190 -111
- package/dist/{chunk-STYT4TGJ.js → chunk-74Q55TOV.js} +41 -2
- package/dist/chunk-74Q55TOV.js.map +1 -0
- package/dist/index.js +162 -80
- package/dist/index.js.map +1 -1
- package/dist/migrations/005_project_git_remote.sql +5 -0
- package/dist/{tui-JEP3F4JS.js → tui-IXZGQMWN.js} +308 -143
- package/dist/tui-IXZGQMWN.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-STYT4TGJ.js.map +0 -1
- package/dist/tui-JEP3F4JS.js.map +0 -1
package/dist/tui-JEP3F4JS.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tui/index.tsx","../src/tui/components/App.tsx","../src/tui/types.ts","../src/tui/theme.ts","../src/tui/constants.ts","../src/tui/state.ts","../src/tui/components/Header.tsx","../src/tui/components/Crumbs.tsx","../src/tui/components/FlashMessage.tsx","../src/tui/components/TaskList.tsx","../src/tui/components/TaskDetail.tsx","../src/tui/components/Markdown.tsx","../src/tui/mermaid.ts","../src/tui/components/TaskForm.tsx","../src/tui/editor.ts","../src/tui/components/TaskPicker.tsx","../src/tui/components/ProjectSelector.tsx","../src/tui/components/ProjectForm.tsx","../src/tui/components/HelpOverlay.tsx","../src/tui/components/ConfirmDialog.tsx","../src/tui/components/DependencyList.tsx","../src/tui/components/EpicPanel.tsx","../src/tui/components/EpicPicker.tsx","../src/tui/useAutoRefetch.ts"],"sourcesContent":["import { render } from 'ink';\nimport type { Container } from '../cli/container.js';\nimport { App } from './components/App.js';\n\nexport async function launchTUI(container: Container, initialProject?: string): Promise<void> {\n const instance = render(<App container={container} initialProject={initialProject} />, {\n exitOnCtrlC: true,\n });\n\n await instance.waitUntilExit();\n}\n","import { useReducer, useEffect, useCallback, useMemo, useState } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport type { Container } from '../../cli/container.js';\nimport {\n TaskStatus,\n TaskType,\n TaskLevel,\n DependencyType,\n isTerminalStatus,\n} from '../../types/enums.js';\nimport type { Task, DependencyEntry } from '../../types/task.js';\nimport type { Project } from '../../types/project.js';\nimport { ViewType } from '../types.js';\nimport { appReducer, initialState } from '../state.js';\nimport { STATUS_VALUES, TYPE_VALUES } from '../constants.js';\nimport { Header } from './Header.js';\nimport { Crumbs } from './Crumbs.js';\nimport { FlashMessage } from './FlashMessage.js';\nimport { TaskList } from './TaskList.js';\nimport { TaskDetail } from './TaskDetail.js';\nimport { TaskForm } from './TaskForm.js';\nimport { ProjectSelector } from './ProjectSelector.js';\nimport { ProjectForm } from './ProjectForm.js';\nimport { HelpOverlay } from './HelpOverlay.js';\nimport { ConfirmDialog } from './ConfirmDialog.js';\nimport { DependencyList } from './DependencyList.js';\nimport { EpicPanel } from './EpicPanel.js';\nimport { EpicPicker } from './EpicPicker.js';\nimport { openAllMermaidDiagrams } from './Markdown.js';\nimport { theme } from '../theme.js';\nimport { logger } from '../../logging/logger.js';\nimport { useAutoRefetch } from '../useAutoRefetch.js';\n\ninterface Props {\n container: Container;\n initialProject?: string | undefined;\n}\n\nconst STATUS_CYCLE: TaskStatus[] = [\n TaskStatus.Backlog,\n TaskStatus.Todo,\n TaskStatus.InProgress,\n TaskStatus.Review,\n TaskStatus.Done,\n];\n\nconst EPIC_PANEL_WIDTH = 48;\n\nexport function App({ container, initialProject }: Props) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [state, dispatch] = useReducer(appReducer, initialState);\n\n // Force re-render on terminal resize so layout recalculates\n const [, setResizeTick] = useState(0);\n useEffect(() => {\n const onResize = () => {\n setResizeTick((n) => n + 1);\n };\n stdout.on('resize', onResize);\n return () => {\n stdout.off('resize', onResize);\n };\n }, [stdout]);\n\n // Fixed panel widths so they don't jump when content changes\n const termWidth = stdout.columns > 0 ? stdout.columns : 120;\n // EpicPanel border adds 2 chars; remaining space split 60/40 between list/detail\n const remaining = Math.max(0, termWidth - EPIC_PANEL_WIDTH - 2);\n const taskListWidth = Math.floor(remaining * 0.6);\n const taskDetailWidth = remaining - taskListWidth;\n\n const loadProjects = useCallback(() => {\n const result = container.projectService.listProjects();\n if (result.ok) {\n logger.info(`TUI.loadProjects: loaded ${result.value.length} projects`);\n dispatch({ type: 'SET_PROJECTS', projects: result.value });\n } else {\n logger.error('TUI.loadProjects: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n }, [container]);\n\n const loadTasks = useCallback(() => {\n logger.startSpan('TUI.loadTasks', () => {\n const filter = { ...state.filter, level: TaskLevel.Work };\n if (state.activeProject) {\n filter.projectId = state.activeProject.id;\n }\n // Apply epic filter: when epics are selected, show only their children\n if (state.selectedEpicIds.size > 0) {\n filter.parentIds = [...state.selectedEpicIds];\n }\n const result = container.taskService.listTasks(filter);\n if (result.ok) {\n logger.info(`TUI.loadTasks: loaded ${result.value.length} tasks`);\n dispatch({ type: 'SET_TASKS', tasks: result.value });\n } else {\n logger.error('TUI.loadTasks: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n });\n }, [container, state.filter, state.activeProject, state.selectedEpicIds]);\n\n const loadEpics = useCallback(() => {\n if (!state.activeProject) return;\n const result = container.taskService.listTasks({\n projectId: state.activeProject.id,\n level: TaskLevel.Epic,\n });\n if (result.ok) {\n dispatch({ type: 'SET_EPICS', epics: result.value });\n } else {\n logger.error('TUI.loadEpics: failed', result.error);\n }\n }, [container, state.activeProject]);\n\n const loadDeps = useCallback(\n (taskId: string) => {\n const blockersResult = container.dependencyService.listBlockers(taskId);\n const dependentsResult = container.dependencyService.listDependents(taskId);\n const relatedResult = container.dependencyService.listRelated(taskId);\n const duplicatesResult = container.dependencyService.listDuplicates(taskId);\n dispatch({\n type: 'SET_DEPS',\n blockers: blockersResult.ok ? blockersResult.value : [],\n dependents: dependentsResult.ok ? dependentsResult.value : [],\n related: relatedResult.ok ? relatedResult.value : [],\n duplicates: duplicatesResult.ok ? duplicatesResult.value : [],\n });\n },\n [container],\n );\n\n const cycleStatus = useCallback(\n (task: Task) => {\n const currentIndex = STATUS_CYCLE.indexOf(task.status);\n const nextStatus = STATUS_CYCLE[(currentIndex + 1) % STATUS_CYCLE.length];\n if (!nextStatus) return;\n\n const result = container.taskService.updateTask(task.id, { status: nextStatus });\n if (result.ok) {\n dispatch({ type: 'FLASH', message: `Status -> ${nextStatus}`, level: 'info' });\n if (state.selectedTask?.id === task.id) {\n dispatch({ type: 'SELECT_TASK', task: result.value });\n }\n loadTasks();\n loadEpics();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n },\n [container, state.selectedTask, loadTasks, loadEpics],\n );\n\n const saveReorder = useCallback(() => {\n const tasks = state.tasks;\n const idx = state.selectedIndex;\n const task = tasks[idx];\n if (!task) return;\n\n const prev = tasks[idx - 1];\n const next = tasks[idx + 1];\n\n // Use after/before positioning so the service computes the rank\n const result = prev\n ? container.taskService.rerankTask({ taskId: task.id, afterId: prev.id })\n : next\n ? container.taskService.rerankTask({ taskId: task.id, beforeId: next.id })\n : container.taskService.rerankTask({ taskId: task.id, position: 1 });\n\n dispatch({ type: 'EXIT_REORDER', save: result.ok });\n dispatch({\n type: 'FLASH',\n message: result.ok ? 'Rank saved' : result.error.message,\n level: result.ok ? 'info' : 'error',\n });\n loadTasks();\n }, [container, state.tasks, state.selectedIndex, loadTasks]);\n\n const saveEpicReorder = useCallback(() => {\n const epics = state.epics;\n const idx = state.epicSelectedIndex;\n const epic = epics[idx];\n if (!epic) return;\n\n const prev = epics[idx - 1];\n const next = epics[idx + 1];\n\n const result = prev\n ? container.taskService.rerankTask({ taskId: epic.id, afterId: prev.id })\n : next\n ? container.taskService.rerankTask({ taskId: epic.id, beforeId: next.id })\n : container.taskService.rerankTask({ taskId: epic.id, position: 1 });\n\n dispatch({ type: 'EXIT_EPIC_REORDER', save: result.ok });\n dispatch({\n type: 'FLASH',\n message: result.ok ? 'Epic rank saved' : result.error.message,\n level: result.ok ? 'info' : 'error',\n });\n loadEpics();\n }, [container, state.epics, state.epicSelectedIndex, loadEpics]);\n\n const rerankSelectedToEdge = useCallback(\n (kind: 'task' | 'epic', edge: 'top' | 'bottom') => {\n const isEpic = kind === 'epic';\n const item = isEpic ? state.epics[state.epicSelectedIndex] : state.tasks[state.selectedIndex];\n if (!item) return;\n\n const result = container.taskService.rerankTask({\n taskId: item.id,\n ...(edge === 'top' ? { top: true } : { bottom: true }),\n });\n\n dispatch({\n type: isEpic ? 'EXIT_EPIC_REORDER' : 'EXIT_REORDER',\n save: result.ok,\n });\n dispatch({\n type: 'FLASH',\n message: result.ok ? `${isEpic ? 'Epic moved' : 'Moved'} to ${edge}` : result.error.message,\n level: result.ok ? 'info' : 'error',\n });\n if (isEpic) loadEpics();\n else loadTasks();\n },\n [\n container,\n state.tasks,\n state.selectedIndex,\n state.epics,\n state.epicSelectedIndex,\n loadTasks,\n loadEpics,\n ],\n );\n\n // Watch the SQLite file for external changes (e.g. CLI mutations) and\n // refetch all data so the TUI stays in sync.\n const refetchAll = useCallback(() => {\n loadProjects();\n loadTasks();\n loadEpics();\n }, [loadProjects, loadTasks, loadEpics]);\n\n useAutoRefetch(container.dbPath, refetchAll);\n\n // Initial load\n useEffect(() => {\n loadProjects();\n }, [loadProjects]);\n\n // Resolve initial project\n useEffect(() => {\n if (state.projects.length > 0 && !state.activeProject) {\n logger.info(`TUI.resolveProject: resolving initialProject=${initialProject ?? '(default)'}`);\n const result = container.projectService.resolveProject(initialProject);\n if (result.ok) {\n logger.info(\n `TUI.resolveProject: resolved to key=${result.value.key} name=${result.value.name}`,\n );\n dispatch({ type: 'SET_ACTIVE_PROJECT', project: result.value });\n } else {\n logger.error('TUI.resolveProject: failed', result.error);\n const fallback = state.projects[0] ?? null;\n logger.info(`TUI.resolveProject: falling back to ${fallback?.name ?? 'null'}`);\n dispatch({ type: 'SET_ACTIVE_PROJECT', project: fallback });\n }\n }\n }, [state.projects, state.activeProject, initialProject, container]);\n\n // Reload tasks and epics when project or filter changes\n useEffect(() => {\n if (state.activeProject) {\n loadTasks();\n loadEpics();\n }\n }, [state.activeProject, state.filter, loadTasks, loadEpics]);\n\n // Auto-clear flash\n useEffect(() => {\n if (state.flash) {\n const timer = setTimeout(() => {\n dispatch({ type: 'CLEAR_FLASH' });\n }, 3000);\n return () => {\n clearTimeout(timer);\n };\n }\n return undefined;\n }, [state.flash]);\n\n // Keyboard handler\n useInput((input, key) => {\n // Handle confirm delete dialog\n if (state.confirmDelete) {\n if (input === 'y') {\n const result = container.taskService.deleteTask(state.confirmDelete.id);\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Task deleted', level: 'info' });\n dispatch({ type: 'CANCEL_DELETE' });\n if (state.activeView === ViewType.TaskDetail) {\n dispatch({ type: 'GO_BACK' });\n }\n loadTasks();\n loadEpics();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n dispatch({ type: 'CANCEL_DELETE' });\n }\n } else if (input === 'n' || key.escape) {\n dispatch({ type: 'CANCEL_DELETE' });\n }\n return;\n }\n\n // Help view - any key closes\n if (state.activeView === ViewType.Help) {\n dispatch({ type: 'GO_BACK' });\n return;\n }\n\n // Form/selector/picker views handle their own input\n if (\n state.activeView === ViewType.TaskCreate ||\n state.activeView === ViewType.TaskEdit ||\n state.activeView === ViewType.ProjectSelector ||\n state.activeView === ViewType.ProjectCreate ||\n state.activeView === ViewType.EpicPicker\n ) {\n return;\n }\n\n // Dep add-input mode: handle inline then return\n if (state.activeView === ViewType.DependencyList && state.isAddingDep) {\n if (key.escape) {\n dispatch({ type: 'SET_ADDING_DEP', active: false });\n return;\n }\n if (key.return && state.addDepInput.trim() && state.selectedTask) {\n // Format: \"TASK-ID\" or \"TASK-ID:relates-to\" or \"TASK-ID:duplicates\"\n const raw = state.addDepInput.trim();\n const colonIdx = raw.lastIndexOf(':');\n const validTypes = new Set(['blocks', 'relates-to', 'duplicates']);\n let depId: string;\n let depType: string | undefined;\n if (colonIdx > 0) {\n const maybetype = raw.slice(colonIdx + 1);\n if (validTypes.has(maybetype)) {\n depId = raw.slice(0, colonIdx);\n depType = maybetype;\n } else {\n depId = raw;\n }\n } else {\n depId = raw;\n }\n const result = container.dependencyService.addDependency({\n taskId: state.selectedTask.id,\n dependsOnId: depId,\n type: depType,\n });\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Dependency added', level: 'info' });\n loadDeps(state.selectedTask.id);\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n dispatch({ type: 'SET_ADDING_DEP', active: false });\n return;\n }\n if (key.backspace || key.delete) {\n dispatch({ type: 'SET_ADD_DEP_INPUT', input: state.addDepInput.slice(0, -1) });\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_ADD_DEP_INPUT', input: state.addDepInput + input });\n return;\n }\n return;\n }\n\n // Search mode\n if (state.isSearchActive) {\n if (key.escape) {\n dispatch({ type: 'SET_SEARCH_ACTIVE', active: false });\n dispatch({ type: 'SET_SEARCH_QUERY', query: '' });\n dispatch({ type: 'SET_FILTER', filter: { search: undefined } });\n return;\n }\n if (key.return) {\n dispatch({ type: 'SET_SEARCH_ACTIVE', active: false });\n dispatch({ type: 'SET_FILTER', filter: { search: state.searchQuery || undefined } });\n return;\n }\n if (key.backspace || key.delete) {\n dispatch({ type: 'SET_SEARCH_QUERY', query: state.searchQuery.slice(0, -1) });\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n dispatch({ type: 'SET_SEARCH_QUERY', query: state.searchQuery + input });\n return;\n }\n return;\n }\n\n // Epic reorder mode\n if (state.isEpicReordering) {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'EPIC_REORDER_MOVE', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'EPIC_REORDER_MOVE', direction: 'down' });\n return;\n }\n if (input === 't') {\n rerankSelectedToEdge('epic', 'top');\n return;\n }\n if (input === 'b') {\n rerankSelectedToEdge('epic', 'bottom');\n return;\n }\n if (key.rightArrow) {\n saveEpicReorder();\n return;\n }\n if (key.escape || key.leftArrow) {\n dispatch({ type: 'EXIT_EPIC_REORDER', save: false });\n dispatch({ type: 'FLASH', message: 'Epic reorder cancelled', level: 'info' });\n return;\n }\n return;\n }\n\n // Reorder mode\n if (state.isReordering) {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'REORDER_MOVE', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'REORDER_MOVE', direction: 'down' });\n return;\n }\n if (input === 't') {\n rerankSelectedToEdge('task', 'top');\n return;\n }\n if (input === 'b') {\n rerankSelectedToEdge('task', 'bottom');\n return;\n }\n if (key.rightArrow) {\n saveReorder();\n return;\n }\n if (key.escape || key.leftArrow) {\n dispatch({ type: 'EXIT_REORDER', save: false });\n dispatch({ type: 'FLASH', message: 'Reorder cancelled', level: 'info' });\n return;\n }\n return;\n }\n\n // Global\n if (input === 'q' && state.activeView === ViewType.TaskList && state.focusedPanel === 'list') {\n exit();\n return;\n }\n if (input === 'q' || key.escape) {\n // In split view with detail focused: escape/q returns focus to list\n if (state.activeView === ViewType.TaskList && state.focusedPanel === 'detail') {\n dispatch({ type: 'SET_PANEL_FOCUS', panel: 'list' });\n return;\n }\n dispatch({ type: 'GO_BACK' });\n return;\n }\n if (input === '?') {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.Help });\n return;\n }\n\n // Tab: cycle panel focus (epic -> list -> detail -> epic)\n if (key.tab && state.activeView === ViewType.TaskList) {\n const panels: Array<'epic' | 'list' | 'detail'> = previewTask\n ? ['epic', 'list', 'detail']\n : ['epic', 'list'];\n const curIdx = panels.indexOf(state.focusedPanel);\n const nextPanel = panels[(curIdx + 1) % panels.length] ?? 'list';\n dispatch({ type: 'SET_PANEL_FOCUS', panel: nextPanel });\n return;\n }\n\n // Task List — epic panel focused\n if (state.activeView === ViewType.TaskList && state.focusedPanel === 'epic') {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'EPIC_MOVE_CURSOR', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'EPIC_MOVE_CURSOR', direction: 'down' });\n return;\n }\n if (input === ' ' || key.return) {\n const epic = state.epics[state.epicSelectedIndex];\n if (epic) {\n dispatch({ type: 'TOGGLE_EPIC', epicId: epic.id });\n }\n return;\n }\n if (input === '0') {\n dispatch({ type: 'CLEAR_EPIC_SELECTION' });\n return;\n }\n if (key.leftArrow) {\n if (state.epics.length > 0) {\n dispatch({ type: 'ENTER_EPIC_REORDER' });\n dispatch({\n type: 'FLASH',\n message: 'Reorder: ↑↓ move, t top, b bottom, → save, ← cancel',\n level: 'info',\n });\n }\n return;\n }\n if (input === 'q') {\n exit();\n return;\n }\n }\n\n // Task List — list panel focused\n if (state.activeView === ViewType.TaskList && state.focusedPanel === 'list') {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'MOVE_CURSOR', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'MOVE_CURSOR', direction: 'down' });\n return;\n }\n // g = go to top, G = go to bottom\n if (input === 'g') {\n dispatch({ type: 'SET_CURSOR', index: 0 });\n return;\n }\n if (input === 'G') {\n dispatch({ type: 'SET_CURSOR', index: state.tasks.length - 1 });\n return;\n }\n if (key.pageDown || (key.ctrl && input === 'd')) {\n dispatch({ type: 'PAGE_CURSOR', direction: 'down' });\n return;\n }\n if (key.pageUp || (key.ctrl && input === 'u')) {\n dispatch({ type: 'PAGE_CURSOR', direction: 'up' });\n return;\n }\n if (key.return) {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n dispatch({ type: 'SELECT_TASK', task });\n loadDeps(task.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskDetail });\n }\n return;\n }\n if (input === 'c') {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskCreate });\n return;\n }\n if (input === 'e') {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n dispatch({ type: 'SELECT_TASK', task });\n loadDeps(task.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskEdit });\n }\n return;\n }\n if (input === 'd') {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n dispatch({ type: 'CONFIRM_DELETE', task });\n }\n return;\n }\n if (input === 's') {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n cycleStatus(task);\n }\n return;\n }\n if (input === 'a') {\n const task = state.tasks[state.selectedIndex];\n if (task) {\n dispatch({ type: 'SELECT_TASK', task });\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.EpicPicker });\n }\n return;\n }\n if (input === 'A') {\n const task = state.tasks[state.selectedIndex];\n if (task && task.parentId) {\n const result = container.taskService.updateTask(task.id, { parentId: null });\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Unassigned from epic', level: 'info' });\n loadTasks();\n loadEpics();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n } else if (task) {\n dispatch({ type: 'FLASH', message: 'Task has no epic', level: 'warn' });\n }\n return;\n }\n if (input === '/') {\n dispatch({ type: 'SET_SEARCH_ACTIVE', active: true });\n dispatch({ type: 'SET_SEARCH_QUERY', query: '' });\n return;\n }\n if (input === 'p') {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.ProjectSelector });\n return;\n }\n // Left arrow: enter reorder mode (only when no epic filter active)\n if (key.leftArrow) {\n if (state.selectedEpicIds.size > 0) {\n dispatch({\n type: 'FLASH',\n message: 'Clear epic filter (0) before reordering',\n level: 'warn',\n });\n return;\n }\n if (state.filter.status || state.filter.type || state.filter.search) {\n dispatch({\n type: 'FLASH',\n message: 'Clear filters (0) before reordering',\n level: 'warn',\n });\n return;\n }\n if (state.tasks.length > 0) {\n dispatch({ type: 'ENTER_REORDER' });\n dispatch({\n type: 'FLASH',\n message: 'Reorder: ↑↓ move, t top, b bottom, → save, ← cancel',\n level: 'info',\n });\n }\n return;\n }\n if (input === 'f') {\n const currentStatus = state.filter.status;\n const currentIndex = currentStatus\n ? STATUS_VALUES.indexOf(currentStatus as TaskStatus)\n : -1;\n const nextIndex = currentIndex + 1;\n const nextStatus = nextIndex < STATUS_VALUES.length ? STATUS_VALUES[nextIndex] : undefined;\n dispatch({ type: 'SET_FILTER', filter: { status: nextStatus } });\n return;\n }\n if (input === 't') {\n const currentType = state.filter.type;\n const currentIndex = currentType ? TYPE_VALUES.indexOf(currentType as TaskType) : -1;\n const nextIndex = currentIndex + 1;\n const nextType = nextIndex < TYPE_VALUES.length ? TYPE_VALUES[nextIndex] : undefined;\n dispatch({ type: 'SET_FILTER', filter: { type: nextType } });\n return;\n }\n if (input === '0') {\n dispatch({ type: 'CLEAR_FILTER' });\n return;\n }\n }\n\n // Task List — detail panel focused (preview task shortcuts)\n if (state.activeView === ViewType.TaskList && state.focusedPanel === 'detail' && previewTask) {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'DETAIL_SCROLL', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'DETAIL_SCROLL', direction: 'down' });\n return;\n }\n if (input === 'e') {\n dispatch({ type: 'SELECT_TASK', task: previewTask });\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskEdit });\n return;\n }\n if (input === 'd') {\n dispatch({ type: 'CONFIRM_DELETE', task: previewTask });\n return;\n }\n if (input === 's') {\n cycleStatus(previewTask);\n return;\n }\n if (input === 'm') {\n const allText = `${previewTask.description}\\n${previewTask.technicalNotes}\\n${previewTask.additionalRequirements}`;\n const count = openAllMermaidDiagrams(allText);\n if (count > 0) {\n dispatch({\n type: 'FLASH',\n message: `Opened ${count} diagram${count > 1 ? 's' : ''} in browser`,\n level: 'info',\n });\n }\n return;\n }\n if (input === 'D') {\n dispatch({ type: 'SELECT_TASK', task: previewTask });\n loadDeps(previewTask.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.DependencyList });\n return;\n }\n }\n\n // Task Detail (full-screen)\n if (state.activeView === ViewType.TaskDetail) {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'DETAIL_SCROLL', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'DETAIL_SCROLL', direction: 'down' });\n return;\n }\n if (input === 'e' && state.selectedTask) {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskEdit });\n return;\n }\n if (input === 'd' && state.selectedTask) {\n dispatch({ type: 'CONFIRM_DELETE', task: state.selectedTask });\n return;\n }\n if (input === 's' && state.selectedTask) {\n cycleStatus(state.selectedTask);\n return;\n }\n if (input === 'm' && state.selectedTask) {\n const allText = `${state.selectedTask.description}\\n${state.selectedTask.technicalNotes}\\n${state.selectedTask.additionalRequirements}`;\n const count = openAllMermaidDiagrams(allText);\n if (count > 0) {\n dispatch({\n type: 'FLASH',\n message: `Opened ${count} diagram${count > 1 ? 's' : ''} in browser`,\n level: 'info',\n });\n }\n return;\n }\n if (input === 'D' && state.selectedTask) {\n loadDeps(state.selectedTask.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.DependencyList });\n return;\n }\n }\n\n // Dependency List (non-adding mode — adding is handled above)\n if (state.activeView === ViewType.DependencyList && state.selectedTask) {\n if (key.upArrow || input === 'k') {\n dispatch({ type: 'DEP_MOVE_CURSOR', direction: 'up' });\n return;\n }\n if (key.downArrow || input === 'j') {\n dispatch({ type: 'DEP_MOVE_CURSOR', direction: 'down' });\n return;\n }\n if (input === 'a') {\n dispatch({ type: 'SET_ADDING_DEP', active: true });\n return;\n }\n if (input === 'x') {\n const allItems = [\n ...state.depBlockers,\n ...state.depDependents,\n ...state.depRelated,\n ...state.depDuplicates,\n ];\n const selected = allItems[state.depSelectedIndex];\n if (selected) {\n // removeDependencyBetween handles direction-agnostic removal for\n // all relationship types (blockers, dependents, related, duplicates).\n const result = container.dependencyService.removeDependencyBetween(\n state.selectedTask.id,\n selected.id,\n );\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Dependency removed', level: 'info' });\n loadDeps(state.selectedTask.id);\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n }\n return;\n }\n if (key.return) {\n const allItems = [\n ...state.depBlockers,\n ...state.depDependents,\n ...state.depRelated,\n ...state.depDuplicates,\n ];\n const selected = allItems[state.depSelectedIndex];\n if (selected) {\n dispatch({ type: 'SELECT_TASK', task: selected });\n loadDeps(selected.id);\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.TaskDetail });\n }\n return;\n }\n }\n });\n\n const handleFormSave = useCallback(\n (data: {\n name: string;\n description: string;\n type: string;\n status: string;\n technicalNotes: string;\n additionalRequirements: string;\n dependsOn?: DependencyEntry[];\n }) => {\n if (state.activeView === ViewType.TaskEdit && state.selectedTask) {\n const taskId = state.selectedTask.id;\n const result = container.taskService.updateTask(taskId, data);\n if (!result.ok) {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n return;\n }\n\n // Diff and apply dependency changes.\n // Current outgoing deps (what this task depends on, in stored direction).\n const currentDepsResult = container.dependencyService.listAllDeps(taskId);\n const currentDeps = currentDepsResult.ok ? currentDepsResult.value : [];\n\n // New desired outgoing deps from the form.\n const newDeps = data.dependsOn ?? [];\n\n // Build lookup keys: \"dependsOnId:type\" for outgoing edges.\n const currentKeys = new Set(currentDeps.map((d) => `${d.dependsOnId}:${d.type}`));\n const newKeys = new Set(newDeps.map((d) => `${d.id}:${d.type}`));\n\n // Remove edges that are no longer in new deps.\n for (const dep of currentDeps) {\n if (!newKeys.has(`${dep.dependsOnId}:${dep.type}`)) {\n container.dependencyService.removeDependency({\n taskId,\n dependsOnId: dep.dependsOnId,\n });\n }\n }\n\n // Add edges that are new (service handles blocked-by normalization).\n for (const entry of newDeps) {\n if (currentKeys.has(`${entry.id}:${entry.type}`)) continue;\n container.dependencyService.addDependency({\n taskId,\n dependsOnId: entry.id,\n type: entry.type,\n });\n }\n\n dispatch({ type: 'FLASH', message: 'Task updated', level: 'info' });\n dispatch({ type: 'SELECT_TASK', task: result.value });\n loadDeps(taskId);\n dispatch({ type: 'GO_BACK' });\n loadTasks();\n loadEpics();\n } else {\n const result = container.taskService.createTask(data, state.activeProject?.id);\n if (result.ok) {\n dispatch({ type: 'FLASH', message: 'Task created', level: 'info' });\n dispatch({ type: 'GO_BACK' });\n loadTasks();\n loadEpics();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n }\n },\n [\n container,\n state.activeView,\n state.selectedTask,\n state.activeProject,\n loadTasks,\n loadDeps,\n loadEpics,\n ],\n );\n\n const handleFormCancel = useCallback(() => {\n dispatch({ type: 'GO_BACK' });\n }, []);\n\n const handleEpicPickerSelect = useCallback(\n (epicId: string | null) => {\n if (!state.selectedTask) return;\n const result = container.taskService.updateTask(state.selectedTask.id, {\n parentId: epicId,\n });\n if (result.ok) {\n const msg = epicId ? `Assigned to ${epicId}` : 'Unassigned from epic';\n dispatch({ type: 'FLASH', message: msg, level: 'info' });\n loadTasks();\n loadEpics();\n } else {\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n dispatch({ type: 'GO_BACK' });\n },\n [container, state.selectedTask, loadTasks, loadEpics],\n );\n\n const handleEpicPickerCancel = useCallback(() => {\n dispatch({ type: 'GO_BACK' });\n }, []);\n\n const handleProjectSelect = useCallback((project: Project) => {\n dispatch({ type: 'SET_ACTIVE_PROJECT', project });\n dispatch({ type: 'GO_BACK' });\n dispatch({ type: 'FLASH', message: `Switched to: ${project.name}`, level: 'info' });\n }, []);\n\n const handleSetDefault = useCallback(\n (project: Project) => {\n const result = container.projectService.updateProject(project.id, { isDefault: true });\n if (result.ok) {\n logger.info(`TUI.setDefault: set key=${result.value.key} as default`);\n dispatch({\n type: 'FLASH',\n message: `Default project: ${result.value.name}`,\n level: 'info',\n });\n loadProjects();\n } else {\n logger.error('TUI.setDefault: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n },\n [container, loadProjects],\n );\n\n const handleProjectCreate = useCallback(() => {\n dispatch({ type: 'NAVIGATE_TO', view: ViewType.ProjectCreate });\n }, []);\n\n const handleProjectFormSave = useCallback(\n (data: { name: string; key: string; description: string; isDefault: boolean }) => {\n const result = container.projectService.createProject({\n name: data.name,\n key: data.key || undefined,\n description: data.description || undefined,\n isDefault: data.isDefault,\n });\n if (result.ok) {\n logger.info(`TUI.createProject: created key=${result.value.key} name=${result.value.name}`);\n dispatch({\n type: 'FLASH',\n message: `Project created: ${result.value.name}`,\n level: 'info',\n });\n dispatch({ type: 'SET_ACTIVE_PROJECT', project: result.value });\n // Go back past ProjectCreate and ProjectSelector to TaskList\n dispatch({ type: 'GO_BACK' });\n dispatch({ type: 'GO_BACK' });\n loadProjects();\n } else {\n logger.error('TUI.createProject: failed', result.error);\n dispatch({ type: 'FLASH', message: result.error.message, level: 'error' });\n }\n },\n [container, loadProjects],\n );\n\n const handleProjectFormCancel = useCallback(() => {\n dispatch({ type: 'GO_BACK' });\n }, []);\n\n const handleProjectCancel = useCallback(() => {\n dispatch({ type: 'GO_BACK' });\n }, []);\n\n const previewTask = state.tasks[state.selectedIndex] ?? null;\n\n // Derive initial deps for the edit form from the already-loaded dep state.\n // depBlockers = tasks the selected task depends on (outgoing blocks edges).\n // depRelated / depDuplicates = bidirectional, but we seed them as outgoing.\n const initialDepsForEdit = useMemo((): import('./TaskPicker.js').PickedDependency[] => {\n return [\n ...state.depBlockers.map((t) => ({ id: t.id, name: t.name, type: DependencyType.Blocks })),\n ...state.depRelated.map((t) => ({ id: t.id, name: t.name, type: DependencyType.RelatesTo })),\n ...state.depDuplicates.map((t) => ({\n id: t.id,\n name: t.name,\n type: DependencyType.Duplicates,\n })),\n ];\n }, [state.depBlockers, state.depRelated, state.depDuplicates]);\n\n // All project tasks (unfiltered) for the dependency picker.\n // Depends on state.tasks so it re-fetches whenever loadTasks() updates the list\n // (e.g. after a task is created), ensuring newly created tasks appear in the picker.\n const allProjectTasks = useMemo(() => {\n if (!state.activeProject) return [];\n const result = container.taskService.listTasks({ projectId: state.activeProject.id });\n return result.ok ? result.value : [];\n }, [container, state.activeProject, state.tasks]);\n const previewTaskId = previewTask?.id ?? null;\n\n // Load deps for the preview pane when selection changes (track ID, not object reference)\n useEffect(() => {\n if (state.activeView === ViewType.TaskList && previewTaskId) {\n loadDeps(previewTaskId);\n }\n }, [state.activeView, previewTaskId, loadDeps]);\n\n return (\n <Box flexDirection=\"column\" height={stdout.rows}>\n {/* Header: app info + key hints + logo */}\n <Header state={state} />\n\n {/* Content area */}\n <Box flexDirection=\"column\" flexGrow={1} overflowY=\"hidden\">\n {state.confirmDelete && <ConfirmDialog task={state.confirmDelete} />}\n\n {!state.confirmDelete && state.activeView === ViewType.TaskList && (\n <Box flexDirection=\"row\" flexGrow={1}>\n <EpicPanel\n epics={state.epics}\n selectedIndex={state.epicSelectedIndex}\n selectedEpicIds={state.selectedEpicIds}\n isFocused={state.focusedPanel === 'epic'}\n isReordering={state.isEpicReordering}\n />\n <Box width={taskListWidth}>\n <TaskList\n tasks={state.tasks}\n selectedIndex={state.selectedIndex}\n searchQuery={state.searchQuery}\n isSearchActive={state.isSearchActive}\n isReordering={state.isReordering}\n filter={state.filter}\n activeProjectName={state.activeProject?.name ?? 'none'}\n nonTerminalBlockerIds={\n new Set(\n state.depBlockers.filter((t) => !isTerminalStatus(t.status)).map((t) => t.id),\n )\n }\n nonTerminalDependentIds={\n new Set(\n state.depDependents.filter((t) => !isTerminalStatus(t.status)).map((t) => t.id),\n )\n }\n isSelectedBlocked={state.depBlockers.some((t) => !isTerminalStatus(t.status))}\n isFocused={state.focusedPanel === 'list'}\n epicFilterActive={state.selectedEpicIds.size > 0}\n />\n </Box>\n <Box width={taskDetailWidth}>\n {previewTask ? (\n <TaskDetail\n task={previewTask}\n blockers={state.depBlockers}\n dependents={state.depDependents}\n related={state.depRelated}\n duplicates={state.depDuplicates}\n isFocused={state.focusedPanel === 'detail'}\n scrollOffset={state.detailScrollOffset}\n />\n ) : (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"bold\"\n borderColor={theme.border}\n >\n <Box>\n <Text color={theme.title} bold>\n {' '}\n detail\n </Text>\n </Box>\n <Box flexGrow={1} justifyContent=\"center\" alignItems=\"center\">\n <Text dimColor>No task selected</Text>\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.TaskDetail && state.selectedTask && (\n <TaskDetail\n task={state.selectedTask}\n blockers={state.depBlockers}\n dependents={state.depDependents}\n related={state.depRelated}\n duplicates={state.depDuplicates}\n scrollOffset={state.detailScrollOffset}\n />\n )}\n\n {!state.confirmDelete &&\n state.activeView === ViewType.DependencyList &&\n state.selectedTask && (\n <DependencyList\n task={state.selectedTask}\n blockers={state.depBlockers}\n dependents={state.depDependents}\n related={state.depRelated}\n duplicates={state.depDuplicates}\n selectedIndex={state.depSelectedIndex}\n isAddingDep={state.isAddingDep}\n addDepInput={state.addDepInput}\n />\n )}\n\n {!state.confirmDelete &&\n (state.activeView === ViewType.TaskCreate || state.activeView === ViewType.TaskEdit) && (\n <TaskForm\n editingTask={state.activeView === ViewType.TaskEdit ? state.selectedTask : null}\n allTasks={allProjectTasks}\n initialDeps={state.activeView === ViewType.TaskEdit ? initialDepsForEdit : undefined}\n onSave={handleFormSave}\n onCancel={handleFormCancel}\n />\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.EpicPicker && state.selectedTask && (\n <EpicPicker\n epics={state.epics}\n currentEpicId={state.selectedTask.parentId}\n onSelect={handleEpicPickerSelect}\n onCancel={handleEpicPickerCancel}\n />\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.ProjectSelector && (\n <ProjectSelector\n projects={state.projects}\n activeProject={state.activeProject}\n onSelect={handleProjectSelect}\n onCreate={handleProjectCreate}\n onSetDefault={handleSetDefault}\n onCancel={handleProjectCancel}\n />\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.ProjectCreate && (\n <ProjectForm onSave={handleProjectFormSave} onCancel={handleProjectFormCancel} />\n )}\n\n {!state.confirmDelete && state.activeView === ViewType.Help && <HelpOverlay />}\n </Box>\n\n {/* Breadcrumbs */}\n <Crumbs breadcrumbs={state.breadcrumbs} />\n\n {/* Flash message */}\n {state.flash && <FlashMessage message={state.flash.message} level={state.flash.level} />}\n </Box>\n );\n}\n","import type { Task } from '../types/task.js';\nimport type { Project } from '../types/project.js';\nimport type { TaskFilter } from '../types/task.js';\n\nexport const ViewType = {\n TaskList: 'task-list',\n TaskDetail: 'task-detail',\n TaskCreate: 'task-create',\n TaskEdit: 'task-edit',\n ProjectSelector: 'project-selector',\n ProjectCreate: 'project-create',\n DependencyList: 'dependency-list',\n EpicPicker: 'epic-picker',\n Help: 'help',\n} as const;\nexport type ViewType = (typeof ViewType)[keyof typeof ViewType];\n\nexport type FlashLevel = 'info' | 'warn' | 'error';\n\nexport type PanelFocus = 'epic' | 'list' | 'detail';\n\nexport interface AppState {\n activeView: ViewType;\n breadcrumbs: ViewType[];\n tasks: Task[];\n selectedIndex: number;\n selectedTask: Task | null;\n projects: Project[];\n activeProject: Project | null;\n filter: TaskFilter;\n searchQuery: string;\n isSearchActive: boolean;\n isReordering: boolean;\n reorderSnapshot: Task[] | null;\n flash: { message: string; level: FlashLevel } | null;\n confirmDelete: Task | null;\n formData: Partial<FormData> | null;\n depBlockers: Task[];\n depDependents: Task[];\n depRelated: Task[];\n depDuplicates: Task[];\n depSelectedIndex: number;\n isAddingDep: boolean;\n addDepInput: string;\n focusedPanel: PanelFocus;\n /** All epics in the active project (level 1 tasks). */\n epics: Task[];\n /** Cursor position in the epic panel. */\n epicSelectedIndex: number;\n /** IDs of selected epics for filtering. Empty = show all. */\n selectedEpicIds: Set<string>;\n /** Scroll offset for detail panel (lines from top). */\n detailScrollOffset: number;\n /** True when reordering epics. */\n isEpicReordering: boolean;\n /** Snapshot of epics before reorder started (for cancel/revert). */\n epicReorderSnapshot: Task[] | null;\n}\n\nexport interface FormData {\n name: string;\n description: string;\n type: string;\n status: string;\n technicalNotes: string;\n additionalRequirements: string;\n}\n\nexport type Action =\n | { type: 'NAVIGATE_TO'; view: ViewType }\n | { type: 'GO_BACK' }\n | { type: 'SET_TASKS'; tasks: Task[] }\n | { type: 'SET_PROJECTS'; projects: Project[] }\n | { type: 'SET_ACTIVE_PROJECT'; project: Project | null }\n | { type: 'SET_FILTER'; filter: Partial<TaskFilter> }\n | { type: 'CLEAR_FILTER' }\n | { type: 'SET_SEARCH_ACTIVE'; active: boolean }\n | { type: 'SET_SEARCH_QUERY'; query: string }\n | { type: 'FLASH'; message: string; level: FlashLevel }\n | { type: 'CLEAR_FLASH' }\n | { type: 'CONFIRM_DELETE'; task: Task }\n | { type: 'CANCEL_DELETE' }\n | { type: 'MOVE_CURSOR'; direction: 'up' | 'down' }\n | { type: 'PAGE_CURSOR'; direction: 'up' | 'down' }\n | { type: 'SET_CURSOR'; index: number }\n | { type: 'SELECT_TASK'; task: Task }\n | { type: 'SET_FORM_DATA'; data: Partial<FormData> | null }\n | { type: 'ENTER_REORDER' }\n | { type: 'REORDER_MOVE'; direction: 'up' | 'down' }\n | { type: 'EXIT_REORDER'; save: boolean }\n | { type: 'SET_DEPS'; blockers: Task[]; dependents: Task[]; related: Task[]; duplicates: Task[] }\n | { type: 'DEP_MOVE_CURSOR'; direction: 'up' | 'down' }\n | { type: 'SET_ADDING_DEP'; active: boolean }\n | { type: 'SET_ADD_DEP_INPUT'; input: string }\n | { type: 'SET_PANEL_FOCUS'; panel: PanelFocus }\n | { type: 'SET_EPICS'; epics: Task[] }\n | { type: 'EPIC_MOVE_CURSOR'; direction: 'up' | 'down' }\n | { type: 'TOGGLE_EPIC'; epicId: string }\n | { type: 'CLEAR_EPIC_SELECTION' }\n | { type: 'DETAIL_SCROLL'; direction: 'up' | 'down' }\n | { type: 'DETAIL_RESET_SCROLL' }\n | { type: 'ENTER_EPIC_REORDER' }\n | { type: 'EPIC_REORDER_MOVE'; direction: 'up' | 'down' }\n | { type: 'EXIT_EPIC_REORDER'; save: boolean };\n","// k9s-inspired color theme\nexport const theme = {\n // Body\n fg: '#1E90FF', // dodgerblue\n bg: 'black',\n logo: '#FFA500', // orange\n\n // Table\n table: {\n fg: '#00FFFF', // aqua\n cursorFg: 'black',\n cursorBg: '#00FFFF', // aqua\n headerFg: 'white',\n markColor: '#98FB98', // palegreen\n depHighlightBg: '#1A5276', // dark steel blue – non-terminal dep rows\n blockedCursorBg: '#C0392B', // strong red – selected row blocked by non-terminal dep\n },\n\n // Status colors (row-level)\n status: {\n new: '#87CEFA', // lightskyblue\n modified: '#ADFF2F', // greenyellow\n added: '#1E90FF', // dodgerblue\n error: '#FF4500', // orangered\n pending: '#FF8C00', // darkorange\n highlight: '#00FFFF', // aqua\n kill: '#9370DB', // mediumpurple\n completed: '#778899', // lightslategray\n },\n\n // Frame / borders\n border: '#1E90FF', // dodgerblue\n borderFocus: '#00FFFF', // aqua\n\n // Title\n title: '#00FFFF', // aqua\n titleHighlight: '#FF00FF', // fuchsia\n titleCounter: '#FFEFD5', // papayawhip\n titleFilter: '#2E8B57', // seagreen\n\n // Prompt\n prompt: '#5F9EA0', // cadetblue\n promptSuggest: '#1E90FF', // dodgerblue\n\n // Dialog\n dialog: {\n fg: '#1E90FF', // dodgerblue\n buttonFg: 'black',\n buttonBg: '#1E90FF',\n buttonFocusFg: 'white',\n buttonFocusBg: '#FF00FF', // fuchsia\n label: '#FF00FF', // fuchsia\n field: '#1E90FF',\n },\n\n // Detail/YAML\n yaml: {\n key: '#4682B4', // steelblue\n colon: 'white',\n value: '#FFEFD5', // papayawhip\n },\n\n // Crumbs\n crumb: {\n fg: 'black',\n bg: '#4682B4', // steelblue\n activeBg: '#FFA500', // orange\n },\n\n // Flash\n flash: {\n info: '#FFDEAD', // navajowhite\n warn: '#FFA500', // orange\n error: '#FF4500', // orangered\n },\n\n // Menu / key hints\n menu: {\n key: '#1E90FF', // dodgerblue\n numKey: '#FF00FF', // fuchsia\n desc: 'white',\n },\n} as const;\n","import { TaskStatus, TaskType, DependencyType, UIDependencyType } from '../types/enums.js';\nimport { theme } from './theme.js';\n\nexport const STATUS_VALUES = Object.values(TaskStatus);\nexport const TYPE_VALUES = Object.values(TaskType);\n\n/** Number of task rows visible per page in the task list. */\nexport const PAGE_SIZE = 20;\n\nexport const STATUS_COLOR: Record<string, string> = {\n [TaskStatus.Backlog]: theme.status.completed,\n [TaskStatus.Todo]: theme.status.new,\n [TaskStatus.InProgress]: theme.status.pending,\n [TaskStatus.Review]: theme.status.modified,\n [TaskStatus.Done]: theme.status.added,\n [TaskStatus.Cancelled]: theme.status.kill,\n};\n\nexport const TYPE_COLOR: Record<string, string> = {\n [TaskType.Epic]: theme.status.modified,\n [TaskType.Story]: theme.status.highlight,\n [TaskType.TechDebt]: theme.status.pending,\n [TaskType.Bug]: theme.status.error,\n};\n\nexport const DEP_TYPE_LABEL: Record<string, string> = {\n [DependencyType.Blocks]: 'blocks',\n [DependencyType.RelatesTo]: 'relates-to',\n [DependencyType.Duplicates]: 'duplicates',\n [UIDependencyType.BlockedBy]: 'blocked-by',\n};\n","import { ViewType } from './types.js';\nimport type { AppState, Action } from './types.js';\nimport { PAGE_SIZE } from './constants.js';\n\nexport const initialState: AppState = {\n activeView: ViewType.TaskList,\n breadcrumbs: [ViewType.TaskList],\n tasks: [],\n selectedIndex: 0,\n selectedTask: null,\n projects: [],\n activeProject: null,\n filter: {},\n searchQuery: '',\n isSearchActive: false,\n isReordering: false,\n reorderSnapshot: null,\n flash: null,\n confirmDelete: null,\n formData: null,\n depBlockers: [],\n depDependents: [],\n depRelated: [],\n depDuplicates: [],\n depSelectedIndex: 0,\n isAddingDep: false,\n addDepInput: '',\n focusedPanel: 'list',\n detailScrollOffset: 0,\n epics: [],\n epicSelectedIndex: 0,\n selectedEpicIds: new Set(),\n isEpicReordering: false,\n epicReorderSnapshot: null,\n};\n\nexport function appReducer(state: AppState, action: Action): AppState {\n switch (action.type) {\n case 'NAVIGATE_TO':\n return {\n ...state,\n breadcrumbs: [...state.breadcrumbs, action.view],\n activeView: action.view,\n confirmDelete: null,\n focusedPanel: 'list',\n };\n\n case 'GO_BACK': {\n const crumbs =\n state.breadcrumbs.length > 1 ? state.breadcrumbs.slice(0, -1) : [ViewType.TaskList];\n return {\n ...state,\n activeView: crumbs[crumbs.length - 1] ?? ViewType.TaskList,\n breadcrumbs: crumbs,\n confirmDelete: null,\n isSearchActive: false,\n formData: null,\n focusedPanel: 'list',\n };\n }\n\n case 'SET_TASKS':\n return {\n ...state,\n tasks: action.tasks,\n selectedIndex: Math.min(state.selectedIndex, Math.max(0, action.tasks.length - 1)),\n };\n\n case 'SET_PROJECTS':\n return { ...state, projects: action.projects };\n\n case 'SET_ACTIVE_PROJECT':\n return { ...state, activeProject: action.project };\n\n case 'SET_FILTER':\n return {\n ...state,\n filter: { ...state.filter, ...action.filter },\n selectedIndex: 0,\n };\n\n case 'CLEAR_FILTER':\n return { ...state, filter: {}, selectedIndex: 0, searchQuery: '' };\n\n case 'SET_SEARCH_ACTIVE':\n return { ...state, isSearchActive: action.active };\n\n case 'SET_SEARCH_QUERY':\n return { ...state, searchQuery: action.query };\n\n case 'FLASH':\n return {\n ...state,\n flash: { message: action.message, level: action.level },\n };\n\n case 'CLEAR_FLASH':\n return { ...state, flash: null };\n\n case 'CONFIRM_DELETE':\n return { ...state, confirmDelete: action.task };\n\n case 'CANCEL_DELETE':\n return { ...state, confirmDelete: null };\n\n case 'MOVE_CURSOR': {\n const maxIndex = Math.max(0, state.tasks.length - 1);\n const newIndex =\n action.direction === 'up'\n ? Math.max(0, state.selectedIndex - 1)\n : Math.min(maxIndex, state.selectedIndex + 1);\n return { ...state, selectedIndex: newIndex, detailScrollOffset: 0 };\n }\n\n case 'PAGE_CURSOR': {\n const maxIndex = Math.max(0, state.tasks.length - 1);\n const newIndex =\n action.direction === 'up'\n ? Math.max(0, state.selectedIndex - PAGE_SIZE)\n : Math.min(maxIndex, state.selectedIndex + PAGE_SIZE);\n return { ...state, selectedIndex: newIndex, detailScrollOffset: 0 };\n }\n\n case 'SET_CURSOR': {\n const maxIndex = Math.max(0, state.tasks.length - 1);\n return { ...state, selectedIndex: Math.max(0, Math.min(action.index, maxIndex)) };\n }\n\n case 'SELECT_TASK':\n return { ...state, selectedTask: action.task, detailScrollOffset: 0 };\n\n case 'SET_FORM_DATA':\n return { ...state, formData: action.data };\n\n case 'ENTER_REORDER':\n return {\n ...state,\n isReordering: true,\n reorderSnapshot: [...state.tasks],\n };\n\n case 'REORDER_MOVE': {\n if (!state.isReordering) return state;\n const idx = state.selectedIndex;\n const tasks = [...state.tasks];\n const swapIdx = action.direction === 'up' ? idx - 1 : idx + 1;\n if (swapIdx < 0 || swapIdx >= tasks.length) return state;\n\n // Swap tasks in the local array\n const current = tasks[idx];\n const swap = tasks[swapIdx];\n if (!current || !swap) return state;\n tasks[idx] = swap;\n tasks[swapIdx] = current;\n\n return {\n ...state,\n tasks,\n selectedIndex: swapIdx,\n };\n }\n\n case 'EXIT_REORDER': {\n if (!action.save && state.reorderSnapshot) {\n // Revert to snapshot\n return {\n ...state,\n isReordering: false,\n tasks: state.reorderSnapshot,\n reorderSnapshot: null,\n };\n }\n return {\n ...state,\n isReordering: false,\n reorderSnapshot: null,\n };\n }\n\n case 'SET_DEPS':\n return {\n ...state,\n depBlockers: action.blockers,\n depDependents: action.dependents,\n depRelated: action.related,\n depDuplicates: action.duplicates,\n depSelectedIndex: 0,\n };\n\n case 'DEP_MOVE_CURSOR': {\n const total =\n state.depBlockers.length +\n state.depDependents.length +\n state.depRelated.length +\n state.depDuplicates.length;\n if (total === 0) return state;\n const maxIdx = Math.max(0, total - 1);\n const newIdx =\n action.direction === 'up'\n ? Math.max(0, state.depSelectedIndex - 1)\n : Math.min(maxIdx, state.depSelectedIndex + 1);\n return { ...state, depSelectedIndex: newIdx };\n }\n\n case 'SET_ADDING_DEP':\n return { ...state, isAddingDep: action.active, addDepInput: '' };\n\n case 'SET_ADD_DEP_INPUT':\n return { ...state, addDepInput: action.input };\n\n case 'SET_PANEL_FOCUS':\n return { ...state, focusedPanel: action.panel };\n\n case 'DETAIL_SCROLL':\n return {\n ...state,\n detailScrollOffset:\n action.direction === 'up'\n ? Math.max(0, state.detailScrollOffset - 1)\n : state.detailScrollOffset + 1,\n };\n\n case 'DETAIL_RESET_SCROLL':\n return { ...state, detailScrollOffset: 0 };\n\n case 'SET_EPICS':\n return {\n ...state,\n epics: action.epics,\n epicSelectedIndex: Math.min(state.epicSelectedIndex, Math.max(0, action.epics.length - 1)),\n };\n\n case 'EPIC_MOVE_CURSOR': {\n if (state.epics.length === 0) return state;\n const maxIdx = Math.max(0, state.epics.length - 1);\n const newIdx =\n action.direction === 'up'\n ? Math.max(0, state.epicSelectedIndex - 1)\n : Math.min(maxIdx, state.epicSelectedIndex + 1);\n return { ...state, epicSelectedIndex: newIdx };\n }\n\n case 'TOGGLE_EPIC': {\n const next = new Set(state.selectedEpicIds);\n if (next.has(action.epicId)) {\n next.delete(action.epicId);\n } else {\n next.add(action.epicId);\n }\n return { ...state, selectedEpicIds: next, selectedIndex: 0 };\n }\n\n case 'CLEAR_EPIC_SELECTION':\n return { ...state, selectedEpicIds: new Set(), selectedIndex: 0 };\n\n case 'ENTER_EPIC_REORDER':\n return {\n ...state,\n isEpicReordering: true,\n epicReorderSnapshot: [...state.epics],\n };\n\n case 'EPIC_REORDER_MOVE': {\n if (!state.isEpicReordering) return state;\n const idx = state.epicSelectedIndex;\n const epics = [...state.epics];\n const swapIdx = action.direction === 'up' ? idx - 1 : idx + 1;\n if (swapIdx < 0 || swapIdx >= epics.length) return state;\n\n const current = epics[idx];\n const swap = epics[swapIdx];\n if (!current || !swap) return state;\n epics[idx] = swap;\n epics[swapIdx] = current;\n\n return {\n ...state,\n epics,\n epicSelectedIndex: swapIdx,\n };\n }\n\n case 'EXIT_EPIC_REORDER': {\n if (!action.save && state.epicReorderSnapshot) {\n return {\n ...state,\n isEpicReordering: false,\n epics: state.epicReorderSnapshot,\n epicReorderSnapshot: null,\n };\n }\n return {\n ...state,\n isEpicReordering: false,\n epicReorderSnapshot: null,\n };\n }\n }\n}\n","import { Box, Text } from 'ink';\nimport type { AppState } from '../types.js';\nimport { theme } from '../theme.js';\n\ninterface KeyHint {\n key: string;\n desc: string;\n}\n\nfunction getKeyHints(view: string, isSearchActive: boolean, focusedPanel: string): KeyHint[] {\n if (isSearchActive) {\n return [\n { key: 'enter', desc: 'apply' },\n { key: 'esc', desc: 'cancel' },\n ];\n }\n if (view === 'task-list' && focusedPanel === 'epic') {\n return [\n { key: 'j/k', desc: 'nav' },\n { key: 'space', desc: 'toggle' },\n { key: '←', desc: 'reorder' },\n { key: '0', desc: 'clear' },\n { key: 'tab', desc: 'tasks' },\n { key: '?', desc: 'help' },\n { key: 'q', desc: 'quit' },\n ];\n }\n if (view === 'task-list') {\n return [\n { key: 'enter', desc: 'view' },\n { key: 'c', desc: 'create' },\n { key: 'e', desc: 'edit' },\n { key: 'd', desc: 'del' },\n { key: 's', desc: 'status' },\n { key: 'a', desc: 'assign' },\n { key: 'A', desc: 'unassign' },\n { key: '←', desc: 'reorder' },\n { key: '/', desc: 'search' },\n { key: 'p', desc: 'project' },\n { key: 'f', desc: 'status-f' },\n { key: 't', desc: 'type-f' },\n { key: 'PgDn/Up', desc: 'page' },\n { key: 'tab', desc: 'panel' },\n { key: '?', desc: 'help' },\n { key: 'q', desc: 'quit' },\n ];\n }\n if (view === 'task-detail') {\n return [\n { key: 'e', desc: 'edit' },\n { key: 's', desc: 'status' },\n { key: 'd', desc: 'del' },\n { key: 'm', desc: 'mermaid' },\n { key: 'esc', desc: 'back' },\n { key: '?', desc: 'help' },\n { key: 'q', desc: 'quit' },\n ];\n }\n return [\n { key: 'esc', desc: 'back' },\n { key: '?', desc: 'help' },\n { key: 'q', desc: 'quit' },\n ];\n}\n\ninterface Props {\n state: AppState;\n}\n\nexport function Header({ state }: Props) {\n const projectName = state.activeProject?.name ?? 'none';\n const taskCount = state.tasks.length;\n const hints = getKeyHints(state.activeView, state.isSearchActive, state.focusedPanel);\n\n return (\n <Box flexDirection=\"column\">\n <Box gap={2}>\n <Text color={theme.logo} bold>\n Tayto\n </Text>\n <Text color={theme.logo}>Project:</Text>\n <Text color=\"white\" bold>\n {projectName}\n </Text>\n <Text dimColor>|</Text>\n <Text color={theme.logo}>Tasks:</Text>\n <Text color=\"white\" bold>\n {taskCount}\n </Text>\n </Box>\n <Box flexDirection=\"row\" flexWrap=\"wrap\" columnGap={1}>\n {hints.map((h) => (\n <Box key={h.key}>\n <Text color={theme.menu.key} bold>\n <{h.key}>\n </Text>\n <Text dimColor>{h.desc}</Text>\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { ViewType } from '../types.js';\nimport { theme } from '../theme.js';\n\nconst VIEW_LABELS: Record<string, string> = {\n 'task-list': 'tasks',\n 'task-detail': 'detail',\n 'task-create': 'create',\n 'task-edit': 'edit',\n 'project-selector': 'projects',\n help: 'help',\n};\n\ninterface Props {\n breadcrumbs: ViewType[];\n}\n\nexport function Crumbs({ breadcrumbs }: Props) {\n return (\n <Box flexDirection=\"row\" gap={0} width=\"100%\">\n {breadcrumbs.map((crumb, i) => {\n const isActive = i === breadcrumbs.length - 1;\n const label = ` ${VIEW_LABELS[crumb] ?? crumb} `;\n return (\n <Text\n key={`${crumb}-${i}`}\n color={theme.crumb.fg}\n backgroundColor={isActive ? theme.crumb.activeBg : theme.crumb.bg}\n bold={isActive}\n >\n {label}\n </Text>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { FlashLevel } from '../types.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n message: string;\n level: FlashLevel;\n}\n\nconst LEVEL_COLOR: Record<FlashLevel, string> = {\n info: theme.flash.info,\n warn: theme.flash.warn,\n error: theme.flash.error,\n};\n\nexport function FlashMessage({ message, level }: Props) {\n return (\n <Box justifyContent=\"center\" width=\"100%\">\n <Text color={LEVEL_COLOR[level]} bold={level === 'error'}>\n {message}\n </Text>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_COLOR, TYPE_COLOR } from '../constants.js';\nimport type { TaskFilter } from '../../types/task.js';\nimport { PAGE_SIZE } from '../constants.js';\n\ninterface Props {\n tasks: Task[];\n selectedIndex: number;\n searchQuery: string;\n isSearchActive: boolean;\n isReordering: boolean;\n filter: TaskFilter;\n activeProjectName: string;\n /** IDs of non-terminal tasks that block the selected task */\n nonTerminalBlockerIds: Set<string>;\n /** IDs of non-terminal tasks that depend on the selected task */\n nonTerminalDependentIds: Set<string>;\n /** True when the selected task has at least one non-terminal blocker */\n isSelectedBlocked: boolean;\n isFocused?: boolean;\n /** True when an epic filter is active (shown in title bar). */\n epicFilterActive?: boolean;\n}\n\n// Fixed column widths\nconst COL = {\n rank: 5,\n type: 12,\n status: 14,\n};\n\nexport function TaskList({\n tasks,\n selectedIndex,\n searchQuery,\n isSearchActive,\n isReordering,\n filter,\n activeProjectName,\n nonTerminalBlockerIds,\n nonTerminalDependentIds,\n isSelectedBlocked,\n isFocused = true,\n epicFilterActive = false,\n}: Props) {\n const currentPage = Math.floor(selectedIndex / PAGE_SIZE);\n const viewStart = currentPage * PAGE_SIZE;\n\n const visibleTasks = tasks.slice(viewStart, viewStart + PAGE_SIZE);\n\n // Title bar filters\n const filterParts: string[] = [];\n if (filter.status) filterParts.push(`status:${filter.status}`);\n if (filter.type) filterParts.push(`type:${filter.type}`);\n if (filter.search) filterParts.push(filter.search);\n const filterText = filterParts.length > 0 ? filterParts.join(' ') : '';\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"bold\"\n borderColor={isFocused ? theme.borderFocus : theme.border}\n >\n {/* Title bar */}\n <Box>\n <Text color={theme.title} bold>\n {' '}\n tasks\n </Text>\n <Text color={theme.fg}>(</Text>\n <Text color={theme.titleHighlight} bold>\n {activeProjectName}\n </Text>\n <Text color={theme.fg}>)</Text>\n <Text color={theme.titleCounter} bold>\n [{tasks.length}]\n </Text>\n {isReordering && (\n <Text color={theme.flash.warn} bold>\n {' '}\n REORDER\n </Text>\n )}\n {epicFilterActive && <Text color={theme.titleHighlight}> [epic]</Text>}\n {filterText && <Text color={theme.titleFilter}> /{filterText}</Text>}\n </Box>\n\n {/* Search prompt */}\n {isSearchActive && (\n <Box borderStyle=\"round\" borderColor={theme.prompt} paddingX={1}>\n <Text color={theme.prompt}>/</Text>\n <Text color={theme.prompt}>{searchQuery}</Text>\n <Text color={theme.promptSuggest}>_</Text>\n </Box>\n )}\n\n {/* Table header */}\n <Box>\n <Text color={theme.table.headerFg} bold>\n {' '}\n </Text>\n <Text color={theme.table.headerFg} bold>\n {'#'.padEnd(COL.rank)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n {'TYPE'.padEnd(COL.type)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n {'STATUS'.padEnd(COL.status)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n NAME\n </Text>\n </Box>\n\n {/* Task rows */}\n <Box flexDirection=\"column\" flexGrow={1} overflowY=\"hidden\">\n {tasks.length === 0 ? (\n <Box paddingX={2} paddingY={1}>\n <Text color={theme.fg}>No tasks found. Press 'c' to create one.</Text>\n </Box>\n ) : (\n visibleTasks.map((task, i) => {\n const actualIndex = viewStart + i;\n const isSelected = actualIndex === selectedIndex;\n const isNonTerminalBlocker = nonTerminalBlockerIds.has(task.id);\n const isNonTerminalDependent = nonTerminalDependentIds.has(task.id);\n const rowColor = STATUS_COLOR[task.status] ?? theme.table.fg;\n const rowNum = `${actualIndex + 1}`;\n\n // Dep marker: ▲ = non-terminal blocker, ▼ = non-terminal dependent\n const depMarker = isNonTerminalBlocker ? '▲ ' : isNonTerminalDependent ? '▼ ' : ' ';\n\n if (isSelected) {\n // Blue if able to transition, red if blocked by a non-terminal task\n const cursorBg = isReordering\n ? theme.flash.warn\n : isSelectedBlocked\n ? theme.table.blockedCursorBg\n : theme.table.cursorBg;\n return (\n <Box key={task.id}>\n <Text backgroundColor={cursorBg} color={theme.table.cursorFg} bold>\n {isReordering ? '~ ' : '> '}\n {rowNum.padEnd(COL.rank)}\n {task.type.padEnd(COL.type)}\n {task.status.padEnd(COL.status)}\n {task.name}\n </Text>\n </Box>\n );\n }\n\n if (isNonTerminalBlocker || isNonTerminalDependent) {\n // Lighter blue background for non-terminal related tasks; rank order\n // implicitly conveys direction (higher rank = blocker, lower = dependent).\n return (\n <Box key={task.id}>\n <Text backgroundColor={theme.table.depHighlightBg} color={theme.table.fg} bold>\n {depMarker}\n {rowNum.padEnd(COL.rank)}\n {task.type.padEnd(COL.type)}\n {task.status.padEnd(COL.status)}\n {task.name}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={task.id}>\n <Text>{' '}</Text>\n <Text dimColor>{rowNum.padEnd(COL.rank)}</Text>\n <Text color={TYPE_COLOR[task.type] ?? rowColor}>{task.type.padEnd(COL.type)}</Text>\n <Text color={STATUS_COLOR[task.status] ?? rowColor}>\n {task.status.padEnd(COL.status)}\n </Text>\n <Text color={rowColor}>{task.name}</Text>\n </Box>\n );\n })\n )}\n </Box>\n\n {/* Page indicator */}\n {tasks.length > PAGE_SIZE && (\n <Box justifyContent=\"flex-end\" paddingRight={1}>\n <Text dimColor>\n [{viewStart + 1}-{Math.min(viewStart + PAGE_SIZE, tasks.length)}/{tasks.length}]\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { useMemo } from 'react';\nimport { Box, Text, useStdout } from 'ink';\nimport chalk from 'chalk';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { renderMarkdown, MermaidHint } from './Markdown.js';\n\ninterface Props {\n task: Task;\n blockers?: Task[];\n dependents?: Task[];\n related?: Task[];\n duplicates?: Task[];\n isFocused?: boolean;\n scrollOffset?: number;\n}\n\nconst PAD = ' ';\n\nfunction field(label: string, value: string): string {\n return (\n PAD +\n chalk.hex(theme.yaml.key).bold(label) +\n chalk.hex(theme.yaml.colon)(': ') +\n chalk.hex(theme.yaml.value)(value)\n );\n}\n\nfunction sectionHeader(title: string): string {\n return PAD + chalk.hex(theme.title).bold(`--- ${title} ---`);\n}\n\nfunction markdownLines(content: string): string[] {\n const rendered = renderMarkdown(content);\n if (!rendered) return [];\n return rendered.split('\\n').map((line) => PAD + line);\n}\n\n/** Build the full detail content as an array of pre-formatted text lines. */\nfunction buildContentLines(\n task: Task,\n blockers: Task[],\n dependents: Task[],\n related: Task[],\n duplicates: Task[],\n): string[] {\n const lines: string[] = [];\n\n // Metadata\n lines.push(field('id', task.id));\n lines.push(field('type', task.type));\n lines.push(field('status', task.status));\n lines.push(field('created', new Date(task.createdAt).toLocaleString()));\n lines.push(field('updated', new Date(task.updatedAt).toLocaleString()));\n if (task.parentId) lines.push(field('parent', task.parentId));\n\n // Dependencies\n const hasDeps =\n blockers.length > 0 || dependents.length > 0 || related.length > 0 || duplicates.length > 0;\n if (hasDeps) {\n lines.push(sectionHeader('dependencies'));\n if (blockers.length > 0) {\n lines.push(\n PAD +\n chalk.hex(theme.status.error).bold('blocked by: ') +\n chalk.hex(theme.yaml.value)(blockers.map((t) => t.id).join(', ')),\n );\n }\n if (dependents.length > 0) {\n lines.push(\n PAD +\n chalk.hex(theme.status.added).bold('blocks: ') +\n chalk.hex(theme.yaml.value)(dependents.map((t) => t.id).join(', ')),\n );\n }\n if (related.length > 0) {\n lines.push(\n PAD +\n chalk.hex(theme.status.new).bold('relates to: ') +\n chalk.hex(theme.yaml.value)(related.map((t) => t.id).join(', ')),\n );\n }\n if (duplicates.length > 0) {\n lines.push(\n PAD +\n chalk.hex(theme.status.pending).bold('duplicates: ') +\n chalk.hex(theme.yaml.value)(duplicates.map((t) => t.id).join(', ')),\n );\n }\n lines.push(PAD + chalk.dim('press D to manage dependencies'));\n }\n\n // Description\n lines.push(sectionHeader('description'));\n if (task.description.trim()) {\n lines.push(...markdownLines(task.description));\n } else {\n lines.push(PAD + chalk.dim('No description'));\n }\n\n // Technical Notes\n if (task.technicalNotes.trim()) {\n lines.push(sectionHeader('technical notes'));\n lines.push(...markdownLines(task.technicalNotes));\n }\n\n // Additional Requirements\n if (task.additionalRequirements.trim()) {\n lines.push(sectionHeader('requirements'));\n lines.push(...markdownLines(task.additionalRequirements));\n }\n\n return lines;\n}\n\n/** Lines reserved outside the scrollable area (header, crumbs, borders, title, mermaid). */\nconst CHROME_LINES = 8;\n\nexport function TaskDetail({\n task,\n blockers = [],\n dependents = [],\n related = [],\n duplicates = [],\n isFocused = true,\n scrollOffset = 0,\n}: Props) {\n const { stdout } = useStdout();\n const allText = `${task.description}\\n${task.technicalNotes}\\n${task.additionalRequirements}`;\n\n const contentLines = useMemo(\n () => buildContentLines(task, blockers, dependents, related, duplicates),\n [task, blockers, dependents, related, duplicates],\n );\n\n const viewportHeight = Math.max(1, (stdout.rows > 0 ? stdout.rows : 24) - CHROME_LINES);\n const visibleLines = contentLines.slice(scrollOffset, scrollOffset + viewportHeight);\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"bold\"\n borderColor={isFocused ? theme.borderFocus : theme.border}\n >\n {/* Title bar */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n detail\n </Text>\n <Text color={theme.fg}>(</Text>\n <Text color={theme.titleHighlight} bold>\n {task.name}\n </Text>\n <Text color={theme.fg}>)</Text>\n {scrollOffset > 0 && <Text dimColor> ↑{scrollOffset}</Text>}\n </Box>\n\n {/* Scrollable content - pre-rendered text lines */}\n <Text>{visibleLines.join('\\n')}</Text>\n\n <Box flexGrow={1} />\n\n {/* Mermaid diagram hint */}\n <Box paddingX={1}>\n <MermaidHint content={allText} />\n </Box>\n </Box>\n );\n}\n","import { Text, Box } from 'ink';\nimport { Marked, type Token, type Tokens } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\nimport chalk from 'chalk';\nimport { theme } from '../theme.js';\nimport { openMermaidInBrowser } from '../mermaid.js';\n\n/** Extract mermaid code blocks from markdown content using the lexer (pure, no side effects). */\nexport function extractMermaidBlocks(content: string): string[] {\n const lexer = new Marked();\n const tokens = lexer.lexer(content);\n const blocks: string[] = [];\n\n function walk(items: Token[]): void {\n for (const token of items) {\n if (token.type === 'code' && (token as Tokens.Code).lang === 'mermaid') {\n blocks.push((token as Tokens.Code).text);\n }\n if ('tokens' in token && Array.isArray(token.tokens)) {\n walk(token.tokens);\n }\n }\n }\n\n walk(tokens);\n return blocks;\n}\n\nfunction createRenderer(): Marked {\n const mermaidExtension = {\n renderer: {\n code(token: Tokens.Code): string | false {\n if (token.lang !== 'mermaid') return false;\n\n const lines = token.text.split('\\n');\n const preview = lines.slice(0, 6);\n const maxLen = Math.max(...preview.map((l) => l.length), 30);\n const border = '─'.repeat(maxLen + 2);\n\n const framed = preview\n .map((l) => ` ${chalk.dim('│')} ${chalk.hex(theme.table.fg)(l)}`)\n .join('\\n');\n const truncated =\n lines.length > 6\n ? `\\n ${chalk.dim('│')} ${chalk.dim(`... ${lines.length - 6} more lines`)}`\n : '';\n\n return [\n '',\n ` ${chalk.hex(theme.title).bold('┌ Mermaid Diagram')} ${chalk.hex(theme.menu.key)('[press m to open in browser]')}`,\n ` ${chalk.dim(border)}`,\n framed,\n truncated,\n ` ${chalk.dim(border)}`,\n '',\n ].join('\\n');\n },\n },\n };\n\n const terminalExt = markedTerminal as unknown as (\n opts: Record<string, unknown>,\n ) => Parameters<Marked['use']>[0];\n\n return new Marked(\n terminalExt({\n showSectionPrefix: false,\n reflowText: true,\n tab: 2,\n }),\n mermaidExtension,\n );\n}\n\nconst marked = createRenderer();\n\n/** Render markdown to an ANSI-styled string (for pre-formatted text output). */\nexport function renderMarkdown(content: string): string {\n if (!content.trim()) return '';\n const rendered = marked.parse(content);\n return typeof rendered === 'string' ? rendered.trimEnd() : content;\n}\n\ninterface Props {\n content: string;\n}\n\nexport function Markdown({ content }: Props) {\n if (!content.trim()) {\n return <Text dimColor>No content</Text>;\n }\n\n const rendered = marked.parse(content);\n if (typeof rendered !== 'string') {\n return <Text>{content}</Text>;\n }\n\n return <Text>{rendered.trimEnd()}</Text>;\n}\n\ninterface MermaidProps {\n content: string;\n}\n\nexport function MermaidHint({ content }: MermaidProps) {\n const blocks = extractMermaidBlocks(content);\n if (blocks.length === 0) return null;\n\n return (\n <Box>\n <Text color={theme.menu.key} bold>\n {'<m>'}{' '}\n </Text>\n <Text dimColor>\n Open {blocks.length} mermaid diagram{blocks.length > 1 ? 's' : ''} in browser\n </Text>\n </Box>\n );\n}\n\nexport function openAllMermaidDiagrams(content: string): number {\n const blocks = extractMermaidBlocks(content);\n for (const block of blocks) {\n openMermaidInBrowser(block);\n }\n return blocks.length;\n}\n","import { writeFileSync, mkdtempSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { exec } from 'node:child_process';\n\nexport function openMermaidInBrowser(code: string): void {\n const dir = mkdtempSync(join(tmpdir(), 'task-mermaid-'));\n const filepath = join(dir, 'diagram.html');\n\n const html = `<!DOCTYPE html>\n<html><head>\n<meta charset=\"utf-8\">\n<title>Mermaid Diagram</title>\n<style>\n body { background: #1a1a2e; display: flex; justify-content: center; padding: 2rem; }\n .mermaid { background: #16213e; padding: 2rem; border-radius: 8px; }\n</style>\n</head><body>\n<pre class=\"mermaid\">\n${code.replace(/</g, '<').replace(/>/g, '>')}\n</pre>\n<script type=\"module\">\nimport mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';\nmermaid.initialize({ startOnLoad: true, theme: 'dark' });\n</script>\n</body></html>`;\n\n writeFileSync(filepath, html, 'utf-8');\n\n // Open in default browser (cross-platform)\n const cmd =\n process.platform === 'darwin'\n ? `open \"${filepath}\"`\n : process.platform === 'win32'\n ? `start \"\" \"${filepath}\"`\n : `xdg-open \"${filepath}\"`;\n\n exec(cmd);\n}\n","import { useState, useCallback } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TaskStatus, TaskType } from '../../types/enums.js';\nimport type { Task } from '../../types/task.js';\nimport type { DependencyEntry } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_VALUES, TYPE_VALUES, DEP_TYPE_LABEL } from '../constants.js';\nimport { openInEditor } from '../editor.js';\nimport { TaskPicker } from './TaskPicker.js';\nimport type { PickedDependency } from './TaskPicker.js';\n\ninterface Props {\n editingTask: Task | null;\n /** All project tasks, used by the dependency picker */\n allTasks: Task[];\n /** Pre-populated dependencies when editing an existing task */\n initialDeps?: PickedDependency[];\n onSave: (data: {\n name: string;\n description: string;\n type: string;\n status: string;\n technicalNotes: string;\n additionalRequirements: string;\n dependsOn?: DependencyEntry[];\n }) => void;\n onCancel: () => void;\n}\n\ntype FieldType = 'inline' | 'select' | 'editor' | 'picker';\n\ninterface Field {\n label: string;\n key: string;\n type: FieldType;\n options?: string[];\n editorFilename?: string;\n}\n\nconst FIELDS: Field[] = [\n { label: 'Name', key: 'name', type: 'inline' },\n { label: 'Type', key: 'type', type: 'select', options: TYPE_VALUES },\n { label: 'Status', key: 'status', type: 'select', options: STATUS_VALUES },\n { label: 'Depends On', key: 'dependsOn', type: 'picker' },\n { label: 'Description', key: 'description', type: 'editor', editorFilename: 'description.md' },\n {\n label: 'Tech Notes',\n key: 'technicalNotes',\n type: 'editor',\n editorFilename: 'technical-notes.md',\n },\n {\n label: 'Requirements',\n key: 'additionalRequirements',\n type: 'editor',\n editorFilename: 'requirements.md',\n },\n];\n\nexport function TaskForm({ editingTask, allTasks, initialDeps, onSave, onCancel }: Props) {\n const [focusIndex, setFocusIndex] = useState(0);\n const [values, setValues] = useState<Record<string, string>>({\n name: editingTask?.name ?? '',\n type: editingTask?.type ?? TaskType.Story,\n status: editingTask?.status ?? TaskStatus.Backlog,\n description: editingTask?.description ?? '',\n technicalNotes: editingTask?.technicalNotes ?? '',\n additionalRequirements: editingTask?.additionalRequirements ?? '',\n });\n const [editorActive, setEditorActive] = useState(false);\n const [pickerActive, setPickerActive] = useState(false);\n const [pickedDeps, setPickedDeps] = useState(initialDeps ?? []);\n\n const currentField = FIELDS[focusIndex];\n\n const launchEditor = useCallback(\n (field: Field) => {\n setEditorActive(true);\n setTimeout(() => {\n const content = values[field.key] ?? '';\n const result = openInEditor(content, field.editorFilename ?? `${field.key}.md`);\n if (result !== null) {\n setValues((v) => ({ ...v, [field.key]: result }));\n }\n setEditorActive(false);\n }, 50);\n },\n [values],\n );\n\n const handlePickerConfirm = useCallback((selected: PickedDependency[]) => {\n setPickedDeps(selected);\n setPickerActive(false);\n }, []);\n\n const handlePickerCancel = useCallback(() => {\n setPickerActive(false);\n }, []);\n\n useInput(\n (input, key) => {\n if (editorActive || pickerActive) return;\n\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (!currentField) return;\n\n if (key.tab) {\n if (key.shift) {\n setFocusIndex((i) => Math.max(0, i - 1));\n } else {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n }\n return;\n }\n\n if (input === 's' && key.ctrl) {\n const nameVal = values['name'];\n if (typeof nameVal === 'string' && nameVal.trim()) {\n onSave({\n name: nameVal,\n description: values['description'] ?? '',\n type: values['type'] ?? TaskType.Story,\n status: values['status'] ?? TaskStatus.Backlog,\n technicalNotes: values['technicalNotes'] ?? '',\n additionalRequirements: values['additionalRequirements'] ?? '',\n dependsOn: pickedDeps.map((d) => ({ id: d.id, type: d.type })),\n });\n }\n return;\n }\n\n if (currentField.type === 'inline') {\n const currentValue = values[currentField.key] ?? '';\n if (key.backspace || key.delete) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue.slice(0, -1) }));\n } else if (key.return) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (input && !key.ctrl && !key.meta) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue + input }));\n }\n }\n\n if (currentField.type === 'picker') {\n if (key.return) {\n setPickerActive(true);\n } else if (key.downArrow) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (key.upArrow) {\n setFocusIndex((i) => Math.max(0, i - 1));\n }\n }\n\n if (currentField.type === 'editor') {\n if (key.return) {\n launchEditor(currentField);\n } else if (key.downArrow) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (key.upArrow) {\n setFocusIndex((i) => Math.max(0, i - 1));\n }\n }\n\n if (currentField.type === 'select') {\n const options = currentField.options ?? [];\n const currentValue = values[currentField.key] ?? '';\n const currentIndex = options.indexOf(currentValue);\n if (key.rightArrow || key.return || input === ' ') {\n const nextIndex = (currentIndex + 1) % options.length;\n setValues((v) => ({ ...v, [currentField.key]: options[nextIndex] ?? '' }));\n } else if (key.leftArrow) {\n const prevIndex = (currentIndex - 1 + options.length) % options.length;\n setValues((v) => ({ ...v, [currentField.key]: options[prevIndex] ?? '' }));\n }\n }\n },\n { isActive: !editorActive && !pickerActive },\n );\n\n // When picker is open, render it instead of the form\n if (pickerActive) {\n const pickerExclude: { excludeIds?: Set<string> } = editingTask\n ? { excludeIds: new Set([editingTask.id]) }\n : {};\n return (\n <TaskPicker\n tasks={allTasks}\n {...pickerExclude}\n initialSelection={pickedDeps}\n onConfirm={handlePickerConfirm}\n onCancel={handlePickerCancel}\n />\n );\n }\n\n const isEdit = editingTask !== null;\n\n // Build dependency display summary\n const depSummary =\n pickedDeps.length > 0\n ? pickedDeps.map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`).join(', ')\n : '';\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n {isEdit ? 'edit' : 'create'}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={1} paddingY={0}>\n {FIELDS.map((field, i) => {\n const isFocused = i === focusIndex;\n const value = field.key === 'dependsOn' ? depSummary : (values[field.key] ?? '');\n const displayValue = value;\n\n return (\n <Box key={field.key} gap={1}>\n <Text color={isFocused ? theme.dialog.label : theme.yaml.key} bold={isFocused}>\n {isFocused ? '>' : ' '} {field.label.padEnd(14)}\n </Text>\n\n {field.type === 'inline' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {displayValue}\n {isFocused ? <Text color={theme.titleHighlight}>_</Text> : ''}\n </Text>\n )}\n\n {field.type === 'picker' && (\n <Text>\n {displayValue ? (\n <Text color={theme.status.added}>\n {displayValue.length > 60 ? displayValue.slice(0, 60) + '...' : displayValue}\n </Text>\n ) : (\n <Text dimColor>{isFocused ? 'press enter to select' : 'none'}</Text>\n )}\n {isFocused && <Text color={theme.menu.key}> [enter: open picker]</Text>}\n </Text>\n )}\n\n {field.type === 'editor' && (\n <Text>\n {displayValue ? (\n <Text color={theme.status.added}>\n {displayValue.split('\\n')[0]?.slice(0, 50)}\n {displayValue.length > 50 || displayValue.includes('\\n') ? '...' : ''}\n </Text>\n ) : (\n <Text dimColor>{isFocused ? 'press enter' : 'empty'}</Text>\n )}\n {isFocused && <Text color={theme.menu.key}> [enter: $EDITOR]</Text>}\n </Text>\n )}\n\n {field.type === 'select' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {isFocused ? '< ' : ' '}\n {displayValue}\n {isFocused ? ' >' : ''}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n <Box flexGrow={1} />\n\n <Box paddingX={1}>\n <Text dimColor>tab: next | shift+tab: prev | ctrl+s: save | esc: cancel</Text>\n </Box>\n {editorActive && (\n <Box paddingX={1}>\n <Text color={theme.flash.warn} bold>\n Editor open... save and close to return\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { writeFileSync, readFileSync, unlinkSync, mkdtempSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { spawnSync } from 'node:child_process';\n\nfunction getEditor(): string {\n return process.env['EDITOR'] ?? process.env['VISUAL'] ?? 'vi';\n}\n\nexport function openInEditor(content: string, filename: string): string | null {\n const dir = mkdtempSync(join(tmpdir(), 'task-'));\n const filepath = join(dir, filename);\n\n writeFileSync(filepath, content, 'utf-8');\n\n const editor = getEditor();\n const result = spawnSync(editor, [filepath], {\n stdio: 'inherit',\n shell: true,\n });\n\n if (result.status !== 0) {\n try {\n unlinkSync(filepath);\n } catch {\n // ignore cleanup errors\n }\n return null;\n }\n\n try {\n const edited = readFileSync(filepath, 'utf-8');\n unlinkSync(filepath);\n return edited;\n } catch {\n return null;\n }\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { DependencyType, UIDependencyType } from '../../types/enums.js';\nimport { theme } from '../theme.js';\nimport { DEP_TYPE_LABEL } from '../constants.js';\n\nconst DEP_TYPE_VALUES = Object.values(UIDependencyType);\n\nconst DEP_TYPE_COLOR: Record<string, string> = {\n [DependencyType.Blocks]: theme.status.error,\n [DependencyType.RelatesTo]: theme.status.new,\n [DependencyType.Duplicates]: theme.status.pending,\n [UIDependencyType.BlockedBy]: theme.status.modified,\n};\n\nexport interface PickedDependency {\n id: string;\n name: string;\n type: string;\n}\n\ninterface Props {\n tasks: Task[];\n /** Task IDs to exclude from the picker (e.g., the task being edited) */\n excludeIds?: Set<string>;\n initialSelection?: PickedDependency[];\n onConfirm: (selected: PickedDependency[]) => void;\n onCancel: () => void;\n}\n\nexport function TaskPicker({ tasks, excludeIds, initialSelection, onConfirm, onCancel }: Props) {\n const { stdout } = useStdout();\n const termHeight = stdout.rows > 0 ? stdout.rows : 24;\n const maxVisible = Math.max(3, termHeight - 12);\n\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [cursorIndex, setCursorIndex] = useState(0);\n const [selected, setSelected] = useState<Map<string, PickedDependency>>(() => {\n const map = new Map<string, PickedDependency>();\n if (initialSelection) {\n for (const dep of initialSelection) {\n map.set(dep.id, dep);\n }\n }\n return map;\n });\n\n // Filter tasks by search query and exclusions\n const available = tasks.filter((t) => {\n if (excludeIds?.has(t.id)) return false;\n if (!searchQuery.trim()) return true;\n const q = searchQuery.toLowerCase();\n return (\n t.id.toLowerCase().includes(q) ||\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q)\n );\n });\n\n // Scrolling window\n let viewStart = 0;\n if (cursorIndex >= viewStart + maxVisible) {\n viewStart = cursorIndex - maxVisible + 1;\n }\n if (cursorIndex < viewStart) {\n viewStart = cursorIndex;\n }\n const visible = available.slice(viewStart, viewStart + maxVisible);\n\n useInput((input, key) => {\n // Search mode\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n return;\n }\n if (key.return) {\n setIsSearching(false);\n setCursorIndex(0);\n return;\n }\n if (key.backspace || key.delete) {\n setSearchQuery((q) => q.slice(0, -1));\n setCursorIndex(0);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setSearchQuery((q) => q + input);\n setCursorIndex(0);\n return;\n }\n return;\n }\n\n // Navigation\n if (key.upArrow || input === 'k') {\n setCursorIndex((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow || input === 'j') {\n setCursorIndex((i) => Math.min(available.length - 1, i + 1));\n return;\n }\n\n // Space: select (with type cycle). First press selects as 'blocks',\n // subsequent presses cycle through: blocks -> relates-to -> duplicates -> deselect.\n if (input === ' ' || input === 't') {\n const task = available[cursorIndex];\n if (!task) return;\n setSelected((prev) => {\n const next = new Map(prev);\n const entry = prev.get(task.id);\n if (!entry) {\n // First select: default to blocks\n next.set(task.id, { id: task.id, name: task.name, type: DependencyType.Blocks });\n } else {\n // Cycle type, then deselect after last type\n const idx = DEP_TYPE_VALUES.indexOf(entry.type as DependencyType);\n if (idx < DEP_TYPE_VALUES.length - 1) {\n const nextType = DEP_TYPE_VALUES[idx + 1] ?? DependencyType.Blocks;\n next.set(task.id, { ...entry, type: nextType });\n } else {\n // Past last type -> deselect\n next.delete(task.id);\n }\n }\n return next;\n });\n return;\n }\n\n // x: deselect the item under cursor\n if (input === 'x') {\n const task = available[cursorIndex];\n if (!task) return;\n setSelected((prev) => {\n const next = new Map(prev);\n next.delete(task.id);\n return next;\n });\n return;\n }\n\n // Search\n if (input === '/') {\n setIsSearching(true);\n setSearchQuery('');\n return;\n }\n\n // Confirm\n if (key.return) {\n onConfirm(Array.from(selected.values()));\n return;\n }\n\n // Cancel\n if (key.escape || input === 'q') {\n onCancel();\n return;\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor={theme.borderFocus} flexGrow={1}>\n {/* Title */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n select dependencies\n </Text>\n <Text color={theme.titleCounter} bold>\n {' '}\n [{selected.size} selected]\n </Text>\n </Box>\n\n {/* Search bar */}\n {isSearching ? (\n <Box borderStyle=\"round\" borderColor={theme.prompt} paddingX={1}>\n <Text color={theme.prompt}>/</Text>\n <Text color={theme.prompt}>{searchQuery}</Text>\n <Text color={theme.promptSuggest}>_</Text>\n </Box>\n ) : searchQuery ? (\n <Box paddingX={1}>\n <Text color={theme.titleFilter}>/{searchQuery}</Text>\n </Box>\n ) : null}\n\n {/* Header */}\n <Box paddingX={1}>\n <Text color={theme.table.headerFg} bold>\n {' '}\n {'SEL'.padEnd(5)}\n {'ID'.padEnd(14)}\n {'REL TYPE'.padEnd(12)}\n {'STATUS'.padEnd(14)}\n {'NAME'}\n </Text>\n </Box>\n\n {/* Task rows */}\n {available.length === 0 ? (\n <Box paddingX={2} paddingY={1}>\n <Text dimColor>No tasks match the filter</Text>\n </Box>\n ) : (\n visible.map((task, i) => {\n const actualIndex = viewStart + i;\n const isCursor = actualIndex === cursorIndex;\n const entry = selected.get(task.id);\n const isChecked = !!entry;\n const checkMark = isChecked ? '[x]' : '[ ]';\n const depType = entry ? (DEP_TYPE_LABEL[entry.type] ?? entry.type) : '';\n const depColor = entry ? (DEP_TYPE_COLOR[entry.type] ?? theme.table.fg) : theme.table.fg;\n\n return (\n <Box key={task.id} paddingX={1}>\n {isCursor ? (\n <Text backgroundColor={theme.table.cursorBg} color={theme.table.cursorFg} bold>\n {'> '}\n {checkMark.padEnd(5)}\n {task.id.padEnd(14)}\n {depType.padEnd(12)}\n {task.status.padEnd(14)}\n {task.name}\n </Text>\n ) : (\n <>\n <Text>{' '}</Text>\n <Text color={isChecked ? theme.status.added : theme.table.fg}>\n {checkMark.padEnd(5)}\n </Text>\n <Text color={theme.yaml.value}>{task.id.padEnd(14)}</Text>\n <Text color={depColor}>{depType.padEnd(12)}</Text>\n <Text color={theme.status.completed}>{task.status.padEnd(14)}</Text>\n <Text color={theme.table.fg}>{task.name}</Text>\n </>\n )}\n </Box>\n );\n })\n )}\n\n <Box flexGrow={1} />\n\n {/* Scroll indicator */}\n {available.length > maxVisible && (\n <Box justifyContent=\"flex-end\" paddingRight={1}>\n <Text dimColor>\n [{viewStart + 1}-{Math.min(viewStart + maxVisible, available.length)}/{available.length}\n ]\n </Text>\n </Box>\n )}\n\n {/* Selected summary */}\n {selected.size > 0 && (\n <Box paddingX={1} flexDirection=\"column\">\n <Text color={theme.table.headerFg} bold>\n Selected:\n </Text>\n <Box>\n <Text>\n {Array.from(selected.values())\n .map((d) => `${d.id} (${DEP_TYPE_LABEL[d.type] ?? d.type})`)\n .join(', ')}\n </Text>\n </Box>\n </Box>\n )}\n\n {/* Hints */}\n <Box paddingX={1}>\n <Text dimColor>\n space/t: select & cycle type (blocks {'->'} relates-to {'->'} duplicates {'->'} blocked-by{' '}\n {'->'} off) | x: deselect | /: search | enter: confirm | esc: cancel\n </Text>\n </Box>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { Project } from '../../types/project.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n projects: Project[];\n activeProject: Project | null;\n onSelect: (project: Project) => void;\n onCreate: () => void;\n onSetDefault: (project: Project) => void;\n onCancel: () => void;\n}\n\nexport function ProjectSelector({\n projects,\n activeProject,\n onSelect,\n onCreate,\n onSetDefault,\n onCancel,\n}: Props) {\n const [selectedIndex, setSelectedIndex] = useState(() => {\n if (!activeProject) return 0;\n const idx = projects.findIndex((p) => p.id === activeProject.id);\n return idx >= 0 ? idx : 0;\n });\n\n useInput((input, key) => {\n if (key.escape || input === 'q') {\n onCancel();\n return;\n }\n if (key.return) {\n const project = projects[selectedIndex];\n if (project) {\n onSelect(project);\n }\n return;\n }\n if (input === 'c') {\n onCreate();\n return;\n }\n if (input === 'd') {\n const project = projects[selectedIndex];\n if (project) {\n onSetDefault(project);\n }\n return;\n }\n if (key.upArrow || input === 'k') {\n setSelectedIndex((i) => Math.max(0, i - 1));\n }\n if (key.downArrow || input === 'j') {\n setSelectedIndex((i) => Math.min(projects.length - 1, i + 1));\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n {/* Title bar */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n projects\n </Text>\n <Text color={theme.titleCounter} bold>\n [{projects.length}]\n </Text>\n </Box>\n\n {/* Table header */}\n <Box paddingX={1}>\n <Text color={theme.table.headerFg} bold>\n {' NAME'.padEnd(30)}\n </Text>\n <Text color={theme.table.headerFg} bold>\n DESCRIPTION\n </Text>\n </Box>\n\n {projects.length === 0 ? (\n <Box paddingX={1} paddingY={1}>\n <Text color={theme.fg}>No projects. Press 'c' to create one.</Text>\n </Box>\n ) : (\n projects.map((project, i) => {\n const isSelected = i === selectedIndex;\n const isActive = project.id === activeProject?.id;\n // * = active project, D = default project, combines to *D when both\n const activeMarker = isActive ? '*' : ' ';\n const defaultMarker = project.isDefault ? 'D' : ' ';\n const marker = `${activeMarker}${defaultMarker}`;\n\n if (isSelected) {\n return (\n <Box key={project.id} paddingX={1}>\n <Text backgroundColor={theme.table.cursorBg} color={theme.table.cursorFg} bold>\n {marker} {project.name.padEnd(27)}\n {project.description}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={project.id} paddingX={1}>\n <Text color={isActive ? theme.status.modified : theme.table.fg}>\n {marker} {project.name.padEnd(27)}\n </Text>\n <Text dimColor>{project.description}</Text>\n </Box>\n );\n })\n )}\n\n <Box flexGrow={1} />\n\n <Box paddingX={1}>\n <Text dimColor>enter: select | d: set default | c: create | esc: back</Text>\n </Box>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { theme } from '../theme.js';\n\ninterface Props {\n onSave: (data: { name: string; key: string; description: string; isDefault: boolean }) => void;\n onCancel: () => void;\n}\n\ntype FieldKey = 'name' | 'key' | 'description' | 'isDefault';\n\ninterface Field {\n label: string;\n key: FieldKey;\n type: 'inline' | 'toggle';\n}\n\nconst FIELDS: Field[] = [\n { label: 'Name', key: 'name', type: 'inline' },\n { label: 'Key', key: 'key', type: 'inline' },\n { label: 'Description', key: 'description', type: 'inline' },\n { label: 'Default', key: 'isDefault', type: 'toggle' },\n];\n\nexport function ProjectForm({ onSave, onCancel }: Props) {\n const [focusIndex, setFocusIndex] = useState(0);\n const [values, setValues] = useState<Record<string, string>>({\n name: '',\n key: '',\n description: '',\n isDefault: 'no',\n });\n\n const currentField = FIELDS[focusIndex];\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (!currentField) return;\n\n if (key.tab) {\n if (key.shift) {\n setFocusIndex((i) => Math.max(0, i - 1));\n } else {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n }\n return;\n }\n\n if (input === 's' && key.ctrl) {\n const nameVal = values['name'];\n if (typeof nameVal === 'string' && nameVal.trim()) {\n onSave({\n name: nameVal,\n key: values['key'] ?? '',\n description: values['description'] ?? '',\n isDefault: values['isDefault'] === 'yes',\n });\n }\n return;\n }\n\n if (currentField.type === 'inline') {\n const currentValue = values[currentField.key] ?? '';\n if (key.backspace || key.delete) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue.slice(0, -1) }));\n } else if (key.return) {\n setFocusIndex((i) => Math.min(FIELDS.length - 1, i + 1));\n } else if (input && !key.ctrl && !key.meta) {\n setValues((v) => ({ ...v, [currentField.key]: currentValue + input }));\n }\n }\n\n if (currentField.type === 'toggle') {\n if (key.return || key.rightArrow || key.leftArrow || input === ' ') {\n setValues((v) => ({\n ...v,\n [currentField.key]: v[currentField.key] === 'yes' ? 'no' : 'yes',\n }));\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n new project\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={1} paddingY={0}>\n {FIELDS.map((field, i) => {\n const isFocused = i === focusIndex;\n const value = values[field.key] ?? '';\n\n return (\n <Box key={field.key} gap={1}>\n <Text color={isFocused ? theme.dialog.label : theme.yaml.key} bold={isFocused}>\n {isFocused ? '>' : ' '} {field.label.padEnd(14)}\n </Text>\n\n {field.type === 'inline' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {value}\n {isFocused ? <Text color={theme.titleHighlight}>_</Text> : ''}\n {field.key === 'key' && !value && (\n <Text dimColor>{isFocused ? ' (auto from name)' : ''}</Text>\n )}\n </Text>\n )}\n\n {field.type === 'toggle' && (\n <Text color={isFocused ? theme.yaml.value : theme.table.fg}>\n {isFocused ? '< ' : ' '}\n {value}\n {isFocused ? ' >' : ''}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n <Box flexGrow={1} />\n\n <Box paddingX={1}>\n <Text dimColor>tab: next | shift+tab: prev | ctrl+s: save | esc: cancel</Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { theme } from '../theme.js';\n\nconst SECTIONS = [\n {\n title: 'NAVIGATION',\n keys: [\n ['j/k', 'Up/Down'],\n ['g/G', 'Top/Bottom'],\n ['PgDn', 'Page down'],\n ['PgUp', 'Page up'],\n ['enter', 'View'],\n ['esc', 'Back'],\n ],\n },\n {\n title: 'ACTIONS',\n keys: [\n ['c', 'Create'],\n ['e', 'Edit'],\n ['d', 'Delete'],\n ['s', 'Status cycle'],\n ['D', 'Dependencies'],\n ],\n },\n {\n title: 'REORDER',\n keys: [\n ['←', 'Enter reorder'],\n ['↑↓', 'Move task'],\n ['t', 'Jump to top'],\n ['b', 'Jump to bottom'],\n ['→', 'Save position'],\n ['esc/←', 'Cancel'],\n ],\n },\n {\n title: 'FILTER',\n keys: [\n ['/', 'Search'],\n ['f', 'Status filter'],\n ['t', 'Type filter'],\n ['0', 'Clear filters'],\n ],\n },\n {\n title: 'DEPS VIEW',\n keys: [\n ['a', 'Add blocker'],\n ['x', 'Remove dep'],\n ['enter', 'Go to task'],\n ['esc', 'Back'],\n ],\n },\n {\n title: 'GENERAL',\n keys: [\n ['p', 'Projects'],\n ['?', 'Help'],\n ['q', 'Quit'],\n ],\n },\n];\n\nexport function HelpOverlay() {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"bold\"\n borderColor={theme.borderFocus}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.title} bold>\n {' '}\n Help\n </Text>\n <Text> </Text>\n <Box flexDirection=\"row\" gap={4}>\n {SECTIONS.map((section) => (\n <Box key={section.title} flexDirection=\"column\">\n <Text color={theme.table.headerFg} bold>\n {section.title}\n </Text>\n {section.keys.map(([key, desc]) => (\n <Box key={key} gap={1}>\n <Text color={theme.menu.key} bold>\n {'<'}\n {(key ?? '').padEnd(5)}\n {'>'}\n </Text>\n <Text dimColor>{desc}</Text>\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n <Text> </Text>\n <Text dimColor>Press any key to close</Text>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\n\ninterface Props {\n task: Task;\n}\n\nexport function ConfirmDialog({ task }: Props) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"bold\"\n borderColor={theme.status.error}\n paddingX={3}\n paddingY={1}\n alignSelf=\"center\"\n >\n <Text color={theme.dialog.label} bold>\n {'<Delete>'}\n </Text>\n <Text> </Text>\n <Text color={theme.dialog.fg}>Delete task "{task.name}"?</Text>\n <Text> </Text>\n <Box gap={3}>\n <Box>\n <Text\n backgroundColor={theme.dialog.buttonFocusBg}\n color={theme.dialog.buttonFocusFg}\n bold\n >\n {' y: OK '}\n </Text>\n </Box>\n <Box>\n <Text backgroundColor={theme.dialog.buttonBg} color={theme.dialog.buttonFg}>\n {' n: Cancel '}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_COLOR } from '../constants.js';\n\ninterface Props {\n task: Task;\n blockers: Task[];\n dependents: Task[];\n related: Task[];\n duplicates: Task[];\n selectedIndex: number;\n isAddingDep: boolean;\n addDepInput: string;\n}\n\nfunction TaskRow({\n task,\n globalIndex,\n selectedIndex,\n}: {\n task: Task;\n globalIndex: number;\n selectedIndex: number;\n}) {\n const isSelected = globalIndex === selectedIndex;\n const statusColor = STATUS_COLOR[task.status] ?? theme.table.fg;\n return (\n <Box key={task.id}>\n {isSelected ? (\n <Text backgroundColor={theme.table.cursorBg} color={theme.table.cursorFg} bold>\n {'> '}\n {task.id.padEnd(12)}\n {task.status.padEnd(14)}\n {task.name}\n </Text>\n ) : (\n <>\n <Text>{' '}</Text>\n <Text color={theme.yaml.value}>{task.id.padEnd(12)}</Text>\n <Text color={statusColor}>{task.status.padEnd(14)}</Text>\n <Text color={theme.table.fg}>{task.name}</Text>\n </>\n )}\n </Box>\n );\n}\n\nexport function DependencyList({\n task,\n blockers,\n dependents,\n related,\n duplicates,\n selectedIndex,\n isAddingDep,\n addDepInput,\n}: Props) {\n let offset = 0;\n const blockersOffset = offset;\n offset += blockers.length;\n const dependentsOffset = offset;\n offset += dependents.length;\n const relatedOffset = offset;\n offset += related.length;\n const duplicatesOffset = offset;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} borderStyle=\"bold\" borderColor={theme.borderFocus}>\n {/* Title */}\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n dependencies\n </Text>\n <Text color={theme.fg}>(</Text>\n <Text color={theme.titleHighlight} bold>\n {task.name}\n </Text>\n <Text color={theme.fg}>)</Text>\n </Box>\n\n {/* Blockers section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n BLOCKED BY ({blockers.length})\n </Text>\n {blockers.length === 0 ? (\n <Text dimColor> No blockers</Text>\n ) : (\n blockers.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={blockersOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n {/* Dependents section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n BLOCKS ({dependents.length})\n </Text>\n {dependents.length === 0 ? (\n <Text dimColor> No dependents</Text>\n ) : (\n dependents.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={dependentsOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n {/* Related section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n RELATES TO ({related.length})\n </Text>\n {related.length === 0 ? (\n <Text dimColor> No related tasks</Text>\n ) : (\n related.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={relatedOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n {/* Duplicates section */}\n <Box flexDirection=\"column\" paddingX={1} paddingTop={1}>\n <Text color={theme.table.headerFg} bold>\n DUPLICATES ({duplicates.length})\n </Text>\n {duplicates.length === 0 ? (\n <Text dimColor> No duplicate tasks</Text>\n ) : (\n duplicates.map((t, i) => (\n <TaskRow\n key={t.id}\n task={t}\n globalIndex={duplicatesOffset + i}\n selectedIndex={selectedIndex}\n />\n ))\n )}\n </Box>\n\n <Box flexGrow={1} />\n\n {/* Add dependency prompt */}\n {isAddingDep && (\n <Box borderStyle=\"round\" borderColor={theme.prompt} paddingX={1}>\n <Text color={theme.prompt}>depends on (id or id:type): </Text>\n <Text color={theme.prompt}>{addDepInput}</Text>\n <Text color={theme.promptSuggest}>_</Text>\n </Box>\n )}\n\n {/* Hints */}\n <Box paddingX={1}>\n <Text dimColor>\n a: add dep (id or id:relates-to) | x: remove selected | enter: go to task | esc: back\n </Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_COLOR } from '../constants.js';\n\nconst PAGE_SIZE = 20;\n\ninterface Props {\n epics: Task[];\n selectedIndex: number;\n selectedEpicIds: Set<string>;\n isFocused: boolean;\n isReordering?: boolean;\n}\n\nexport function EpicPanel({\n epics,\n selectedIndex,\n selectedEpicIds,\n isFocused,\n isReordering = false,\n}: Props) {\n const filterActive = selectedEpicIds.size > 0;\n const currentPage = Math.floor(selectedIndex / PAGE_SIZE);\n const viewStart = currentPage * PAGE_SIZE;\n const visibleEpics = epics.slice(viewStart, viewStart + PAGE_SIZE);\n\n return (\n <Box\n flexDirection=\"column\"\n width={48}\n borderStyle=\"bold\"\n borderColor={isFocused ? theme.borderFocus : theme.border}\n >\n <Box>\n <Text color={theme.title} bold>\n {' '}\n epics\n </Text>\n <Text color={theme.titleCounter} bold>\n [{epics.length}]\n </Text>\n {isReordering && (\n <Text color={theme.flash.warn} bold>\n {' '}\n REORDER\n </Text>\n )}\n {filterActive && <Text color={theme.titleFilter}> *{selectedEpicIds.size}</Text>}\n </Box>\n\n <Box flexDirection=\"column\" flexGrow={1} overflowY=\"hidden\">\n {epics.length === 0 ? (\n <Box paddingX={1}>\n <Text dimColor>No epics</Text>\n </Box>\n ) : (\n visibleEpics.map((epic, i) => {\n const actualIndex = viewStart + i;\n const isSelected = actualIndex === selectedIndex && isFocused;\n const isChecked = selectedEpicIds.has(epic.id);\n const marker = isChecked ? '[x]' : '[ ]';\n const statusColor = STATUS_COLOR[epic.status] ?? theme.table.fg;\n\n if (isSelected) {\n const cursorBg = isReordering ? theme.flash.warn : theme.table.cursorBg;\n return (\n <Box key={epic.id}>\n <Text backgroundColor={cursorBg} color={theme.table.cursorFg} bold>\n {isReordering ? '~ ' : ' '}\n {marker} {epic.name}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box key={epic.id}>\n <Text color={isChecked ? theme.titleHighlight : statusColor}>\n {' '}\n {marker} {epic.name}\n </Text>\n </Box>\n );\n })\n )}\n </Box>\n\n {epics.length > PAGE_SIZE && (\n <Box justifyContent=\"flex-end\" paddingRight={1}>\n <Text dimColor>\n [{viewStart + 1}-{Math.min(viewStart + PAGE_SIZE, epics.length)}/{epics.length}]\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport type { Task } from '../../types/task.js';\nimport { theme } from '../theme.js';\nimport { STATUS_COLOR } from '../constants.js';\n\ninterface Props {\n epics: Task[];\n /** Currently assigned epic ID (highlighted in the list). */\n currentEpicId: string | null;\n onSelect: (epicId: string | null) => void;\n onCancel: () => void;\n}\n\nexport function EpicPicker({ epics, currentEpicId, onSelect, onCancel }: Props) {\n const { stdout } = useStdout();\n const termHeight = stdout.rows > 0 ? stdout.rows : 24;\n const maxVisible = Math.max(3, termHeight - 10);\n\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [cursorIndex, setCursorIndex] = useState(0);\n\n const filtered = epics.filter((e) => {\n if (!searchQuery.trim()) return true;\n const q = searchQuery.toLowerCase();\n return (\n e.id.toLowerCase().includes(q) ||\n e.name.toLowerCase().includes(q) ||\n e.description.toLowerCase().includes(q)\n );\n });\n\n let viewStart = 0;\n if (cursorIndex >= viewStart + maxVisible) {\n viewStart = cursorIndex - maxVisible + 1;\n }\n if (cursorIndex < viewStart) {\n viewStart = cursorIndex;\n }\n const visible = filtered.slice(viewStart, viewStart + maxVisible);\n\n useInput((input, key) => {\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n return;\n }\n if (key.return) {\n setIsSearching(false);\n setCursorIndex(0);\n return;\n }\n if (key.backspace || key.delete) {\n setSearchQuery((q) => q.slice(0, -1));\n setCursorIndex(0);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setSearchQuery((q) => q + input);\n setCursorIndex(0);\n return;\n }\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setCursorIndex((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow || input === 'j') {\n setCursorIndex((i) => Math.min(filtered.length - 1, i + 1));\n return;\n }\n\n if (key.return) {\n const epic = filtered[cursorIndex];\n if (epic) {\n onSelect(epic.id);\n }\n return;\n }\n\n // x: unassign (set parent to null)\n if (input === 'x') {\n onSelect(null);\n return;\n }\n\n if (input === '/') {\n setIsSearching(true);\n setSearchQuery('');\n return;\n }\n\n if (key.escape || input === 'q') {\n onCancel();\n return;\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"bold\" borderColor={theme.borderFocus} flexGrow={1}>\n <Box gap={0}>\n <Text color={theme.title} bold>\n {' '}\n assign to epic\n </Text>\n <Text color={theme.titleCounter} bold>\n {' '}\n [{epics.length}]\n </Text>\n </Box>\n\n {isSearching ? (\n <Box borderStyle=\"round\" borderColor={theme.prompt} paddingX={1}>\n <Text color={theme.prompt}>/</Text>\n <Text color={theme.prompt}>{searchQuery}</Text>\n <Text color={theme.promptSuggest}>_</Text>\n </Box>\n ) : searchQuery ? (\n <Box paddingX={1}>\n <Text color={theme.titleFilter}>/{searchQuery}</Text>\n </Box>\n ) : null}\n\n <Box paddingX={1}>\n <Text color={theme.table.headerFg} bold>\n {' '}\n {'ID'.padEnd(14)}\n {'STATUS'.padEnd(14)}\n {'NAME'}\n </Text>\n </Box>\n\n {filtered.length === 0 ? (\n <Box paddingX={2} paddingY={1}>\n <Text dimColor>No epics match the filter</Text>\n </Box>\n ) : (\n visible.map((epic, i) => {\n const actualIndex = viewStart + i;\n const isCursor = actualIndex === cursorIndex;\n const isCurrent = epic.id === currentEpicId;\n const marker = isCurrent ? '* ' : ' ';\n const statusColor = STATUS_COLOR[epic.status] ?? theme.table.fg;\n\n return (\n <Box key={epic.id} paddingX={1}>\n {isCursor ? (\n <Text backgroundColor={theme.table.cursorBg} color={theme.table.cursorFg} bold>\n {'> '}\n {epic.id.padEnd(14)}\n {epic.status.padEnd(14)}\n {epic.name}\n </Text>\n ) : (\n <>\n <Text color={isCurrent ? theme.titleHighlight : theme.table.fg}>{marker}</Text>\n <Text color={theme.yaml.value}>{epic.id.padEnd(14)}</Text>\n <Text color={statusColor}>{epic.status.padEnd(14)}</Text>\n <Text color={isCurrent ? theme.titleHighlight : theme.table.fg}>{epic.name}</Text>\n </>\n )}\n </Box>\n );\n })\n )}\n\n <Box flexGrow={1} />\n\n {filtered.length > maxVisible && (\n <Box justifyContent=\"flex-end\" paddingRight={1}>\n <Text dimColor>\n [{viewStart + 1}-{Math.min(viewStart + maxVisible, filtered.length)}/{filtered.length}]\n </Text>\n </Box>\n )}\n\n <Box paddingX={1}>\n <Text dimColor>enter: assign | x: unassign | /: search | esc: cancel</Text>\n </Box>\n </Box>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { watchFile, unwatchFile } from 'node:fs';\nimport { logger } from '../logging/logger.js';\n\nconst POLL_INTERVAL_MS = 1000;\nconst DEBOUNCE_MS = 200;\n\n/**\n * Watches the SQLite database file (and its WAL journal) for external\n * modifications. When a change is detected the supplied `onRefetch`\n * callback fires – debounced so rapid successive writes only trigger a\n * single refetch.\n *\n * Uses `fs.watchFile` (stat-polling) rather than `fs.watch` because the\n * latter is unreliable for SQLite WAL-mode databases on some platforms.\n */\nexport function useAutoRefetch(dbPath: string, onRefetch: () => void): void {\n // Keep a stable reference to the latest callback so the watcher\n // closure never goes stale while avoiding re-subscribing on every\n // render.\n const callbackRef = useRef(onRefetch);\n callbackRef.current = onRefetch;\n\n useEffect(() => {\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const handleChange = (): void => {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n logger.info('useAutoRefetch: external db change detected, refetching');\n callbackRef.current();\n }, DEBOUNCE_MS);\n };\n\n const walPath = `${dbPath}-wal`;\n\n // `watchFile` emits (curr, prev) stat objects; fire when mtime changes.\n const listener = (curr: { mtimeMs: number }, prev: { mtimeMs: number }): void => {\n if (curr.mtimeMs !== prev.mtimeMs) {\n handleChange();\n }\n };\n\n watchFile(dbPath, { interval: POLL_INTERVAL_MS }, listener);\n watchFile(walPath, { interval: POLL_INTERVAL_MS }, listener);\n\n logger.info(`useAutoRefetch: watching ${dbPath} (poll ${POLL_INTERVAL_MS}ms)`);\n\n return () => {\n unwatchFile(dbPath, listener);\n unwatchFile(walPath, listener);\n if (debounceTimer) clearTimeout(debounceTimer);\n logger.info('useAutoRefetch: stopped watching');\n };\n }, [dbPath]);\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,cAAc;;;ACAvB,SAAS,YAAY,aAAAA,YAAW,eAAAC,cAAa,WAAAC,UAAS,YAAAC,iBAAgB;AACtE,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,WAAU,QAAQ,aAAAC,kBAAiB;;;ACGhD,IAAM,WAAW;AAAA,EACtB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,MAAM;AACR;;;ACbO,IAAM,QAAQ;AAAA;AAAA,EAEnB,IAAI;AAAA;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA;AAAA;AAAA,EAGN,OAAO;AAAA,IACL,IAAI;AAAA;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA;AAAA,IACX,gBAAgB;AAAA;AAAA,IAChB,iBAAiB;AAAA;AAAA,EACnB;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,KAAK;AAAA;AAAA,IACL,UAAU;AAAA;AAAA,IACV,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,SAAS;AAAA;AAAA,IACT,WAAW;AAAA;AAAA,IACX,MAAM;AAAA;AAAA,IACN,WAAW;AAAA;AAAA,EACb;AAAA;AAAA,EAGA,QAAQ;AAAA;AAAA,EACR,aAAa;AAAA;AAAA;AAAA,EAGb,OAAO;AAAA;AAAA,EACP,gBAAgB;AAAA;AAAA,EAChB,cAAc;AAAA;AAAA,EACd,aAAa;AAAA;AAAA;AAAA,EAGb,QAAQ;AAAA;AAAA,EACR,eAAe;AAAA;AAAA;AAAA,EAGf,QAAQ;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA;AAAA,IACf,OAAO;AAAA;AAAA,IACP,OAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM;AAAA,IACJ,KAAK;AAAA;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,UAAU;AAAA;AAAA,EACZ;AAAA;AAAA,EAGA,OAAO;AAAA,IACL,MAAM;AAAA;AAAA,IACN,MAAM;AAAA;AAAA,IACN,OAAO;AAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM;AAAA,IACJ,KAAK;AAAA;AAAA,IACL,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA,EACR;AACF;;;AC/EO,IAAM,gBAAgB,OAAO,OAAO,UAAU;AAC9C,IAAM,cAAc,OAAO,OAAO,QAAQ;AAG1C,IAAM,YAAY;AAElB,IAAM,eAAuC;AAAA,EAClD,CAAC,WAAW,OAAO,GAAG,MAAM,OAAO;AAAA,EACnC,CAAC,WAAW,IAAI,GAAG,MAAM,OAAO;AAAA,EAChC,CAAC,WAAW,UAAU,GAAG,MAAM,OAAO;AAAA,EACtC,CAAC,WAAW,MAAM,GAAG,MAAM,OAAO;AAAA,EAClC,CAAC,WAAW,IAAI,GAAG,MAAM,OAAO;AAAA,EAChC,CAAC,WAAW,SAAS,GAAG,MAAM,OAAO;AACvC;AAEO,IAAM,aAAqC;AAAA,EAChD,CAAC,SAAS,IAAI,GAAG,MAAM,OAAO;AAAA,EAC9B,CAAC,SAAS,KAAK,GAAG,MAAM,OAAO;AAAA,EAC/B,CAAC,SAAS,QAAQ,GAAG,MAAM,OAAO;AAAA,EAClC,CAAC,SAAS,GAAG,GAAG,MAAM,OAAO;AAC/B;AAEO,IAAM,iBAAyC;AAAA,EACpD,CAAC,eAAe,MAAM,GAAG;AAAA,EACzB,CAAC,eAAe,SAAS,GAAG;AAAA,EAC5B,CAAC,eAAe,UAAU,GAAG;AAAA,EAC7B,CAAC,iBAAiB,SAAS,GAAG;AAChC;;;AC1BO,IAAM,eAAyB;AAAA,EACpC,YAAY,SAAS;AAAA,EACrB,aAAa,CAAC,SAAS,QAAQ;AAAA,EAC/B,OAAO,CAAC;AAAA,EACR,eAAe;AAAA,EACf,cAAc;AAAA,EACd,UAAU,CAAC;AAAA,EACX,eAAe;AAAA,EACf,QAAQ,CAAC;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,UAAU;AAAA,EACV,aAAa,CAAC;AAAA,EACd,eAAe,CAAC;AAAA,EAChB,YAAY,CAAC;AAAA,EACb,eAAe,CAAC;AAAA,EAChB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,OAAO,CAAC;AAAA,EACR,mBAAmB;AAAA,EACnB,iBAAiB,oBAAI,IAAI;AAAA,EACzB,kBAAkB;AAAA,EAClB,qBAAqB;AACvB;AAEO,SAAS,WAAW,OAAiB,QAA0B;AACpE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa,CAAC,GAAG,MAAM,aAAa,OAAO,IAAI;AAAA,QAC/C,YAAY,OAAO;AAAA,QACnB,eAAe;AAAA,QACf,cAAc;AAAA,MAChB;AAAA,IAEF,KAAK,WAAW;AACd,YAAM,SACJ,MAAM,YAAY,SAAS,IAAI,MAAM,YAAY,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,QAAQ;AACpF,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,OAAO,OAAO,SAAS,CAAC,KAAK,SAAS;AAAA,QAClD,aAAa;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,OAAO;AAAA,QACd,eAAe,KAAK,IAAI,MAAM,eAAe,KAAK,IAAI,GAAG,OAAO,MAAM,SAAS,CAAC,CAAC;AAAA,MACnF;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,UAAU,OAAO,SAAS;AAAA,IAE/C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,eAAe,OAAO,QAAQ;AAAA,IAEnD,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ,EAAE,GAAG,MAAM,QAAQ,GAAG,OAAO,OAAO;AAAA,QAC5C,eAAe;AAAA,MACjB;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,CAAC,GAAG,eAAe,GAAG,aAAa,GAAG;AAAA,IAEnE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,gBAAgB,OAAO,OAAO;AAAA,IAEnD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,MAAM;AAAA,IAE/C,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,EAAE,SAAS,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,MACxD;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,OAAO,KAAK;AAAA,IAEjC,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,eAAe,OAAO,KAAK;AAAA,IAEhD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,eAAe,KAAK;AAAA,IAEzC,KAAK,eAAe;AAClB,YAAM,WAAW,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC;AACnD,YAAM,WACJ,OAAO,cAAc,OACjB,KAAK,IAAI,GAAG,MAAM,gBAAgB,CAAC,IACnC,KAAK,IAAI,UAAU,MAAM,gBAAgB,CAAC;AAChD,aAAO,EAAE,GAAG,OAAO,eAAe,UAAU,oBAAoB,EAAE;AAAA,IACpE;AAAA,IAEA,KAAK,eAAe;AAClB,YAAM,WAAW,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC;AACnD,YAAM,WACJ,OAAO,cAAc,OACjB,KAAK,IAAI,GAAG,MAAM,gBAAgB,SAAS,IAC3C,KAAK,IAAI,UAAU,MAAM,gBAAgB,SAAS;AACxD,aAAO,EAAE,GAAG,OAAO,eAAe,UAAU,oBAAoB,EAAE;AAAA,IACpE;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,WAAW,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC;AACnD,aAAO,EAAE,GAAG,OAAO,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,OAAO,QAAQ,CAAC,EAAE;AAAA,IAClF;AAAA,IAEA,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,cAAc,OAAO,MAAM,oBAAoB,EAAE;AAAA,IAEtE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,UAAU,OAAO,KAAK;AAAA,IAE3C,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,cAAc;AAAA,QACd,iBAAiB,CAAC,GAAG,MAAM,KAAK;AAAA,MAClC;AAAA,IAEF,KAAK,gBAAgB;AACnB,UAAI,CAAC,MAAM,aAAc,QAAO;AAChC,YAAM,MAAM,MAAM;AAClB,YAAM,QAAQ,CAAC,GAAG,MAAM,KAAK;AAC7B,YAAM,UAAU,OAAO,cAAc,OAAO,MAAM,IAAI,MAAM;AAC5D,UAAI,UAAU,KAAK,WAAW,MAAM,OAAQ,QAAO;AAGnD,YAAM,UAAU,MAAM,GAAG;AACzB,YAAM,OAAO,MAAM,OAAO;AAC1B,UAAI,CAAC,WAAW,CAAC,KAAM,QAAO;AAC9B,YAAM,GAAG,IAAI;AACb,YAAM,OAAO,IAAI;AAEjB,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,KAAK,gBAAgB;AACnB,UAAI,CAAC,OAAO,QAAQ,MAAM,iBAAiB;AAEzC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,cAAc;AAAA,UACd,OAAO,MAAM;AAAA,UACb,iBAAiB;AAAA,QACnB;AAAA,MACF;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,cAAc;AAAA,QACd,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa,OAAO;AAAA,QACpB,eAAe,OAAO;AAAA,QACtB,YAAY,OAAO;AAAA,QACnB,eAAe,OAAO;AAAA,QACtB,kBAAkB;AAAA,MACpB;AAAA,IAEF,KAAK,mBAAmB;AACtB,YAAM,QACJ,MAAM,YAAY,SAClB,MAAM,cAAc,SACpB,MAAM,WAAW,SACjB,MAAM,cAAc;AACtB,UAAI,UAAU,EAAG,QAAO;AACxB,YAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,CAAC;AACpC,YAAM,SACJ,OAAO,cAAc,OACjB,KAAK,IAAI,GAAG,MAAM,mBAAmB,CAAC,IACtC,KAAK,IAAI,QAAQ,MAAM,mBAAmB,CAAC;AACjD,aAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO;AAAA,IAC9C;AAAA,IAEA,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,QAAQ,aAAa,GAAG;AAAA,IAEjE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,MAAM;AAAA,IAE/C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,cAAc,OAAO,MAAM;AAAA,IAEhD,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,oBACE,OAAO,cAAc,OACjB,KAAK,IAAI,GAAG,MAAM,qBAAqB,CAAC,IACxC,MAAM,qBAAqB;AAAA,MACnC;AAAA,IAEF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,oBAAoB,EAAE;AAAA,IAE3C,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,OAAO;AAAA,QACd,mBAAmB,KAAK,IAAI,MAAM,mBAAmB,KAAK,IAAI,GAAG,OAAO,MAAM,SAAS,CAAC,CAAC;AAAA,MAC3F;AAAA,IAEF,KAAK,oBAAoB;AACvB,UAAI,MAAM,MAAM,WAAW,EAAG,QAAO;AACrC,YAAM,SAAS,KAAK,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC;AACjD,YAAM,SACJ,OAAO,cAAc,OACjB,KAAK,IAAI,GAAG,MAAM,oBAAoB,CAAC,IACvC,KAAK,IAAI,QAAQ,MAAM,oBAAoB,CAAC;AAClD,aAAO,EAAE,GAAG,OAAO,mBAAmB,OAAO;AAAA,IAC/C;AAAA,IAEA,KAAK,eAAe;AAClB,YAAM,OAAO,IAAI,IAAI,MAAM,eAAe;AAC1C,UAAI,KAAK,IAAI,OAAO,MAAM,GAAG;AAC3B,aAAK,OAAO,OAAO,MAAM;AAAA,MAC3B,OAAO;AACL,aAAK,IAAI,OAAO,MAAM;AAAA,MACxB;AACA,aAAO,EAAE,GAAG,OAAO,iBAAiB,MAAM,eAAe,EAAE;AAAA,IAC7D;AAAA,IAEA,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,iBAAiB,oBAAI,IAAI,GAAG,eAAe,EAAE;AAAA,IAElE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,qBAAqB,CAAC,GAAG,MAAM,KAAK;AAAA,MACtC;AAAA,IAEF,KAAK,qBAAqB;AACxB,UAAI,CAAC,MAAM,iBAAkB,QAAO;AACpC,YAAM,MAAM,MAAM;AAClB,YAAM,QAAQ,CAAC,GAAG,MAAM,KAAK;AAC7B,YAAM,UAAU,OAAO,cAAc,OAAO,MAAM,IAAI,MAAM;AAC5D,UAAI,UAAU,KAAK,WAAW,MAAM,OAAQ,QAAO;AAEnD,YAAM,UAAU,MAAM,GAAG;AACzB,YAAM,OAAO,MAAM,OAAO;AAC1B,UAAI,CAAC,WAAW,CAAC,KAAM,QAAO;AAC9B,YAAM,GAAG,IAAI;AACb,YAAM,OAAO,IAAI;AAEjB,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,IAEA,KAAK,qBAAqB;AACxB,UAAI,CAAC,OAAO,QAAQ,MAAM,qBAAqB;AAC7C,eAAO;AAAA,UACL,GAAG;AAAA,UACH,kBAAkB;AAAA,UAClB,OAAO,MAAM;AAAA,UACb,qBAAqB;AAAA,QACvB;AAAA,MACF;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,qBAAqB;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;;;AC1SA,SAAS,KAAK,YAAY;AA4EpB,SACE,KADF;AAnEN,SAAS,YAAY,MAAc,gBAAyB,cAAiC;AAC3F,MAAI,gBAAgB;AAClB,WAAO;AAAA,MACL,EAAE,KAAK,SAAS,MAAM,QAAQ;AAAA,MAC9B,EAAE,KAAK,OAAO,MAAM,SAAS;AAAA,IAC/B;AAAA,EACF;AACA,MAAI,SAAS,eAAe,iBAAiB,QAAQ;AACnD,WAAO;AAAA,MACL,EAAE,KAAK,OAAO,MAAM,MAAM;AAAA,MAC1B,EAAE,KAAK,SAAS,MAAM,SAAS;AAAA,MAC/B,EAAE,KAAK,UAAK,MAAM,UAAU;AAAA,MAC5B,EAAE,KAAK,KAAK,MAAM,QAAQ;AAAA,MAC1B,EAAE,KAAK,OAAO,MAAM,QAAQ;AAAA,MAC5B,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,MACzB,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,SAAS,aAAa;AACxB,WAAO;AAAA,MACL,EAAE,KAAK,SAAS,MAAM,OAAO;AAAA,MAC7B,EAAE,KAAK,KAAK,MAAM,SAAS;AAAA,MAC3B,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,MACzB,EAAE,KAAK,KAAK,MAAM,MAAM;AAAA,MACxB,EAAE,KAAK,KAAK,MAAM,SAAS;AAAA,MAC3B,EAAE,KAAK,KAAK,MAAM,SAAS;AAAA,MAC3B,EAAE,KAAK,KAAK,MAAM,WAAW;AAAA,MAC7B,EAAE,KAAK,UAAK,MAAM,UAAU;AAAA,MAC5B,EAAE,KAAK,KAAK,MAAM,SAAS;AAAA,MAC3B,EAAE,KAAK,KAAK,MAAM,UAAU;AAAA,MAC5B,EAAE,KAAK,KAAK,MAAM,WAAW;AAAA,MAC7B,EAAE,KAAK,KAAK,MAAM,SAAS;AAAA,MAC3B,EAAE,KAAK,WAAW,MAAM,OAAO;AAAA,MAC/B,EAAE,KAAK,OAAO,MAAM,QAAQ;AAAA,MAC5B,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,MACzB,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,SAAS,eAAe;AAC1B,WAAO;AAAA,MACL,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,MACzB,EAAE,KAAK,KAAK,MAAM,SAAS;AAAA,MAC3B,EAAE,KAAK,KAAK,MAAM,MAAM;AAAA,MACxB,EAAE,KAAK,KAAK,MAAM,UAAU;AAAA,MAC5B,EAAE,KAAK,OAAO,MAAM,OAAO;AAAA,MAC3B,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,MACzB,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AAAA,IACL,EAAE,KAAK,OAAO,MAAM,OAAO;AAAA,IAC3B,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,IACzB,EAAE,KAAK,KAAK,MAAM,OAAO;AAAA,EAC3B;AACF;AAMO,SAAS,OAAO,EAAE,MAAM,GAAU;AACvC,QAAM,cAAc,MAAM,eAAe,QAAQ;AACjD,QAAM,YAAY,MAAM,MAAM;AAC9B,QAAM,QAAQ,YAAY,MAAM,YAAY,MAAM,gBAAgB,MAAM,YAAY;AAEpF,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,yBAAC,OAAI,KAAK,GACR;AAAA,0BAAC,QAAK,OAAO,MAAM,MAAM,MAAI,MAAC,mBAE9B;AAAA,MACA,oBAAC,QAAK,OAAO,MAAM,MAAM,sBAAQ;AAAA,MACjC,oBAAC,QAAK,OAAM,SAAQ,MAAI,MACrB,uBACH;AAAA,MACA,oBAAC,QAAK,UAAQ,MAAC,eAAC;AAAA,MAChB,oBAAC,QAAK,OAAO,MAAM,MAAM,oBAAM;AAAA,MAC/B,oBAAC,QAAK,OAAM,SAAQ,MAAI,MACrB,qBACH;AAAA,OACF;AAAA,IACA,oBAAC,OAAI,eAAc,OAAM,UAAS,QAAO,WAAW,GACjD,gBAAM,IAAI,CAAC,MACV,qBAAC,OACC;AAAA,2BAAC,QAAK,OAAO,MAAM,KAAK,KAAK,MAAI,MAAC;AAAA;AAAA,QAC3B,EAAE;AAAA,QAAI;AAAA,SACb;AAAA,MACA,oBAAC,QAAK,UAAQ,MAAE,YAAE,MAAK;AAAA,SAJf,EAAE,GAKZ,CACD,GACH;AAAA,KACF;AAEJ;;;ACtGA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAwBhB,gBAAAC,YAAA;AApBV,IAAM,cAAsC;AAAA,EAC1C,aAAa;AAAA,EACb,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,MAAM;AACR;AAMO,SAAS,OAAO,EAAE,YAAY,GAAU;AAC7C,SACE,gBAAAA,KAACC,MAAA,EAAI,eAAc,OAAM,KAAK,GAAG,OAAM,QACpC,sBAAY,IAAI,CAAC,OAAO,MAAM;AAC7B,UAAM,WAAW,MAAM,YAAY,SAAS;AAC5C,UAAM,QAAQ,IAAI,YAAY,KAAK,KAAK,KAAK;AAC7C,WACE,gBAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QAEC,OAAO,MAAM,MAAM;AAAA,QACnB,iBAAiB,WAAW,MAAM,MAAM,WAAW,MAAM,MAAM;AAAA,QAC/D,MAAM;AAAA,QAEL;AAAA;AAAA,MALI,GAAG,KAAK,IAAI,CAAC;AAAA,IAMpB;AAAA,EAEJ,CAAC,GACH;AAEJ;;;ACpCA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAkBpB,gBAAAC,YAAA;AATN,IAAM,cAA0C;AAAA,EAC9C,MAAM,MAAM,MAAM;AAAA,EAClB,MAAM,MAAM,MAAM;AAAA,EAClB,OAAO,MAAM,MAAM;AACrB;AAEO,SAAS,aAAa,EAAE,SAAS,MAAM,GAAU;AACtD,SACE,gBAAAA,KAACC,MAAA,EAAI,gBAAe,UAAS,OAAM,QACjC,0BAAAD,KAACE,OAAA,EAAK,OAAO,YAAY,KAAK,GAAG,MAAM,UAAU,SAC9C,mBACH,GACF;AAEJ;;;ACvBA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAoElB,SAIA,OAAAC,MAJA,QAAAC,aAAA;AAzCR,IAAM,MAAM;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACV;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,mBAAmB;AACrB,GAAU;AACR,QAAM,cAAc,KAAK,MAAM,gBAAgB,SAAS;AACxD,QAAM,YAAY,cAAc;AAEhC,QAAM,eAAe,MAAM,MAAM,WAAW,YAAY,SAAS;AAGjE,QAAM,cAAwB,CAAC;AAC/B,MAAI,OAAO,OAAQ,aAAY,KAAK,UAAU,OAAO,MAAM,EAAE;AAC7D,MAAI,OAAO,KAAM,aAAY,KAAK,QAAQ,OAAO,IAAI,EAAE;AACvD,MAAI,OAAO,OAAQ,aAAY,KAAK,OAAO,MAAM;AACjD,QAAM,aAAa,YAAY,SAAS,IAAI,YAAY,KAAK,GAAG,IAAI;AAEpE,SACE,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAa,YAAY,MAAM,cAAc,MAAM;AAAA,MAGnD;AAAA,wBAAAD,MAACC,MAAA,EACC;AAAA,0BAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,IAAI,eAAC;AAAA,UACxB,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,gBAAgB,MAAI,MACpC,6BACH;AAAA,UACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,IAAI,eAAC;AAAA,UACxB,gBAAAF,MAACE,OAAA,EAAK,OAAO,MAAM,cAAc,MAAI,MAAC;AAAA;AAAA,YAClC,MAAM;AAAA,YAAO;AAAA,aACjB;AAAA,UACC,gBACC,gBAAAF,MAACE,OAAA,EAAK,OAAO,MAAM,MAAM,MAAM,MAAI,MAChC;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UAED,oBAAoB,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,gBAAgB,qBAAO;AAAA,UAC9D,cAAc,gBAAAF,MAACE,OAAA,EAAK,OAAO,MAAM,aAAa;AAAA;AAAA,YAAG;AAAA,aAAW;AAAA,WAC/D;AAAA,QAGC,kBACC,gBAAAF,MAACC,MAAA,EAAI,aAAY,SAAQ,aAAa,MAAM,QAAQ,UAAU,GAC5D;AAAA,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,QAAQ,eAAC;AAAA,UAC5B,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,QAAS,uBAAY;AAAA,UACxC,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,eAAe,eAAC;AAAA,WACrC;AAAA,QAIF,gBAAAF,MAACC,MAAA,EACC;AAAA,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC,gBACH;AAAA,UACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC,cAAI,OAAO,IAAI,IAAI,GACtB;AAAA,UACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC,iBAAO,OAAO,IAAI,IAAI,GACzB;AAAA,UACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC,mBAAS,OAAO,IAAI,MAAM,GAC7B;AAAA,UACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MAAC,kBAExC;AAAA,WACF;AAAA,QAGA,gBAAAH,KAACE,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,WAAU,UAChD,gBAAM,WAAW,IAChB,gBAAAF,KAACE,MAAA,EAAI,UAAU,GAAG,UAAU,GAC1B,0BAAAF,KAACG,OAAA,EAAK,OAAO,MAAM,IAAI,sDAAkD,GAC3E,IAEA,aAAa,IAAI,CAAC,MAAM,MAAM;AAC5B,gBAAM,cAAc,YAAY;AAChC,gBAAM,aAAa,gBAAgB;AACnC,gBAAM,uBAAuB,sBAAsB,IAAI,KAAK,EAAE;AAC9D,gBAAM,yBAAyB,wBAAwB,IAAI,KAAK,EAAE;AAClE,gBAAM,WAAW,aAAa,KAAK,MAAM,KAAK,MAAM,MAAM;AAC1D,gBAAM,SAAS,GAAG,cAAc,CAAC;AAGjC,gBAAM,YAAY,uBAAuB,YAAO,yBAAyB,YAAO;AAEhF,cAAI,YAAY;AAEd,kBAAM,WAAW,eACb,MAAM,MAAM,OACZ,oBACE,MAAM,MAAM,kBACZ,MAAM,MAAM;AAClB,mBACE,gBAAAH,KAACE,MAAA,EACC,0BAAAD,MAACE,OAAA,EAAK,iBAAiB,UAAU,OAAO,MAAM,MAAM,UAAU,MAAI,MAC/D;AAAA,6BAAe,OAAO;AAAA,cACtB,OAAO,OAAO,IAAI,IAAI;AAAA,cACtB,KAAK,KAAK,OAAO,IAAI,IAAI;AAAA,cACzB,KAAK,OAAO,OAAO,IAAI,MAAM;AAAA,cAC7B,KAAK;AAAA,eACR,KAPQ,KAAK,EAQf;AAAA,UAEJ;AAEA,cAAI,wBAAwB,wBAAwB;AAGlD,mBACE,gBAAAH,KAACE,MAAA,EACC,0BAAAD,MAACE,OAAA,EAAK,iBAAiB,MAAM,MAAM,gBAAgB,OAAO,MAAM,MAAM,IAAI,MAAI,MAC3E;AAAA;AAAA,cACA,OAAO,OAAO,IAAI,IAAI;AAAA,cACtB,KAAK,KAAK,OAAO,IAAI,IAAI;AAAA,cACzB,KAAK,OAAO,OAAO,IAAI,MAAM;AAAA,cAC7B,KAAK;AAAA,eACR,KAPQ,KAAK,EAQf;AAAA,UAEJ;AAEA,iBACE,gBAAAF,MAACC,MAAA,EACC;AAAA,4BAAAF,KAACG,OAAA,EAAM,gBAAK;AAAA,YACZ,gBAAAH,KAACG,OAAA,EAAK,UAAQ,MAAE,iBAAO,OAAO,IAAI,IAAI,GAAE;AAAA,YACxC,gBAAAH,KAACG,OAAA,EAAK,OAAO,WAAW,KAAK,IAAI,KAAK,UAAW,eAAK,KAAK,OAAO,IAAI,IAAI,GAAE;AAAA,YAC5E,gBAAAH,KAACG,OAAA,EAAK,OAAO,aAAa,KAAK,MAAM,KAAK,UACvC,eAAK,OAAO,OAAO,IAAI,MAAM,GAChC;AAAA,YACA,gBAAAH,KAACG,OAAA,EAAK,OAAO,UAAW,eAAK,MAAK;AAAA,eAP1B,KAAK,EAQf;AAAA,QAEJ,CAAC,GAEL;AAAA,QAGC,MAAM,SAAS,aACd,gBAAAH,KAACE,MAAA,EAAI,gBAAe,YAAW,cAAc,GAC3C,0BAAAD,MAACE,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,UACX,YAAY;AAAA,UAAE;AAAA,UAAE,KAAK,IAAI,YAAY,WAAW,MAAM,MAAM;AAAA,UAAE;AAAA,UAAE,MAAM;AAAA,UAAO;AAAA,WACjF,GACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACrMA,SAAS,eAAe;AACxB,SAAS,OAAAC,MAAK,QAAAC,OAAM,iBAAiB;AACrC,OAAOC,YAAW;;;ACFlB,SAAS,QAAAC,OAAM,OAAAC,YAAW;AAC1B,SAAS,cAAuC;AAChD,SAAS,sBAAsB;AAC/B,OAAO,WAAW;;;ACHlB,SAAS,eAAe,mBAAmB;AAC3C,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,YAAY;AAEd,SAAS,qBAAqB,MAAoB;AACvD,QAAM,MAAM,YAAY,KAAK,OAAO,GAAG,eAAe,CAAC;AACvD,QAAM,WAAW,KAAK,KAAK,cAAc;AAEzC,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUb,KAAK,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQhD,gBAAc,UAAU,MAAM,OAAO;AAGrC,QAAM,MACJ,QAAQ,aAAa,WACjB,SAAS,QAAQ,MACjB,QAAQ,aAAa,UACnB,aAAa,QAAQ,MACrB,aAAa,QAAQ;AAE7B,OAAK,GAAG;AACV;;;ADmDW,gBAAAC,MAqBL,QAAAC,aArBK;AAjFJ,SAAS,qBAAqB,SAA2B;AAC9D,QAAM,QAAQ,IAAI,OAAO;AACzB,QAAM,SAAS,MAAM,MAAM,OAAO;AAClC,QAAM,SAAmB,CAAC;AAE1B,WAAS,KAAK,OAAsB;AAClC,eAAW,SAAS,OAAO;AACzB,UAAI,MAAM,SAAS,UAAW,MAAsB,SAAS,WAAW;AACtE,eAAO,KAAM,MAAsB,IAAI;AAAA,MACzC;AACA,UAAI,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AACpD,aAAK,MAAM,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,OAAK,MAAM;AACX,SAAO;AACT;AAEA,SAAS,iBAAyB;AAChC,QAAM,mBAAmB;AAAA,IACvB,UAAU;AAAA,MACR,KAAK,OAAoC;AACvC,YAAI,MAAM,SAAS,UAAW,QAAO;AAErC,cAAM,QAAQ,MAAM,KAAK,MAAM,IAAI;AACnC,cAAM,UAAU,MAAM,MAAM,GAAG,CAAC;AAChC,cAAM,SAAS,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE;AAC3D,cAAM,SAAS,SAAI,OAAO,SAAS,CAAC;AAEpC,cAAM,SAAS,QACZ,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,QAAG,CAAC,IAAI,MAAM,IAAI,MAAM,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAChE,KAAK,IAAI;AACZ,cAAM,YACJ,MAAM,SAAS,IACX;AAAA,IAAO,MAAM,IAAI,QAAG,CAAC,IAAI,MAAM,IAAI,OAAO,MAAM,SAAS,CAAC,aAAa,CAAC,KACxE;AAEN,eAAO;AAAA,UACL;AAAA,UACA,KAAK,MAAM,IAAI,MAAM,KAAK,EAAE,KAAK,wBAAmB,CAAC,KAAK,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE,8BAA8B,CAAC;AAAA,UACnH,KAAK,MAAM,IAAI,MAAM,CAAC;AAAA,UACtB;AAAA,UACA;AAAA,UACA,KAAK,MAAM,IAAI,MAAM,CAAC;AAAA,UACtB;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc;AAIpB,SAAO,IAAI;AAAA,IACT,YAAY;AAAA,MACV,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,KAAK;AAAA,IACP,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEA,IAAM,SAAS,eAAe;AAGvB,SAAS,eAAe,SAAyB;AACtD,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO;AAC5B,QAAM,WAAW,OAAO,MAAM,OAAO;AACrC,SAAO,OAAO,aAAa,WAAW,SAAS,QAAQ,IAAI;AAC7D;AAuBO,SAAS,YAAY,EAAE,QAAQ,GAAiB;AACrD,QAAM,SAAS,qBAAqB,OAAO;AAC3C,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,SACE,gBAAAC,MAACC,MAAA,EACC;AAAA,oBAAAD,MAACE,OAAA,EAAK,OAAO,MAAM,KAAK,KAAK,MAAI,MAC9B;AAAA;AAAA,MAAO;AAAA,OACV;AAAA,IACA,gBAAAF,MAACE,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MACP,OAAO;AAAA,MAAO;AAAA,MAAiB,OAAO,SAAS,IAAI,MAAM;AAAA,MAAG;AAAA,OACpE;AAAA,KACF;AAEJ;AAEO,SAAS,uBAAuB,SAAyB;AAC9D,QAAM,SAAS,qBAAqB,OAAO;AAC3C,aAAW,SAAS,QAAQ;AAC1B,yBAAqB,KAAK;AAAA,EAC5B;AACA,SAAO,OAAO;AAChB;;;ADqBQ,SAIA,OAAAC,MAJA,QAAAC,aAAA;AAlIR,IAAM,MAAM;AAEZ,SAAS,MAAM,OAAe,OAAuB;AACnD,SACE,MACAC,OAAM,IAAI,MAAM,KAAK,GAAG,EAAE,KAAK,KAAK,IACpCA,OAAM,IAAI,MAAM,KAAK,KAAK,EAAE,IAAI,IAChCA,OAAM,IAAI,MAAM,KAAK,KAAK,EAAE,KAAK;AAErC;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MAAMA,OAAM,IAAI,MAAM,KAAK,EAAE,KAAK,OAAO,KAAK,MAAM;AAC7D;AAEA,SAAS,cAAc,SAA2B;AAChD,QAAM,WAAW,eAAe,OAAO;AACvC,MAAI,CAAC,SAAU,QAAO,CAAC;AACvB,SAAO,SAAS,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,MAAM,IAAI;AACtD;AAGA,SAAS,kBACP,MACA,UACA,YACA,SACA,YACU;AACV,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,MAAM,MAAM,KAAK,EAAE,CAAC;AAC/B,QAAM,KAAK,MAAM,QAAQ,KAAK,IAAI,CAAC;AACnC,QAAM,KAAK,MAAM,UAAU,KAAK,MAAM,CAAC;AACvC,QAAM,KAAK,MAAM,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe,CAAC,CAAC;AACtE,QAAM,KAAK,MAAM,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe,CAAC,CAAC;AACtE,MAAI,KAAK,SAAU,OAAM,KAAK,MAAM,UAAU,KAAK,QAAQ,CAAC;AAG5D,QAAM,UACJ,SAAS,SAAS,KAAK,WAAW,SAAS,KAAK,QAAQ,SAAS,KAAK,WAAW,SAAS;AAC5F,MAAI,SAAS;AACX,UAAM,KAAK,cAAc,cAAc,CAAC;AACxC,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM;AAAA,QACJ,MACEA,OAAM,IAAI,MAAM,OAAO,KAAK,EAAE,KAAK,cAAc,IACjDA,OAAM,IAAI,MAAM,KAAK,KAAK,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MACpE;AAAA,IACF;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM;AAAA,QACJ,MACEA,OAAM,IAAI,MAAM,OAAO,KAAK,EAAE,KAAK,UAAU,IAC7CA,OAAM,IAAI,MAAM,KAAK,KAAK,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MACtE;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM;AAAA,QACJ,MACEA,OAAM,IAAI,MAAM,OAAO,GAAG,EAAE,KAAK,cAAc,IAC/CA,OAAM,IAAI,MAAM,KAAK,KAAK,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MACnE;AAAA,IACF;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM;AAAA,QACJ,MACEA,OAAM,IAAI,MAAM,OAAO,OAAO,EAAE,KAAK,cAAc,IACnDA,OAAM,IAAI,MAAM,KAAK,KAAK,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MACtE;AAAA,IACF;AACA,UAAM,KAAK,MAAMA,OAAM,IAAI,gCAAgC,CAAC;AAAA,EAC9D;AAGA,QAAM,KAAK,cAAc,aAAa,CAAC;AACvC,MAAI,KAAK,YAAY,KAAK,GAAG;AAC3B,UAAM,KAAK,GAAG,cAAc,KAAK,WAAW,CAAC;AAAA,EAC/C,OAAO;AACL,UAAM,KAAK,MAAMA,OAAM,IAAI,gBAAgB,CAAC;AAAA,EAC9C;AAGA,MAAI,KAAK,eAAe,KAAK,GAAG;AAC9B,UAAM,KAAK,cAAc,iBAAiB,CAAC;AAC3C,UAAM,KAAK,GAAG,cAAc,KAAK,cAAc,CAAC;AAAA,EAClD;AAGA,MAAI,KAAK,uBAAuB,KAAK,GAAG;AACtC,UAAM,KAAK,cAAc,cAAc,CAAC;AACxC,UAAM,KAAK,GAAG,cAAc,KAAK,sBAAsB,CAAC;AAAA,EAC1D;AAEA,SAAO;AACT;AAGA,IAAM,eAAe;AAEd,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,aAAa,CAAC;AAAA,EACd,UAAU,CAAC;AAAA,EACX,aAAa,CAAC;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AACjB,GAAU;AACR,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,UAAU,GAAG,KAAK,WAAW;AAAA,EAAK,KAAK,cAAc;AAAA,EAAK,KAAK,sBAAsB;AAE3F,QAAM,eAAe;AAAA,IACnB,MAAM,kBAAkB,MAAM,UAAU,YAAY,SAAS,UAAU;AAAA,IACvE,CAAC,MAAM,UAAU,YAAY,SAAS,UAAU;AAAA,EAClD;AAEA,QAAM,iBAAiB,KAAK,IAAI,IAAI,OAAO,OAAO,IAAI,OAAO,OAAO,MAAM,YAAY;AACtF,QAAM,eAAe,aAAa,MAAM,cAAc,eAAe,cAAc;AAEnF,SACE,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAa,YAAY,MAAM,cAAc,MAAM;AAAA,MAGnD;AAAA,wBAAAF,MAACE,MAAA,EAAI,KAAK,GACR;AAAA,0BAAAF,MAACG,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UACA,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,IAAI,eAAC;AAAA,UACxB,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,gBAAgB,MAAI,MACpC,eAAK,MACR;AAAA,UACA,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,IAAI,eAAC;AAAA,UACvB,eAAe,KAAK,gBAAAH,MAACG,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,YAAG;AAAA,aAAa;AAAA,WACtD;AAAA,QAGA,gBAAAJ,KAACI,OAAA,EAAM,uBAAa,KAAK,IAAI,GAAE;AAAA,QAE/B,gBAAAJ,KAACG,MAAA,EAAI,UAAU,GAAG;AAAA,QAGlB,gBAAAH,KAACG,MAAA,EAAI,UAAU,GACb,0BAAAH,KAAC,eAAY,SAAS,SAAS,GACjC;AAAA;AAAA;AAAA,EACF;AAEJ;;;AG1KA,SAAS,YAAAK,WAAU,mBAAmB;AACtC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;;;ACDpC,SAAS,iBAAAC,gBAAe,cAAc,YAAY,eAAAC,oBAAmB;AACrE,SAAS,QAAAC,aAAY;AACrB,SAAS,UAAAC,eAAc;AACvB,SAAS,iBAAiB;AAE1B,SAAS,YAAoB;AAC3B,SAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK;AAC3D;AAEO,SAAS,aAAa,SAAiB,UAAiC;AAC7E,QAAM,MAAMF,aAAYC,MAAKC,QAAO,GAAG,OAAO,CAAC;AAC/C,QAAM,WAAWD,MAAK,KAAK,QAAQ;AAEnC,EAAAF,eAAc,UAAU,SAAS,OAAO;AAExC,QAAM,SAAS,UAAU;AACzB,QAAM,SAAS,UAAU,QAAQ,CAAC,QAAQ,GAAG;AAAA,IAC3C,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AAED,MAAI,OAAO,WAAW,GAAG;AACvB,QAAI;AACF,iBAAW,QAAQ;AAAA,IACrB,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,aAAa,UAAU,OAAO;AAC7C,eAAW,QAAQ;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACrCA,SAAS,gBAAgB;AACzB,SAAS,OAAAI,MAAK,QAAAC,OAAM,UAAU,aAAAC,kBAAiB;AAwKvC,SA8DQ,UAjDN,OAAAC,MAbF,QAAAC,aAAA;AAlKR,IAAM,kBAAkB,OAAO,OAAO,gBAAgB;AAEtD,IAAM,iBAAyC;AAAA,EAC7C,CAAC,eAAe,MAAM,GAAG,MAAM,OAAO;AAAA,EACtC,CAAC,eAAe,SAAS,GAAG,MAAM,OAAO;AAAA,EACzC,CAAC,eAAe,UAAU,GAAG,MAAM,OAAO;AAAA,EAC1C,CAAC,iBAAiB,SAAS,GAAG,MAAM,OAAO;AAC7C;AAiBO,SAAS,WAAW,EAAE,OAAO,YAAY,kBAAkB,WAAW,SAAS,GAAU;AAC9F,QAAM,EAAE,OAAO,IAAIC,WAAU;AAC7B,QAAM,aAAa,OAAO,OAAO,IAAI,OAAO,OAAO;AACnD,QAAM,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;AAE9C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwC,MAAM;AAC5E,UAAM,MAAM,oBAAI,IAA8B;AAC9C,QAAI,kBAAkB;AACpB,iBAAW,OAAO,kBAAkB;AAClC,YAAI,IAAI,IAAI,IAAI,GAAG;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM;AACpC,QAAI,YAAY,IAAI,EAAE,EAAE,EAAG,QAAO;AAClC,QAAI,CAAC,YAAY,KAAK,EAAG,QAAO;AAChC,UAAM,IAAI,YAAY,YAAY;AAClC,WACE,EAAE,GAAG,YAAY,EAAE,SAAS,CAAC,KAC7B,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,KAC/B,EAAE,YAAY,YAAY,EAAE,SAAS,CAAC;AAAA,EAE1C,CAAC;AAGD,MAAI,YAAY;AAChB,MAAI,eAAe,YAAY,YAAY;AACzC,gBAAY,cAAc,aAAa;AAAA,EACzC;AACA,MAAI,cAAc,WAAW;AAC3B,gBAAY;AAAA,EACd;AACA,QAAM,UAAU,UAAU,MAAM,WAAW,YAAY,UAAU;AAEjE,WAAS,CAAC,OAAO,QAAQ;AAEvB,QAAI,aAAa;AACf,UAAI,IAAI,QAAQ;AACd,uBAAe,KAAK;AACpB;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,uBAAe,KAAK;AACpB,uBAAe,CAAC;AAChB;AAAA,MACF;AACA,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,uBAAe,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;AACpC,uBAAe,CAAC;AAChB;AAAA,MACF;AACA,UAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AACnC,uBAAe,CAAC,MAAM,IAAI,KAAK;AAC/B,uBAAe,CAAC;AAChB;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,qBAAe,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AACxC;AAAA,IACF;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,qBAAe,CAAC,MAAM,KAAK,IAAI,UAAU,SAAS,GAAG,IAAI,CAAC,CAAC;AAC3D;AAAA,IACF;AAIA,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,YAAM,OAAO,UAAU,WAAW;AAClC,UAAI,CAAC,KAAM;AACX,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,cAAM,QAAQ,KAAK,IAAI,KAAK,EAAE;AAC9B,YAAI,CAAC,OAAO;AAEV,eAAK,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,MAAM,eAAe,OAAO,CAAC;AAAA,QACjF,OAAO;AAEL,gBAAM,MAAM,gBAAgB,QAAQ,MAAM,IAAsB;AAChE,cAAI,MAAM,gBAAgB,SAAS,GAAG;AACpC,kBAAM,WAAW,gBAAgB,MAAM,CAAC,KAAK,eAAe;AAC5D,iBAAK,IAAI,KAAK,IAAI,EAAE,GAAG,OAAO,MAAM,SAAS,CAAC;AAAA,UAChD,OAAO;AAEL,iBAAK,OAAO,KAAK,EAAE;AAAA,UACrB;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,QAAI,UAAU,KAAK;AACjB,YAAM,OAAO,UAAU,WAAW;AAClC,UAAI,CAAC,KAAM;AACX,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,OAAO,KAAK,EAAE;AACnB,eAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,QAAI,UAAU,KAAK;AACjB,qBAAe,IAAI;AACnB,qBAAe,EAAE;AACjB;AAAA,IACF;AAGA,QAAI,IAAI,QAAQ;AACd,gBAAU,MAAM,KAAK,SAAS,OAAO,CAAC,CAAC;AACvC;AAAA,IACF;AAGA,QAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,eAAS;AACT;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAAS,aAAY,QAAO,aAAa,MAAM,aAAa,UAAU,GAEvF;AAAA,oBAAAF,MAACE,MAAA,EAAI,KAAK,GACR;AAAA,sBAAAF,MAACG,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,QAAI;AAAA,SAEP;AAAA,MACA,gBAAAH,MAACG,OAAA,EAAK,OAAO,MAAM,cAAc,MAAI,MAClC;AAAA;AAAA,QAAI;AAAA,QACH,SAAS;AAAA,QAAK;AAAA,SAClB;AAAA,OACF;AAAA,IAGC,cACC,gBAAAH,MAACE,MAAA,EAAI,aAAY,SAAQ,aAAa,MAAM,QAAQ,UAAU,GAC5D;AAAA,sBAAAH,KAACI,OAAA,EAAK,OAAO,MAAM,QAAQ,eAAC;AAAA,MAC5B,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,QAAS,uBAAY;AAAA,MACxC,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,eAAe,eAAC;AAAA,OACrC,IACE,cACF,gBAAAJ,KAACG,MAAA,EAAI,UAAU,GACb,0BAAAF,MAACG,OAAA,EAAK,OAAO,MAAM,aAAa;AAAA;AAAA,MAAE;AAAA,OAAY,GAChD,IACE;AAAA,IAGJ,gBAAAJ,KAACG,MAAA,EAAI,UAAU,GACb,0BAAAF,MAACG,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC;AAAA;AAAA,MACA,MAAM,OAAO,CAAC;AAAA,MACd,KAAK,OAAO,EAAE;AAAA,MACd,WAAW,OAAO,EAAE;AAAA,MACpB,SAAS,OAAO,EAAE;AAAA,MAClB;AAAA,OACH,GACF;AAAA,IAGC,UAAU,WAAW,IACpB,gBAAAJ,KAACG,MAAA,EAAI,UAAU,GAAG,UAAU,GAC1B,0BAAAH,KAACI,OAAA,EAAK,UAAQ,MAAC,uCAAyB,GAC1C,IAEA,QAAQ,IAAI,CAAC,MAAM,MAAM;AACvB,YAAM,cAAc,YAAY;AAChC,YAAM,WAAW,gBAAgB;AACjC,YAAM,QAAQ,SAAS,IAAI,KAAK,EAAE;AAClC,YAAM,YAAY,CAAC,CAAC;AACpB,YAAM,YAAY,YAAY,QAAQ;AACtC,YAAM,UAAU,QAAS,eAAe,MAAM,IAAI,KAAK,MAAM,OAAQ;AACrE,YAAM,WAAW,QAAS,eAAe,MAAM,IAAI,KAAK,MAAM,MAAM,KAAM,MAAM,MAAM;AAEtF,aACE,gBAAAJ,KAACG,MAAA,EAAkB,UAAU,GAC1B,qBACC,gBAAAF,MAACG,OAAA,EAAK,iBAAiB,MAAM,MAAM,UAAU,OAAO,MAAM,MAAM,UAAU,MAAI,MAC3E;AAAA;AAAA,QACA,UAAU,OAAO,CAAC;AAAA,QAClB,KAAK,GAAG,OAAO,EAAE;AAAA,QACjB,QAAQ,OAAO,EAAE;AAAA,QACjB,KAAK,OAAO,OAAO,EAAE;AAAA,QACrB,KAAK;AAAA,SACR,IAEA,gBAAAH,MAAA,YACE;AAAA,wBAAAD,KAACI,OAAA,EAAM,gBAAK;AAAA,QACZ,gBAAAJ,KAACI,OAAA,EAAK,OAAO,YAAY,MAAM,OAAO,QAAQ,MAAM,MAAM,IACvD,oBAAU,OAAO,CAAC,GACrB;AAAA,QACA,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,KAAK,OAAQ,eAAK,GAAG,OAAO,EAAE,GAAE;AAAA,QACnD,gBAAAJ,KAACI,OAAA,EAAK,OAAO,UAAW,kBAAQ,OAAO,EAAE,GAAE;AAAA,QAC3C,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,OAAO,WAAY,eAAK,OAAO,OAAO,EAAE,GAAE;AAAA,QAC7D,gBAAAJ,KAACI,OAAA,EAAK,OAAO,MAAM,MAAM,IAAK,eAAK,MAAK;AAAA,SAC1C,KApBM,KAAK,EAsBf;AAAA,IAEJ,CAAC;AAAA,IAGH,gBAAAJ,KAACG,MAAA,EAAI,UAAU,GAAG;AAAA,IAGjB,UAAU,SAAS,cAClB,gBAAAH,KAACG,MAAA,EAAI,gBAAe,YAAW,cAAc,GAC3C,0BAAAF,MAACG,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MACX,YAAY;AAAA,MAAE;AAAA,MAAE,KAAK,IAAI,YAAY,YAAY,UAAU,MAAM;AAAA,MAAE;AAAA,MAAE,UAAU;AAAA,MAAO;AAAA,OAE1F,GACF;AAAA,IAID,SAAS,OAAO,KACf,gBAAAH,MAACE,MAAA,EAAI,UAAU,GAAG,eAAc,UAC9B;AAAA,sBAAAH,KAACI,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MAAC,uBAExC;AAAA,MACA,gBAAAJ,KAACG,MAAA,EACC,0BAAAH,KAACI,OAAA,EACE,gBAAM,KAAK,SAAS,OAAO,CAAC,EAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,eAAe,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,EAC1D,KAAK,IAAI,GACd,GACF;AAAA,OACF;AAAA,IAIF,gBAAAJ,KAACG,MAAA,EAAI,UAAU,GACb,0BAAAF,MAACG,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MACyB;AAAA,MAAK;AAAA,MAAa;AAAA,MAAK;AAAA,MAAa;AAAA,MAAK;AAAA,MAAY;AAAA,MAC1F;AAAA,MAAK;AAAA,OACR,GACF;AAAA,KACF;AAEJ;;;AFhGM,gBAAAC,MAqBE,QAAAC,aArBF;AArJN,IAAM,SAAkB;AAAA,EACtB,EAAE,OAAO,QAAQ,KAAK,QAAQ,MAAM,SAAS;AAAA,EAC7C,EAAE,OAAO,QAAQ,KAAK,QAAQ,MAAM,UAAU,SAAS,YAAY;AAAA,EACnE,EAAE,OAAO,UAAU,KAAK,UAAU,MAAM,UAAU,SAAS,cAAc;AAAA,EACzE,EAAE,OAAO,cAAc,KAAK,aAAa,MAAM,SAAS;AAAA,EACxD,EAAE,OAAO,eAAe,KAAK,eAAe,MAAM,UAAU,gBAAgB,iBAAiB;AAAA,EAC7F;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB;AACF;AAEO,SAAS,SAAS,EAAE,aAAa,UAAU,aAAa,QAAQ,SAAS,GAAU;AACxF,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,CAAC;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiC;AAAA,IAC3D,MAAM,aAAa,QAAQ;AAAA,IAC3B,MAAM,aAAa,QAAQ,SAAS;AAAA,IACpC,QAAQ,aAAa,UAAU,WAAW;AAAA,IAC1C,aAAa,aAAa,eAAe;AAAA,IACzC,gBAAgB,aAAa,kBAAkB;AAAA,IAC/C,wBAAwB,aAAa,0BAA0B;AAAA,EACjE,CAAC;AACD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,eAAe,CAAC,CAAC;AAE9D,QAAM,eAAe,OAAO,UAAU;AAEtC,QAAM,eAAe;AAAA,IACnB,CAACC,WAAiB;AAChB,sBAAgB,IAAI;AACpB,iBAAW,MAAM;AACf,cAAM,UAAU,OAAOA,OAAM,GAAG,KAAK;AACrC,cAAM,SAAS,aAAa,SAASA,OAAM,kBAAkB,GAAGA,OAAM,GAAG,KAAK;AAC9E,YAAI,WAAW,MAAM;AACnB,oBAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAACA,OAAM,GAAG,GAAG,OAAO,EAAE;AAAA,QAClD;AACA,wBAAgB,KAAK;AAAA,MACvB,GAAG,EAAE;AAAA,IACP;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,sBAAsB,YAAY,CAAC,aAAiC;AACxE,kBAAc,QAAQ;AACtB,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,YAAY,MAAM;AAC3C,oBAAgB,KAAK;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,gBAAgB,aAAc;AAElC,UAAI,IAAI,QAAQ;AACd,iBAAS;AACT;AAAA,MACF;AAEA,UAAI,CAAC,aAAc;AAEnB,UAAI,IAAI,KAAK;AACX,YAAI,IAAI,OAAO;AACb,wBAAc,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QACzC,OAAO;AACL,wBAAc,CAAC,MAAM,KAAK,IAAI,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,QACzD;AACA;AAAA,MACF;AAEA,UAAI,UAAU,OAAO,IAAI,MAAM;AAC7B,cAAM,UAAU,OAAO,MAAM;AAC7B,YAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,GAAG;AACjD,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa,OAAO,aAAa,KAAK;AAAA,YACtC,MAAM,OAAO,MAAM,KAAK,SAAS;AAAA,YACjC,QAAQ,OAAO,QAAQ,KAAK,WAAW;AAAA,YACvC,gBAAgB,OAAO,gBAAgB,KAAK;AAAA,YAC5C,wBAAwB,OAAO,wBAAwB,KAAK;AAAA,YAC5D,WAAW,WAAW,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,EAAE;AAAA,UAC/D,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,UAAI,aAAa,SAAS,UAAU;AAClC,cAAM,eAAe,OAAO,aAAa,GAAG,KAAK;AACjD,YAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,oBAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,aAAa,MAAM,GAAG,EAAE,EAAE,EAAE;AAAA,QAC5E,WAAW,IAAI,QAAQ;AACrB,wBAAc,CAAC,MAAM,KAAK,IAAI,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,QACzD,WAAW,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AAC1C,oBAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,eAAe,MAAM,EAAE;AAAA,QACvE;AAAA,MACF;AAEA,UAAI,aAAa,SAAS,UAAU;AAClC,YAAI,IAAI,QAAQ;AACd,0BAAgB,IAAI;AAAA,QACtB,WAAW,IAAI,WAAW;AACxB,wBAAc,CAAC,MAAM,KAAK,IAAI,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,QACzD,WAAW,IAAI,SAAS;AACtB,wBAAc,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QACzC;AAAA,MACF;AAEA,UAAI,aAAa,SAAS,UAAU;AAClC,YAAI,IAAI,QAAQ;AACd,uBAAa,YAAY;AAAA,QAC3B,WAAW,IAAI,WAAW;AACxB,wBAAc,CAAC,MAAM,KAAK,IAAI,OAAO,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,QACzD,WAAW,IAAI,SAAS;AACtB,wBAAc,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QACzC;AAAA,MACF;AAEA,UAAI,aAAa,SAAS,UAAU;AAClC,cAAM,UAAU,aAAa,WAAW,CAAC;AACzC,cAAM,eAAe,OAAO,aAAa,GAAG,KAAK;AACjD,cAAM,eAAe,QAAQ,QAAQ,YAAY;AACjD,YAAI,IAAI,cAAc,IAAI,UAAU,UAAU,KAAK;AACjD,gBAAM,aAAa,eAAe,KAAK,QAAQ;AAC/C,oBAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,QAAQ,SAAS,KAAK,GAAG,EAAE;AAAA,QAC3E,WAAW,IAAI,WAAW;AACxB,gBAAM,aAAa,eAAe,IAAI,QAAQ,UAAU,QAAQ;AAChE,oBAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,QAAQ,SAAS,KAAK,GAAG,EAAE;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa;AAAA,EAC7C;AAGA,MAAI,cAAc;AAChB,UAAM,gBAA8C,cAChD,EAAE,YAAY,oBAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,IACxC,CAAC;AACL,WACE,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACN,GAAG;AAAA,QACJ,kBAAkB;AAAA,QAClB,WAAW;AAAA,QACX,UAAU;AAAA;AAAA,IACZ;AAAA,EAEJ;AAEA,QAAM,SAAS,gBAAgB;AAG/B,QAAM,aACJ,WAAW,SAAS,IAChB,WAAW,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,eAAe,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,IAChF;AAEN,SACE,gBAAAC,MAACI,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,aAAY,QAAO,aAAa,MAAM,aAC7E;AAAA,oBAAAL,KAACK,MAAA,EAAI,KAAK,GACR,0BAAAJ,MAACK,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,MACA,SAAS,SAAS;AAAA,OACrB,GACF;AAAA,IAEA,gBAAAN,KAACK,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAChD,iBAAO,IAAI,CAACF,QAAO,MAAM;AACxB,YAAM,YAAY,MAAM;AACxB,YAAM,QAAQA,OAAM,QAAQ,cAAc,aAAc,OAAOA,OAAM,GAAG,KAAK;AAC7E,YAAM,eAAe;AAErB,aACE,gBAAAF,MAACI,MAAA,EAAoB,KAAK,GACxB;AAAA,wBAAAJ,MAACK,OAAA,EAAK,OAAO,YAAY,MAAM,OAAO,QAAQ,MAAM,KAAK,KAAK,MAAM,WACjE;AAAA,sBAAY,MAAM;AAAA,UAAI;AAAA,UAAEH,OAAM,MAAM,OAAO,EAAE;AAAA,WAChD;AAAA,QAECA,OAAM,SAAS,YACd,gBAAAF,MAACK,OAAA,EAAK,OAAO,YAAY,MAAM,KAAK,QAAQ,MAAM,MAAM,IACrD;AAAA;AAAA,UACA,YAAY,gBAAAN,KAACM,OAAA,EAAK,OAAO,MAAM,gBAAgB,eAAC,IAAU;AAAA,WAC7D;AAAA,QAGDH,OAAM,SAAS,YACd,gBAAAF,MAACK,OAAA,EACE;AAAA,yBACC,gBAAAN,KAACM,OAAA,EAAK,OAAO,MAAM,OAAO,OACvB,uBAAa,SAAS,KAAK,aAAa,MAAM,GAAG,EAAE,IAAI,QAAQ,cAClE,IAEA,gBAAAN,KAACM,OAAA,EAAK,UAAQ,MAAE,sBAAY,0BAA0B,QAAO;AAAA,UAE9D,aAAa,gBAAAN,KAACM,OAAA,EAAK,OAAO,MAAM,KAAK,KAAK,mCAAqB;AAAA,WAClE;AAAA,QAGDH,OAAM,SAAS,YACd,gBAAAF,MAACK,OAAA,EACE;AAAA,yBACC,gBAAAL,MAACK,OAAA,EAAK,OAAO,MAAM,OAAO,OACvB;AAAA,yBAAa,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE;AAAA,YACxC,aAAa,SAAS,MAAM,aAAa,SAAS,IAAI,IAAI,QAAQ;AAAA,aACrE,IAEA,gBAAAN,KAACM,OAAA,EAAK,UAAQ,MAAE,sBAAY,gBAAgB,SAAQ;AAAA,UAErD,aAAa,gBAAAN,KAACM,OAAA,EAAK,OAAO,MAAM,KAAK,KAAK,+BAAiB;AAAA,WAC9D;AAAA,QAGDH,OAAM,SAAS,YACd,gBAAAF,MAACK,OAAA,EAAK,OAAO,YAAY,MAAM,KAAK,QAAQ,MAAM,MAAM,IACrD;AAAA,sBAAY,OAAO;AAAA,UACnB;AAAA,UACA,YAAY,OAAO;AAAA,WACtB;AAAA,WA5CMH,OAAM,GA8ChB;AAAA,IAEJ,CAAC,GACH;AAAA,IAEA,gBAAAH,KAACK,MAAA,EAAI,UAAU,GAAG;AAAA,IAElB,gBAAAL,KAACK,MAAA,EAAI,UAAU,GACb,0BAAAL,KAACM,OAAA,EAAK,UAAQ,MAAC,sEAAwD,GACzE;AAAA,IACC,gBACC,gBAAAN,KAACK,MAAA,EAAI,UAAU,GACb,0BAAAL,KAACM,OAAA,EAAK,OAAO,MAAM,MAAM,MAAM,MAAI,MAAC,qDAEpC,GACF;AAAA,KAEJ;AAEJ;;;AG/RA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AA8D5B,SAWA,OAAAC,MAXA,QAAAC,aAAA;AAjDD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAAS,MAAM;AACvD,QAAI,CAAC,cAAe,QAAO;AAC3B,UAAM,MAAM,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,cAAc,EAAE;AAC/D,WAAO,OAAO,IAAI,MAAM;AAAA,EAC1B,CAAC;AAED,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,eAAS;AACT;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AACd,YAAM,UAAU,SAAS,aAAa;AACtC,UAAI,SAAS;AACX,iBAAS,OAAO;AAAA,MAClB;AACA;AAAA,IACF;AACA,QAAI,UAAU,KAAK;AACjB,eAAS;AACT;AAAA,IACF;AACA,QAAI,UAAU,KAAK;AACjB,YAAM,UAAU,SAAS,aAAa;AACtC,UAAI,SAAS;AACX,qBAAa,OAAO;AAAA,MACtB;AACA;AAAA,IACF;AACA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,uBAAiB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,IAC5C;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,uBAAiB,CAAC,MAAM,KAAK,IAAI,SAAS,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,SACE,gBAAAF,MAACG,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,aAAY,QAAO,aAAa,MAAM,aAE7E;AAAA,oBAAAH,MAACG,MAAA,EAAI,KAAK,GACR;AAAA,sBAAAH,MAACI,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,QAAI;AAAA,SAEP;AAAA,MACA,gBAAAJ,MAACI,OAAA,EAAK,OAAO,MAAM,cAAc,MAAI,MAAC;AAAA;AAAA,QAClC,SAAS;AAAA,QAAO;AAAA,SACpB;AAAA,OACF;AAAA,IAGA,gBAAAJ,MAACG,MAAA,EAAI,UAAU,GACb;AAAA,sBAAAJ,KAACK,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC,mBAAS,OAAO,EAAE,GACrB;AAAA,MACA,gBAAAL,KAACK,OAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MAAC,yBAExC;AAAA,OACF;AAAA,IAEC,SAAS,WAAW,IACnB,gBAAAL,KAACI,MAAA,EAAI,UAAU,GAAG,UAAU,GAC1B,0BAAAJ,KAACK,OAAA,EAAK,OAAO,MAAM,IAAI,mDAA+C,GACxE,IAEA,SAAS,IAAI,CAAC,SAAS,MAAM;AAC3B,YAAM,aAAa,MAAM;AACzB,YAAM,WAAW,QAAQ,OAAO,eAAe;AAE/C,YAAM,eAAe,WAAW,MAAM;AACtC,YAAM,gBAAgB,QAAQ,YAAY,MAAM;AAChD,YAAM,SAAS,GAAG,YAAY,GAAG,aAAa;AAE9C,UAAI,YAAY;AACd,eACE,gBAAAL,KAACI,MAAA,EAAqB,UAAU,GAC9B,0BAAAH,MAACI,OAAA,EAAK,iBAAiB,MAAM,MAAM,UAAU,OAAO,MAAM,MAAM,UAAU,MAAI,MAC3E;AAAA;AAAA,UAAO;AAAA,UAAE,QAAQ,KAAK,OAAO,EAAE;AAAA,UAC/B,QAAQ;AAAA,WACX,KAJQ,QAAQ,EAKlB;AAAA,MAEJ;AAEA,aACE,gBAAAJ,MAACG,MAAA,EAAqB,UAAU,GAC9B;AAAA,wBAAAH,MAACI,OAAA,EAAK,OAAO,WAAW,MAAM,OAAO,WAAW,MAAM,MAAM,IACzD;AAAA;AAAA,UAAO;AAAA,UAAE,QAAQ,KAAK,OAAO,EAAE;AAAA,WAClC;AAAA,QACA,gBAAAL,KAACK,OAAA,EAAK,UAAQ,MAAE,kBAAQ,aAAY;AAAA,WAJ5B,QAAQ,EAKlB;AAAA,IAEJ,CAAC;AAAA,IAGH,gBAAAL,KAACI,MAAA,EAAI,UAAU,GAAG;AAAA,IAElB,gBAAAJ,KAACI,MAAA,EAAI,UAAU,GACb,0BAAAJ,KAACK,OAAA,EAAK,UAAQ,MAAC,oEAAsD,GACvE;AAAA,KACF;AAEJ;;;AC5HA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AAuF9B,gBAAAC,OACE,QAAAC,aADF;AAvEN,IAAMC,UAAkB;AAAA,EACtB,EAAE,OAAO,QAAQ,KAAK,QAAQ,MAAM,SAAS;AAAA,EAC7C,EAAE,OAAO,OAAO,KAAK,OAAO,MAAM,SAAS;AAAA,EAC3C,EAAE,OAAO,eAAe,KAAK,eAAe,MAAM,SAAS;AAAA,EAC3D,EAAE,OAAO,WAAW,KAAK,aAAa,MAAM,SAAS;AACvD;AAEO,SAAS,YAAY,EAAE,QAAQ,SAAS,GAAU;AACvD,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,CAAC;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiC;AAAA,IAC3D,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,WAAW;AAAA,EACb,CAAC;AAED,QAAM,eAAeD,QAAO,UAAU;AAEtC,EAAAE,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,eAAS;AACT;AAAA,IACF;AAEA,QAAI,CAAC,aAAc;AAEnB,QAAI,IAAI,KAAK;AACX,UAAI,IAAI,OAAO;AACb,sBAAc,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,MACzC,OAAO;AACL,sBAAc,CAAC,MAAM,KAAK,IAAIF,QAAO,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,MACzD;AACA;AAAA,IACF;AAEA,QAAI,UAAU,OAAO,IAAI,MAAM;AAC7B,YAAM,UAAU,OAAO,MAAM;AAC7B,UAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,GAAG;AACjD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,OAAO,KAAK,KAAK;AAAA,UACtB,aAAa,OAAO,aAAa,KAAK;AAAA,UACtC,WAAW,OAAO,WAAW,MAAM;AAAA,QACrC,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,aAAa,SAAS,UAAU;AAClC,YAAM,eAAe,OAAO,aAAa,GAAG,KAAK;AACjD,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,kBAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,aAAa,MAAM,GAAG,EAAE,EAAE,EAAE;AAAA,MAC5E,WAAW,IAAI,QAAQ;AACrB,sBAAc,CAAC,MAAM,KAAK,IAAIA,QAAO,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,MACzD,WAAW,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AAC1C,kBAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,aAAa,GAAG,GAAG,eAAe,MAAM,EAAE;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,aAAa,SAAS,UAAU;AAClC,UAAI,IAAI,UAAU,IAAI,cAAc,IAAI,aAAa,UAAU,KAAK;AAClE,kBAAU,CAAC,OAAO;AAAA,UAChB,GAAG;AAAA,UACH,CAAC,aAAa,GAAG,GAAG,EAAE,aAAa,GAAG,MAAM,QAAQ,OAAO;AAAA,QAC7D,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,gBAAAD,MAACI,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,aAAY,QAAO,aAAa,MAAM,aAC7E;AAAA,oBAAAL,MAACK,OAAA,EAAI,KAAK,GACR,0BAAAJ,MAACK,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,MAAI;AAAA,OAEP,GACF;AAAA,IAEA,gBAAAN,MAACK,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAChD,UAAAH,QAAO,IAAI,CAACK,QAAO,MAAM;AACxB,YAAM,YAAY,MAAM;AACxB,YAAM,QAAQ,OAAOA,OAAM,GAAG,KAAK;AAEnC,aACE,gBAAAN,MAACI,OAAA,EAAoB,KAAK,GACxB;AAAA,wBAAAJ,MAACK,QAAA,EAAK,OAAO,YAAY,MAAM,OAAO,QAAQ,MAAM,KAAK,KAAK,MAAM,WACjE;AAAA,sBAAY,MAAM;AAAA,UAAI;AAAA,UAAEC,OAAM,MAAM,OAAO,EAAE;AAAA,WAChD;AAAA,QAECA,OAAM,SAAS,YACd,gBAAAN,MAACK,QAAA,EAAK,OAAO,YAAY,MAAM,KAAK,QAAQ,MAAM,MAAM,IACrD;AAAA;AAAA,UACA,YAAY,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,gBAAgB,eAAC,IAAU;AAAA,UAC1DC,OAAM,QAAQ,SAAS,CAAC,SACvB,gBAAAP,MAACM,QAAA,EAAK,UAAQ,MAAE,sBAAY,sBAAsB,IAAG;AAAA,WAEzD;AAAA,QAGDC,OAAM,SAAS,YACd,gBAAAN,MAACK,QAAA,EAAK,OAAO,YAAY,MAAM,KAAK,QAAQ,MAAM,MAAM,IACrD;AAAA,sBAAY,OAAO;AAAA,UACnB;AAAA,UACA,YAAY,OAAO;AAAA,WACtB;AAAA,WApBMC,OAAM,GAsBhB;AAAA,IAEJ,CAAC,GACH;AAAA,IAEA,gBAAAP,MAACK,OAAA,EAAI,UAAU,GAAG;AAAA,IAElB,gBAAAL,MAACK,OAAA,EAAI,UAAU,GACb,0BAAAL,MAACM,QAAA,EAAK,UAAQ,MAAC,sEAAwD,GACzE;AAAA,KACF;AAEJ;;;ACvIA,SAAS,OAAAE,OAAK,QAAAC,cAAY;AAyEpB,SAIA,OAAAC,OAJA,QAAAC,aAAA;AAtEN,IAAM,WAAW;AAAA,EACf;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,CAAC,OAAO,SAAS;AAAA,MACjB,CAAC,OAAO,YAAY;AAAA,MACpB,CAAC,QAAQ,WAAW;AAAA,MACpB,CAAC,QAAQ,SAAS;AAAA,MAClB,CAAC,SAAS,MAAM;AAAA,MAChB,CAAC,OAAO,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,CAAC,KAAK,QAAQ;AAAA,MACd,CAAC,KAAK,MAAM;AAAA,MACZ,CAAC,KAAK,QAAQ;AAAA,MACd,CAAC,KAAK,cAAc;AAAA,MACpB,CAAC,KAAK,cAAc;AAAA,IACtB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,CAAC,UAAK,eAAe;AAAA,MACrB,CAAC,gBAAM,WAAW;AAAA,MAClB,CAAC,KAAK,aAAa;AAAA,MACnB,CAAC,KAAK,gBAAgB;AAAA,MACtB,CAAC,UAAK,eAAe;AAAA,MACrB,CAAC,cAAS,QAAQ;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,CAAC,KAAK,QAAQ;AAAA,MACd,CAAC,KAAK,eAAe;AAAA,MACrB,CAAC,KAAK,aAAa;AAAA,MACnB,CAAC,KAAK,eAAe;AAAA,IACvB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,CAAC,KAAK,aAAa;AAAA,MACnB,CAAC,KAAK,YAAY;AAAA,MAClB,CAAC,SAAS,YAAY;AAAA,MACtB,CAAC,OAAO,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,CAAC,KAAK,UAAU;AAAA,MAChB,CAAC,KAAK,MAAM;AAAA,MACZ,CAAC,KAAK,MAAM;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,cAAc;AAC5B,SACE,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,UAAU;AAAA,MAEV;AAAA,wBAAAD,MAACE,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,UAAI;AAAA,WAEP;AAAA,QACA,gBAAAH,MAACG,QAAA,EAAK,eAAC;AAAA,QACP,gBAAAH,MAACE,OAAA,EAAI,eAAc,OAAM,KAAK,GAC3B,mBAAS,IAAI,CAAC,YACb,gBAAAD,MAACC,OAAA,EAAwB,eAAc,UACrC;AAAA,0BAAAF,MAACG,QAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC,kBAAQ,OACX;AAAA,UACC,QAAQ,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,MAC3B,gBAAAF,MAACC,OAAA,EAAc,KAAK,GAClB;AAAA,4BAAAD,MAACE,QAAA,EAAK,OAAO,MAAM,KAAK,KAAK,MAAI,MAC9B;AAAA;AAAA,eACC,OAAO,IAAI,OAAO,CAAC;AAAA,cACpB;AAAA,eACH;AAAA,YACA,gBAAAH,MAACG,QAAA,EAAK,UAAQ,MAAE,gBAAK;AAAA,eANb,GAOV,CACD;AAAA,aAbO,QAAQ,KAclB,CACD,GACH;AAAA,QACA,gBAAAH,MAACG,QAAA,EAAK,eAAC;AAAA,QACP,gBAAAH,MAACG,QAAA,EAAK,UAAQ,MAAC,oCAAsB;AAAA;AAAA;AAAA,EACvC;AAEJ;;;ACrGA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAkBpB,gBAAAC,OAIA,QAAAC,cAJA;AAVC,SAAS,cAAc,EAAE,KAAK,GAAU;AAC7C,SACE,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM,OAAO;AAAA,MAC1B,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,wBAAAF,MAACG,QAAA,EAAK,OAAO,MAAM,OAAO,OAAO,MAAI,MAClC,sBACH;AAAA,QACA,gBAAAH,MAACG,QAAA,EAAK,eAAC;AAAA,QACP,gBAAAF,OAACE,QAAA,EAAK,OAAO,MAAM,OAAO,IAAI;AAAA;AAAA,UAAmB,KAAK;AAAA,UAAK;AAAA,WAAO;AAAA,QAClE,gBAAAH,MAACG,QAAA,EAAK,eAAC;AAAA,QACP,gBAAAF,OAACC,OAAA,EAAI,KAAK,GACR;AAAA,0BAAAF,MAACE,OAAA,EACC,0BAAAF;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,iBAAiB,MAAM,OAAO;AAAA,cAC9B,OAAO,MAAM,OAAO;AAAA,cACpB,MAAI;AAAA,cAEH;AAAA;AAAA,UACH,GACF;AAAA,UACA,gBAAAH,MAACE,OAAA,EACC,0BAAAF,MAACG,QAAA,EAAK,iBAAiB,MAAM,OAAO,UAAU,OAAO,MAAM,OAAO,UAC/D,yBACH,GACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC1CA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AA8BlB,SAOA,YAAAC,WACE,OAAAC,OARF,QAAAC,cAAA;AAdR,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,aAAa,gBAAgB;AACnC,QAAM,cAAc,aAAa,KAAK,MAAM,KAAK,MAAM,MAAM;AAC7D,SACE,gBAAAD,MAACE,OAAA,EACE,uBACC,gBAAAD,OAACE,QAAA,EAAK,iBAAiB,MAAM,MAAM,UAAU,OAAO,MAAM,MAAM,UAAU,MAAI,MAC3E;AAAA;AAAA,IACA,KAAK,GAAG,OAAO,EAAE;AAAA,IACjB,KAAK,OAAO,OAAO,EAAE;AAAA,IACrB,KAAK;AAAA,KACR,IAEA,gBAAAF,OAAAF,WAAA,EACE;AAAA,oBAAAC,MAACG,QAAA,EAAM,gBAAK;AAAA,IACZ,gBAAAH,MAACG,QAAA,EAAK,OAAO,MAAM,KAAK,OAAQ,eAAK,GAAG,OAAO,EAAE,GAAE;AAAA,IACnD,gBAAAH,MAACG,QAAA,EAAK,OAAO,aAAc,eAAK,OAAO,OAAO,EAAE,GAAE;AAAA,IAClD,gBAAAH,MAACG,QAAA,EAAK,OAAO,MAAM,MAAM,IAAK,eAAK,MAAK;AAAA,KAC1C,KAdM,KAAK,EAgBf;AAEJ;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,MAAI,SAAS;AACb,QAAM,iBAAiB;AACvB,YAAU,SAAS;AACnB,QAAM,mBAAmB;AACzB,YAAU,WAAW;AACrB,QAAM,gBAAgB;AACtB,YAAU,QAAQ;AAClB,QAAM,mBAAmB;AAEzB,SACE,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,aAAY,QAAO,aAAa,MAAM,aAE7E;AAAA,oBAAAD,OAACC,OAAA,EAAI,KAAK,GACR;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,QAAI;AAAA,SAEP;AAAA,MACA,gBAAAH,MAACG,QAAA,EAAK,OAAO,MAAM,IAAI,eAAC;AAAA,MACxB,gBAAAH,MAACG,QAAA,EAAK,OAAO,MAAM,gBAAgB,MAAI,MACpC,eAAK,MACR;AAAA,MACA,gBAAAH,MAACG,QAAA,EAAK,OAAO,MAAM,IAAI,eAAC;AAAA,OAC1B;AAAA,IAGA,gBAAAF,OAACC,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,YAAY,GACnD;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MAAC;AAAA;AAAA,QACzB,SAAS;AAAA,QAAO;AAAA,SAC/B;AAAA,MACC,SAAS,WAAW,IACnB,gBAAAH,MAACG,QAAA,EAAK,UAAQ,MAAC,0BAAY,IAE3B,SAAS,IAAI,CAAC,GAAG,MACf,gBAAAH;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,aAAa,iBAAiB;AAAA,UAC9B;AAAA;AAAA,QAHK,EAAE;AAAA,MAIT,CACD;AAAA,OAEL;AAAA,IAGA,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,YAAY,GACnD;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MAAC;AAAA;AAAA,QAC7B,WAAW;AAAA,QAAO;AAAA,SAC7B;AAAA,MACC,WAAW,WAAW,IACrB,gBAAAH,MAACG,QAAA,EAAK,UAAQ,MAAC,4BAAc,IAE7B,WAAW,IAAI,CAAC,GAAG,MACjB,gBAAAH;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,aAAa,mBAAmB;AAAA,UAChC;AAAA;AAAA,QAHK,EAAE;AAAA,MAIT,CACD;AAAA,OAEL;AAAA,IAGA,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,YAAY,GACnD;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MAAC;AAAA;AAAA,QACzB,QAAQ;AAAA,QAAO;AAAA,SAC9B;AAAA,MACC,QAAQ,WAAW,IAClB,gBAAAH,MAACG,QAAA,EAAK,UAAQ,MAAC,+BAAiB,IAEhC,QAAQ,IAAI,CAAC,GAAG,MACd,gBAAAH;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,aAAa,gBAAgB;AAAA,UAC7B;AAAA;AAAA,QAHK,EAAE;AAAA,MAIT,CACD;AAAA,OAEL;AAAA,IAGA,gBAAAC,OAACC,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,YAAY,GACnD;AAAA,sBAAAD,OAACE,QAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MAAC;AAAA;AAAA,QACzB,WAAW;AAAA,QAAO;AAAA,SACjC;AAAA,MACC,WAAW,WAAW,IACrB,gBAAAH,MAACG,QAAA,EAAK,UAAQ,MAAC,iCAAmB,IAElC,WAAW,IAAI,CAAC,GAAG,MACjB,gBAAAH;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,aAAa,mBAAmB;AAAA,UAChC;AAAA;AAAA,QAHK,EAAE;AAAA,MAIT,CACD;AAAA,OAEL;AAAA,IAEA,gBAAAA,MAACE,OAAA,EAAI,UAAU,GAAG;AAAA,IAGjB,eACC,gBAAAD,OAACC,OAAA,EAAI,aAAY,SAAQ,aAAa,MAAM,QAAQ,UAAU,GAC5D;AAAA,sBAAAF,MAACG,QAAA,EAAK,OAAO,MAAM,QAAQ,0CAA4B;AAAA,MACvD,gBAAAH,MAACG,QAAA,EAAK,OAAO,MAAM,QAAS,uBAAY;AAAA,MACxC,gBAAAH,MAACG,QAAA,EAAK,OAAO,MAAM,eAAe,eAAC;AAAA,OACrC;AAAA,IAIF,gBAAAH,MAACE,OAAA,EAAI,UAAU,GACb,0BAAAF,MAACG,QAAA,EAAK,UAAQ,MAAC,mGAEf,GACF;AAAA,KACF;AAEJ;;;ACjLA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAmClB,SAmBI,OAAAC,OAnBJ,QAAAC,cAAA;AA9BR,IAAMC,aAAY;AAUX,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAU;AACR,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,cAAc,KAAK,MAAM,gBAAgBA,UAAS;AACxD,QAAM,YAAY,cAAcA;AAChC,QAAM,eAAe,MAAM,MAAM,WAAW,YAAYA,UAAS;AAEjE,SACE,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,eAAc;AAAA,MACd,OAAO;AAAA,MACP,aAAY;AAAA,MACZ,aAAa,YAAY,MAAM,cAAc,MAAM;AAAA,MAEnD;AAAA,wBAAAF,OAACE,OAAA,EACC;AAAA,0BAAAF,OAACG,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UACA,gBAAAH,OAACG,QAAA,EAAK,OAAO,MAAM,cAAc,MAAI,MAAC;AAAA;AAAA,YAClC,MAAM;AAAA,YAAO;AAAA,aACjB;AAAA,UACC,gBACC,gBAAAH,OAACG,QAAA,EAAK,OAAO,MAAM,MAAM,MAAM,MAAI,MAChC;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UAED,gBAAgB,gBAAAH,OAACG,QAAA,EAAK,OAAO,MAAM,aAAa;AAAA;AAAA,YAAG,gBAAgB;AAAA,aAAK;AAAA,WAC3E;AAAA,QAEA,gBAAAJ,MAACG,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,WAAU,UAChD,gBAAM,WAAW,IAChB,gBAAAH,MAACG,OAAA,EAAI,UAAU,GACb,0BAAAH,MAACI,QAAA,EAAK,UAAQ,MAAC,sBAAQ,GACzB,IAEA,aAAa,IAAI,CAAC,MAAM,MAAM;AAC5B,gBAAM,cAAc,YAAY;AAChC,gBAAM,aAAa,gBAAgB,iBAAiB;AACpD,gBAAM,YAAY,gBAAgB,IAAI,KAAK,EAAE;AAC7C,gBAAM,SAAS,YAAY,QAAQ;AACnC,gBAAM,cAAc,aAAa,KAAK,MAAM,KAAK,MAAM,MAAM;AAE7D,cAAI,YAAY;AACd,kBAAM,WAAW,eAAe,MAAM,MAAM,OAAO,MAAM,MAAM;AAC/D,mBACE,gBAAAJ,MAACG,OAAA,EACC,0BAAAF,OAACG,QAAA,EAAK,iBAAiB,UAAU,OAAO,MAAM,MAAM,UAAU,MAAI,MAC/D;AAAA,6BAAe,OAAO;AAAA,cACtB;AAAA,cAAO;AAAA,cAAE,KAAK;AAAA,eACjB,KAJQ,KAAK,EAKf;AAAA,UAEJ;AAEA,iBACE,gBAAAJ,MAACG,OAAA,EACC,0BAAAF,OAACG,QAAA,EAAK,OAAO,YAAY,MAAM,iBAAiB,aAC7C;AAAA;AAAA,YACA;AAAA,YAAO;AAAA,YAAE,KAAK;AAAA,aACjB,KAJQ,KAAK,EAKf;AAAA,QAEJ,CAAC,GAEL;AAAA,QAEC,MAAM,SAASF,cACd,gBAAAF,MAACG,OAAA,EAAI,gBAAe,YAAW,cAAc,GAC3C,0BAAAF,OAACG,QAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,UACX,YAAY;AAAA,UAAE;AAAA,UAAE,KAAK,IAAI,YAAYF,YAAW,MAAM,MAAM;AAAA,UAAE;AAAA,UAAE,MAAM;AAAA,UAAO;AAAA,WACjF,GACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACjGA,SAAS,YAAAG,iBAAgB;AACzB,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,WAAU,aAAAC,kBAAiB;AAuGvC,SAqDQ,YAAAC,WAzCN,OAAAC,OAZF,QAAAC,cAAA;AA1FD,SAAS,WAAW,EAAE,OAAO,eAAe,UAAU,SAAS,GAAU;AAC9E,QAAM,EAAE,OAAO,IAAIC,WAAU;AAC7B,QAAM,aAAa,OAAO,OAAO,IAAI,OAAO,OAAO;AACnD,QAAM,aAAa,KAAK,IAAI,GAAG,aAAa,EAAE;AAE9C,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,CAAC;AAEhD,QAAM,WAAW,MAAM,OAAO,CAAC,MAAM;AACnC,QAAI,CAAC,YAAY,KAAK,EAAG,QAAO;AAChC,UAAM,IAAI,YAAY,YAAY;AAClC,WACE,EAAE,GAAG,YAAY,EAAE,SAAS,CAAC,KAC7B,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,KAC/B,EAAE,YAAY,YAAY,EAAE,SAAS,CAAC;AAAA,EAE1C,CAAC;AAED,MAAI,YAAY;AAChB,MAAI,eAAe,YAAY,YAAY;AACzC,gBAAY,cAAc,aAAa;AAAA,EACzC;AACA,MAAI,cAAc,WAAW;AAC3B,gBAAY;AAAA,EACd;AACA,QAAM,UAAU,SAAS,MAAM,WAAW,YAAY,UAAU;AAEhE,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,aAAa;AACf,UAAI,IAAI,QAAQ;AACd,uBAAe,KAAK;AACpB;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,uBAAe,KAAK;AACpB,uBAAe,CAAC;AAChB;AAAA,MACF;AACA,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,uBAAe,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;AACpC,uBAAe,CAAC;AAChB;AAAA,MACF;AACA,UAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AACnC,uBAAe,CAAC,MAAM,IAAI,KAAK;AAC/B,uBAAe,CAAC;AAChB;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,qBAAe,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AACxC;AAAA,IACF;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,qBAAe,CAAC,MAAM,KAAK,IAAI,SAAS,SAAS,GAAG,IAAI,CAAC,CAAC;AAC1D;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,YAAM,OAAO,SAAS,WAAW;AACjC,UAAI,MAAM;AACR,iBAAS,KAAK,EAAE;AAAA,MAClB;AACA;AAAA,IACF;AAGA,QAAI,UAAU,KAAK;AACjB,eAAS,IAAI;AACb;AAAA,IACF;AAEA,QAAI,UAAU,KAAK;AACjB,qBAAe,IAAI;AACnB,qBAAe,EAAE;AACjB;AAAA,IACF;AAEA,QAAI,IAAI,UAAU,UAAU,KAAK;AAC/B,eAAS;AACT;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,aAAY,QAAO,aAAa,MAAM,aAAa,UAAU,GACvF;AAAA,oBAAAJ,OAACI,OAAA,EAAI,KAAK,GACR;AAAA,sBAAAJ,OAACK,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,QAAI;AAAA,SAEP;AAAA,MACA,gBAAAL,OAACK,QAAA,EAAK,OAAO,MAAM,cAAc,MAAI,MAClC;AAAA;AAAA,QAAI;AAAA,QACH,MAAM;AAAA,QAAO;AAAA,SACjB;AAAA,OACF;AAAA,IAEC,cACC,gBAAAL,OAACI,OAAA,EAAI,aAAY,SAAQ,aAAa,MAAM,QAAQ,UAAU,GAC5D;AAAA,sBAAAL,MAACM,QAAA,EAAK,OAAO,MAAM,QAAQ,eAAC;AAAA,MAC5B,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,QAAS,uBAAY;AAAA,MACxC,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,eAAe,eAAC;AAAA,OACrC,IACE,cACF,gBAAAN,MAACK,OAAA,EAAI,UAAU,GACb,0BAAAJ,OAACK,QAAA,EAAK,OAAO,MAAM,aAAa;AAAA;AAAA,MAAE;AAAA,OAAY,GAChD,IACE;AAAA,IAEJ,gBAAAN,MAACK,OAAA,EAAI,UAAU,GACb,0BAAAJ,OAACK,QAAA,EAAK,OAAO,MAAM,MAAM,UAAU,MAAI,MACpC;AAAA;AAAA,MACA,KAAK,OAAO,EAAE;AAAA,MACd,SAAS,OAAO,EAAE;AAAA,MAClB;AAAA,OACH,GACF;AAAA,IAEC,SAAS,WAAW,IACnB,gBAAAN,MAACK,OAAA,EAAI,UAAU,GAAG,UAAU,GAC1B,0BAAAL,MAACM,QAAA,EAAK,UAAQ,MAAC,uCAAyB,GAC1C,IAEA,QAAQ,IAAI,CAAC,MAAM,MAAM;AACvB,YAAM,cAAc,YAAY;AAChC,YAAM,WAAW,gBAAgB;AACjC,YAAM,YAAY,KAAK,OAAO;AAC9B,YAAM,SAAS,YAAY,OAAO;AAClC,YAAM,cAAc,aAAa,KAAK,MAAM,KAAK,MAAM,MAAM;AAE7D,aACE,gBAAAN,MAACK,OAAA,EAAkB,UAAU,GAC1B,qBACC,gBAAAJ,OAACK,QAAA,EAAK,iBAAiB,MAAM,MAAM,UAAU,OAAO,MAAM,MAAM,UAAU,MAAI,MAC3E;AAAA;AAAA,QACA,KAAK,GAAG,OAAO,EAAE;AAAA,QACjB,KAAK,OAAO,OAAO,EAAE;AAAA,QACrB,KAAK;AAAA,SACR,IAEA,gBAAAL,OAAAF,WAAA,EACE;AAAA,wBAAAC,MAACM,QAAA,EAAK,OAAO,YAAY,MAAM,iBAAiB,MAAM,MAAM,IAAK,kBAAO;AAAA,QACxE,gBAAAN,MAACM,QAAA,EAAK,OAAO,MAAM,KAAK,OAAQ,eAAK,GAAG,OAAO,EAAE,GAAE;AAAA,QACnD,gBAAAN,MAACM,QAAA,EAAK,OAAO,aAAc,eAAK,OAAO,OAAO,EAAE,GAAE;AAAA,QAClD,gBAAAN,MAACM,QAAA,EAAK,OAAO,YAAY,MAAM,iBAAiB,MAAM,MAAM,IAAK,eAAK,MAAK;AAAA,SAC7E,KAdM,KAAK,EAgBf;AAAA,IAEJ,CAAC;AAAA,IAGH,gBAAAN,MAACK,OAAA,EAAI,UAAU,GAAG;AAAA,IAEjB,SAAS,SAAS,cACjB,gBAAAL,MAACK,OAAA,EAAI,gBAAe,YAAW,cAAc,GAC3C,0BAAAJ,OAACK,QAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MACX,YAAY;AAAA,MAAE;AAAA,MAAE,KAAK,IAAI,YAAY,YAAY,SAAS,MAAM;AAAA,MAAE;AAAA,MAAE,SAAS;AAAA,MAAO;AAAA,OACxF,GACF;AAAA,IAGF,gBAAAN,MAACK,OAAA,EAAI,UAAU,GACb,0BAAAL,MAACM,QAAA,EAAK,UAAQ,MAAC,mEAAqD,GACtE;AAAA,KACF;AAEJ;;;ACxLA,SAAS,WAAW,cAAc;AAClC,SAAS,WAAW,mBAAmB;AAGvC,IAAM,mBAAmB;AACzB,IAAM,cAAc;AAWb,SAAS,eAAe,QAAgB,WAA6B;AAI1E,QAAM,cAAc,OAAO,SAAS;AACpC,cAAY,UAAU;AAEtB,YAAU,MAAM;AACd,QAAI,gBAAsD;AAE1D,UAAM,eAAe,MAAY;AAC/B,UAAI,cAAe,cAAa,aAAa;AAC7C,sBAAgB,WAAW,MAAM;AAC/B,eAAO,KAAK,yDAAyD;AACrE,oBAAY,QAAQ;AAAA,MACtB,GAAG,WAAW;AAAA,IAChB;AAEA,UAAM,UAAU,GAAG,MAAM;AAGzB,UAAM,WAAW,CAAC,MAA2B,SAAoC;AAC/E,UAAI,KAAK,YAAY,KAAK,SAAS;AACjC,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,cAAU,QAAQ,EAAE,UAAU,iBAAiB,GAAG,QAAQ;AAC1D,cAAU,SAAS,EAAE,UAAU,iBAAiB,GAAG,QAAQ;AAE3D,WAAO,KAAK,4BAA4B,MAAM,UAAU,gBAAgB,KAAK;AAE7E,WAAO,MAAM;AACX,kBAAY,QAAQ,QAAQ;AAC5B,kBAAY,SAAS,QAAQ;AAC7B,UAAI,cAAe,cAAa,aAAa;AAC7C,aAAO,KAAK,kCAAkC;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AACb;;;AtBg9BM,gBAAAC,OA0Dc,QAAAC,cA1Dd;AAj+BN,IAAM,eAA6B;AAAA,EACjC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb;AAEA,IAAM,mBAAmB;AAElB,SAAS,IAAI,EAAE,WAAW,eAAe,GAAU;AACxD,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,EAAE,OAAO,IAAIC,WAAU;AAC7B,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,YAAY,YAAY;AAG7D,QAAM,CAAC,EAAE,aAAa,IAAIC,UAAS,CAAC;AACpC,EAAAC,WAAU,MAAM;AACd,UAAM,WAAW,MAAM;AACrB,oBAAc,CAAC,MAAM,IAAI,CAAC;AAAA,IAC5B;AACA,WAAO,GAAG,UAAU,QAAQ;AAC5B,WAAO,MAAM;AACX,aAAO,IAAI,UAAU,QAAQ;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,YAAY,OAAO,UAAU,IAAI,OAAO,UAAU;AAExD,QAAM,YAAY,KAAK,IAAI,GAAG,YAAY,mBAAmB,CAAC;AAC9D,QAAM,gBAAgB,KAAK,MAAM,YAAY,GAAG;AAChD,QAAM,kBAAkB,YAAY;AAEpC,QAAM,eAAeC,aAAY,MAAM;AACrC,UAAM,SAAS,UAAU,eAAe,aAAa;AACrD,QAAI,OAAO,IAAI;AACb,aAAO,KAAK,4BAA4B,OAAO,MAAM,MAAM,WAAW;AACtE,eAAS,EAAE,MAAM,gBAAgB,UAAU,OAAO,MAAM,CAAC;AAAA,IAC3D,OAAO;AACL,aAAO,MAAM,4BAA4B,OAAO,KAAK;AACrD,eAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,IAC3E;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,YAAYA,aAAY,MAAM;AAClC,WAAO,UAAU,iBAAiB,MAAM;AACtC,YAAM,SAAS,EAAE,GAAG,MAAM,QAAQ,OAAO,UAAU,KAAK;AACxD,UAAI,MAAM,eAAe;AACvB,eAAO,YAAY,MAAM,cAAc;AAAA,MACzC;AAEA,UAAI,MAAM,gBAAgB,OAAO,GAAG;AAClC,eAAO,YAAY,CAAC,GAAG,MAAM,eAAe;AAAA,MAC9C;AACA,YAAM,SAAS,UAAU,YAAY,UAAU,MAAM;AACrD,UAAI,OAAO,IAAI;AACb,eAAO,KAAK,yBAAyB,OAAO,MAAM,MAAM,QAAQ;AAChE,iBAAS,EAAE,MAAM,aAAa,OAAO,OAAO,MAAM,CAAC;AAAA,MACrD,OAAO;AACL,eAAO,MAAM,yBAAyB,OAAO,KAAK;AAClD,iBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,MAAM,QAAQ,MAAM,eAAe,MAAM,eAAe,CAAC;AAExE,QAAM,YAAYA,aAAY,MAAM;AAClC,QAAI,CAAC,MAAM,cAAe;AAC1B,UAAM,SAAS,UAAU,YAAY,UAAU;AAAA,MAC7C,WAAW,MAAM,cAAc;AAAA,MAC/B,OAAO,UAAU;AAAA,IACnB,CAAC;AACD,QAAI,OAAO,IAAI;AACb,eAAS,EAAE,MAAM,aAAa,OAAO,OAAO,MAAM,CAAC;AAAA,IACrD,OAAO;AACL,aAAO,MAAM,yBAAyB,OAAO,KAAK;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,WAAW,MAAM,aAAa,CAAC;AAEnC,QAAM,WAAWA;AAAA,IACf,CAAC,WAAmB;AAClB,YAAM,iBAAiB,UAAU,kBAAkB,aAAa,MAAM;AACtE,YAAM,mBAAmB,UAAU,kBAAkB,eAAe,MAAM;AAC1E,YAAM,gBAAgB,UAAU,kBAAkB,YAAY,MAAM;AACpE,YAAM,mBAAmB,UAAU,kBAAkB,eAAe,MAAM;AAC1E,eAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU,eAAe,KAAK,eAAe,QAAQ,CAAC;AAAA,QACtD,YAAY,iBAAiB,KAAK,iBAAiB,QAAQ,CAAC;AAAA,QAC5D,SAAS,cAAc,KAAK,cAAc,QAAQ,CAAC;AAAA,QACnD,YAAY,iBAAiB,KAAK,iBAAiB,QAAQ,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,cAAcA;AAAA,IAClB,CAAC,SAAe;AACd,YAAM,eAAe,aAAa,QAAQ,KAAK,MAAM;AACrD,YAAM,aAAa,cAAc,eAAe,KAAK,aAAa,MAAM;AACxE,UAAI,CAAC,WAAY;AAEjB,YAAM,SAAS,UAAU,YAAY,WAAW,KAAK,IAAI,EAAE,QAAQ,WAAW,CAAC;AAC/E,UAAI,OAAO,IAAI;AACb,iBAAS,EAAE,MAAM,SAAS,SAAS,aAAa,UAAU,IAAI,OAAO,OAAO,CAAC;AAC7E,YAAI,MAAM,cAAc,OAAO,KAAK,IAAI;AACtC,mBAAS,EAAE,MAAM,eAAe,MAAM,OAAO,MAAM,CAAC;AAAA,QACtD;AACA,kBAAU;AACV,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,CAAC,WAAW,MAAM,cAAc,WAAW,SAAS;AAAA,EACtD;AAEA,QAAM,cAAcA,aAAY,MAAM;AACpC,UAAM,QAAQ,MAAM;AACpB,UAAM,MAAM,MAAM;AAClB,UAAM,OAAO,MAAM,GAAG;AACtB,QAAI,CAAC,KAAM;AAEX,UAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,UAAM,OAAO,MAAM,MAAM,CAAC;AAG1B,UAAM,SAAS,OACX,UAAU,YAAY,WAAW,EAAE,QAAQ,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,IACtE,OACE,UAAU,YAAY,WAAW,EAAE,QAAQ,KAAK,IAAI,UAAU,KAAK,GAAG,CAAC,IACvE,UAAU,YAAY,WAAW,EAAE,QAAQ,KAAK,IAAI,UAAU,EAAE,CAAC;AAEvE,aAAS,EAAE,MAAM,gBAAgB,MAAM,OAAO,GAAG,CAAC;AAClD,aAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,OAAO,KAAK,eAAe,OAAO,MAAM;AAAA,MACjD,OAAO,OAAO,KAAK,SAAS;AAAA,IAC9B,CAAC;AACD,cAAU;AAAA,EACZ,GAAG,CAAC,WAAW,MAAM,OAAO,MAAM,eAAe,SAAS,CAAC;AAE3D,QAAM,kBAAkBA,aAAY,MAAM;AACxC,UAAM,QAAQ,MAAM;AACpB,UAAM,MAAM,MAAM;AAClB,UAAM,OAAO,MAAM,GAAG;AACtB,QAAI,CAAC,KAAM;AAEX,UAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,UAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,UAAM,SAAS,OACX,UAAU,YAAY,WAAW,EAAE,QAAQ,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,IACtE,OACE,UAAU,YAAY,WAAW,EAAE,QAAQ,KAAK,IAAI,UAAU,KAAK,GAAG,CAAC,IACvE,UAAU,YAAY,WAAW,EAAE,QAAQ,KAAK,IAAI,UAAU,EAAE,CAAC;AAEvE,aAAS,EAAE,MAAM,qBAAqB,MAAM,OAAO,GAAG,CAAC;AACvD,aAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,OAAO,KAAK,oBAAoB,OAAO,MAAM;AAAA,MACtD,OAAO,OAAO,KAAK,SAAS;AAAA,IAC9B,CAAC;AACD,cAAU;AAAA,EACZ,GAAG,CAAC,WAAW,MAAM,OAAO,MAAM,mBAAmB,SAAS,CAAC;AAE/D,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,MAAuB,SAA2B;AACjD,YAAM,SAAS,SAAS;AACxB,YAAM,OAAO,SAAS,MAAM,MAAM,MAAM,iBAAiB,IAAI,MAAM,MAAM,MAAM,aAAa;AAC5F,UAAI,CAAC,KAAM;AAEX,YAAM,SAAS,UAAU,YAAY,WAAW;AAAA,QAC9C,QAAQ,KAAK;AAAA,QACb,GAAI,SAAS,QAAQ,EAAE,KAAK,KAAK,IAAI,EAAE,QAAQ,KAAK;AAAA,MACtD,CAAC;AAED,eAAS;AAAA,QACP,MAAM,SAAS,sBAAsB;AAAA,QACrC,MAAM,OAAO;AAAA,MACf,CAAC;AACD,eAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS,OAAO,KAAK,GAAG,SAAS,eAAe,OAAO,OAAO,IAAI,KAAK,OAAO,MAAM;AAAA,QACpF,OAAO,OAAO,KAAK,SAAS;AAAA,MAC9B,CAAC;AACD,UAAI,OAAQ,WAAU;AAAA,UACjB,WAAU;AAAA,IACjB;AAAA,IACA;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAIA,QAAM,aAAaA,aAAY,MAAM;AACnC,iBAAa;AACb,cAAU;AACV,cAAU;AAAA,EACZ,GAAG,CAAC,cAAc,WAAW,SAAS,CAAC;AAEvC,iBAAe,UAAU,QAAQ,UAAU;AAG3C,EAAAD,WAAU,MAAM;AACd,iBAAa;AAAA,EACf,GAAG,CAAC,YAAY,CAAC;AAGjB,EAAAA,WAAU,MAAM;AACd,QAAI,MAAM,SAAS,SAAS,KAAK,CAAC,MAAM,eAAe;AACrD,aAAO,KAAK,gDAAgD,kBAAkB,WAAW,EAAE;AAC3F,YAAM,SAAS,UAAU,eAAe,eAAe,cAAc;AACrE,UAAI,OAAO,IAAI;AACb,eAAO;AAAA,UACL,uCAAuC,OAAO,MAAM,GAAG,SAAS,OAAO,MAAM,IAAI;AAAA,QACnF;AACA,iBAAS,EAAE,MAAM,sBAAsB,SAAS,OAAO,MAAM,CAAC;AAAA,MAChE,OAAO;AACL,eAAO,MAAM,8BAA8B,OAAO,KAAK;AACvD,cAAM,WAAW,MAAM,SAAS,CAAC,KAAK;AACtC,eAAO,KAAK,uCAAuC,UAAU,QAAQ,MAAM,EAAE;AAC7E,iBAAS,EAAE,MAAM,sBAAsB,SAAS,SAAS,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,MAAM,eAAe,gBAAgB,SAAS,CAAC;AAGnE,EAAAA,WAAU,MAAM;AACd,QAAI,MAAM,eAAe;AACvB,gBAAU;AACV,gBAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,MAAM,eAAe,MAAM,QAAQ,WAAW,SAAS,CAAC;AAG5D,EAAAA,WAAU,MAAM;AACd,QAAI,MAAM,OAAO;AACf,YAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAS,EAAE,MAAM,cAAc,CAAC;AAAA,MAClC,GAAG,GAAI;AACP,aAAO,MAAM;AACX,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,KAAK,CAAC;AAGhB,EAAAE,UAAS,CAAC,OAAO,QAAQ;AAEvB,QAAI,MAAM,eAAe;AACvB,UAAI,UAAU,KAAK;AACjB,cAAM,SAAS,UAAU,YAAY,WAAW,MAAM,cAAc,EAAE;AACtE,YAAI,OAAO,IAAI;AACb,mBAAS,EAAE,MAAM,SAAS,SAAS,gBAAgB,OAAO,OAAO,CAAC;AAClE,mBAAS,EAAE,MAAM,gBAAgB,CAAC;AAClC,cAAI,MAAM,eAAe,SAAS,YAAY;AAC5C,qBAAS,EAAE,MAAM,UAAU,CAAC;AAAA,UAC9B;AACA,oBAAU;AACV,oBAAU;AAAA,QACZ,OAAO;AACL,mBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AACzE,mBAAS,EAAE,MAAM,gBAAgB,CAAC;AAAA,QACpC;AAAA,MACF,WAAW,UAAU,OAAO,IAAI,QAAQ;AACtC,iBAAS,EAAE,MAAM,gBAAgB,CAAC;AAAA,MACpC;AACA;AAAA,IACF;AAGA,QAAI,MAAM,eAAe,SAAS,MAAM;AACtC,eAAS,EAAE,MAAM,UAAU,CAAC;AAC5B;AAAA,IACF;AAGA,QACE,MAAM,eAAe,SAAS,cAC9B,MAAM,eAAe,SAAS,YAC9B,MAAM,eAAe,SAAS,mBAC9B,MAAM,eAAe,SAAS,iBAC9B,MAAM,eAAe,SAAS,YAC9B;AACA;AAAA,IACF;AAGA,QAAI,MAAM,eAAe,SAAS,kBAAkB,MAAM,aAAa;AACrE,UAAI,IAAI,QAAQ;AACd,iBAAS,EAAE,MAAM,kBAAkB,QAAQ,MAAM,CAAC;AAClD;AAAA,MACF;AACA,UAAI,IAAI,UAAU,MAAM,YAAY,KAAK,KAAK,MAAM,cAAc;AAEhE,cAAM,MAAM,MAAM,YAAY,KAAK;AACnC,cAAM,WAAW,IAAI,YAAY,GAAG;AACpC,cAAM,aAAa,oBAAI,IAAI,CAAC,UAAU,cAAc,YAAY,CAAC;AACjE,YAAI;AACJ,YAAI;AACJ,YAAI,WAAW,GAAG;AAChB,gBAAM,YAAY,IAAI,MAAM,WAAW,CAAC;AACxC,cAAI,WAAW,IAAI,SAAS,GAAG;AAC7B,oBAAQ,IAAI,MAAM,GAAG,QAAQ;AAC7B,sBAAU;AAAA,UACZ,OAAO;AACL,oBAAQ;AAAA,UACV;AAAA,QACF,OAAO;AACL,kBAAQ;AAAA,QACV;AACA,cAAM,SAAS,UAAU,kBAAkB,cAAc;AAAA,UACvD,QAAQ,MAAM,aAAa;AAAA,UAC3B,aAAa;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AACD,YAAI,OAAO,IAAI;AACb,mBAAS,EAAE,MAAM,SAAS,SAAS,oBAAoB,OAAO,OAAO,CAAC;AACtE,mBAAS,MAAM,aAAa,EAAE;AAAA,QAChC,OAAO;AACL,mBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,QAC3E;AACA,iBAAS,EAAE,MAAM,kBAAkB,QAAQ,MAAM,CAAC;AAClD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,iBAAS,EAAE,MAAM,qBAAqB,OAAO,MAAM,YAAY,MAAM,GAAG,EAAE,EAAE,CAAC;AAC7E;AAAA,MACF;AACA,UAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AACnC,iBAAS,EAAE,MAAM,qBAAqB,OAAO,MAAM,cAAc,MAAM,CAAC;AACxE;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,MAAM,gBAAgB;AACxB,UAAI,IAAI,QAAQ;AACd,iBAAS,EAAE,MAAM,qBAAqB,QAAQ,MAAM,CAAC;AACrD,iBAAS,EAAE,MAAM,oBAAoB,OAAO,GAAG,CAAC;AAChD,iBAAS,EAAE,MAAM,cAAc,QAAQ,EAAE,QAAQ,OAAU,EAAE,CAAC;AAC9D;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,iBAAS,EAAE,MAAM,qBAAqB,QAAQ,MAAM,CAAC;AACrD,iBAAS,EAAE,MAAM,cAAc,QAAQ,EAAE,QAAQ,MAAM,eAAe,OAAU,EAAE,CAAC;AACnF;AAAA,MACF;AACA,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,iBAAS,EAAE,MAAM,oBAAoB,OAAO,MAAM,YAAY,MAAM,GAAG,EAAE,EAAE,CAAC;AAC5E;AAAA,MACF;AACA,UAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AACnC,iBAAS,EAAE,MAAM,oBAAoB,OAAO,MAAM,cAAc,MAAM,CAAC;AACvE;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,MAAM,kBAAkB;AAC1B,UAAI,IAAI,WAAW,UAAU,KAAK;AAChC,iBAAS,EAAE,MAAM,qBAAqB,WAAW,KAAK,CAAC;AACvD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,UAAU,KAAK;AAClC,iBAAS,EAAE,MAAM,qBAAqB,WAAW,OAAO,CAAC;AACzD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,6BAAqB,QAAQ,KAAK;AAClC;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,6BAAqB,QAAQ,QAAQ;AACrC;AAAA,MACF;AACA,UAAI,IAAI,YAAY;AAClB,wBAAgB;AAChB;AAAA,MACF;AACA,UAAI,IAAI,UAAU,IAAI,WAAW;AAC/B,iBAAS,EAAE,MAAM,qBAAqB,MAAM,MAAM,CAAC;AACnD,iBAAS,EAAE,MAAM,SAAS,SAAS,0BAA0B,OAAO,OAAO,CAAC;AAC5E;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,MAAM,cAAc;AACtB,UAAI,IAAI,WAAW,UAAU,KAAK;AAChC,iBAAS,EAAE,MAAM,gBAAgB,WAAW,KAAK,CAAC;AAClD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,UAAU,KAAK;AAClC,iBAAS,EAAE,MAAM,gBAAgB,WAAW,OAAO,CAAC;AACpD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,6BAAqB,QAAQ,KAAK;AAClC;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,6BAAqB,QAAQ,QAAQ;AACrC;AAAA,MACF;AACA,UAAI,IAAI,YAAY;AAClB,oBAAY;AACZ;AAAA,MACF;AACA,UAAI,IAAI,UAAU,IAAI,WAAW;AAC/B,iBAAS,EAAE,MAAM,gBAAgB,MAAM,MAAM,CAAC;AAC9C,iBAAS,EAAE,MAAM,SAAS,SAAS,qBAAqB,OAAO,OAAO,CAAC;AACvE;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,MAAM,eAAe,SAAS,YAAY,MAAM,iBAAiB,QAAQ;AAC5F,WAAK;AACL;AAAA,IACF;AACA,QAAI,UAAU,OAAO,IAAI,QAAQ;AAE/B,UAAI,MAAM,eAAe,SAAS,YAAY,MAAM,iBAAiB,UAAU;AAC7E,iBAAS,EAAE,MAAM,mBAAmB,OAAO,OAAO,CAAC;AACnD;AAAA,MACF;AACA,eAAS,EAAE,MAAM,UAAU,CAAC;AAC5B;AAAA,IACF;AACA,QAAI,UAAU,KAAK;AACjB,eAAS,EAAE,MAAM,eAAe,MAAM,SAAS,KAAK,CAAC;AACrD;AAAA,IACF;AAGA,QAAI,IAAI,OAAO,MAAM,eAAe,SAAS,UAAU;AACrD,YAAM,SAA4C,cAC9C,CAAC,QAAQ,QAAQ,QAAQ,IACzB,CAAC,QAAQ,MAAM;AACnB,YAAM,SAAS,OAAO,QAAQ,MAAM,YAAY;AAChD,YAAM,YAAY,QAAQ,SAAS,KAAK,OAAO,MAAM,KAAK;AAC1D,eAAS,EAAE,MAAM,mBAAmB,OAAO,UAAU,CAAC;AACtD;AAAA,IACF;AAGA,QAAI,MAAM,eAAe,SAAS,YAAY,MAAM,iBAAiB,QAAQ;AAC3E,UAAI,IAAI,WAAW,UAAU,KAAK;AAChC,iBAAS,EAAE,MAAM,oBAAoB,WAAW,KAAK,CAAC;AACtD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,UAAU,KAAK;AAClC,iBAAS,EAAE,MAAM,oBAAoB,WAAW,OAAO,CAAC;AACxD;AAAA,MACF;AACA,UAAI,UAAU,OAAO,IAAI,QAAQ;AAC/B,cAAM,OAAO,MAAM,MAAM,MAAM,iBAAiB;AAChD,YAAI,MAAM;AACR,mBAAS,EAAE,MAAM,eAAe,QAAQ,KAAK,GAAG,CAAC;AAAA,QACnD;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,uBAAuB,CAAC;AACzC;AAAA,MACF;AACA,UAAI,IAAI,WAAW;AACjB,YAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,mBAAS,EAAE,MAAM,qBAAqB,CAAC;AACvC,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,aAAK;AACL;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,eAAe,SAAS,YAAY,MAAM,iBAAiB,QAAQ;AAC3E,UAAI,IAAI,WAAW,UAAU,KAAK;AAChC,iBAAS,EAAE,MAAM,eAAe,WAAW,KAAK,CAAC;AACjD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,UAAU,KAAK;AAClC,iBAAS,EAAE,MAAM,eAAe,WAAW,OAAO,CAAC;AACnD;AAAA,MACF;AAEA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,cAAc,OAAO,EAAE,CAAC;AACzC;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,cAAc,OAAO,MAAM,MAAM,SAAS,EAAE,CAAC;AAC9D;AAAA,MACF;AACA,UAAI,IAAI,YAAa,IAAI,QAAQ,UAAU,KAAM;AAC/C,iBAAS,EAAE,MAAM,eAAe,WAAW,OAAO,CAAC;AACnD;AAAA,MACF;AACA,UAAI,IAAI,UAAW,IAAI,QAAQ,UAAU,KAAM;AAC7C,iBAAS,EAAE,MAAM,eAAe,WAAW,KAAK,CAAC;AACjD;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,cAAM,OAAO,MAAM,MAAM,MAAM,aAAa;AAC5C,YAAI,MAAM;AACR,mBAAS,EAAE,MAAM,eAAe,KAAK,CAAC;AACtC,mBAAS,KAAK,EAAE;AAChB,mBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,WAAW,CAAC;AAAA,QAC7D;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,WAAW,CAAC;AAC3D;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,OAAO,MAAM,MAAM,MAAM,aAAa;AAC5C,YAAI,MAAM;AACR,mBAAS,EAAE,MAAM,eAAe,KAAK,CAAC;AACtC,mBAAS,KAAK,EAAE;AAChB,mBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,SAAS,CAAC;AAAA,QAC3D;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,OAAO,MAAM,MAAM,MAAM,aAAa;AAC5C,YAAI,MAAM;AACR,mBAAS,EAAE,MAAM,kBAAkB,KAAK,CAAC;AAAA,QAC3C;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,OAAO,MAAM,MAAM,MAAM,aAAa;AAC5C,YAAI,MAAM;AACR,sBAAY,IAAI;AAAA,QAClB;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,OAAO,MAAM,MAAM,MAAM,aAAa;AAC5C,YAAI,MAAM;AACR,mBAAS,EAAE,MAAM,eAAe,KAAK,CAAC;AACtC,mBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,WAAW,CAAC;AAAA,QAC7D;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,OAAO,MAAM,MAAM,MAAM,aAAa;AAC5C,YAAI,QAAQ,KAAK,UAAU;AACzB,gBAAM,SAAS,UAAU,YAAY,WAAW,KAAK,IAAI,EAAE,UAAU,KAAK,CAAC;AAC3E,cAAI,OAAO,IAAI;AACb,qBAAS,EAAE,MAAM,SAAS,SAAS,wBAAwB,OAAO,OAAO,CAAC;AAC1E,sBAAU;AACV,sBAAU;AAAA,UACZ,OAAO;AACL,qBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,UAC3E;AAAA,QACF,WAAW,MAAM;AACf,mBAAS,EAAE,MAAM,SAAS,SAAS,oBAAoB,OAAO,OAAO,CAAC;AAAA,QACxE;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,qBAAqB,QAAQ,KAAK,CAAC;AACpD,iBAAS,EAAE,MAAM,oBAAoB,OAAO,GAAG,CAAC;AAChD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,gBAAgB,CAAC;AAChE;AAAA,MACF;AAEA,UAAI,IAAI,WAAW;AACjB,YAAI,MAAM,gBAAgB,OAAO,GAAG;AAClC,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AACD;AAAA,QACF;AACA,YAAI,MAAM,OAAO,UAAU,MAAM,OAAO,QAAQ,MAAM,OAAO,QAAQ;AACnE,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AACD;AAAA,QACF;AACA,YAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,mBAAS,EAAE,MAAM,gBAAgB,CAAC;AAClC,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,gBAAgB,MAAM,OAAO;AACnC,cAAM,eAAe,gBACjB,cAAc,QAAQ,aAA2B,IACjD;AACJ,cAAM,YAAY,eAAe;AACjC,cAAM,aAAa,YAAY,cAAc,SAAS,cAAc,SAAS,IAAI;AACjF,iBAAS,EAAE,MAAM,cAAc,QAAQ,EAAE,QAAQ,WAAW,EAAE,CAAC;AAC/D;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,cAAc,MAAM,OAAO;AACjC,cAAM,eAAe,cAAc,YAAY,QAAQ,WAAuB,IAAI;AAClF,cAAM,YAAY,eAAe;AACjC,cAAM,WAAW,YAAY,YAAY,SAAS,YAAY,SAAS,IAAI;AAC3E,iBAAS,EAAE,MAAM,cAAc,QAAQ,EAAE,MAAM,SAAS,EAAE,CAAC;AAC3D;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,eAAe,CAAC;AACjC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,eAAe,SAAS,YAAY,MAAM,iBAAiB,YAAY,aAAa;AAC5F,UAAI,IAAI,WAAW,UAAU,KAAK;AAChC,iBAAS,EAAE,MAAM,iBAAiB,WAAW,KAAK,CAAC;AACnD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,UAAU,KAAK;AAClC,iBAAS,EAAE,MAAM,iBAAiB,WAAW,OAAO,CAAC;AACrD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,eAAe,MAAM,YAAY,CAAC;AACnD,iBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,SAAS,CAAC;AACzD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,kBAAkB,MAAM,YAAY,CAAC;AACtD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,oBAAY,WAAW;AACvB;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,UAAU,GAAG,YAAY,WAAW;AAAA,EAAK,YAAY,cAAc;AAAA,EAAK,YAAY,sBAAsB;AAChH,cAAM,QAAQ,uBAAuB,OAAO;AAC5C,YAAI,QAAQ,GAAG;AACb,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,UAAU,KAAK,WAAW,QAAQ,IAAI,MAAM,EAAE;AAAA,YACvD,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,eAAe,MAAM,YAAY,CAAC;AACnD,iBAAS,YAAY,EAAE;AACvB,iBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,eAAe,CAAC;AAC/D;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,eAAe,SAAS,YAAY;AAC5C,UAAI,IAAI,WAAW,UAAU,KAAK;AAChC,iBAAS,EAAE,MAAM,iBAAiB,WAAW,KAAK,CAAC;AACnD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,UAAU,KAAK;AAClC,iBAAS,EAAE,MAAM,iBAAiB,WAAW,OAAO,CAAC;AACrD;AAAA,MACF;AACA,UAAI,UAAU,OAAO,MAAM,cAAc;AACvC,iBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,SAAS,CAAC;AACzD;AAAA,MACF;AACA,UAAI,UAAU,OAAO,MAAM,cAAc;AACvC,iBAAS,EAAE,MAAM,kBAAkB,MAAM,MAAM,aAAa,CAAC;AAC7D;AAAA,MACF;AACA,UAAI,UAAU,OAAO,MAAM,cAAc;AACvC,oBAAY,MAAM,YAAY;AAC9B;AAAA,MACF;AACA,UAAI,UAAU,OAAO,MAAM,cAAc;AACvC,cAAM,UAAU,GAAG,MAAM,aAAa,WAAW;AAAA,EAAK,MAAM,aAAa,cAAc;AAAA,EAAK,MAAM,aAAa,sBAAsB;AACrI,cAAM,QAAQ,uBAAuB,OAAO;AAC5C,YAAI,QAAQ,GAAG;AACb,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS,UAAU,KAAK,WAAW,QAAQ,IAAI,MAAM,EAAE;AAAA,YACvD,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,UAAI,UAAU,OAAO,MAAM,cAAc;AACvC,iBAAS,MAAM,aAAa,EAAE;AAC9B,iBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,eAAe,CAAC;AAC/D;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,eAAe,SAAS,kBAAkB,MAAM,cAAc;AACtE,UAAI,IAAI,WAAW,UAAU,KAAK;AAChC,iBAAS,EAAE,MAAM,mBAAmB,WAAW,KAAK,CAAC;AACrD;AAAA,MACF;AACA,UAAI,IAAI,aAAa,UAAU,KAAK;AAClC,iBAAS,EAAE,MAAM,mBAAmB,WAAW,OAAO,CAAC;AACvD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,iBAAS,EAAE,MAAM,kBAAkB,QAAQ,KAAK,CAAC;AACjD;AAAA,MACF;AACA,UAAI,UAAU,KAAK;AACjB,cAAM,WAAW;AAAA,UACf,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,QACX;AACA,cAAM,WAAW,SAAS,MAAM,gBAAgB;AAChD,YAAI,UAAU;AAGZ,gBAAM,SAAS,UAAU,kBAAkB;AAAA,YACzC,MAAM,aAAa;AAAA,YACnB,SAAS;AAAA,UACX;AACA,cAAI,OAAO,IAAI;AACb,qBAAS,EAAE,MAAM,SAAS,SAAS,sBAAsB,OAAO,OAAO,CAAC;AACxE,qBAAS,MAAM,aAAa,EAAE;AAAA,UAChC,OAAO;AACL,qBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,UAC3E;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,IAAI,QAAQ;AACd,cAAM,WAAW;AAAA,UACf,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,QACX;AACA,cAAM,WAAW,SAAS,MAAM,gBAAgB;AAChD,YAAI,UAAU;AACZ,mBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,CAAC;AAChD,mBAAS,SAAS,EAAE;AACpB,mBAAS,EAAE,MAAM,eAAe,MAAM,SAAS,WAAW,CAAC;AAAA,QAC7D;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,iBAAiBD;AAAA,IACrB,CAAC,SAQK;AACJ,UAAI,MAAM,eAAe,SAAS,YAAY,MAAM,cAAc;AAChE,cAAM,SAAS,MAAM,aAAa;AAClC,cAAM,SAAS,UAAU,YAAY,WAAW,QAAQ,IAAI;AAC5D,YAAI,CAAC,OAAO,IAAI;AACd,mBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AACzE;AAAA,QACF;AAIA,cAAM,oBAAoB,UAAU,kBAAkB,YAAY,MAAM;AACxE,cAAM,cAAc,kBAAkB,KAAK,kBAAkB,QAAQ,CAAC;AAGtE,cAAM,UAAU,KAAK,aAAa,CAAC;AAGnC,cAAM,cAAc,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,IAAI,EAAE,IAAI,EAAE,CAAC;AAChF,cAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAG/D,mBAAW,OAAO,aAAa;AAC7B,cAAI,CAAC,QAAQ,IAAI,GAAG,IAAI,WAAW,IAAI,IAAI,IAAI,EAAE,GAAG;AAClD,sBAAU,kBAAkB,iBAAiB;AAAA,cAC3C;AAAA,cACA,aAAa,IAAI;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AAGA,mBAAW,SAAS,SAAS;AAC3B,cAAI,YAAY,IAAI,GAAG,MAAM,EAAE,IAAI,MAAM,IAAI,EAAE,EAAG;AAClD,oBAAU,kBAAkB,cAAc;AAAA,YACxC;AAAA,YACA,aAAa,MAAM;AAAA,YACnB,MAAM,MAAM;AAAA,UACd,CAAC;AAAA,QACH;AAEA,iBAAS,EAAE,MAAM,SAAS,SAAS,gBAAgB,OAAO,OAAO,CAAC;AAClE,iBAAS,EAAE,MAAM,eAAe,MAAM,OAAO,MAAM,CAAC;AACpD,iBAAS,MAAM;AACf,iBAAS,EAAE,MAAM,UAAU,CAAC;AAC5B,kBAAU;AACV,kBAAU;AAAA,MACZ,OAAO;AACL,cAAM,SAAS,UAAU,YAAY,WAAW,MAAM,MAAM,eAAe,EAAE;AAC7E,YAAI,OAAO,IAAI;AACb,mBAAS,EAAE,MAAM,SAAS,SAAS,gBAAgB,OAAO,OAAO,CAAC;AAClE,mBAAS,EAAE,MAAM,UAAU,CAAC;AAC5B,oBAAU;AACV,oBAAU;AAAA,QACZ,OAAO;AACL,mBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmBA,aAAY,MAAM;AACzC,aAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAyBA;AAAA,IAC7B,CAAC,WAA0B;AACzB,UAAI,CAAC,MAAM,aAAc;AACzB,YAAM,SAAS,UAAU,YAAY,WAAW,MAAM,aAAa,IAAI;AAAA,QACrE,UAAU;AAAA,MACZ,CAAC;AACD,UAAI,OAAO,IAAI;AACb,cAAM,MAAM,SAAS,eAAe,MAAM,KAAK;AAC/C,iBAAS,EAAE,MAAM,SAAS,SAAS,KAAK,OAAO,OAAO,CAAC;AACvD,kBAAU;AACV,kBAAU;AAAA,MACZ,OAAO;AACL,iBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,MAC3E;AACA,eAAS,EAAE,MAAM,UAAU,CAAC;AAAA,IAC9B;AAAA,IACA,CAAC,WAAW,MAAM,cAAc,WAAW,SAAS;AAAA,EACtD;AAEA,QAAM,yBAAyBA,aAAY,MAAM;AAC/C,aAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsBA,aAAY,CAAC,YAAqB;AAC5D,aAAS,EAAE,MAAM,sBAAsB,QAAQ,CAAC;AAChD,aAAS,EAAE,MAAM,UAAU,CAAC;AAC5B,aAAS,EAAE,MAAM,SAAS,SAAS,gBAAgB,QAAQ,IAAI,IAAI,OAAO,OAAO,CAAC;AAAA,EACpF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA;AAAA,IACvB,CAAC,YAAqB;AACpB,YAAM,SAAS,UAAU,eAAe,cAAc,QAAQ,IAAI,EAAE,WAAW,KAAK,CAAC;AACrF,UAAI,OAAO,IAAI;AACb,eAAO,KAAK,2BAA2B,OAAO,MAAM,GAAG,aAAa;AACpE,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,oBAAoB,OAAO,MAAM,IAAI;AAAA,UAC9C,OAAO;AAAA,QACT,CAAC;AACD,qBAAa;AAAA,MACf,OAAO;AACL,eAAO,MAAM,0BAA0B,OAAO,KAAK;AACnD,iBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,CAAC,WAAW,YAAY;AAAA,EAC1B;AAEA,QAAM,sBAAsBA,aAAY,MAAM;AAC5C,aAAS,EAAE,MAAM,eAAe,MAAM,SAAS,cAAc,CAAC;AAAA,EAChE,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwBA;AAAA,IAC5B,CAAC,SAAiF;AAChF,YAAM,SAAS,UAAU,eAAe,cAAc;AAAA,QACpD,MAAM,KAAK;AAAA,QACX,KAAK,KAAK,OAAO;AAAA,QACjB,aAAa,KAAK,eAAe;AAAA,QACjC,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,UAAI,OAAO,IAAI;AACb,eAAO,KAAK,kCAAkC,OAAO,MAAM,GAAG,SAAS,OAAO,MAAM,IAAI,EAAE;AAC1F,iBAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,oBAAoB,OAAO,MAAM,IAAI;AAAA,UAC9C,OAAO;AAAA,QACT,CAAC;AACD,iBAAS,EAAE,MAAM,sBAAsB,SAAS,OAAO,MAAM,CAAC;AAE9D,iBAAS,EAAE,MAAM,UAAU,CAAC;AAC5B,iBAAS,EAAE,MAAM,UAAU,CAAC;AAC5B,qBAAa;AAAA,MACf,OAAO;AACL,eAAO,MAAM,6BAA6B,OAAO,KAAK;AACtD,iBAAS,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,CAAC,WAAW,YAAY;AAAA,EAC1B;AAEA,QAAM,0BAA0BA,aAAY,MAAM;AAChD,aAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsBA,aAAY,MAAM;AAC5C,aAAS,EAAE,MAAM,UAAU,CAAC;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAM,MAAM,MAAM,aAAa,KAAK;AAKxD,QAAM,qBAAqBE,SAAQ,MAAoD;AACrF,WAAO;AAAA,MACL,GAAG,MAAM,YAAY,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,eAAe,OAAO,EAAE;AAAA,MACzF,GAAG,MAAM,WAAW,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,eAAe,UAAU,EAAE;AAAA,MAC3F,GAAG,MAAM,cAAc,IAAI,CAAC,OAAO;AAAA,QACjC,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,MAAM,eAAe;AAAA,MACvB,EAAE;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,MAAM,aAAa,MAAM,YAAY,MAAM,aAAa,CAAC;AAK7D,QAAM,kBAAkBA,SAAQ,MAAM;AACpC,QAAI,CAAC,MAAM,cAAe,QAAO,CAAC;AAClC,UAAM,SAAS,UAAU,YAAY,UAAU,EAAE,WAAW,MAAM,cAAc,GAAG,CAAC;AACpF,WAAO,OAAO,KAAK,OAAO,QAAQ,CAAC;AAAA,EACrC,GAAG,CAAC,WAAW,MAAM,eAAe,MAAM,KAAK,CAAC;AAChD,QAAM,gBAAgB,aAAa,MAAM;AAGzC,EAAAH,WAAU,MAAM;AACd,QAAI,MAAM,eAAe,SAAS,YAAY,eAAe;AAC3D,eAAS,aAAa;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,eAAe,QAAQ,CAAC;AAE9C,SACE,gBAAAH,OAACO,OAAA,EAAI,eAAc,UAAS,QAAQ,OAAO,MAEzC;AAAA,oBAAAR,MAAC,UAAO,OAAc;AAAA,IAGtB,gBAAAC,OAACO,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,WAAU,UAChD;AAAA,YAAM,iBAAiB,gBAAAR,MAAC,iBAAc,MAAM,MAAM,eAAe;AAAA,MAEjE,CAAC,MAAM,iBAAiB,MAAM,eAAe,SAAS,YACrD,gBAAAC,OAACO,OAAA,EAAI,eAAc,OAAM,UAAU,GACjC;AAAA,wBAAAR;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,eAAe,MAAM;AAAA,YACrB,iBAAiB,MAAM;AAAA,YACvB,WAAW,MAAM,iBAAiB;AAAA,YAClC,cAAc,MAAM;AAAA;AAAA,QACtB;AAAA,QACA,gBAAAA,MAACQ,OAAA,EAAI,OAAO,eACV,0BAAAR;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,eAAe,MAAM;AAAA,YACrB,aAAa,MAAM;AAAA,YACnB,gBAAgB,MAAM;AAAA,YACtB,cAAc,MAAM;AAAA,YACpB,QAAQ,MAAM;AAAA,YACd,mBAAmB,MAAM,eAAe,QAAQ;AAAA,YAChD,uBACE,IAAI;AAAA,cACF,MAAM,YAAY,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,YAC9E;AAAA,YAEF,yBACE,IAAI;AAAA,cACF,MAAM,cAAc,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,YAChF;AAAA,YAEF,mBAAmB,MAAM,YAAY,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAAA,YAC5E,WAAW,MAAM,iBAAiB;AAAA,YAClC,kBAAkB,MAAM,gBAAgB,OAAO;AAAA;AAAA,QACjD,GACF;AAAA,QACA,gBAAAA,MAACQ,OAAA,EAAI,OAAO,iBACT,wBACC,gBAAAR;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,UAAU,MAAM;AAAA,YAChB,YAAY,MAAM;AAAA,YAClB,SAAS,MAAM;AAAA,YACf,YAAY,MAAM;AAAA,YAClB,WAAW,MAAM,iBAAiB;AAAA,YAClC,cAAc,MAAM;AAAA;AAAA,QACtB,IAEA,gBAAAC;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,eAAc;AAAA,YACd,UAAU;AAAA,YACV,aAAY;AAAA,YACZ,aAAa,MAAM;AAAA,YAEnB;AAAA,8BAAAR,MAACQ,OAAA,EACC,0BAAAP,OAACQ,QAAA,EAAK,OAAO,MAAM,OAAO,MAAI,MAC3B;AAAA;AAAA,gBAAI;AAAA,iBAEP,GACF;AAAA,cACA,gBAAAT,MAACQ,OAAA,EAAI,UAAU,GAAG,gBAAe,UAAS,YAAW,UACnD,0BAAAR,MAACS,QAAA,EAAK,UAAQ,MAAC,8BAAgB,GACjC;AAAA;AAAA;AAAA,QACF,GAEJ;AAAA,SACF;AAAA,MAGD,CAAC,MAAM,iBAAiB,MAAM,eAAe,SAAS,cAAc,MAAM,gBACzE,gBAAAT;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,UAClB,SAAS,MAAM;AAAA,UACf,YAAY,MAAM;AAAA,UAClB,cAAc,MAAM;AAAA;AAAA,MACtB;AAAA,MAGD,CAAC,MAAM,iBACN,MAAM,eAAe,SAAS,kBAC9B,MAAM,gBACJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,UAClB,SAAS,MAAM;AAAA,UACf,YAAY,MAAM;AAAA,UAClB,eAAe,MAAM;AAAA,UACrB,aAAa,MAAM;AAAA,UACnB,aAAa,MAAM;AAAA;AAAA,MACrB;AAAA,MAGH,CAAC,MAAM,kBACL,MAAM,eAAe,SAAS,cAAc,MAAM,eAAe,SAAS,aACzE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,MAAM,eAAe,SAAS,WAAW,MAAM,eAAe;AAAA,UAC3E,UAAU;AAAA,UACV,aAAa,MAAM,eAAe,SAAS,WAAW,qBAAqB;AAAA,UAC3E,QAAQ;AAAA,UACR,UAAU;AAAA;AAAA,MACZ;AAAA,MAGH,CAAC,MAAM,iBAAiB,MAAM,eAAe,SAAS,cAAc,MAAM,gBACzE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,eAAe,MAAM,aAAa;AAAA,UAClC,UAAU;AAAA,UACV,UAAU;AAAA;AAAA,MACZ;AAAA,MAGD,CAAC,MAAM,iBAAiB,MAAM,eAAe,SAAS,mBACrD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MAAM;AAAA,UAChB,eAAe,MAAM;AAAA,UACrB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,cAAc;AAAA,UACd,UAAU;AAAA;AAAA,MACZ;AAAA,MAGD,CAAC,MAAM,iBAAiB,MAAM,eAAe,SAAS,iBACrD,gBAAAA,MAAC,eAAY,QAAQ,uBAAuB,UAAU,yBAAyB;AAAA,MAGhF,CAAC,MAAM,iBAAiB,MAAM,eAAe,SAAS,QAAQ,gBAAAA,MAAC,eAAY;AAAA,OAC9E;AAAA,IAGA,gBAAAA,MAAC,UAAO,aAAa,MAAM,aAAa;AAAA,IAGvC,MAAM,SAAS,gBAAAA,MAAC,gBAAa,SAAS,MAAM,MAAM,SAAS,OAAO,MAAM,MAAM,OAAO;AAAA,KACxF;AAEJ;;;ADjpC0B,gBAAAU,aAAA;AAD1B,eAAsB,UAAU,WAAsB,gBAAwC;AAC5F,QAAM,WAAW,OAAO,gBAAAA,MAAC,OAAI,WAAsB,gBAAgC,GAAI;AAAA,IACrF,aAAa;AAAA,EACf,CAAC;AAED,QAAM,SAAS,cAAc;AAC/B;","names":["useEffect","useCallback","useMemo","useState","Box","Text","useInput","useStdout","Box","Text","jsx","Box","Text","Box","Text","jsx","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","chalk","Text","Box","jsx","jsxs","jsxs","Box","Text","jsx","jsxs","chalk","Box","Text","useState","Box","Text","useInput","writeFileSync","mkdtempSync","join","tmpdir","Box","Text","useStdout","jsx","jsxs","useStdout","Box","Text","jsx","jsxs","useState","field","useInput","Box","Text","useState","Box","Text","useInput","jsx","jsxs","useState","useInput","Box","Text","useState","Box","Text","useInput","jsx","jsxs","FIELDS","useState","useInput","Box","Text","field","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","Fragment","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","PAGE_SIZE","Box","Text","useState","Box","Text","useInput","useStdout","Fragment","jsx","jsxs","useStdout","useState","useInput","Box","Text","jsx","jsxs","useStdout","useState","useEffect","useCallback","useInput","useMemo","Box","Text","jsx"]}
|