codedeck 0.1.9 → 0.3.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 (99) hide show
  1. package/README.md +97 -1
  2. package/dist/cli/cli-name.js +20 -0
  3. package/dist/cli/cli-name.js.map +1 -0
  4. package/dist/cli/commands/claims.js +170 -0
  5. package/dist/cli/commands/claims.js.map +1 -0
  6. package/dist/cli/commands/doctor.js +22 -1
  7. package/dist/cli/commands/doctor.js.map +1 -1
  8. package/dist/cli/commands/models.js +3 -3
  9. package/dist/cli/commands/models.js.map +1 -1
  10. package/dist/cli/commands/open.js +331 -0
  11. package/dist/cli/commands/open.js.map +1 -0
  12. package/dist/cli/commands/ps.js +260 -23
  13. package/dist/cli/commands/ps.js.map +1 -1
  14. package/dist/cli/commands/rename.js +29 -0
  15. package/dist/cli/commands/rename.js.map +1 -0
  16. package/dist/cli/commands/run.js +68 -30
  17. package/dist/cli/commands/run.js.map +1 -1
  18. package/dist/cli/commands/setup.js +508 -0
  19. package/dist/cli/commands/setup.js.map +1 -0
  20. package/dist/cli/commands/usage.js +37 -0
  21. package/dist/cli/commands/usage.js.map +1 -0
  22. package/dist/cli/commands/wait.js +3 -2
  23. package/dist/cli/commands/wait.js.map +1 -1
  24. package/dist/cli/index.js +37 -21
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/picker-state.js +168 -0
  27. package/dist/cli/picker-state.js.map +1 -0
  28. package/dist/cli/picker.js +157 -0
  29. package/dist/cli/picker.js.map +1 -0
  30. package/dist/cli/ui.js +233 -0
  31. package/dist/cli/ui.js.map +1 -0
  32. package/dist/config/config.js +47 -0
  33. package/dist/config/config.js.map +1 -1
  34. package/dist/config/orchestrator-mode.js +72 -0
  35. package/dist/config/orchestrator-mode.js.map +1 -0
  36. package/dist/config/paths.js +8 -0
  37. package/dist/config/paths.js.map +1 -1
  38. package/dist/core/models.js +23 -4
  39. package/dist/core/models.js.map +1 -1
  40. package/dist/core/pricing.js +65 -0
  41. package/dist/core/pricing.js.map +1 -0
  42. package/dist/core/roles.js +83 -0
  43. package/dist/core/roles.js.map +1 -0
  44. package/dist/core/run-usage.js +46 -0
  45. package/dist/core/run-usage.js.map +1 -0
  46. package/dist/core/session.js +5 -0
  47. package/dist/core/session.js.map +1 -1
  48. package/dist/daemon/daemon.js +90 -3
  49. package/dist/daemon/daemon.js.map +1 -1
  50. package/dist/daemon/ipc.js +10 -3
  51. package/dist/daemon/ipc.js.map +1 -1
  52. package/dist/drivers/opencode/driver.js +1 -114
  53. package/dist/drivers/opencode/driver.js.map +1 -1
  54. package/dist/drivers/opencode/parser.js +86 -0
  55. package/dist/drivers/opencode/parser.js.map +1 -0
  56. package/dist/drivers/session-runtime.js +1 -0
  57. package/dist/drivers/session-runtime.js.map +1 -1
  58. package/dist/git/worktree.js +1 -1
  59. package/dist/git/worktree.js.map +1 -1
  60. package/dist/open/contract.js +104 -0
  61. package/dist/open/contract.js.map +1 -0
  62. package/dist/open/injection.js +59 -0
  63. package/dist/open/injection.js.map +1 -0
  64. package/dist/open/launchers/claude.js +212 -0
  65. package/dist/open/launchers/claude.js.map +1 -0
  66. package/dist/open/launchers/opencode.js +178 -0
  67. package/dist/open/launchers/opencode.js.map +1 -0
  68. package/dist/open/orchestrator-prose.js +12 -0
  69. package/dist/open/orchestrator-prose.js.map +1 -0
  70. package/dist/open/pty.js +281 -0
  71. package/dist/open/pty.js.map +1 -0
  72. package/dist/open/runtime.js +597 -0
  73. package/dist/open/runtime.js.map +1 -0
  74. package/dist/plugin/.claude-plugin/plugin.json +11 -0
  75. package/dist/plugin/agents/auditor.md +36 -0
  76. package/dist/plugin/agents/general.md +35 -0
  77. package/dist/plugin/agents/orchestrator-edit.md +69 -0
  78. package/dist/plugin/agents/orchestrator-read.md +69 -0
  79. package/dist/plugin/agents/orchestrator.md +91 -0
  80. package/dist/plugin/agents/reviewer.md +36 -0
  81. package/dist/plugin/commands/autonomous.md +58 -0
  82. package/dist/plugin/hooks/hooks.json +24 -0
  83. package/dist/plugin/hooks/session-id.sh +23 -0
  84. package/dist/plugin/hooks/session-name-lib.mjs +40 -0
  85. package/dist/plugin/hooks/session-name-worker.mjs +124 -0
  86. package/dist/plugin/hooks/session-name.mjs +66 -0
  87. package/dist/plugin/hooks/session-name.sh +7 -0
  88. package/dist/plugin/pty-shim.mjs +114 -0
  89. package/dist/plugin/statusline.sh +260 -0
  90. package/dist/plugin/themes/codedeck-rage.json +74 -0
  91. package/dist/plugin/themes/codedeck-ultra.json +76 -0
  92. package/dist/plugin/ultra.md +9 -0
  93. package/dist/store/claims.js +152 -0
  94. package/dist/store/claims.js.map +1 -0
  95. package/dist/store/database.js +14 -0
  96. package/dist/store/database.js.map +1 -1
  97. package/dist/store/sessions.js +17 -3
  98. package/dist/store/sessions.js.map +1 -1
  99. package/package.json +6 -4
