@codedeck/codedeck 2026.3.1-4.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +38 -0
  2. package/config/default.yaml +51 -0
  3. package/dist/agent/brain-dispatcher.d.ts +67 -0
  4. package/dist/agent/brain-dispatcher.d.ts.map +1 -0
  5. package/dist/agent/brain-dispatcher.js +136 -0
  6. package/dist/agent/brain-dispatcher.js.map +1 -0
  7. package/dist/agent/detect.d.ts +20 -0
  8. package/dist/agent/detect.d.ts.map +1 -0
  9. package/dist/agent/detect.js +187 -0
  10. package/dist/agent/detect.js.map +1 -0
  11. package/dist/agent/drivers/base.d.ts +57 -0
  12. package/dist/agent/drivers/base.d.ts.map +1 -0
  13. package/dist/agent/drivers/base.js +3 -0
  14. package/dist/agent/drivers/base.js.map +1 -0
  15. package/dist/agent/drivers/claude-code.d.ts +14 -0
  16. package/dist/agent/drivers/claude-code.d.ts.map +1 -0
  17. package/dist/agent/drivers/claude-code.js +112 -0
  18. package/dist/agent/drivers/claude-code.js.map +1 -0
  19. package/dist/agent/drivers/codex.d.ts +14 -0
  20. package/dist/agent/drivers/codex.d.ts.map +1 -0
  21. package/dist/agent/drivers/codex.js +77 -0
  22. package/dist/agent/drivers/codex.js.map +1 -0
  23. package/dist/agent/drivers/gemini.d.ts +24 -0
  24. package/dist/agent/drivers/gemini.d.ts.map +1 -0
  25. package/dist/agent/drivers/gemini.js +142 -0
  26. package/dist/agent/drivers/gemini.js.map +1 -0
  27. package/dist/agent/drivers/opencode.d.ts +18 -0
  28. package/dist/agent/drivers/opencode.d.ts.map +1 -0
  29. package/dist/agent/drivers/opencode.js +50 -0
  30. package/dist/agent/drivers/opencode.js.map +1 -0
  31. package/dist/agent/drivers/shell.d.ts +13 -0
  32. package/dist/agent/drivers/shell.d.ts.map +1 -0
  33. package/dist/agent/drivers/shell.js +30 -0
  34. package/dist/agent/drivers/shell.js.map +1 -0
  35. package/dist/agent/env-isolation.d.ts +26 -0
  36. package/dist/agent/env-isolation.d.ts.map +1 -0
  37. package/dist/agent/env-isolation.js +103 -0
  38. package/dist/agent/env-isolation.js.map +1 -0
  39. package/dist/agent/notify-setup.d.ts +18 -0
  40. package/dist/agent/notify-setup.d.ts.map +1 -0
  41. package/dist/agent/notify-setup.js +68 -0
  42. package/dist/agent/notify-setup.js.map +1 -0
  43. package/dist/agent/session-manager.d.ts +75 -0
  44. package/dist/agent/session-manager.d.ts.map +1 -0
  45. package/dist/agent/session-manager.js +407 -0
  46. package/dist/agent/session-manager.js.map +1 -0
  47. package/dist/agent/signal.d.ts +32 -0
  48. package/dist/agent/signal.d.ts.map +1 -0
  49. package/dist/agent/signal.js +199 -0
  50. package/dist/agent/signal.js.map +1 -0
  51. package/dist/agent/status-poller.d.ts +27 -0
  52. package/dist/agent/status-poller.d.ts.map +1 -0
  53. package/dist/agent/status-poller.js +76 -0
  54. package/dist/agent/status-poller.js.map +1 -0
  55. package/dist/agent/templates/brain-prompt.d.ts +14 -0
  56. package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
  57. package/dist/agent/templates/brain-prompt.js +57 -0
  58. package/dist/agent/templates/brain-prompt.js.map +1 -0
  59. package/dist/agent/templates/identity.d.ts +19 -0
  60. package/dist/agent/templates/identity.d.ts.map +1 -0
  61. package/dist/agent/templates/identity.js +97 -0
  62. package/dist/agent/templates/identity.js.map +1 -0
  63. package/dist/agent/tmux.d.ts +90 -0
  64. package/dist/agent/tmux.d.ts.map +1 -0
  65. package/dist/agent/tmux.js +386 -0
  66. package/dist/agent/tmux.js.map +1 -0
  67. package/dist/autofix/audit-engine.d.ts +35 -0
  68. package/dist/autofix/audit-engine.d.ts.map +1 -0
  69. package/dist/autofix/audit-engine.js +144 -0
  70. package/dist/autofix/audit-engine.js.map +1 -0
  71. package/dist/autofix/branch-manager.d.ts +44 -0
  72. package/dist/autofix/branch-manager.d.ts.map +1 -0
  73. package/dist/autofix/branch-manager.js +97 -0
  74. package/dist/autofix/branch-manager.js.map +1 -0
  75. package/dist/autofix/decision-engine.d.ts +38 -0
  76. package/dist/autofix/decision-engine.d.ts.map +1 -0
  77. package/dist/autofix/decision-engine.js +115 -0
  78. package/dist/autofix/decision-engine.js.map +1 -0
  79. package/dist/autofix/index.d.ts +23 -0
  80. package/dist/autofix/index.d.ts.map +1 -0
  81. package/dist/autofix/index.js +192 -0
  82. package/dist/autofix/index.js.map +1 -0
  83. package/dist/autofix/prompt-builder.d.ts +25 -0
  84. package/dist/autofix/prompt-builder.d.ts.map +1 -0
  85. package/dist/autofix/prompt-builder.js +137 -0
  86. package/dist/autofix/prompt-builder.js.map +1 -0
  87. package/dist/autofix/report-parser.d.ts +18 -0
  88. package/dist/autofix/report-parser.d.ts.map +1 -0
  89. package/dist/autofix/report-parser.js +74 -0
  90. package/dist/autofix/report-parser.js.map +1 -0
  91. package/dist/autofix/state-machine.d.ts +40 -0
  92. package/dist/autofix/state-machine.d.ts.map +1 -0
  93. package/dist/autofix/state-machine.js +76 -0
  94. package/dist/autofix/state-machine.js.map +1 -0
  95. package/dist/bind/bind-flow.d.ts +15 -0
  96. package/dist/bind/bind-flow.d.ts.map +1 -0
  97. package/dist/bind/bind-flow.js +198 -0
  98. package/dist/bind/bind-flow.js.map +1 -0
  99. package/dist/config.d.ts +53 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +89 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/daemon/codex-watcher.d.ts +46 -0
  104. package/dist/daemon/codex-watcher.d.ts.map +1 -0
  105. package/dist/daemon/codex-watcher.js +533 -0
  106. package/dist/daemon/codex-watcher.js.map +1 -0
  107. package/dist/daemon/command-handler.d.ts +6 -0
  108. package/dist/daemon/command-handler.d.ts.map +1 -0
  109. package/dist/daemon/command-handler.js +770 -0
  110. package/dist/daemon/command-handler.js.map +1 -0
  111. package/dist/daemon/discussion-orchestrator.d.ts +63 -0
  112. package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
  113. package/dist/daemon/discussion-orchestrator.js +482 -0
  114. package/dist/daemon/discussion-orchestrator.js.map +1 -0
  115. package/dist/daemon/gemini-watcher.d.ts +42 -0
  116. package/dist/daemon/gemini-watcher.d.ts.map +1 -0
  117. package/dist/daemon/gemini-watcher.js +463 -0
  118. package/dist/daemon/gemini-watcher.js.map +1 -0
  119. package/dist/daemon/hook-server.d.ts +42 -0
  120. package/dist/daemon/hook-server.d.ts.map +1 -0
  121. package/dist/daemon/hook-server.js +160 -0
  122. package/dist/daemon/hook-server.js.map +1 -0
  123. package/dist/daemon/jsonl-watcher.d.ts +35 -0
  124. package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
  125. package/dist/daemon/jsonl-watcher.js +635 -0
  126. package/dist/daemon/jsonl-watcher.js.map +1 -0
  127. package/dist/daemon/lifecycle.d.ts +20 -0
  128. package/dist/daemon/lifecycle.d.ts.map +1 -0
  129. package/dist/daemon/lifecycle.js +331 -0
  130. package/dist/daemon/lifecycle.js.map +1 -0
  131. package/dist/daemon/server-link.d.ts +44 -0
  132. package/dist/daemon/server-link.d.ts.map +1 -0
  133. package/dist/daemon/server-link.js +232 -0
  134. package/dist/daemon/server-link.js.map +1 -0
  135. package/dist/daemon/subsession-manager.d.ts +37 -0
  136. package/dist/daemon/subsession-manager.d.ts.map +1 -0
  137. package/dist/daemon/subsession-manager.js +240 -0
  138. package/dist/daemon/subsession-manager.js.map +1 -0
  139. package/dist/daemon/terminal-parser.d.ts +42 -0
  140. package/dist/daemon/terminal-parser.d.ts.map +1 -0
  141. package/dist/daemon/terminal-parser.js +278 -0
  142. package/dist/daemon/terminal-parser.js.map +1 -0
  143. package/dist/daemon/terminal-streamer.d.ts +93 -0
  144. package/dist/daemon/terminal-streamer.d.ts.map +1 -0
  145. package/dist/daemon/terminal-streamer.js +451 -0
  146. package/dist/daemon/terminal-streamer.js.map +1 -0
  147. package/dist/daemon/timeline-emitter.d.ts +32 -0
  148. package/dist/daemon/timeline-emitter.d.ts.map +1 -0
  149. package/dist/daemon/timeline-emitter.js +97 -0
  150. package/dist/daemon/timeline-emitter.js.map +1 -0
  151. package/dist/daemon/timeline-event.d.ts +23 -0
  152. package/dist/daemon/timeline-event.d.ts.map +1 -0
  153. package/dist/daemon/timeline-event.js +7 -0
  154. package/dist/daemon/timeline-event.js.map +1 -0
  155. package/dist/daemon/timeline-store.d.ts +40 -0
  156. package/dist/daemon/timeline-store.d.ts.map +1 -0
  157. package/dist/daemon/timeline-store.js +153 -0
  158. package/dist/daemon/timeline-store.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +149 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/memory/claude-mem.d.ts +9 -0
  164. package/dist/memory/claude-mem.d.ts.map +1 -0
  165. package/dist/memory/claude-mem.js +58 -0
  166. package/dist/memory/claude-mem.js.map +1 -0
  167. package/dist/memory/context-builder.d.ts +4 -0
  168. package/dist/memory/context-builder.d.ts.map +1 -0
  169. package/dist/memory/context-builder.js +35 -0
  170. package/dist/memory/context-builder.js.map +1 -0
  171. package/dist/memory/detector.d.ts +7 -0
  172. package/dist/memory/detector.d.ts.map +1 -0
  173. package/dist/memory/detector.js +17 -0
  174. package/dist/memory/detector.js.map +1 -0
  175. package/dist/memory/extractor.d.ts +21 -0
  176. package/dist/memory/extractor.d.ts.map +1 -0
  177. package/dist/memory/extractor.js +83 -0
  178. package/dist/memory/extractor.js.map +1 -0
  179. package/dist/memory/injector.d.ts +7 -0
  180. package/dist/memory/injector.d.ts.map +1 -0
  181. package/dist/memory/injector.js +18 -0
  182. package/dist/memory/injector.js.map +1 -0
  183. package/dist/memory/interface.d.ts +25 -0
  184. package/dist/memory/interface.d.ts.map +1 -0
  185. package/dist/memory/interface.js +3 -0
  186. package/dist/memory/interface.js.map +1 -0
  187. package/dist/memory/mem0.d.ts +12 -0
  188. package/dist/memory/mem0.d.ts.map +1 -0
  189. package/dist/memory/mem0.js +93 -0
  190. package/dist/memory/mem0.js.map +1 -0
  191. package/dist/router/command-parser.d.ts +33 -0
  192. package/dist/router/command-parser.d.ts.map +1 -0
  193. package/dist/router/command-parser.js +66 -0
  194. package/dist/router/command-parser.js.map +1 -0
  195. package/dist/router/message-router.d.ts +42 -0
  196. package/dist/router/message-router.d.ts.map +1 -0
  197. package/dist/router/message-router.js +222 -0
  198. package/dist/router/message-router.js.map +1 -0
  199. package/dist/router/response-collector.d.ts +28 -0
  200. package/dist/router/response-collector.d.ts.map +1 -0
  201. package/dist/router/response-collector.js +164 -0
  202. package/dist/router/response-collector.js.map +1 -0
  203. package/dist/store/project-store.d.ts +37 -0
  204. package/dist/store/project-store.d.ts.map +1 -0
  205. package/dist/store/project-store.js +70 -0
  206. package/dist/store/project-store.js.map +1 -0
  207. package/dist/store/session-store.d.ts +32 -0
  208. package/dist/store/session-store.d.ts.map +1 -0
  209. package/dist/store/session-store.js +67 -0
  210. package/dist/store/session-store.js.map +1 -0
  211. package/dist/tracker/branch.d.ts +24 -0
  212. package/dist/tracker/branch.d.ts.map +1 -0
  213. package/dist/tracker/branch.js +55 -0
  214. package/dist/tracker/branch.js.map +1 -0
  215. package/dist/tracker/github.d.ts +31 -0
  216. package/dist/tracker/github.d.ts.map +1 -0
  217. package/dist/tracker/github.js +117 -0
  218. package/dist/tracker/github.js.map +1 -0
  219. package/dist/tracker/gitlab.d.ts +31 -0
  220. package/dist/tracker/gitlab.d.ts.map +1 -0
  221. package/dist/tracker/gitlab.js +116 -0
  222. package/dist/tracker/gitlab.js.map +1 -0
  223. package/dist/tracker/index.d.ts +9 -0
  224. package/dist/tracker/index.d.ts.map +1 -0
  225. package/dist/tracker/index.js +28 -0
  226. package/dist/tracker/index.js.map +1 -0
  227. package/dist/tracker/interface.d.ts +39 -0
  228. package/dist/tracker/interface.d.ts.map +1 -0
  229. package/dist/tracker/interface.js +7 -0
  230. package/dist/tracker/interface.js.map +1 -0
  231. package/dist/tracker/priority.d.ts +19 -0
  232. package/dist/tracker/priority.d.ts.map +1 -0
  233. package/dist/tracker/priority.js +40 -0
  234. package/dist/tracker/priority.js.map +1 -0
  235. package/dist/util/logger.d.ts +4 -0
  236. package/dist/util/logger.d.ts.map +1 -0
  237. package/dist/util/logger.js +14 -0
  238. package/dist/util/logger.js.map +1 -0
  239. package/package.json +65 -0
