contextos-mcp 0.4.0

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/bin/mcp.mjs +61 -0
  4. package/bin/swarm.mjs +45 -0
  5. package/dist/agents/aider.d.ts +12 -0
  6. package/dist/agents/aider.js +192 -0
  7. package/dist/agents/aider.js.map +1 -0
  8. package/dist/agents/claude-code.d.ts +9 -0
  9. package/dist/agents/claude-code.js +236 -0
  10. package/dist/agents/claude-code.js.map +1 -0
  11. package/dist/agents/codex.d.ts +14 -0
  12. package/dist/agents/codex.js +203 -0
  13. package/dist/agents/codex.js.map +1 -0
  14. package/dist/agents/direct-llm.d.ts +22 -0
  15. package/dist/agents/direct-llm.js +254 -0
  16. package/dist/agents/direct-llm.js.map +1 -0
  17. package/dist/agents/mock.d.ts +10 -0
  18. package/dist/agents/mock.js +170 -0
  19. package/dist/agents/mock.js.map +1 -0
  20. package/dist/agents/opencode.d.ts +23 -0
  21. package/dist/agents/opencode.js +631 -0
  22. package/dist/agents/opencode.js.map +1 -0
  23. package/dist/agents/provider.d.ts +11 -0
  24. package/dist/agents/provider.js +31 -0
  25. package/dist/agents/provider.js.map +1 -0
  26. package/dist/compression/compressor.d.ts +28 -0
  27. package/dist/compression/compressor.js +268 -0
  28. package/dist/compression/compressor.js.map +1 -0
  29. package/dist/config.d.ts +43 -0
  30. package/dist/config.js +172 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/contextos/loader.d.ts +46 -0
  33. package/dist/contextos/loader.js +120 -0
  34. package/dist/contextos/loader.js.map +1 -0
  35. package/dist/contextos/selector.d.ts +46 -0
  36. package/dist/contextos/selector.js +80 -0
  37. package/dist/contextos/selector.js.map +1 -0
  38. package/dist/core/action-dispatcher.d.ts +15 -0
  39. package/dist/core/action-dispatcher.js +28 -0
  40. package/dist/core/action-dispatcher.js.map +1 -0
  41. package/dist/core/action-schema.d.ts +72 -0
  42. package/dist/core/action-schema.js +86 -0
  43. package/dist/core/action-schema.js.map +1 -0
  44. package/dist/core/repl-interface.d.ts +48 -0
  45. package/dist/core/repl-interface.js +5 -0
  46. package/dist/core/repl-interface.js.map +1 -0
  47. package/dist/core/repl.d.ts +59 -0
  48. package/dist/core/repl.js +353 -0
  49. package/dist/core/repl.js.map +1 -0
  50. package/dist/core/rlm.d.ts +65 -0
  51. package/dist/core/rlm.js +564 -0
  52. package/dist/core/rlm.js.map +1 -0
  53. package/dist/core/runtime.py +470 -0
  54. package/dist/core/types.d.ts +265 -0
  55. package/dist/core/types.js +19 -0
  56. package/dist/core/types.js.map +1 -0
  57. package/dist/env.d.ts +10 -0
  58. package/dist/env.js +75 -0
  59. package/dist/env.js.map +1 -0
  60. package/dist/hooks/runner.d.ts +43 -0
  61. package/dist/hooks/runner.js +173 -0
  62. package/dist/hooks/runner.js.map +1 -0
  63. package/dist/labs/cli.d.ts +15 -0
  64. package/dist/labs/cli.js +295 -0
  65. package/dist/labs/cli.js.map +1 -0
  66. package/dist/labs/episodic-memory.d.ts +132 -0
  67. package/dist/labs/episodic-memory.js +391 -0
  68. package/dist/labs/episodic-memory.js.map +1 -0
  69. package/dist/labs/interactive-swarm.d.ts +20 -0
  70. package/dist/labs/interactive-swarm.js +1173 -0
  71. package/dist/labs/interactive-swarm.js.map +1 -0
  72. package/dist/labs/interactive.d.ts +10 -0
  73. package/dist/labs/interactive.js +2099 -0
  74. package/dist/labs/interactive.js.map +1 -0
  75. package/dist/labs/ts-analyzer.d.ts +74 -0
  76. package/dist/labs/ts-analyzer.js +379 -0
  77. package/dist/labs/ts-analyzer.js.map +1 -0
  78. package/dist/labs/viewer.d.ts +12 -0
  79. package/dist/labs/viewer.js +1284 -0
  80. package/dist/labs/viewer.js.map +1 -0
  81. package/dist/main.d.ts +15 -0
  82. package/dist/main.js +247 -0
  83. package/dist/main.js.map +1 -0
  84. package/dist/mcp/server.d.ts +16 -0
  85. package/dist/mcp/server.js +192775 -0
  86. package/dist/mcp/server.js.map +1 -0
  87. package/dist/mcp/session.d.ts +117 -0
  88. package/dist/mcp/session.js +450 -0
  89. package/dist/mcp/session.js.map +1 -0
  90. package/dist/mcp/state.d.ts +42 -0
  91. package/dist/mcp/state.js +537 -0
  92. package/dist/mcp/state.js.map +1 -0
  93. package/dist/mcp/tools/contextos.d.ts +17 -0
  94. package/dist/mcp/tools/contextos.js +583 -0
  95. package/dist/mcp/tools/contextos.js.map +1 -0
  96. package/dist/mcp/tools.d.ts +15 -0
  97. package/dist/mcp/tools.js +393 -0
  98. package/dist/mcp/tools.js.map +1 -0
  99. package/dist/orchestration/reviewer-gate.d.ts +43 -0
  100. package/dist/orchestration/reviewer-gate.js +280 -0
  101. package/dist/orchestration/reviewer-gate.js.map +1 -0
  102. package/dist/orchestration/reviewer-prompt.d.ts +18 -0
  103. package/dist/orchestration/reviewer-prompt.js +67 -0
  104. package/dist/orchestration/reviewer-prompt.js.map +1 -0
  105. package/dist/orchestration/verification-runner.d.ts +53 -0
  106. package/dist/orchestration/verification-runner.js +352 -0
  107. package/dist/orchestration/verification-runner.js.map +1 -0
  108. package/dist/plugins/adapter.d.ts +11 -0
  109. package/dist/plugins/adapter.js +11 -0
  110. package/dist/plugins/adapter.js.map +1 -0
  111. package/dist/plugins/core/archive.d.ts +9 -0
  112. package/dist/plugins/core/archive.js +128 -0
  113. package/dist/plugins/core/archive.js.map +1 -0
  114. package/dist/plugins/core/digest.d.ts +11 -0
  115. package/dist/plugins/core/digest.js +70 -0
  116. package/dist/plugins/core/digest.js.map +1 -0
  117. package/dist/plugins/core/grants.d.ts +22 -0
  118. package/dist/plugins/core/grants.js +90 -0
  119. package/dist/plugins/core/grants.js.map +1 -0
  120. package/dist/plugins/core/index.d.ts +10 -0
  121. package/dist/plugins/core/index.js +11 -0
  122. package/dist/plugins/core/index.js.map +1 -0
  123. package/dist/plugins/core/pinning.d.ts +15 -0
  124. package/dist/plugins/core/pinning.js +86 -0
  125. package/dist/plugins/core/pinning.js.map +1 -0
  126. package/dist/plugins/core/types.d.ts +105 -0
  127. package/dist/plugins/core/types.js +22 -0
  128. package/dist/plugins/core/types.js.map +1 -0
  129. package/dist/plugins/core/updater.d.ts +16 -0
  130. package/dist/plugins/core/updater.js +64 -0
  131. package/dist/plugins/core/updater.js.map +1 -0
  132. package/dist/plugins/loader.d.ts +65 -0
  133. package/dist/plugins/loader.js +110 -0
  134. package/dist/plugins/loader.js.map +1 -0
  135. package/dist/prompts/orchestrator.d.ts +6 -0
  136. package/dist/prompts/orchestrator.js +114 -0
  137. package/dist/prompts/orchestrator.js.map +1 -0
  138. package/dist/routing/model-resolver.d.ts +27 -0
  139. package/dist/routing/model-resolver.js +265 -0
  140. package/dist/routing/model-resolver.js.map +1 -0
  141. package/dist/routing/model-router.d.ts +130 -0
  142. package/dist/routing/model-router.js +515 -0
  143. package/dist/routing/model-router.js.map +1 -0
  144. package/dist/runtime/attestations.cjs +260 -0
  145. package/dist/runtime/reviewer-pipeline.cjs +319 -0
  146. package/dist/runtime/sandbox.cjs +468 -0
  147. package/dist/runtime/state-machine.cjs +885 -0
  148. package/dist/runtime/thread-store.cjs +175 -0
  149. package/dist/runtime/transactional-git.cjs +315 -0
  150. package/dist/runtime/verification-pipeline.cjs +435 -0
  151. package/dist/sandbox/execution.d.ts +165 -0
  152. package/dist/sandbox/execution.js +497 -0
  153. package/dist/sandbox/execution.js.map +1 -0
  154. package/dist/security/file-policy.d.ts +22 -0
  155. package/dist/security/file-policy.js +53 -0
  156. package/dist/security/file-policy.js.map +1 -0
  157. package/dist/security/repository-boundary.d.ts +21 -0
  158. package/dist/security/repository-boundary.js +119 -0
  159. package/dist/security/repository-boundary.js.map +1 -0
  160. package/dist/security/secret-filter.d.ts +36 -0
  161. package/dist/security/secret-filter.js +149 -0
  162. package/dist/security/secret-filter.js.map +1 -0
  163. package/dist/swarm.d.ts +14 -0
  164. package/dist/swarm.js +624 -0
  165. package/dist/swarm.js.map +1 -0
  166. package/dist/threads/cache.d.ts +64 -0
  167. package/dist/threads/cache.js +241 -0
  168. package/dist/threads/cache.js.map +1 -0
  169. package/dist/threads/manager.d.ts +94 -0
  170. package/dist/threads/manager.js +914 -0
  171. package/dist/threads/manager.js.map +1 -0
  172. package/dist/ui/banner.d.ts +14 -0
  173. package/dist/ui/banner.js +42 -0
  174. package/dist/ui/banner.js.map +1 -0
  175. package/dist/ui/dashboard.d.ts +33 -0
  176. package/dist/ui/dashboard.js +135 -0
  177. package/dist/ui/dashboard.js.map +1 -0
  178. package/dist/ui/index.d.ts +11 -0
  179. package/dist/ui/index.js +12 -0
  180. package/dist/ui/index.js.map +1 -0
  181. package/dist/ui/log.d.ts +39 -0
  182. package/dist/ui/log.js +126 -0
  183. package/dist/ui/log.js.map +1 -0
  184. package/dist/ui/onboarding.d.ts +14 -0
  185. package/dist/ui/onboarding.js +755 -0
  186. package/dist/ui/onboarding.js.map +1 -0
  187. package/dist/ui/run-log.d.ts +50 -0
  188. package/dist/ui/run-log.js +60 -0
  189. package/dist/ui/run-log.js.map +1 -0
  190. package/dist/ui/spinner.d.ts +41 -0
  191. package/dist/ui/spinner.js +172 -0
  192. package/dist/ui/spinner.js.map +1 -0
  193. package/dist/ui/streaming-feed.d.ts +72 -0
  194. package/dist/ui/streaming-feed.js +386 -0
  195. package/dist/ui/streaming-feed.js.map +1 -0
  196. package/dist/ui/summary.d.ts +18 -0
  197. package/dist/ui/summary.js +113 -0
  198. package/dist/ui/summary.js.map +1 -0
  199. package/dist/ui/text-input.d.ts +19 -0
  200. package/dist/ui/text-input.js +266 -0
  201. package/dist/ui/text-input.js.map +1 -0
  202. package/dist/ui/theme.d.ts +63 -0
  203. package/dist/ui/theme.js +97 -0
  204. package/dist/ui/theme.js.map +1 -0
  205. package/dist/utils/command-exists.d.ts +11 -0
  206. package/dist/utils/command-exists.js +41 -0
  207. package/dist/utils/command-exists.js.map +1 -0
  208. package/dist/utils/process-security.d.ts +19 -0
  209. package/dist/utils/process-security.js +90 -0
  210. package/dist/utils/process-security.js.map +1 -0
  211. package/dist/utils/rolling-buffer.d.ts +16 -0
  212. package/dist/utils/rolling-buffer.js +30 -0
  213. package/dist/utils/rolling-buffer.js.map +1 -0
  214. package/dist/utils/safe-spawn.d.ts +13 -0
  215. package/dist/utils/safe-spawn.js +49 -0
  216. package/dist/utils/safe-spawn.js.map +1 -0
  217. package/dist/worktree/manager.d.ts +69 -0
  218. package/dist/worktree/manager.js +593 -0
  219. package/dist/worktree/manager.js.map +1 -0
  220. package/dist/worktree/merge.d.ts +58 -0
  221. package/dist/worktree/merge.js +389 -0
  222. package/dist/worktree/merge.js.map +1 -0
  223. package/package.json +63 -0