@@ -0,0 +1,331 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import path from "node:path";
4
+ import * as readline from "node:readline";
5
+ import { IpcClient } from "../../daemon/ipc.js";
6
+ import { loadConfig, resolveRoleBinding, resolveOrchestratorMode, } from "../../config/config.js";
7
+ import { harnessInjection } from "../../open/injection.js";
8
+ import { ptyShimPath } from "../../open/pty.js";
9
+ import { isInteractiveTerminal } from "./setup.js";
10
+ import { sessionsDir } from "../../open/pty.js";
11
+ import { ROLES, parseRole, resolvePluginDir } from "../../core/roles.js";
12
+ import { getCliName } from "../cli-name.js";
13
+ import { effectiveModel, resolveOpenModel } from "../../open/contract.js";
14
+ import { buildArgs as buildOpencodeArgs, buildInlineConfig, createEphemeralTuiDir, ensureOpencodeTheme, OPENCODE_NOT_FOUND, preflight as preflightOpencode, removeEphemeralTuiDir, resolveBinary as resolveOpencodeBinary, } from "../../open/launchers/opencode.js";
15
+ import { assertSupport, buildOpenArgs, CLAUDE_NOT_FOUND, DEFAULT_EFFORT, DEFAULT_MODEL, entitlementError, preflightModel, resolveBinary, } from "../../open/launchers/claude.js";
16
+ import { assertPluginDirectory, currentWorkingDirectory, finishOpenSession, playBoot, renderBanner, spawnHarness, } from "../../open/runtime.js";
17
+ export { ROLES, parseRole, resolvePluginDir };
18
+ export { effectiveModel };
19
+ export { buildOpenArgs, buildSettings, entitlementError, judgeModel, sessionName } from "../../open/launchers/claude.js";
20
+ export { bootFrame, ensureCodedeckShim, exitCodeFor, finishOpenSession, installSigintGuard, renderBanner, renderExit, resumeHint, sanitizeEnv, spinnerTips, withCodedeckOnPath, writeStdoutSync, } from "../../open/runtime.js";
21
+ const DEFAULT_ROLE = "orchestrator";
22
+ export function launchClaude(claudeBin, model, args, cwd, sessionFile, onClose, spawnChild = spawn, signalHost = process, envExtra, pty) {
23
+ return spawnHarness(claudeBin, args, {
24
+ cwd,
25
+ sessionFile,
26
+ envExtra,
27
+ model,
28
+ notFoundMessage: CLAUDE_NOT_FOUND,
29
+ entitlementError,
30
+ onClose,
31
+ spawnChild,
32
+ signalHost,
33
+ pty,
34
+ });
35
+ }
36
+ /**
37
+ * What CodeDeck may type into this harness, or nothing when the harness has no
38
+ * command worth typing or the caller turned the pty off. Interactive only: a
39
+ * `--print` launch has no TUI to type into.
40
+ */
41
+ export function ptyLaunchForHarness(harness, pluginDir, sessionFile, flags, config, interactive) {
42
+ if (!interactive)
43
+ return undefined;
44
+ if (flags.pty === false || config.pty === false)
45
+ return undefined;
46
+ const rename = harnessInjection(harness).rename;
47
+ if (!rename)
48
+ return undefined;
49
+ return { shim: ptyShimPath(pluginDir), sessionFile, keystrokesForName: rename };
50
+ }
51
+ /**
52
+ * Width of each replacement verb in terminal columns. Keeping this fixed
53
+ * leaves Claude's elapsed-time and token-count fields aligned.
54
+ */
55
+ export const SPINNER_VERB_WIDTH = 12;
56
+ /**
57
+ * Why an agent bound to a harness without a launcher cannot be opened, or
58
+ * nothing. `open` launches claude and opencode sessions; anything else has no
59
+ * launcher, so refusing beats opening a session under a name whose
60
+ * configuration it does not follow.
61
+ *
62
+ * The model is deliberately not part of the check. An explicit --model changes
63
+ * which binary runs, never whether it is the right harness.
64
+ */
65
+ export function harnessMismatch(role, binding) {
66
+ if (!binding || binding.harness === "claude" || binding.harness === "opencode") {
67
+ return undefined;
68
+ }
69
+ return (`Agent "${role}" runs on ${binding.harness}, and ${getCliName()} open only launches claude and opencode sessions. ` +
70
+ `Use \`${getCliName()} run --role ${role} "<prompt>"\`, or move it with \`${getCliName()} setup\`.`);
71
+ }
72
+ /**
73
+ * The one dispatch decision: the binding owns the harness, and an unbound
74
+ * role opens claude like it always did. Anything else throws instead of
75
+ * rounding down to the wrong session.
76
+ */
77
+ export function launcherFor(role, binding) {
78
+ const harness = binding?.harness ?? "claude";
79
+ if (harness === "claude" || harness === "opencode")
80
+ return harness;
81
+ const mismatch = harnessMismatch(role, binding);
82
+ throw new Error(mismatch ?? `Agent "${role}" runs on ${harness}, which ${getCliName()} open does not launch.`);
83
+ }
84
+ function selectRole() {
85
+ const rl = readline.createInterface({
86
+ input: process.stdin,
87
+ output: process.stdout,
88
+ });
89
+ return new Promise((resolve, reject) => {
90
+ let settled = false;
91
+ const finish = (role) => {
92
+ if (settled)
93
+ return;
94
+ settled = true;
95
+ rl.close();
96
+ resolve(role);
97
+ };
98
+ // Ctrl+D closes the interface without ever answering, so without this the
99
+ // promise stays pending and the command hangs. It is a walk-out, not a
100
+ // choice: EOF here used to launch a permission-bypassed session the user
101
+ // never picked, and the model wizard already treats the same keystroke as
102
+ // leaving. Reaching this needs a TTY, so a piped launch cannot trip it.
103
+ rl.once("close", () => {
104
+ if (settled)
105
+ return;
106
+ settled = true;
107
+ reject(new Error("Role selection was interrupted; nothing was launched."));
108
+ });
109
+ const ask = () => {
110
+ rl.question(`Role [${DEFAULT_ROLE}] (${ROLES.join("/")}): `, (answer) => {
111
+ const role = parseRole(answer || DEFAULT_ROLE);
112
+ if (role) {
113
+ finish(role);
114
+ return;
115
+ }
116
+ process.stderr.write(`Invalid role. Available roles: ${ROLES.join(", ")}\n`);
117
+ ask();
118
+ });
119
+ };
120
+ ask();
121
+ });
122
+ }
123
+ /**
124
+ * `claude -p` answers one prompt and exits, so there is no session to choose a
125
+ * role for. A terminal check alone does not catch this: under a pty (CI scripts,
126
+ * `script`, most CI runners) stdout is a TTY and the prompt would block forever.
127
+ */
128
+ export function isNonInteractiveLaunch(passthrough) {
129
+ return passthrough.some((arg) => arg === "-p" || arg === "--print");
130
+ }
131
+ export function resolveRole(input, interactive) {
132
+ if (input !== undefined) {
133
+ const role = parseRole(input);
134
+ if (!role) {
135
+ return Promise.reject(new Error(`Invalid role "${input}". Available roles: ${ROLES.join(", ")}`));
136
+ }
137
+ return Promise.resolve(role);
138
+ }
139
+ if (!interactive || !isInteractiveTerminal())
140
+ return Promise.resolve(DEFAULT_ROLE);
141
+ return selectRole();
142
+ }
143
+ /**
144
+ * Unknown options have to be allowed so the passthrough can carry Claude's own
145
+ * flags, but that acceptance must stop at the separator. Without this check a
146
+ * typo in a safety flag is silent: `open --no-bypas` looks like it turned the
147
+ * permission bypass off and launches with it still on.
148
+ *
149
+ * The rule enforced is commander's own: reject exactly what commander would
150
+ * treat as unknown under allowUnknownOption(). Looser lets a dropped flag
151
+ * through, which is the bug this exists to catch; stricter refuses a command
152
+ * line commander parses happily.
153
+ *
154
+ * Returns the operands, meaning the tokens commander did not swallow as an
155
+ * option or an option's value, so the caller can tell a role from a value that
156
+ * happens to spell one.
157
+ *
158
+ * The known set is read from commander's registry so it cannot drift from the
159
+ * declared options. Help is the exception: commander keeps its help option out
160
+ * of `command.options`, so those two spellings are mirrored from the
161
+ * `.helpOption()` call in src/cli/index.ts and change with it.
162
+ */
163
+ export function scanOptions(tokens, command) {
164
+ const takesValue = new Map([
165
+ ["-h", false],
166
+ ["--help", false],
167
+ ]);
168
+ for (const option of command.options) {
169
+ const wantsValue = option.required || option.optional;
170
+ if (option.short)
171
+ takesValue.set(option.short, wantsValue);
172
+ if (option.long)
173
+ takesValue.set(option.long, wantsValue);
174
+ }
175
+ const operands = [];
176
+ for (let i = 0; i < tokens.length; i++) {
177
+ const token = tokens[i];
178
+ if (!token.startsWith("-") || token === "-") {
179
+ operands.push(token);
180
+ continue;
181
+ }
182
+ const separator = token.indexOf("=");
183
+ const name = separator >= 0 ? token.slice(0, separator) : token;
184
+ const wantsValue = takesValue.get(name);
185
+ if (wantsValue === undefined) {
186
+ throw new Error(`Unknown option "${name}" for ${getCliName()} open. Options for Claude go after "--".`);
187
+ }
188
+ // Commander honours "=" only on options declared with a value and drops the
189
+ // whole token otherwise, so `--no-bypass=false` would read as accepted and
190
+ // launch with the bypass still on.
191
+ if (separator >= 0 && !wantsValue) {
192
+ throw new Error(`Option "${name}" for ${getCliName()} open takes no value.`);
193
+ }
194
+ // The next token belongs to this option even when it looks like a flag,
195
+ // which is what keeps `--model -weird` from reading as an unknown option.
196
+ if (wantsValue && separator < 0)
197
+ i += 1;
198
+ }
199
+ return operands;
200
+ }
201
+ function getInvocation(command, roleArg) {
202
+ const rawArgs = command.parent?.rawArgs ?? [];
203
+ // Searching forward from the executable and script entries, never backwards:
204
+ // `open -- --print open` would otherwise match the passthrough word instead
205
+ // of the command and lose the separator behind it.
206
+ const commandIndex = rawArgs.indexOf(command.name(), 2);
207
+ const separatorIndex = commandIndex >= 0 ? rawArgs.indexOf("--", commandIndex + 1) : -1;
208
+ const beforeSeparator = commandIndex >= 0
209
+ ? rawArgs.slice(commandIndex + 1, separatorIndex >= 0 ? separatorIndex : undefined)
210
+ : [];
211
+ const operands = scanOptions(beforeSeparator, command);
212
+ if (separatorIndex >= 0) {
213
+ // Commander folds the separator away, so roleArg can just as easily have
214
+ // come from the passthrough. It counts as a role only when it really stood
215
+ // before the separator as an operand, never as some option's value:
216
+ // `open --resume reviewer -- reviewer` asks for no role at all.
217
+ const explicitRole = roleArg !== undefined && operands.includes(roleArg) ? roleArg : undefined;
218
+ return {
219
+ roleInput: explicitRole,
220
+ passthrough: rawArgs.slice(separatorIndex + 1),
221
+ };
222
+ }
223
+ const parsedArgs = command.args.slice();
224
+ if (roleArg !== undefined && parsedArgs[0] === roleArg) {
225
+ parsedArgs.shift();
226
+ }
227
+ if (parsedArgs.length > 0) {
228
+ throw new Error('Arguments for Claude must follow "--" so CodeDeck can forward them verbatim.');
229
+ }
230
+ return { roleInput: roleArg, passthrough: [] };
231
+ }
232
+ export function registerOpenCommand(program) {
233
+ program
234
+ .command("open [role]")
235
+ .description(`Open a configured Claude Code session (roles: ${ROLES.join(" | ")}, default: ${DEFAULT_ROLE}, 3-letter prefixes accepted)`)
236
+ .option("--model <model>", `model to use (default: ${DEFAULT_MODEL})`)
237
+ .option("--effort <level>", `reasoning effort (default: ${DEFAULT_EFFORT})`)
238
+ .option("--resume <session>", "resume a Claude Code session")
239
+ .option("--worktree", "ask Claude Code to create an isolated worktree")
240
+ .option("--no-bypass", "do not skip Claude Code permission prompts")
241
+ .option("--no-theme", "keep only the CodeDeck status line, without the theme or the renderer")
242
+ .option("--no-pty", "do not run the session under a pty, which also drops the automatic rename")
243
+ .allowUnknownOption()
244
+ .action(async (roleArg, opts, command) => {
245
+ const invocation = getInvocation(command, roleArg);
246
+ const interactive = !isNonInteractiveLaunch(invocation.passthrough);
247
+ const role = await resolveRole(invocation.roleInput, interactive);
248
+ const pluginDir = resolvePluginDir();
249
+ assertPluginDirectory(pluginDir);
250
+ const cwd = currentWorkingDirectory();
251
+ const client = new IpcClient();
252
+ await client.ensureDaemonStarted();
253
+ // Launching never opens the wizard. Asking a model per harness was the
254
+ // wrong question to greet someone with, and `codedeck setup` is the place
255
+ // to answer it deliberately.
256
+ const config = loadConfig();
257
+ const orchestratorMode = resolveOrchestratorMode(config);
258
+ const binding = resolveRoleBinding(role, config);
259
+ const launcher = launcherFor(role, binding);
260
+ const passthroughModel = effectiveModel(invocation.passthrough);
261
+ const { model: boundModel, fromConfig } = resolveOpenModel(role, { model: opts.model, passthroughModel }, config);
262
+ // Not the shared temp directory: `open` types the name it finds beside
263
+ // this file into a live session, and on Linux anyone on the box can put
264
+ // a file in /tmp under a name that is only a pid.
265
+ const sessionFile = path.join(sessionsDir(), `codedeck-session-${process.pid}`);
266
+ const runId = randomUUID();
267
+ if (launcher === "opencode") {
268
+ // Dispatch needs a binding, and a binding always carries a model, so
269
+ // this is unreachable through the CLI. It stays because buildArgs
270
+ // takes a string and a TypeError is not a diagnostic.
271
+ if (boundModel === undefined) {
272
+ throw new Error(`Agent "${role}" has no model bound. Run \`${getCliName()} setup\` to bind one.`);
273
+ }
274
+ if (opts.worktree) {
275
+ console.error("Warning: --worktree has no effect on opencode (no native worktree); continuing without it.");
276
+ }
277
+ const model = passthroughModel ?? boundModel;
278
+ await preflightOpencode(model, fromConfig);
279
+ const opencodeBin = await resolveOpencodeBinary();
280
+ // Effort has no opencode flag; the banner names the fallback.
281
+ const effort = opts.effort ?? "default";
282
+ // --no-theme asks for no CodeDeck styling, and an animation is styling.
283
+ if (opts.theme === false) {
284
+ process.stdout.write(renderBanner(role, model, effort));
285
+ }
286
+ else {
287
+ await playBoot(role, model, effort);
288
+ }
289
+ // --no-theme leaves the user's own opencode theme alone. Otherwise the
290
+ // managed rage theme is ensured once and selected through an ephemeral
291
+ // config dir, so the user's tui.json is never rewritten.
292
+ const tuiDir = opts.theme === false || !ensureOpencodeTheme(pluginDir)
293
+ ? undefined
294
+ : createEphemeralTuiDir();
295
+ const closeOpencode = () => {
296
+ if (tuiDir !== undefined)
297
+ removeEphemeralTuiDir(tuiDir);
298
+ finishOpenSession(role, sessionFile);
299
+ };
300
+ await spawnHarness(opencodeBin, buildOpencodeArgs(role, { ...opts, model: boundModel }, invocation.passthrough), {
301
+ cwd,
302
+ envExtra: {
303
+ CODEDECK_RUN_ID: runId,
304
+ OPENCODE_CONFIG_CONTENT: buildInlineConfig(pluginDir, role, orchestratorMode),
305
+ ...(tuiDir !== undefined ? { OPENCODE_CONFIG_DIR: tuiDir } : {}),
306
+ },
307
+ sessionFile,
308
+ model,
309
+ notFoundMessage: OPENCODE_NOT_FOUND,
310
+ onClose: closeOpencode,
311
+ });
312
+ return;
313
+ }
314
+ const resolved = boundModel ?? DEFAULT_MODEL;
315
+ const args = buildOpenArgs(role, { ...opts, model: resolved, remoteControl: config.remoteControl }, pluginDir, invocation.passthrough, cwd, orchestratorMode);
316
+ const model = passthroughModel ?? resolved;
317
+ await preflightModel(model, fromConfig);
318
+ const claudeBin = await resolveBinary();
319
+ await assertSupport(claudeBin, cwd);
320
+ const effort = opts.effort ?? DEFAULT_EFFORT;
321
+ // --no-theme asks for no CodeDeck styling, and an animation is styling.
322
+ if (opts.theme === false) {
323
+ process.stdout.write(renderBanner(role, model, effort));
324
+ }
325
+ else {
326
+ await playBoot(role, model, effort);
327
+ }
328
+ await launchClaude(claudeBin, model, args, cwd, sessionFile, () => finishOpenSession(role, sessionFile), undefined, undefined, { CODEDECK_RUN_ID: runId }, ptyLaunchForHarness("claude", pluginDir, sessionFile, opts, config, interactive));
329
+ });
330
+ }
331
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/cli/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,uBAAuB,GAGxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAa,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EACL,SAAS,IAAI,iBAAiB,EAC9B,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,SAAS,IAAI,iBAAiB,EAC9B,qBAAqB,EACrB,aAAa,IAAI,qBAAqB,GACvC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAEhB,cAAc,EACd,aAAa,GACd,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,qBAAqB,EACrB,uBAAuB,EAGvB,iBAAiB,EACjB,QAAQ,EACR,YAAY,EAGZ,YAAY,GAGb,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAa,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAEzH,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,YAAY,GAAS,cAAc,CAAC;AAE1C,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,KAAa,EACb,IAAc,EACd,GAAW,EACX,WAAmB,EACnB,OAAmB,EACnB,aAA2B,KAAK,EAChC,aAAyB,OAAO,EAChC,QAAiC,EACjC,GAAe;IAEf,OAAO,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE;QACnC,GAAG;QACH,WAAW;QACX,QAAQ;QACR,KAAK;QACL,eAAe,EAAE,gBAAgB;QACjC,gBAAgB;QAChB,OAAO;QACP,UAAU;QACV,UAAU;QACV,GAAG;KACJ,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAgB,EAChB,SAAiB,EACjB,WAAmB,EACnB,KAAwB,EACxB,MAAsB,EACtB,WAAoB;IAEpB,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;AAClF,CAAC;AAID;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAOrC;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,OAAgC;IAC1E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,CACL,UAAU,IAAI,aAAa,OAAO,CAAC,OAAO,SAAS,UAAU,EAAE,oDAAoD;QACnH,SAAS,UAAU,EAAE,eAAe,IAAI,oCAAoC,UAAU,EAAE,WAAW,CACpG,CAAC;AACJ,CAAC;AAID;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAU,EAAE,OAAgC;IACtE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC;IAC7C,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC;IACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,UAAU,IAAI,aAAa,OAAO,WAAW,UAAU,EAAE,wBAAwB,CAC9F,CAAC;AACJ,CAAC;AAOD,SAAS,UAAU;IACjB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,IAAU,EAAE,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,0EAA0E;QAC1E,uEAAuE;QACvE,yEAAyE;QACzE,0EAA0E;QAC1E,wEAAwE;QACxE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,GAAG,EAAE;YACf,EAAE,CAAC,QAAQ,CAAC,SAAS,YAAY,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;gBACtE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC;gBAC/C,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,CAAC,IAAI,CAAC,CAAC;oBACb,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7E,GAAG,EAAE,CAAC;YACR,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,GAAG,EAAE,CAAC;IACR,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAqB;IAC1D,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAyB,EAAE,WAAoB;IACzE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,iBAAiB,KAAK,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3E,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,CAAC,qBAAqB,EAAE;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACnF,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAYD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,WAAW,CAAC,MAAgB,EAAE,OAAgB;IAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAkB;QAC1C,CAAC,IAAI,EAAE,KAAK,CAAC;QACb,CAAC,QAAQ,EAAE,KAAK,CAAC;KAClB,CAAC,CAAC;IACH,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;QACtD,IAAI,MAAM,CAAC,KAAK;YAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,IAAI;YAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,mBAAmB,IAAI,SAAS,UAAU,EAAE,0CAA0C,CACvF,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,2EAA2E;QAC3E,mCAAmC;QACnC,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,SAAS,UAAU,EAAE,uBAAuB,CAAC,CAAC;QAC/E,CAAC;QAED,wEAAwE;QACxE,0EAA0E;QAC1E,IAAI,UAAU,IAAI,SAAS,GAAG,CAAC;YAAE,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,OAA2B;IAClE,MAAM,OAAO,GAAI,OAAO,CAAC,MAAoC,EAAE,OAAO,IAAI,EAAE,CAAC;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,mDAAmD;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,eAAe,GAAG,YAAY,IAAI,CAAC;QACvC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,yEAAyE;QACzE,2EAA2E;QAC3E,oEAAoE;QACpE,gEAAgE;QAChE,MAAM,YAAY,GAAG,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,OAAO;YACL,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACvD,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AACjD,CAAC;AAUD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,iDAAiD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,YAAY,+BAA+B,CAAC;SACxI,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,aAAa,GAAG,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,cAAc,GAAG,CAAC;SAC3E,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;SAC5D,MAAM,CAAC,YAAY,EAAE,gDAAgD,CAAC;SACtE,MAAM,CAAC,aAAa,EAAE,4CAA4C,CAAC;SACnE,MAAM,CAAC,YAAY,EAAE,uEAAuE,CAAC;SAC7F,MAAM,CAAC,UAAU,EAAE,2EAA2E,CAAC;SAC/F,kBAAkB,EAAE;SACpB,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,IAAe,EAAE,OAAgB,EAAE,EAAE;QAC/E,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,CAAC,sBAAsB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAEnC,uEAAuE;QACvE,0EAA0E;QAC1E,6BAA6B;QAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAChE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,gBAAgB,CACxD,IAAI,EACJ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,EACvC,MAAM,CACP,CAAC;QAEF,uEAAuE;QACvE,wEAAwE;QACxE,kDAAkD;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,oBAAoB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAE3B,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,qEAAqE;YACrE,kEAAkE;YAClE,sDAAsD;YACtD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,UAAU,IAAI,+BAA+B,UAAU,EAAE,uBAAuB,CACjF,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CACX,4FAA4F,CAC7F,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,gBAAgB,IAAI,UAAU,CAAC;YAC7C,MAAM,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAClD,8DAA8D;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;YAExC,wEAAwE;YACxE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;YAED,uEAAuE;YACvE,uEAAuE;YACvE,yDAAyD;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;gBACpE,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,qBAAqB,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,IAAI,MAAM,KAAK,SAAS;oBAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBACxD,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACvC,CAAC,CAAC;YAEF,MAAM,YAAY,CAChB,WAAW,EACX,iBAAiB,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,CAAC,WAAW,CAAC,EAC/E;gBACE,GAAG;gBACH,QAAQ,EAAE;oBACR,eAAe,EAAE,KAAK;oBACtB,uBAAuB,EAAE,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC;oBAC7E,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACjE;gBACD,WAAW;gBACX,KAAK;gBACL,eAAe,EAAE,kBAAkB;gBACnC,OAAO,EAAE,aAAa;aACvB,CACF,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,IAAI,aAAa,CAAC;QAC7C,MAAM,IAAI,GAAG,aAAa,CACxB,IAAI,EACJ,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,EACjE,SAAS,EACT,UAAU,CAAC,WAAW,EACtB,GAAG,EACH,gBAAgB,CACjB,CAAC;QACF,MAAM,KAAK,GAAG,gBAAgB,IAAI,QAAQ,CAAC;QAE3C,MAAM,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;QACxC,MAAM,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC;QAE7C,wEAAwE;QACxE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,YAAY,CAChB,SAAS,EACT,KAAK,EACL,IAAI,EACJ,GAAG,EACH,WAAW,EACX,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,EAC1C,SAAS,EACT,SAAS,EACT,EAAE,eAAe,EAAE,KAAK,EAAE,EAC1B,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}