@@ -0,0 +1,635 @@
1
+ "use strict";
2
+ /**
3
+ * Watches Claude Code JSONL transcript files for structured events.
4
+ *
5
+ * Claude Code writes every conversation turn to:
6
+ * ~/.claude/projects/{projectKey}/{sessionId}.jsonl
7
+ *
8
+ * Each line is a JSON object with type "assistant", "user", "result", or "system".
9
+ * This watcher tails the active JSONL file and emits structured timeline events —
10
+ * far more reliable than parsing raw PTY terminal output.
11
+ *
12
+ * Integration:
13
+ * - startWatching(sessionName, projectDir) when a claude-code session starts
14
+ * - stopWatching(sessionName) when it stops
15
+ */
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.claudeProjectDir = claudeProjectDir;
21
+ exports.startWatching = startWatching;
22
+ exports.isWatching = isWatching;
23
+ exports.stopWatching = stopWatching;
24
+ exports.startWatchingFile = startWatchingFile;
25
+ const promises_1 = require("fs/promises");
26
+ const path_1 = require("path");
27
+ const os_1 = require("os");
28
+ const timeline_emitter_js_1 = require("./timeline-emitter.js");
29
+ const logger_js_1 = __importDefault(require("../util/logger.js"));
30
+ // ── Path helpers ──────────────────────────────────────────────────────────────
31
+ /** Compute Claude Code project key: replace path separators with '-'. */
32
+ function claudeProjectKey(absPath) {
33
+ return absPath.replace(/\/+$/, '').replace(/[/\\]/g, '-');
34
+ }
35
+ /** Return the ~/.claude/projects/{key} directory for a given work dir. */
36
+ function claudeProjectDir(workDir) {
37
+ const key = claudeProjectKey(workDir);
38
+ return (0, path_1.join)((0, os_1.homedir)(), '.claude', 'projects', key);
39
+ }
40
+ /** Find the most recently modified .jsonl file in a directory. */
41
+ async function findLatestJsonl(dir) {
42
+ let entries;
43
+ try {
44
+ entries = await (0, promises_1.readdir)(dir);
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ const jsonls = entries.filter((e) => e.endsWith('.jsonl'));
50
+ if (jsonls.length === 0)
51
+ return null;
52
+ const withStats = await Promise.all(jsonls.map(async (f) => {
53
+ try {
54
+ const s = await (0, promises_1.stat)((0, path_1.join)(dir, f));
55
+ return { f, mtime: s.mtimeMs };
56
+ }
57
+ catch {
58
+ return { f, mtime: 0 };
59
+ }
60
+ }));
61
+ withStats.sort((a, b) => b.mtime - a.mtime);
62
+ return (0, path_1.join)(dir, withStats[0].f);
63
+ }
64
+ /**
65
+ * Parse one JSONL line and emit timeline events.
66
+ * - assistant: emit assistant.text, assistant.thinking, tool.call
67
+ * - user: emit user.message, tool.result
68
+ */
69
+ function parseLine(sessionName, line) {
70
+ if (!line.trim())
71
+ return;
72
+ let raw;
73
+ try {
74
+ raw = JSON.parse(line);
75
+ }
76
+ catch {
77
+ return;
78
+ }
79
+ // Progress events — transient status for status bar display (no message.content)
80
+ if (raw['type'] === 'progress') {
81
+ const data = raw['data'];
82
+ if (!data)
83
+ return;
84
+ const progressType = String(data['type'] ?? '');
85
+ switch (progressType) {
86
+ case 'bash_progress': {
87
+ const elapsed = data['elapsedTimeSeconds'];
88
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
89
+ status: 'bash_running',
90
+ label: `Bash running${elapsed ? ` (${Math.round(elapsed)}s)` : ''}...`,
91
+ }, { source: 'daemon', confidence: 'high' });
92
+ break;
93
+ }
94
+ case 'agent_progress': {
95
+ const msg = String(data['message'] ?? 'working');
96
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
97
+ status: 'agent_working',
98
+ label: `Sub-agent: ${msg}`,
99
+ }, { source: 'daemon', confidence: 'high' });
100
+ break;
101
+ }
102
+ case 'mcp_progress': {
103
+ const toolName = String(data['toolName'] ?? 'tool');
104
+ const server = String(data['serverName'] ?? '');
105
+ const mStatus = String(data['status'] ?? 'started');
106
+ if (mStatus === 'started') {
107
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
108
+ status: 'mcp_running',
109
+ label: `MCP: ${server ? server + '/' : ''}${toolName}...`,
110
+ }, { source: 'daemon', confidence: 'high' });
111
+ }
112
+ break;
113
+ }
114
+ case 'waiting_for_task': {
115
+ const desc = String(data['taskDescription'] ?? 'task');
116
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
117
+ status: 'waiting',
118
+ label: `Waiting: ${desc}`,
119
+ }, { source: 'daemon', confidence: 'high' });
120
+ break;
121
+ }
122
+ }
123
+ return;
124
+ }
125
+ // Result events — end-of-turn summary with total cost
126
+ if (raw['type'] === 'result') {
127
+ const costUsd = raw['total_cost_usd'];
128
+ if (typeof costUsd === 'number' && costUsd > 0) {
129
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'usage.update', { costUsd }, { source: 'daemon', confidence: 'high' });
130
+ }
131
+ return;
132
+ }
133
+ // System events — compact_boundary etc. (no message.content)
134
+ if (raw['type'] === 'system') {
135
+ const subtype = String(raw['subtype'] ?? '');
136
+ if (subtype === 'compact_boundary') {
137
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'agent.status', {
138
+ status: 'compacting',
139
+ label: 'Compacting conversation...',
140
+ }, { source: 'daemon', confidence: 'high' });
141
+ }
142
+ return;
143
+ }
144
+ const msg = raw['message'];
145
+ if (!msg)
146
+ return;
147
+ const content = msg['content'];
148
+ if (!Array.isArray(content))
149
+ return;
150
+ if (raw['type'] === 'assistant') {
151
+ for (const block of content) {
152
+ if (block.type === 'text' && block.text) {
153
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.text', {
154
+ text: block.text,
155
+ streaming: false,
156
+ }, { source: 'daemon', confidence: 'high' });
157
+ }
158
+ else if (block.type === 'thinking' && block.thinking) {
159
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.thinking', {
160
+ text: block.thinking,
161
+ }, { source: 'daemon', confidence: 'high' });
162
+ }
163
+ else if (block.type === 'tool_use' && block.name) {
164
+ const input = extractToolInput(block.name, block.input);
165
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.call', {
166
+ tool: block.name,
167
+ ...(input ? { input } : {}),
168
+ }, { source: 'daemon', confidence: 'high' });
169
+ }
170
+ }
171
+ // Emit token usage + model for context bar
172
+ const usage = msg['usage'];
173
+ const model = msg['model'];
174
+ if (usage && typeof usage.input_tokens === 'number') {
175
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'usage.update', {
176
+ inputTokens: usage.input_tokens + (usage.cache_creation_input_tokens ?? 0),
177
+ cacheTokens: usage.cache_read_input_tokens ?? 0,
178
+ contextWindow: 1_000_000,
179
+ ...(model ? { model } : {}),
180
+ }, { source: 'daemon', confidence: 'high' });
181
+ }
182
+ return;
183
+ }
184
+ if (raw['type'] === 'user') {
185
+ for (const block of content) {
186
+ if (block.type === 'text' && block.text?.trim()) {
187
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'user.message', {
188
+ text: block.text,
189
+ }, { source: 'daemon', confidence: 'high' });
190
+ }
191
+ else if (block.type === 'tool_result') {
192
+ const error = block.is_error ? String(block.content ?? 'error') : undefined;
193
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.result', {
194
+ ...(error ? { error } : {}),
195
+ }, { source: 'daemon', confidence: 'high' });
196
+ }
197
+ }
198
+ }
199
+ }
200
+ /** Extract a short summary of tool input for display. */
201
+ function extractToolInput(tool, input) {
202
+ if (!input)
203
+ return '';
204
+ switch (tool) {
205
+ case 'Bash': return String(input['command'] ?? '').split('\n').find((l) => l.trim()) ?? '';
206
+ case 'Read':
207
+ case 'Write':
208
+ case 'Edit': return String(input['file_path'] ?? '');
209
+ case 'Glob': return String(input['pattern'] ?? '');
210
+ case 'Grep': return `${input['pattern'] ?? ''}${input['path'] ? ` in ${input['path']}` : ''}`;
211
+ case 'Agent': return String(input['description'] ?? '');
212
+ default: return '';
213
+ }
214
+ }
215
+ const watchers = new Map();
216
+ /** Which session has claimed each JSONL file path (prevents cross-session stealing). */
217
+ const claimedFiles = new Map(); // filePath → sessionName
218
+ function claimFile(sessionName, filePath) {
219
+ // Release any previous file claimed by this session
220
+ for (const [fp, sn] of claimedFiles) {
221
+ if (sn === sessionName) {
222
+ claimedFiles.delete(fp);
223
+ break;
224
+ }
225
+ }
226
+ claimedFiles.set(filePath, sessionName);
227
+ }
228
+ function releaseFiles(sessionName) {
229
+ for (const [fp, sn] of claimedFiles) {
230
+ if (sn === sessionName)
231
+ claimedFiles.delete(fp);
232
+ }
233
+ }
234
+ /** Returns true if filePath is unclaimed or already claimed by sessionName. */
235
+ function canClaim(sessionName, filePath) {
236
+ const owner = claimedFiles.get(filePath);
237
+ return !owner || owner === sessionName;
238
+ }
239
+ // ── Public API ────────────────────────────────────────────────────────────────
240
+ const HISTORY_LINES = 500; // max lines to scan for recent assistant.text history
241
+ /**
242
+ * Read the tail of a JSONL file and emit history events (text, thinking, tool.call, tool.result).
243
+ */
244
+ async function emitRecentHistory(sessionName, filePath) {
245
+ let fh = null;
246
+ try {
247
+ fh = await (0, promises_1.open)(filePath, 'r');
248
+ const { size } = await fh.stat();
249
+ if (size === 0)
250
+ return;
251
+ // Read up to 256KB from the end of the file to cover recent history
252
+ const readSize = Math.min(size, 256 * 1024);
253
+ const buf = Buffer.allocUnsafe(readSize);
254
+ const { bytesRead } = await fh.read(buf, 0, readSize, size - readSize);
255
+ if (bytesRead === 0)
256
+ return;
257
+ const chunk = buf.subarray(0, bytesRead).toString('utf8');
258
+ // Drop the first (possibly partial) line when reading mid-file
259
+ const lines = chunk.split('\n');
260
+ const startIdx = size > readSize ? 1 : 0; // skip partial first line
261
+ // First pass: find the most recent usage data (scan all lines, not limited to HISTORY_LINES)
262
+ let lastUsagePayload = null;
263
+ for (let i = startIdx; i < lines.length; i++) {
264
+ const line = lines[i];
265
+ if (!line.trim())
266
+ continue;
267
+ let raw;
268
+ try {
269
+ raw = JSON.parse(line);
270
+ }
271
+ catch {
272
+ continue;
273
+ }
274
+ if (raw['type'] === 'assistant') {
275
+ const msg = raw['message'];
276
+ const usage = msg?.['usage'];
277
+ const model = msg?.['model'];
278
+ if (usage && typeof usage.input_tokens === 'number') {
279
+ lastUsagePayload = {
280
+ inputTokens: usage.input_tokens + (usage.cache_creation_input_tokens ?? 0),
281
+ cacheTokens: usage.cache_read_input_tokens ?? 0,
282
+ contextWindow: 1_000_000,
283
+ ...(model ? { model } : {}),
284
+ };
285
+ }
286
+ }
287
+ }
288
+ let count = 0;
289
+ for (let i = startIdx; i < lines.length && count < HISTORY_LINES; i++) {
290
+ const line = lines[i];
291
+ if (!line.trim())
292
+ continue;
293
+ let raw;
294
+ try {
295
+ raw = JSON.parse(line);
296
+ }
297
+ catch {
298
+ continue;
299
+ }
300
+ const msg = raw['message'];
301
+ const content = msg?.['content'];
302
+ if (!Array.isArray(content))
303
+ continue;
304
+ if (raw['type'] === 'assistant') {
305
+ for (const block of content) {
306
+ if (block.type === 'text' && block.text) {
307
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.text', {
308
+ text: block.text, streaming: false,
309
+ }, { source: 'daemon', confidence: 'high' });
310
+ count++;
311
+ }
312
+ else if (block.type === 'thinking' && block.thinking) {
313
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'assistant.thinking', {
314
+ text: block.thinking,
315
+ }, { source: 'daemon', confidence: 'high' });
316
+ count++;
317
+ }
318
+ else if (block.type === 'tool_use' && block.name) {
319
+ const input = extractToolInput(block.name, block.input);
320
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.call', {
321
+ tool: block.name, ...(input ? { input } : {}),
322
+ }, { source: 'daemon', confidence: 'high' });
323
+ count++;
324
+ }
325
+ }
326
+ }
327
+ else if (raw['type'] === 'user') {
328
+ for (const block of content) {
329
+ if (block.type === 'text' && block.text?.trim()) {
330
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'user.message', {
331
+ text: block.text,
332
+ }, { source: 'daemon', confidence: 'high' });
333
+ count++;
334
+ }
335
+ else if (block.type === 'tool_result') {
336
+ const error = block.is_error ? String(block.content ?? 'error') : undefined;
337
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'tool.result', {
338
+ ...(error ? { error } : {}),
339
+ }, { source: 'daemon', confidence: 'high' });
340
+ count++;
341
+ }
342
+ }
343
+ }
344
+ }
345
+ // Emit the most recent usage snapshot so the context bar populates on load
346
+ if (lastUsagePayload) {
347
+ timeline_emitter_js_1.timelineEmitter.emit(sessionName, 'usage.update', lastUsagePayload, { source: 'daemon', confidence: 'high' });
348
+ }
349
+ }
350
+ catch {
351
+ // best-effort
352
+ }
353
+ finally {
354
+ if (fh)
355
+ await fh.close().catch(() => { });
356
+ }
357
+ }
358
+ /**
359
+ * Start watching Claude Code's JSONL transcript for a session.
360
+ * Only new lines written after this call are emitted — no history replay.
361
+ *
362
+ * @param sessionName tmux session name (e.g. "deck_myapp_brain")
363
+ * @param workDir absolute path to the project working directory
364
+ */
365
+ async function startWatching(sessionName, workDir) {
366
+ if (watchers.has(sessionName)) {
367
+ stopWatching(sessionName);
368
+ }
369
+ const projectDir = claudeProjectDir(workDir);
370
+ const state = {
371
+ projectDir,
372
+ activeFile: null,
373
+ fileOffset: 0,
374
+ abort: new AbortController(),
375
+ stopped: false,
376
+ };
377
+ watchers.set(sessionName, state);
378
+ // Find the current active JSONL file, emit recent history, then tail from EOF.
379
+ // Only claim an unclaimed file; if the latest is already claimed by another session,
380
+ // start with no active file and wait for a new one to appear.
381
+ const latest = await findLatestJsonl(projectDir);
382
+ if (latest && canClaim(sessionName, latest)) {
383
+ claimFile(sessionName, latest);
384
+ try {
385
+ const s = await (0, promises_1.stat)(latest);
386
+ state.activeFile = latest;
387
+ state.fileOffset = s.size;
388
+ // Emit recent assistant.text events from history so chat view populates immediately
389
+ await emitRecentHistory(sessionName, latest);
390
+ }
391
+ catch {
392
+ state.activeFile = latest;
393
+ state.fileOffset = 0;
394
+ }
395
+ }
396
+ // Poll every 2s as a reliable fallback (fs.watch on macOS misses file appends).
397
+ // Uses pollTick (not drainNewLines) so it can re-acquire a file if the claim was stolen.
398
+ state.pollTimer = setInterval(() => {
399
+ void pollTick(sessionName, state);
400
+ }, 2000);
401
+ // Watch the project directory for new/modified JSONL files (best-effort, faster than poll)
402
+ void watchDir(sessionName, state);
403
+ }
404
+ /** Returns true if a JSONL watcher is active for this session. */
405
+ function isWatching(sessionName) {
406
+ return watchers.has(sessionName);
407
+ }
408
+ /** Stop watching and release all file handles for a session. */
409
+ function stopWatching(sessionName) {
410
+ const state = watchers.get(sessionName);
411
+ if (!state)
412
+ return;
413
+ state.stopped = true;
414
+ state.abort.abort();
415
+ if (state.pollTimer)
416
+ clearInterval(state.pollTimer);
417
+ watchers.delete(sessionName);
418
+ releaseFiles(sessionName);
419
+ }
420
+ /**
421
+ * Start watching a specific JSONL file for a session.
422
+ * Polls until the file appears (CC creates it on first conversation), then tails it.
423
+ * Used for CC sub-sessions where the file path is known from --session-id.
424
+ */
425
+ async function startWatchingFile(sessionName, filePath) {
426
+ if (watchers.has(sessionName)) {
427
+ stopWatching(sessionName);
428
+ }
429
+ // Pre-claim the file path immediately — before the file even exists — so that
430
+ // the main session's watchDir cannot steal it when CC creates the file.
431
+ claimFile(sessionName, filePath);
432
+ // Derive projectDir from filePath (parent directory)
433
+ const projectDir = (0, path_1.dirname)(filePath);
434
+ const state = {
435
+ projectDir,
436
+ activeFile: null,
437
+ fileOffset: 0,
438
+ abort: new AbortController(),
439
+ stopped: false,
440
+ };
441
+ watchers.set(sessionName, state);
442
+ // Poll until the specific file appears (up to 120s — CC needs first conversation)
443
+ let appeared = false;
444
+ for (let i = 0; i < 120 && !state.stopped; i++) {
445
+ try {
446
+ const s = await (0, promises_1.stat)(filePath);
447
+ state.activeFile = filePath;
448
+ state.fileOffset = s.size; // start from end (only new content)
449
+ claimFile(sessionName, filePath);
450
+ appeared = true;
451
+ break;
452
+ }
453
+ catch {
454
+ await new Promise((r) => setTimeout(r, 1000));
455
+ }
456
+ }
457
+ if (!appeared || state.stopped)
458
+ return;
459
+ // Poll every 2s for new content
460
+ state.pollTimer = setInterval(() => {
461
+ void drainNewLines(sessionName, state);
462
+ }, 2000);
463
+ // Also use fs.watch on the specific file for faster updates
464
+ void watchFile(sessionName, state, filePath);
465
+ }
466
+ async function watchFile(sessionName, state, filePath) {
467
+ try {
468
+ const watcher = (0, promises_1.watch)((0, path_1.dirname)(filePath), { persistent: false, signal: state.abort.signal });
469
+ const fileName = (0, path_1.basename)(filePath);
470
+ for await (const event of watcher) {
471
+ if (state.stopped)
472
+ break;
473
+ if (event.filename !== fileName)
474
+ continue;
475
+ await drainNewLines(sessionName, state);
476
+ }
477
+ }
478
+ catch (err) {
479
+ if (!state.stopped) {
480
+ logger_js_1.default.warn({ sessionName, err }, 'jsonl-watcher: file watch error');
481
+ }
482
+ }
483
+ }
484
+ // ── Internal watcher logic ────────────────────────────────────────────────────
485
+ async function watchDir(sessionName, state) {
486
+ // Ensure the directory exists (Claude Code may not have created it yet)
487
+ try {
488
+ await (0, promises_1.stat)(state.projectDir);
489
+ }
490
+ catch {
491
+ // Dir doesn't exist yet — poll until it appears, up to 60s
492
+ for (let i = 0; i < 60; i++) {
493
+ await new Promise((r) => setTimeout(r, 1000));
494
+ if (state.stopped)
495
+ return;
496
+ try {
497
+ await (0, promises_1.stat)(state.projectDir);
498
+ break;
499
+ }
500
+ catch {
501
+ // keep waiting
502
+ }
503
+ }
504
+ if (state.stopped)
505
+ return;
506
+ }
507
+ try {
508
+ const watcher = (0, promises_1.watch)(state.projectDir, { persistent: false, signal: state.abort.signal });
509
+ for await (const event of watcher) {
510
+ if (state.stopped)
511
+ break;
512
+ if (typeof event.filename !== 'string' || !event.filename.endsWith('.jsonl'))
513
+ continue;
514
+ const changedFile = (0, path_1.join)(state.projectDir, event.filename);
515
+ // If a new file appeared that is newer than our active file, switch to it.
516
+ // Skip if another session has already claimed it.
517
+ if (changedFile !== state.activeFile) {
518
+ if (!canClaim(sessionName, changedFile))
519
+ continue; // claimed by another session
520
+ const isNewer = await checkNewer(changedFile, state.activeFile);
521
+ if (isNewer) {
522
+ logger_js_1.default.debug({ sessionName, file: event.filename }, 'jsonl-watcher: switching to new JSONL file');
523
+ claimFile(sessionName, changedFile);
524
+ state.activeFile = changedFile;
525
+ state.fileOffset = 0;
526
+ }
527
+ else if (!state.activeFile) {
528
+ claimFile(sessionName, changedFile);
529
+ state.activeFile = changedFile;
530
+ state.fileOffset = 0;
531
+ }
532
+ else {
533
+ continue; // older file, ignore
534
+ }
535
+ }
536
+ await drainNewLines(sessionName, state);
537
+ }
538
+ }
539
+ catch (err) {
540
+ if (!state.stopped) {
541
+ logger_js_1.default.warn({ sessionName, err }, 'jsonl-watcher: dir watch error');
542
+ }
543
+ }
544
+ }
545
+ /** Returns true if candidate is newer than current (or current is null). */
546
+ async function checkNewer(candidate, current) {
547
+ if (!current)
548
+ return true;
549
+ try {
550
+ const [cs, curS] = await Promise.all([(0, promises_1.stat)(candidate), (0, promises_1.stat)(current)]);
551
+ return cs.mtimeMs > curS.mtimeMs;
552
+ }
553
+ catch {
554
+ return false;
555
+ }
556
+ }
557
+ /**
558
+ * Poll tick for startWatching — drains new lines and re-acquires a file if activeFile was released.
559
+ * Separate from drainNewLines so startWatchingFile's poll timer stays simple.
560
+ */
561
+ async function pollTick(sessionName, state) {
562
+ // If active file was stolen by another session, try to find a claimable replacement
563
+ if (!state.activeFile) {
564
+ try {
565
+ const entries = await (0, promises_1.readdir)(state.projectDir);
566
+ const jsonls = entries.filter((e) => e.endsWith('.jsonl'));
567
+ const withStats = await Promise.all(jsonls.map(async (f) => {
568
+ const fp = (0, path_1.join)(state.projectDir, f);
569
+ if (!canClaim(sessionName, fp))
570
+ return null;
571
+ try {
572
+ return { fp, mtime: (await (0, promises_1.stat)(fp)).mtimeMs };
573
+ }
574
+ catch {
575
+ return null;
576
+ }
577
+ }));
578
+ const best = withStats
579
+ .filter((x) => x !== null)
580
+ .sort((a, b) => b.mtime - a.mtime)[0];
581
+ if (best) {
582
+ claimFile(sessionName, best.fp);
583
+ state.activeFile = best.fp;
584
+ try {
585
+ state.fileOffset = (await (0, promises_1.stat)(best.fp)).size;
586
+ await emitRecentHistory(sessionName, best.fp);
587
+ }
588
+ catch {
589
+ state.fileOffset = 0;
590
+ }
591
+ }
592
+ }
593
+ catch { /* ignore */ }
594
+ }
595
+ await drainNewLines(sessionName, state);
596
+ }
597
+ /** Read any new lines from the active JSONL file since the last offset. */
598
+ async function drainNewLines(sessionName, state) {
599
+ if (!state.activeFile)
600
+ return;
601
+ // If another session has claimed our active file, release it so we can re-acquire our own
602
+ if (!canClaim(sessionName, state.activeFile)) {
603
+ state.activeFile = null;
604
+ return;
605
+ }
606
+ let fh = null;
607
+ try {
608
+ fh = await (0, promises_1.open)(state.activeFile, 'r');
609
+ const fileStat = await fh.stat();
610
+ if (fileStat.size <= state.fileOffset)
611
+ return;
612
+ const buf = Buffer.allocUnsafe(fileStat.size - state.fileOffset);
613
+ const { bytesRead } = await fh.read(buf, 0, buf.length, state.fileOffset);
614
+ if (bytesRead === 0)
615
+ return;
616
+ state.fileOffset += bytesRead;
617
+ const chunk = buf.subarray(0, bytesRead).toString('utf8');
618
+ const lines = chunk.split('\n');
619
+ for (const line of lines) {
620
+ if (state.stopped)
621
+ break;
622
+ parseLine(sessionName, line);
623
+ }
624
+ }
625
+ catch (err) {
626
+ if (!state.stopped) {
627
+ logger_js_1.default.debug({ sessionName, err }, 'jsonl-watcher: drain error');
628
+ }
629
+ }
630
+ finally {
631
+ if (fh)
632
+ await fh.close().catch(() => { });
633
+ }
634
+ }
635
+ //# sourceMappingURL=jsonl-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-watcher.js","sourceRoot":"","sources":["../../src/daemon/jsonl-watcher.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;AAiBH,4CAGC;AAoVD,sCAyCC;AAGD,gCAEC;AAGD,oCAQC;AAOD,8CA4CC;AAldD,0CAAyD;AAEzD,+BAA+C;AAC/C,2BAA6B;AAC7B,+DAAwD;AACxD,kEAAuC;AAEvC,iFAAiF;AAEjF,yEAAyE;AACzE,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,0EAA0E;AAC1E,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,kEAAkE;AAClE,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAA,eAAI,EAAC,IAAA,WAAI,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,IAAA,WAAI,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAcD;;;;GAIG;AACH,SAAS,SAAS,CAAC,WAAmB,EAAE,IAAY;IAClD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO;IAEzB,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,iFAAiF;IACjF,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAwC,CAAC;QAChE,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAuB,CAAC;gBACjE,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;oBAChD,MAAM,EAAE,cAAc;oBACtB,KAAK,EAAE,eAAe,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;iBACvE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC7C,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC;gBACjD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;oBAChD,MAAM,EAAE,eAAe;oBACvB,KAAK,EAAE,cAAc,GAAG,EAAE;iBAC3B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC7C,MAAM;YACR,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC;gBACpD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;wBAChD,MAAM,EAAE,aAAa;wBACrB,KAAK,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,KAAK;qBAC1D,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC/C,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,CAAC;gBACvD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;oBAChD,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,YAAY,IAAI,EAAE;iBAC1B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC7C,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,sDAAsD;IACtD,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAuB,CAAC;QAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAC/C,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAC3D,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO;IACT,CAAC;IAED,6DAA6D;IAC7D,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;YACnC,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;gBAChD,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,4BAA4B;aACpC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAwC,CAAC;IAClE,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IAEpC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,WAAW,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,OAAyB,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACxC,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE;oBAClD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,SAAS,EAAE,KAAK;iBACjB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACvD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,EAAE;oBACtD,IAAI,EAAE,KAAK,CAAC,QAAQ;iBACrB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE;oBAC7C,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,2CAA2C;QAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAkH,CAAC;QAC5I,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAuB,CAAC;QACjD,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACpD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;gBAChD,WAAW,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC;gBAC1E,WAAW,EAAE,KAAK,CAAC,uBAAuB,IAAI,CAAC;gBAC/C,aAAa,EAAE,SAAS;gBACxB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAyB,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;gBAChD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;oBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5E,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE;oBAC/C,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAA+B;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3F,KAAK,MAAM,CAAC;QAAC,KAAK,OAAO,CAAC;QAAC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAChF,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9F,KAAK,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAaD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEjD,wFAAwF;AACxF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,yBAAyB;AAEzE,SAAS,SAAS,CAAC,WAAmB,EAAE,QAAgB;IACtD,oDAAoD;IACpD,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;YAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IAC7D,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,WAAmB;IACvC,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,EAAE,KAAK,WAAW;YAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS,QAAQ,CAAC,WAAmB,EAAE,QAAgB;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,IAAI,KAAK,KAAK,WAAW,CAAC;AACzC,CAAC;AAED,iFAAiF;AAEjF,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,sDAAsD;AAEjF;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,QAAgB;IACpE,IAAI,EAAE,GAA4C,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,IAAA,eAAI,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO;QAEvB,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC;QACvE,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO;QAE5B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1D,+DAA+D;QAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;QAEpE,6FAA6F;QAC7F,IAAI,gBAAgB,GAAmC,IAAI,CAAC;QAC5D,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,GAA4B,CAAC;YACjC,IAAI,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC9E,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,WAAW,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAwC,CAAC;gBAClE,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,OAAO,CAAkH,CAAC;gBAC9I,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,OAAO,CAAuB,CAAC;gBACnD,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;oBACpD,gBAAgB,GAAG;wBACjB,WAAW,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC;wBAC1E,WAAW,EAAE,KAAK,CAAC,uBAAuB,IAAI,CAAC;wBAC/C,aAAa,EAAE,SAAS;wBACxB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5B,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,GAA4B,CAAC;YACjC,IAAI,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAE9E,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAwC,CAAC;YAClE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,SAAS;YAEtC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,WAAW,EAAE,CAAC;gBAChC,KAAK,MAAM,KAAK,IAAI,OAAyB,EAAE,CAAC;oBAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBACxC,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE;4BAClD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK;yBACnC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC7C,KAAK,EAAE,CAAC;oBACV,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACvD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,EAAE;4BACtD,IAAI,EAAE,KAAK,CAAC,QAAQ;yBACrB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC7C,KAAK,EAAE,CAAC;oBACV,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBACnD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;wBACxD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE;4BAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC9C,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC7C,KAAK,EAAE,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;gBAClC,KAAK,MAAM,KAAK,IAAI,OAAyB,EAAE,CAAC;oBAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;wBAChD,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE;4BAChD,IAAI,EAAE,KAAK,CAAC,IAAI;yBACjB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC7C,KAAK,EAAE,CAAC;oBACV,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACxC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC5E,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE;4BAC/C,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC5B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;wBAC7C,KAAK,EAAE,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,IAAI,gBAAgB,EAAE,CAAC;YACrB,qCAAe,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAChE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;YAAS,CAAC;QACT,IAAI,EAAE;YAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAgB,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CAAC,WAAmB,EAAE,OAAe;IACtE,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAiB;QAC1B,UAAU;QACV,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,IAAI,eAAe,EAAE;QAC5B,OAAO,EAAE,KAAK;KACf,CAAC;IACF,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjC,+EAA+E;IAC/E,qFAAqF;IACrF,8DAA8D;IAC9D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5C,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAA,eAAI,EAAC,MAAM,CAAC,CAAC;YAC7B,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC;YAC1B,oFAAoF;YACpF,MAAM,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;YAC1B,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,yFAAyF;IACzF,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,KAAK,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,2FAA2F;IAC3F,KAAK,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,kEAAkE;AAClE,SAAgB,UAAU,CAAC,WAAmB;IAC5C,OAAO,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,gEAAgE;AAChE,SAAgB,YAAY,CAAC,WAAmB;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACpB,IAAI,KAAK,CAAC,SAAS;QAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC7B,YAAY,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,QAAgB;IAC3E,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,8EAA8E;IAC9E,wEAAwE;IACxE,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjC,qDAAqD;IACrD,MAAM,UAAU,GAAG,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAiB;QAC1B,UAAU;QACV,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,IAAI,eAAe,EAAE;QAC5B,OAAO,EAAE,KAAK;KACf,CAAC;IACF,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjC,kFAAkF;IAClF,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAA,eAAI,EAAC,QAAQ,CAAC,CAAC;YAC/B,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;YAC5B,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,oCAAoC;YAC/D,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACjC,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO;IAEvC,gCAAgC;IAChC,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,KAAK,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,4DAA4D;IAC5D,KAAK,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,WAAmB,EAAE,KAAmB,EAAE,QAAgB;IACjF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,gBAAK,EAAC,IAAA,cAAO,EAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,MAAM,QAAQ,GAAG,IAAA,eAAQ,EAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAgD,EAAE,CAAC;YAC3E,IAAI,KAAK,CAAC,OAAO;gBAAE,MAAM;YACzB,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAAE,SAAS;YAC1C,MAAM,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,mBAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,QAAQ,CAAC,WAAmB,EAAE,KAAmB;IAC9D,wEAAwE;IACxE,IAAI,CAAC;QACH,MAAM,IAAA,eAAI,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;QAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,OAAO;gBAAE,OAAO;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAA,eAAI,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC7B,MAAM;YACR,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;IAC5B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,gBAAK,EAAC,KAAK,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAgD,EAAE,CAAC;YAC3E,IAAI,KAAK,CAAC,OAAO;gBAAE,MAAM;YACzB,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAEvF,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE3D,2EAA2E;YAC3E,kDAAkD;YAClD,IAAI,WAAW,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;oBAAE,SAAS,CAAC,6BAA6B;gBAChF,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAChE,IAAI,OAAO,EAAE,CAAC;oBACZ,mBAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,4CAA4C,CAAC,CAAC;oBAClG,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBACpC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC;oBAC/B,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;gBACvB,CAAC;qBAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBAC7B,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBACpC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC;oBAC/B,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,qBAAqB;gBACjC,CAAC;YACH,CAAC;YAED,MAAM,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,mBAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,UAAU,CAAC,SAAiB,EAAE,OAAsB;IACjE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAA,eAAI,EAAC,SAAS,CAAC,EAAE,IAAA,eAAI,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,QAAQ,CAAC,WAAmB,EAAE,KAAmB;IAC9D,oFAAoF;IACpF,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACrB,MAAM,EAAE,GAAG,IAAA,WAAI,EAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC5C,IAAI,CAAC;oBAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,IAAA,eAAI,EAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,IAAI,CAAC;gBAAC,CAAC;YAChF,CAAC,CAAC,CACH,CAAC;YACF,MAAM,IAAI,GAAG,SAAS;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAsC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;iBAC7D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC9C,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC;oBAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;gBAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,aAAa,CAAC,WAAmB,EAAE,KAAmB;IACnE,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO;IAE9B,0FAA0F;IAC1F,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,EAAE,GAA4C,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,IAAA,eAAI,EAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU;YAAE,OAAO;QAE9C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QACjE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1E,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO;QAE5B,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;QAE9B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,OAAO;gBAAE,MAAM;YACzB,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,mBAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,EAAE;YAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAgB,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}