@@ -0,0 +1,593 @@
1
+ /**
2
+ * Git worktree manager — creates isolated worktrees for thread execution.
3
+ *
4
+ * Phase 2 enhancements:
5
+ * - Mutex on create() to prevent branch name races under concurrency
6
+ * - Retry logic for git worktree add (transient lock file contention)
7
+ *
8
+ * Lifecycle:
9
+ * 1. create() — git worktree add -b swarm/<id> <path> HEAD
10
+ * 2. Agent runs in worktree directory
11
+ * 3. getDiff() — capture changes
12
+ * 4. commit() — commit changes in worktree
13
+ * 5. destroy() — git worktree remove + branch cleanup
14
+ */
15
+ import { execFile } from "node:child_process";
16
+ import { createHash, randomUUID } from "node:crypto";
17
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
18
+ import * as os from "node:os";
19
+ import * as path from "node:path";
20
+ import { isPathAllowed } from "../security/file-policy.js";
21
+ import { assertWithinRepository } from "../security/repository-boundary.js";
22
+ import { containsSecrets, isBlockedPath, redactSecrets } from "../security/secret-filter.js";
23
+ function git(args, cwd, extraEnv) {
24
+ return new Promise((resolve, reject) => {
25
+ const env = extraEnv ? { ...process.env, ...extraEnv } : process.env;
26
+ execFile("git", args, { cwd, maxBuffer: 10 * 1024 * 1024, env }, (err, stdout, stderr) => {
27
+ if (err) {
28
+ reject(new Error(`git ${args[0]} failed: ${stderr || err.message}`));
29
+ }
30
+ else {
31
+ resolve({ stdout, stderr });
32
+ }
33
+ });
34
+ });
35
+ }
36
+ /** Read a worktree without initializing a runtime or changing its real index. */
37
+ export async function readWorktreeDiff(worktreePath, repoRoot) {
38
+ assertWithinRepository(worktreePath, repoRoot);
39
+ const tempBase = path.resolve(os.tmpdir());
40
+ const tempRoot = mkdtempSync(path.join(tempBase, "ctx-diff-"));
41
+ if (path.dirname(tempRoot) !== tempBase || !path.basename(tempRoot).startsWith("ctx-diff-")) {
42
+ throw new Error("Invalid temporary diff path");
43
+ }
44
+ const tmpIndex = path.join(tempRoot, "index");
45
+ const objects = path.join(tempRoot, "objects");
46
+ mkdirSync(objects);
47
+ let diff;
48
+ try {
49
+ const { stdout: originalObjects } = await git(["rev-parse", "--git-path", "objects"], worktreePath, {
50
+ GIT_OPTIONAL_LOCKS: "0",
51
+ });
52
+ const env = {
53
+ GIT_INDEX_FILE: tmpIndex,
54
+ GIT_OPTIONAL_LOCKS: "0",
55
+ GIT_OBJECT_DIRECTORY: objects,
56
+ GIT_ALTERNATE_OBJECT_DIRECTORIES: path.resolve(worktreePath, originalObjects.trim()),
57
+ };
58
+ await git(["read-tree", "HEAD"], worktreePath, env);
59
+ const { stdout: status } = await git(["status", "--porcelain", "-z"], worktreePath, { GIT_OPTIONAL_LOCKS: "0" });
60
+ const untracked = status
61
+ .split("\0")
62
+ .filter((s) => s.startsWith("?? "))
63
+ .map((s) => s.slice(3))
64
+ .filter((file) => file !== ".contextos-owner" && file !== ".contextos-session");
65
+ for (let i = 0; i < untracked.length; i += 100) {
66
+ await git(["add", "-N", "--", ...untracked.slice(i, i + 100)], worktreePath, env);
67
+ }
68
+ const { stdout } = await git(["diff", "HEAD", "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], worktreePath, env);
69
+ diff = redactSecrets(stdout || "(no changes)");
70
+ }
71
+ catch (error) {
72
+ try {
73
+ rmSync(tempRoot, { recursive: true, force: true });
74
+ }
75
+ catch (cleanupError) {
76
+ throw new AggregateError([error, cleanupError], "Git diff failed and temporary directory cleanup failed");
77
+ }
78
+ throw error;
79
+ }
80
+ rmSync(tempRoot, { recursive: true, force: true });
81
+ return diff;
82
+ }
83
+ /** Simple async mutex for serializing worktree creation. */
84
+ class Mutex {
85
+ locked = false;
86
+ waiters = [];
87
+ async acquire() {
88
+ if (!this.locked) {
89
+ this.locked = true;
90
+ return;
91
+ }
92
+ return new Promise((resolve) => {
93
+ this.waiters.push(resolve);
94
+ });
95
+ }
96
+ release() {
97
+ this.locked = false;
98
+ const next = this.waiters.shift();
99
+ if (next)
100
+ next();
101
+ }
102
+ }
103
+ const WORKTREE_CREATE_RETRIES = 3;
104
+ const WORKTREE_RETRY_DELAY_MS = 500;
105
+ export class ScopeViolationError extends Error {
106
+ files;
107
+ constructor(files) {
108
+ super(`scope_violation: changes outside writeScope: ${files.join(", ")}`);
109
+ this.name = "ScopeViolationError";
110
+ this.files = files;
111
+ }
112
+ }
113
+ export function normalizeGitPath(file) {
114
+ return file.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/$/, "");
115
+ }
116
+ export function isWithinWriteScope(file, writeScope) {
117
+ const normalized = normalizeGitPath(file);
118
+ return writeScope.some((scope) => {
119
+ const allowed = normalizeGitPath(scope);
120
+ if (allowed === "." || allowed === "")
121
+ return true;
122
+ return normalized === allowed || normalized.startsWith(`${allowed}/`);
123
+ });
124
+ }
125
+ export function isDeniedByWriteScope(file, denyScope) {
126
+ return isWithinWriteScope(file, denyScope);
127
+ }
128
+ function parseNameStatus(raw) {
129
+ const fields = raw.split("\0").filter(Boolean);
130
+ const files = [];
131
+ for (let index = 0; index < fields.length;) {
132
+ const status = fields[index++];
133
+ const file = fields[index++];
134
+ if (!file)
135
+ break;
136
+ files.push(file);
137
+ if (status.startsWith("R") || status.startsWith("C")) {
138
+ const previous = fields[index++];
139
+ if (previous)
140
+ files.push(previous);
141
+ }
142
+ }
143
+ return files;
144
+ }
145
+ function parsePorcelainV2(raw) {
146
+ const records = raw.split("\0").filter(Boolean);
147
+ const files = [];
148
+ for (let index = 0; index < records.length; index++) {
149
+ const record = records[index];
150
+ if (record.startsWith("? "))
151
+ files.push(record.slice(2));
152
+ else if (record.startsWith("1 "))
153
+ files.push(record.split(" ").slice(8).join(" "));
154
+ else if (record.startsWith("2 ")) {
155
+ files.push(record.split(" ").slice(9).join(" "));
156
+ const previous = records[++index];
157
+ if (previous)
158
+ files.push(previous);
159
+ }
160
+ else if (record.startsWith("u "))
161
+ files.push(record.split(" ").slice(10).join(" "));
162
+ }
163
+ return files;
164
+ }
165
+ export function createRepositoryFingerprint(repoRoot) {
166
+ const canonical = path.resolve(repoRoot).toLowerCase();
167
+ return createHash("sha256").update(canonical).digest("hex").slice(0, 16);
168
+ }
169
+ export class WorktreeManager {
170
+ repoRoot;
171
+ baseDir;
172
+ sessionId;
173
+ repoFingerprint;
174
+ worktrees = new Map();
175
+ createMutex = new Mutex();
176
+ constructor(repoRoot, baseDir = ".swarm-worktrees", sessionId) {
177
+ this.repoRoot = assertWithinRepository(repoRoot, repoRoot);
178
+ const targetBase = path.isAbsolute(baseDir) ? baseDir : path.join(this.repoRoot, baseDir);
179
+ this.baseDir = assertWithinRepository(targetBase, this.repoRoot);
180
+ this.sessionId = sessionId || `session-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
181
+ this.repoFingerprint = createRepositoryFingerprint(this.repoRoot);
182
+ }
183
+ getSessionId() {
184
+ return this.sessionId;
185
+ }
186
+ getRepositoryFingerprint() {
187
+ return this.repoFingerprint;
188
+ }
189
+ isContextosWorktree(wtPath) {
190
+ const sessionMarkerPath = path.join(wtPath, ".contextos-session");
191
+ const ownerMarkerPath = path.join(wtPath, ".contextos-owner");
192
+ if (existsSync(sessionMarkerPath)) {
193
+ try {
194
+ const raw = readFileSync(sessionMarkerPath, "utf-8");
195
+ const marker = JSON.parse(raw);
196
+ return (marker.schemaVersion === 1 &&
197
+ marker.repositoryFingerprint === this.repoFingerprint &&
198
+ typeof marker.sessionId === "string" &&
199
+ typeof marker.threadId === "string" &&
200
+ typeof marker.worktreePath === "string" &&
201
+ typeof marker.branchName === "string" &&
202
+ typeof marker.ownerToken === "string" &&
203
+ typeof marker.createdAt === "number");
204
+ }
205
+ catch {
206
+ return false;
207
+ }
208
+ }
209
+ if (existsSync(ownerMarkerPath)) {
210
+ try {
211
+ const raw = readFileSync(ownerMarkerPath, "utf-8");
212
+ const owner = JSON.parse(raw);
213
+ return typeof owner.threadId === "string";
214
+ }
215
+ catch {
216
+ return false;
217
+ }
218
+ }
219
+ return false;
220
+ }
221
+ /** Ensure we're in a git repo and the base directory exists. */
222
+ async init() {
223
+ try {
224
+ await git(["rev-parse", "--git-dir"], this.repoRoot);
225
+ }
226
+ catch {
227
+ throw new Error(`Not a git repository: ${this.repoRoot}`);
228
+ }
229
+ if (!existsSync(this.baseDir)) {
230
+ mkdirSync(this.baseDir, { recursive: true });
231
+ }
232
+ // Add base dir to .gitignore if not already
233
+ const gitignorePath = path.join(this.repoRoot, ".gitignore");
234
+ const baseDirRelative = path.relative(this.repoRoot, this.baseDir);
235
+ try {
236
+ const { readFileSync, appendFileSync } = await import("node:fs");
237
+ let content = "";
238
+ if (existsSync(gitignorePath)) {
239
+ content = readFileSync(gitignorePath, "utf-8");
240
+ }
241
+ if (!content.includes(baseDirRelative)) {
242
+ appendFileSync(gitignorePath, `\n# Swarm worktrees\n${baseDirRelative}/\n`);
243
+ }
244
+ }
245
+ catch {
246
+ // Non-fatal — .gitignore might be read-only
247
+ }
248
+ }
249
+ /**
250
+ * Create a new worktree for a thread.
251
+ * Serialized via mutex to prevent branch name races.
252
+ * Retries on transient lock-file contention.
253
+ */
254
+ async create(threadId) {
255
+ await this.createMutex.acquire();
256
+ try {
257
+ return await this.createWorktreeWithRetry(threadId);
258
+ }
259
+ finally {
260
+ this.createMutex.release();
261
+ }
262
+ }
263
+ async createWorktreeWithRetry(threadId) {
264
+ if (!/^[a-zA-Z0-9_-]+$/.test(threadId)) {
265
+ throw new Error(`Invalid threadId "${threadId}": must contain only alphanumeric characters, underscores, and dashes.`);
266
+ }
267
+ const branch = `swarm/${threadId}`;
268
+ const wtPath = assertWithinRepository(path.resolve(this.baseDir, `wt-${threadId}`), this.repoRoot);
269
+ const rel = path.relative(path.resolve(this.baseDir), wtPath);
270
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
271
+ throw new Error(`Path traversal detected: worktree path "${wtPath}" escapes base directory "${this.baseDir}"`);
272
+ }
273
+ // Remove stale worktree if it exists
274
+ if (existsSync(wtPath)) {
275
+ try {
276
+ await git(["worktree", "remove", "--force", wtPath], this.repoRoot);
277
+ }
278
+ catch {
279
+ rmSync(wtPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
280
+ }
281
+ }
282
+ // Delete stale branch if exists
283
+ try {
284
+ await git(["branch", "-D", branch], this.repoRoot);
285
+ }
286
+ catch {
287
+ // Branch didn't exist — fine
288
+ }
289
+ // Create worktree with retry for lock-file contention
290
+ let lastErr;
291
+ for (let attempt = 1; attempt <= WORKTREE_CREATE_RETRIES; attempt++) {
292
+ try {
293
+ await git(["worktree", "add", "-b", branch, wtPath, "HEAD"], this.repoRoot);
294
+ const info = { id: threadId, path: wtPath, branch };
295
+ this.worktrees.set(threadId, info);
296
+ // Write ownership marker to distinguish ContextOS worktrees from user directories
297
+ try {
298
+ const sessionMarker = {
299
+ schemaVersion: 1,
300
+ sessionId: this.sessionId,
301
+ repositoryFingerprint: this.repoFingerprint,
302
+ worktreePath: wtPath,
303
+ branchName: branch,
304
+ threadId,
305
+ ownerToken: randomUUID(),
306
+ createdAt: Date.now(),
307
+ };
308
+ writeFileSync(path.join(wtPath, ".contextos-session"), JSON.stringify(sessionMarker, null, 2));
309
+ writeFileSync(path.join(wtPath, ".contextos-owner"), JSON.stringify({
310
+ threadId,
311
+ createdAt: Date.now(),
312
+ creatorPid: process.pid,
313
+ }, null, 2));
314
+ }
315
+ catch {
316
+ // Non-fatal
317
+ }
318
+ return info;
319
+ }
320
+ catch (err) {
321
+ lastErr = err instanceof Error ? err : new Error(String(err));
322
+ const isLockError = lastErr.message.includes(".lock") ||
323
+ lastErr.message.includes("Unable to create") ||
324
+ lastErr.message.includes("index.lock");
325
+ if (isLockError && attempt < WORKTREE_CREATE_RETRIES) {
326
+ // Wait with jitter before retrying
327
+ const delay = WORKTREE_RETRY_DELAY_MS * attempt + Math.random() * 200;
328
+ await new Promise((r) => setTimeout(r, delay));
329
+ continue;
330
+ }
331
+ throw lastErr;
332
+ }
333
+ }
334
+ throw lastErr || new Error("Failed to create worktree");
335
+ }
336
+ /** Get HEAD commit SHA of a worktree. */
337
+ async getHeadSha(threadId) {
338
+ const info = this.worktrees.get(threadId);
339
+ if (!info)
340
+ throw new Error(`No worktree for thread ${threadId}`);
341
+ assertWithinRepository(info.path, this.repoRoot);
342
+ const { stdout } = await git(["rev-parse", "HEAD"], info.path);
343
+ return stdout.trim();
344
+ }
345
+ /** Get diff of candidate worktree commits against baseSha. */
346
+ async getCandidateDiff(threadId, baseSha) {
347
+ const info = this.worktrees.get(threadId);
348
+ if (!info)
349
+ throw new Error(`No worktree for thread ${threadId}`);
350
+ assertWithinRepository(info.path, this.repoRoot);
351
+ if (!baseSha || !/^[0-9a-fA-F]{7,64}$/.test(baseSha)) {
352
+ throw new Error("Invalid TaskBrief baseSha");
353
+ }
354
+ const { stdout } = await git(["diff", `${baseSha}...HEAD`, "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], info.path);
355
+ return stdout;
356
+ }
357
+ /** Get the git diff of uncommitted changes in a worktree. */
358
+ async getDiff(threadId) {
359
+ const info = this.worktrees.get(threadId);
360
+ if (!info)
361
+ throw new Error(`No worktree for thread ${threadId}`);
362
+ return readWorktreeDiff(info.path, this.repoRoot);
363
+ }
364
+ /** Get diff stats (short summary). */
365
+ async getDiffStats(threadId) {
366
+ const info = this.worktrees.get(threadId);
367
+ if (!info)
368
+ throw new Error(`No worktree for thread ${threadId}`);
369
+ assertWithinRepository(info.path, this.repoRoot);
370
+ const tmpIndex = path.join(os.tmpdir(), `ctx-idx-${randomUUID()}`);
371
+ try {
372
+ await git(["read-tree", "HEAD"], info.path, { GIT_INDEX_FILE: tmpIndex });
373
+ const { stdout: status } = await git(["status", "--porcelain", "-z"], info.path);
374
+ const untracked = status
375
+ .split("\0")
376
+ .filter(Boolean)
377
+ .filter((s) => s.startsWith("?? "))
378
+ .map((s) => s.slice(3))
379
+ .filter((f) => f !== ".contextos-owner" && f !== ".contextos-session");
380
+ if (untracked.length > 0) {
381
+ const chunkSize = 100;
382
+ for (let i = 0; i < untracked.length; i += chunkSize) {
383
+ await git(["add", "-N", "--", ...untracked.slice(i, i + chunkSize)], info.path, {
384
+ GIT_INDEX_FILE: tmpIndex,
385
+ });
386
+ }
387
+ }
388
+ const { stdout } = await git(["diff", "HEAD", "--stat", "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], info.path, { GIT_INDEX_FILE: tmpIndex });
389
+ return redactSecrets(stdout.trim() || "(no changes)");
390
+ }
391
+ catch {
392
+ const { stdout: fallbackStats } = await git(["diff", "HEAD", "--stat", "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], info.path);
393
+ return redactSecrets(fallbackStats.trim() || "(no changes)");
394
+ }
395
+ finally {
396
+ try {
397
+ if (existsSync(tmpIndex))
398
+ unlinkSync(tmpIndex);
399
+ }
400
+ catch {
401
+ /* cleanup best-effort */
402
+ }
403
+ }
404
+ }
405
+ /** Get list of changed files without mutating Git index. */
406
+ async getChangedFiles(threadId) {
407
+ const info = this.worktrees.get(threadId);
408
+ if (!info)
409
+ throw new Error(`No worktree for thread ${threadId}`);
410
+ assertWithinRepository(info.path, this.repoRoot);
411
+ const { stdout: status } = await git(["status", "--porcelain=v2", "-z", "--untracked-files=all"], info.path);
412
+ const internal = new Set([".contextos-owner", ".contextos-session"]);
413
+ return [
414
+ ...new Set(parsePorcelainV2(status)
415
+ .map(normalizeGitPath)
416
+ .filter((file) => file && !internal.has(file) && !isBlockedPath(file))),
417
+ ];
418
+ }
419
+ /**
420
+ * Detect every worktree change, including untracked, staged, unstaged,
421
+ * committed, and both sides of renames, then enforce the immutable scope.
422
+ */
423
+ async assertWriteScope(threadId, baseSha, writeScope, denyScope = []) {
424
+ const info = this.worktrees.get(threadId);
425
+ if (!info)
426
+ throw new Error(`No worktree for thread ${threadId}`);
427
+ assertWithinRepository(info.path, this.repoRoot);
428
+ if (!baseSha || !/^[0-9a-fA-F]{7,64}$/.test(baseSha))
429
+ throw new Error("Invalid TaskBrief baseSha");
430
+ if (writeScope.length === 0)
431
+ throw new ScopeViolationError(["<empty writeScope>"]);
432
+ const [{ stdout: status }, { stdout: committed }, { stdout: staged }] = await Promise.all([
433
+ git(["status", "--porcelain=v2", "-z", "--untracked-files=all"], info.path),
434
+ git(["diff", "--name-status", "-z", `${baseSha}...HEAD`], info.path),
435
+ git(["diff", "--cached", "--name-status", "-z"], info.path),
436
+ ]);
437
+ const internal = new Set([".contextos-owner", ".contextos-session"]);
438
+ const touched = [
439
+ ...new Set([...parsePorcelainV2(status), ...parseNameStatus(committed), ...parseNameStatus(staged)]),
440
+ ]
441
+ .map(normalizeGitPath)
442
+ .filter((file) => file && !internal.has(file));
443
+ for (const file of touched)
444
+ assertWithinRepository(path.resolve(info.path, file), info.path);
445
+ const violations = touched.filter((file) => !isWithinWriteScope(file, writeScope) || isDeniedByWriteScope(file, denyScope));
446
+ if (violations.length > 0)
447
+ throw new ScopeViolationError(violations);
448
+ return touched;
449
+ }
450
+ /** Commit all changes in a worktree. */
451
+ async commit(threadId, message, writeScope = [], denyScope = []) {
452
+ const info = this.worktrees.get(threadId);
453
+ if (!info)
454
+ throw new Error(`No worktree for thread ${threadId}`);
455
+ assertWithinRepository(info.path, this.repoRoot);
456
+ const tmpIndex = path.join(os.tmpdir(), `ctx-idx-${randomUUID()}`);
457
+ try {
458
+ // 1. Check porcelain status to inspect changed & untracked files
459
+ const { stdout: statusRaw } = await git(["status", "--porcelain=v2", "-z", "--untracked-files=all"], info.path);
460
+ if (!statusRaw.trim())
461
+ return false;
462
+ // 2. Validate changed paths against security policies
463
+ const changedFiles = parsePorcelainV2(statusRaw);
464
+ const pathsToStage = [];
465
+ for (const file of changedFiles) {
466
+ if (file === ".contextos-owner" || file === ".contextos-session") {
467
+ continue; // Do not commit internal ownership markers
468
+ }
469
+ if (isBlockedPath(file)) {
470
+ throw new Error(`SECURITY_POLICY_FAILED: Attempted commit of blocked sensitive path: "${file}"`);
471
+ }
472
+ if (writeScope.length > 0 && (!isWithinWriteScope(file, writeScope) || isDeniedByWriteScope(file, denyScope))) {
473
+ throw new ScopeViolationError([file]);
474
+ }
475
+ if (!isPathAllowed(file, info.path)) {
476
+ throw new Error(`SECURITY_POLICY_FAILED: Path traversal violation attempt: "${file}"`);
477
+ }
478
+ const absPath = path.join(info.path, file);
479
+ if (existsSync(absPath)) {
480
+ const content = readFileSync(absPath, "utf-8");
481
+ if (containsSecrets(content)) {
482
+ throw new Error(`SECURITY_POLICY_FAILED: Secret detected in file content: "${file}"`);
483
+ }
484
+ }
485
+ pathsToStage.push(file);
486
+ }
487
+ if (pathsToStage.length === 0) {
488
+ return false;
489
+ }
490
+ // 3. Read current HEAD into tmp index
491
+ await git(["read-tree", "HEAD"], info.path, { GIT_INDEX_FILE: tmpIndex });
492
+ // 4. Stage only verified paths in temporary index
493
+ const chunkSize = 100;
494
+ for (let i = 0; i < pathsToStage.length; i += chunkSize) {
495
+ await git(["add", "--", ...pathsToStage.slice(i, i + chunkSize)], info.path, {
496
+ GIT_INDEX_FILE: tmpIndex,
497
+ });
498
+ }
499
+ // 5. Verify staged inventory strictly against blocked paths
500
+ const { stdout: stagedStatus } = await git(["diff", "--cached", "--name-only", "-z"], info.path, {
501
+ GIT_INDEX_FILE: tmpIndex,
502
+ });
503
+ const stagedFiles = stagedStatus.split("\0").filter(Boolean);
504
+ for (const file of stagedFiles) {
505
+ if (isBlockedPath(file) || !isPathAllowed(file, info.path)) {
506
+ throw new Error(`SECURITY_POLICY_FAILED: Sensitive or disallowed path detected in staged index: "${file}"`);
507
+ }
508
+ }
509
+ if (stagedFiles.length === 0)
510
+ return false;
511
+ // 6. Write tree and commit
512
+ const { stdout: treeShaRaw } = await git(["write-tree"], info.path, { GIT_INDEX_FILE: tmpIndex });
513
+ const treeSha = treeShaRaw.trim();
514
+ const { stdout: commitShaRaw } = await git(["commit-tree", treeSha, "-p", "HEAD", "-m", message], info.path, {
515
+ GIT_INDEX_FILE: tmpIndex,
516
+ });
517
+ const commitSha = commitShaRaw.trim();
518
+ // 7. Update HEAD and working tree
519
+ await git(["update-ref", "HEAD", commitSha], info.path);
520
+ await git(["reset", "--hard", "HEAD"], info.path);
521
+ return true;
522
+ }
523
+ catch (err) {
524
+ if (String(err).includes("nothing to commit"))
525
+ return false;
526
+ throw err;
527
+ }
528
+ }
529
+ /** Destroy a worktree and optionally its branch. */
530
+ async destroy(threadId, deleteBranch = false) {
531
+ const info = this.worktrees.get(threadId);
532
+ if (!info)
533
+ return;
534
+ assertWithinRepository(info.path, this.repoRoot);
535
+ if (existsSync(info.path)) {
536
+ if (!this.isContextosWorktree(info.path)) {
537
+ throw new Error(`Refusing to destroy worktree "${info.path}": invalid, missing, or mismatched ownership marker`);
538
+ }
539
+ }
540
+ try {
541
+ await git(["worktree", "remove", "--force", info.path], this.repoRoot);
542
+ }
543
+ catch {
544
+ // Force remove the directory if git worktree remove fails
545
+ if (existsSync(info.path)) {
546
+ rmSync(info.path, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
547
+ }
548
+ // Prune stale worktree entries
549
+ try {
550
+ await git(["worktree", "prune"], this.repoRoot);
551
+ }
552
+ catch {
553
+ /* non-fatal */
554
+ }
555
+ }
556
+ if (deleteBranch) {
557
+ try {
558
+ await git(["branch", "-D", info.branch], this.repoRoot);
559
+ }
560
+ catch {
561
+ // Branch already gone
562
+ }
563
+ }
564
+ this.worktrees.delete(threadId);
565
+ }
566
+ /** Get info for a thread's worktree. */
567
+ getWorktreeInfo(threadId) {
568
+ return this.worktrees.get(threadId);
569
+ }
570
+ /** Cleanup all worktrees. Resilient — continues past individual failures. */
571
+ async destroyAll() {
572
+ assertWithinRepository(this.baseDir, this.repoRoot);
573
+ for (const [id] of this.worktrees) {
574
+ try {
575
+ await this.destroy(id, true);
576
+ }
577
+ catch {
578
+ // Continue cleaning up remaining worktrees
579
+ }
580
+ }
581
+ // Remove base directory if empty
582
+ try {
583
+ const { readdirSync } = await import("node:fs");
584
+ if (existsSync(this.baseDir) && readdirSync(this.baseDir).length === 0) {
585
+ rmSync(this.baseDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
586
+ }
587
+ }
588
+ catch {
589
+ /* non-fatal */
590
+ }
591
+ }
592
+ }
593
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/worktree/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9G,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7F,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,QAA4B;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QACrE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxF,IAAI,GAAG,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAoB,EAAE,QAAgB;IAC5E,sBAAsB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/C,SAAS,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,YAAY,EAAE;YACnG,kBAAkB,EAAE,GAAG;SACvB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG;YACX,cAAc,EAAE,QAAQ;YACxB,kBAAkB,EAAE,GAAG;YACvB,oBAAoB,EAAE,OAAO;YAC7B,gCAAgC,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;SACpF,CAAC;QACF,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,YAAY,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;QACjH,MAAM,SAAS,GAAG,MAAM;aACtB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,oBAAoB,CAAC,CAAC;QACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;YAChD,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC3B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,8BAA8B,CAAC,EACpF,YAAY,EACZ,GAAG,CACH,CAAC;QACF,IAAI,GAAG,aAAa,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC;YACJ,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,wDAAwD,CAAC,CAAC;QAC3G,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;IACD,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,4DAA4D;AAC5D,MAAM,KAAK;IACF,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,GAAmB,EAAE,CAAC;IAErC,KAAK,CAAC,OAAO;QACZ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,OAAO;QACR,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACN,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;IAClB,CAAC;CACD;AAED,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACpC,KAAK,CAAoB;IAElC,YAAY,KAAwB;QACnC,KAAK,CAAC,gDAAgD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;CACD;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAA6B;IAC7E,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QACnD,OAAO,UAAU,KAAK,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,SAA4B;IAC9E,OAAO,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,GAAI,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,MAAM;QACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACjC,IAAI,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACpD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aAC9E,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,OAAO,eAAe;IACnB,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,eAAe,CAAS;IACxB,SAAS,GAA8B,IAAI,GAAG,EAAE,CAAC;IACjD,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;IAElC,YAAY,QAAgB,EAAE,UAAkB,kBAAkB,EAAE,SAAkB;QACrF,IAAI,CAAC,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1F,IAAI,CAAC,OAAO,GAAG,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7G,IAAI,CAAC,eAAe,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED,YAAY;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,wBAAwB;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED,mBAAmB,CAAC,MAAc;QACjC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAE9D,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,MAAM,GAA0B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACtD,OAAO,CACN,MAAM,CAAC,aAAa,KAAK,CAAC;oBAC1B,MAAM,CAAC,qBAAqB,KAAK,IAAI,CAAC,eAAe;oBACrD,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;oBACpC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;oBACnC,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;oBACvC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;oBACrC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;oBACrC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CACpC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QAED,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,OAAO,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,IAAI;QACT,IAAI,CAAC;YACJ,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,4CAA4C;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC;YACJ,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/B,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACxC,cAAc,CAAC,aAAa,EAAE,wBAAwB,eAAe,KAAK,CAAC,CAAC;YAC7E,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,4CAA4C;QAC7C,CAAC;IACF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC5B,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,QAAgB;QACrD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACd,qBAAqB,QAAQ,wEAAwE,CACrG,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,QAAQ,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnG,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,6BAA6B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAChH,CAAC;QAED,qCAAqC;QACrC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBACJ,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;gBACR,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAClF,CAAC;QACF,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC;YACJ,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACR,6BAA6B;QAC9B,CAAC;QAED,sDAAsD;QACtD,IAAI,OAA0B,CAAC;QAC/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,uBAAuB,EAAE,OAAO,EAAE,EAAE,CAAC;YACrE,IAAI,CAAC;gBACJ,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5E,MAAM,IAAI,GAAiB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAEnC,kFAAkF;gBAClF,IAAI,CAAC;oBACJ,MAAM,aAAa,GAA0B;wBAC5C,aAAa,EAAE,CAAC;wBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,qBAAqB,EAAE,IAAI,CAAC,eAAe;wBAC3C,YAAY,EAAE,MAAM;wBACpB,UAAU,EAAE,MAAM;wBAClB,QAAQ;wBACR,UAAU,EAAE,UAAU,EAAE;wBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC;oBACF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC/F,aAAa,CACZ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACrC,IAAI,CAAC,SAAS,CACb;wBACC,QAAQ;wBACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,UAAU,EAAE,OAAO,CAAC,GAAG;qBACvB,EACD,IAAI,EACJ,CAAC,CACD,CACD,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACR,YAAY;gBACb,CAAC;gBAED,OAAO,IAAI,CAAC;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9D,MAAM,WAAW,GAChB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACjC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;oBAC5C,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAExC,IAAI,WAAW,IAAI,OAAO,GAAG,uBAAuB,EAAE,CAAC;oBACtD,mCAAmC;oBACnC,MAAM,KAAK,GAAG,uBAAuB,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;oBACtE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;oBAC/C,SAAS;gBACV,CAAC;gBACD,MAAM,OAAO,CAAC;YACf,CAAC;QACF,CAAC;QAED,MAAM,OAAO,IAAI,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACzD,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,UAAU,CAAC,QAAgB;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACjE,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,OAAe;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACjE,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC3B,CAAC,MAAM,EAAE,GAAG,OAAO,SAAS,EAAE,IAAI,EAAE,4BAA4B,EAAE,8BAA8B,CAAC,EACjG,IAAI,CAAC,IAAI,CACT,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACjE,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,YAAY,CAAC,QAAgB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACjE,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,UAAU,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC;YACJ,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE1E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM;iBACtB,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,OAAO,CAAC;iBACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,kBAAkB,IAAI,CAAC,KAAK,oBAAoB,CAAC,CAAC;YAExE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;oBACtD,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;wBAC/E,cAAc,EAAE,QAAQ;qBACxB,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC3B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,4BAA4B,EAAE,8BAA8B,CAAC,EAC9F,IAAI,CAAC,IAAI,EACT,EAAE,cAAc,EAAE,QAAQ,EAAE,CAC5B,CAAC;YACF,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,GAAG,CAC1C,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,4BAA4B,EAAE,8BAA8B,CAAC,EAC9F,IAAI,CAAC,IAAI,CACT,CAAC;YACF,OAAO,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC;gBACJ,IAAI,UAAU,CAAC,QAAQ,CAAC;oBAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACR,yBAAyB;YAC1B,CAAC;QACF,CAAC;IACF,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,eAAe,CAAC,QAAgB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACjE,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,uBAAuB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACrE,OAAO;YACN,GAAG,IAAI,GAAG,CACT,gBAAgB,CAAC,MAAM,CAAC;iBACtB,GAAG,CAAC,gBAAgB,CAAC;iBACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CACvE;SACD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CACrB,QAAgB,EAChB,OAAe,EACf,UAA6B,EAC7B,YAA+B,EAAE;QAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACjE,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACnG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEnF,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzF,GAAG,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,uBAAuB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;YAC3E,GAAG,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;YACpE,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;SAC3D,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG;YACf,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;SACpG;aACC,GAAG,CAAC,gBAAgB,CAAC;aACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhD,KAAK,MAAM,IAAI,IAAI,OAAO;YAAE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CACxF,CAAC;QACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,MAAM,CACX,QAAgB,EAChB,OAAe,EACf,aAAgC,EAAE,EAClC,YAA+B,EAAE;QAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACjE,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,UAAU,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC;YACJ,iEAAiE;YACjE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,uBAAuB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAChH,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBAAE,OAAO,KAAK,CAAC;YAEpC,sDAAsD;YACtD,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBACjC,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBAClE,SAAS,CAAC,2CAA2C;gBACtD,CAAC;gBACD,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,wEAAwE,IAAI,GAAG,CAAC,CAAC;gBAClG,CAAC;gBACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;oBAC/G,MAAM,IAAI,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,MAAM,IAAI,KAAK,CAAC,8DAA8D,IAAI,GAAG,CAAC,CAAC;gBACxF,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC/C,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9B,MAAM,IAAI,KAAK,CAAC,6DAA6D,IAAI,GAAG,CAAC,CAAC;oBACvF,CAAC;gBACF,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC;YACd,CAAC;YAED,sCAAsC;YACtC,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE1E,kDAAkD;YAClD,MAAM,SAAS,GAAG,GAAG,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;gBACzD,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;oBAC5E,cAAc,EAAE,QAAQ;iBACxB,CAAC,CAAC;YACJ,CAAC;YAED,4DAA4D;YAC5D,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;gBAChG,cAAc,EAAE,QAAQ;aACxB,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7D,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAChC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5D,MAAM,IAAI,KAAK,CAAC,mFAAmF,IAAI,GAAG,CAAC,CAAC;gBAC7G,CAAC;YACF,CAAC;YAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAE3C,2BAA2B;YAC3B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClG,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YAElC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;gBAC5G,cAAc,EAAE,QAAQ;aACxB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;YAEtC,kCAAkC;YAClC,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAElD,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC5D,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,eAAwB,KAAK;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CACd,iCAAiC,IAAI,CAAC,IAAI,qDAAqD,CAC/F,CAAC;YACH,CAAC;QACF,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACR,0DAA0D;YAC1D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,+BAA+B;YAC/B,IAAI,CAAC;gBACJ,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC;gBACR,eAAe;YAChB,CAAC;QACF,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC;gBACJ,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACR,sBAAsB;YACvB,CAAC;QACF,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,wCAAwC;IACxC,eAAe,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,UAAU;QACf,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACR,2CAA2C;YAC5C,CAAC;QACF,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC;YACJ,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACxF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,eAAe;QAChB,CAAC;IACF,CAAC;CACD"}