roughbook 0.0.0-stage → 0.1.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 (144) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +166 -2
  3. package/dist/agents/claude.js +214 -0
  4. package/dist/agents/claude.js.map +1 -0
  5. package/dist/agents/codex.js +179 -0
  6. package/dist/agents/codex.js.map +1 -0
  7. package/dist/agents/command.js +47 -0
  8. package/dist/agents/command.js.map +1 -0
  9. package/dist/agents/index.js +21 -0
  10. package/dist/agents/index.js.map +1 -0
  11. package/dist/agents/process.js +76 -0
  12. package/dist/agents/process.js.map +1 -0
  13. package/dist/agents/session.js +26 -0
  14. package/dist/agents/session.js.map +1 -0
  15. package/dist/agents/types.js +2 -0
  16. package/dist/agents/types.js.map +1 -0
  17. package/dist/api/client.js +138 -0
  18. package/dist/api/client.js.map +1 -0
  19. package/dist/api/errors.js +40 -0
  20. package/dist/api/errors.js.map +1 -0
  21. package/dist/api/outbox.js +105 -0
  22. package/dist/api/outbox.js.map +1 -0
  23. package/dist/api/types.js +4 -0
  24. package/dist/api/types.js.map +1 -0
  25. package/dist/cli.js +10 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/commands/agents.js +39 -0
  28. package/dist/commands/agents.js.map +1 -0
  29. package/dist/commands/context.js +27 -0
  30. package/dist/commands/context.js.map +1 -0
  31. package/dist/commands/done.js +125 -0
  32. package/dist/commands/done.js.map +1 -0
  33. package/dist/commands/index.js +101 -0
  34. package/dist/commands/index.js.map +1 -0
  35. package/dist/commands/init.js +203 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/login.js +93 -0
  38. package/dist/commands/login.js.map +1 -0
  39. package/dist/commands/logout.js +34 -0
  40. package/dist/commands/logout.js.map +1 -0
  41. package/dist/commands/promote.js +105 -0
  42. package/dist/commands/promote.js.map +1 -0
  43. package/dist/commands/pull.js +45 -0
  44. package/dist/commands/pull.js.map +1 -0
  45. package/dist/commands/revert.js +39 -0
  46. package/dist/commands/revert.js.map +1 -0
  47. package/dist/commands/review.js +73 -0
  48. package/dist/commands/review.js.map +1 -0
  49. package/dist/commands/run.js +147 -0
  50. package/dist/commands/run.js.map +1 -0
  51. package/dist/commands/shared.js +81 -0
  52. package/dist/commands/shared.js.map +1 -0
  53. package/dist/commands/start.js +119 -0
  54. package/dist/commands/start.js.map +1 -0
  55. package/dist/commands/status.js +62 -0
  56. package/dist/commands/status.js.map +1 -0
  57. package/dist/config/credentials.js +17 -0
  58. package/dist/config/credentials.js.map +1 -0
  59. package/dist/config/server.js +29 -0
  60. package/dist/config/server.js.map +1 -0
  61. package/dist/config/settings.js +21 -0
  62. package/dist/config/settings.js.map +1 -0
  63. package/dist/config/userDir.js +18 -0
  64. package/dist/config/userDir.js.map +1 -0
  65. package/dist/fs/json.js +44 -0
  66. package/dist/fs/json.js.map +1 -0
  67. package/dist/fs/lock.js +38 -0
  68. package/dist/fs/lock.js.map +1 -0
  69. package/dist/io.js +26 -0
  70. package/dist/io.js.map +1 -0
  71. package/dist/launch/open.js +48 -0
  72. package/dist/launch/open.js.map +1 -0
  73. package/dist/launch/platform.js +38 -0
  74. package/dist/launch/platform.js.map +1 -0
  75. package/dist/launch/pty.js +61 -0
  76. package/dist/launch/pty.js.map +1 -0
  77. package/dist/launch/terminal.js +194 -0
  78. package/dist/launch/terminal.js.map +1 -0
  79. package/dist/launch/which.js +59 -0
  80. package/dist/launch/which.js.map +1 -0
  81. package/dist/repo/diff.js +26 -0
  82. package/dist/repo/diff.js.map +1 -0
  83. package/dist/repo/framework.js +41 -0
  84. package/dist/repo/framework.js.map +1 -0
  85. package/dist/repo/link.js +28 -0
  86. package/dist/repo/link.js.map +1 -0
  87. package/dist/repo/prep.js +447 -0
  88. package/dist/repo/prep.js.map +1 -0
  89. package/dist/repo/preview.js +144 -0
  90. package/dist/repo/preview.js.map +1 -0
  91. package/dist/repo/root.js +48 -0
  92. package/dist/repo/root.js.map +1 -0
  93. package/dist/repo/scratch.js +111 -0
  94. package/dist/repo/scratch.js.map +1 -0
  95. package/dist/runs/checks.js +160 -0
  96. package/dist/runs/checks.js.map +1 -0
  97. package/dist/runs/lifecycle.js +142 -0
  98. package/dist/runs/lifecycle.js.map +1 -0
  99. package/dist/runs/promote.js +185 -0
  100. package/dist/runs/promote.js.map +1 -0
  101. package/dist/runs/pull.js +182 -0
  102. package/dist/runs/pull.js.map +1 -0
  103. package/dist/runs/reviews.js +34 -0
  104. package/dist/runs/reviews.js.map +1 -0
  105. package/dist/runs/slots.js +96 -0
  106. package/dist/runs/slots.js.map +1 -0
  107. package/dist/runs/snapshot.js +265 -0
  108. package/dist/runs/snapshot.js.map +1 -0
  109. package/dist/runs/store.js +38 -0
  110. package/dist/runs/store.js.map +1 -0
  111. package/dist/runs/types.js +3 -0
  112. package/dist/runs/types.js.map +1 -0
  113. package/dist/runs/watch.js +42 -0
  114. package/dist/runs/watch.js.map +1 -0
  115. package/dist/screenshot/browser.js +163 -0
  116. package/dist/screenshot/browser.js.map +1 -0
  117. package/dist/screenshot/iteration.js +37 -0
  118. package/dist/screenshot/iteration.js.map +1 -0
  119. package/dist/server/app.js +321 -0
  120. package/dist/server/app.js.map +1 -0
  121. package/dist/server/security.js +44 -0
  122. package/dist/server/security.js.map +1 -0
  123. package/dist/server/studio.js +618 -0
  124. package/dist/server/studio.js.map +1 -0
  125. package/dist/server/terminals.js +142 -0
  126. package/dist/server/terminals.js.map +1 -0
  127. package/dist/ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  128. package/dist/ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  129. package/dist/ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  130. package/dist/ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  131. package/dist/ui/assets/index-D-TSXfvz.css +1 -0
  132. package/dist/ui/assets/index-HGV8FKwI.js +27 -0
  133. package/dist/ui/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  134. package/dist/ui/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  135. package/dist/ui/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  136. package/dist/ui/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  137. package/dist/ui/assets/space-grotesk-latin-400-normal-BnQMeOim.woff +0 -0
  138. package/dist/ui/assets/space-grotesk-latin-400-normal-CJ-V5oYT.woff2 +0 -0
  139. package/dist/ui/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
  140. package/dist/ui/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
  141. package/dist/ui/index.html +14 -0
  142. package/dist/version.js +4 -0
  143. package/dist/version.js.map +1 -0
  144. package/package.json +68 -4
@@ -0,0 +1,618 @@
1
+ // What the local UI asks for, done with the same parts as the CLI: runs, Done, revert, review
2
+ // decisions through the outbox, promote, and the agents' sessions. The HTTP layer (app.ts) only
3
+ // checks who is asking and turns these into JSON.
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { ADAPTERS } from '../agents/index.js';
7
+ import { runTarget, terminalSessions } from '../agents/session.js';
8
+ import { describeError } from '../api/errors.js';
9
+ import { outboxFor } from '../api/outbox.js';
10
+ import { finishWithScreenshots } from '../commands/done.js';
11
+ import { promoteSession } from '../commands/promote.js';
12
+ import { chooseAgent, sendHeartbeat } from '../commands/shared.js';
13
+ import { localOrigin, readSettings, saveSettings } from '../config/settings.js';
14
+ import { manualCommand, planTerminal } from '../launch/terminal.js';
15
+ import { ITERATION, SLUG, listIterations, writePreviewRegistry } from '../repo/preview.js';
16
+ import { startRuns } from '../runs/lifecycle.js';
17
+ import { findComponent, preparePromotion } from '../runs/promote.js';
18
+ import { pullAdvice, pullSketch } from '../runs/pull.js';
19
+ import { sendDecision } from '../runs/reviews.js';
20
+ import { assertTarget } from '../runs/slots.js';
21
+ import { revertFile } from '../runs/snapshot.js';
22
+ import { listRuns, readRun } from '../runs/store.js';
23
+ import { SIZES } from '../screenshot/browser.js';
24
+ import { screenshotPath } from '../screenshot/iteration.js';
25
+ import { STUDIO_VERSION } from '../version.js';
26
+ import { Terminals } from './terminals.js';
27
+ const KEEP_LINES = 300;
28
+ const ASSET_CACHE_MS = 5 * 60_000;
29
+ const ASSET_CACHE_BYTES = 64 * 1024 * 1024;
30
+ const ASSET_TYPES = {
31
+ avif: 'image/avif',
32
+ gif: 'image/gif',
33
+ glb: 'model/gltf-binary',
34
+ jpeg: 'image/jpeg',
35
+ jpg: 'image/jpeg',
36
+ mp4: 'video/mp4',
37
+ png: 'image/png',
38
+ svg: 'image/svg+xml',
39
+ webm: 'video/webm',
40
+ webp: 'image/webp'
41
+ };
42
+ /** The content type an asset file is served with, from its name. */
43
+ export function assetType(file) {
44
+ return ASSET_TYPES[file.split('.').pop()?.toLowerCase() ?? ''] ?? 'application/octet-stream';
45
+ }
46
+ const DETECTION_FRESH_MS = 60_000;
47
+ function describeEvent(event) {
48
+ switch (event.kind) {
49
+ case 'file':
50
+ return `Wrote ${event.name}`;
51
+ case 'tool':
52
+ return `Used ${event.name}`;
53
+ case 'message':
54
+ return event.text;
55
+ case 'result':
56
+ return event.ok ? 'Finished.' : `Failed${event.text ? `: ${event.text}` : '.'}`;
57
+ default:
58
+ return null;
59
+ }
60
+ }
61
+ /** A request the local UI made wrong: answered 400 with this sentence. */
62
+ export class BadRequest extends Error {
63
+ }
64
+ function text(value, what, max = 2000) {
65
+ if (typeof value !== 'string' || !value.trim() || value.length > max) {
66
+ throw new BadRequest(`${what} is missing or too long.`);
67
+ }
68
+ return value.trim();
69
+ }
70
+ function optionalText(value, what, max = 20_000) {
71
+ if (value === undefined || value === null || value === '')
72
+ return undefined;
73
+ if (typeof value !== 'string' || value.length > max)
74
+ throw new BadRequest(`${what} is too long.`);
75
+ return value;
76
+ }
77
+ function lines(value, what) {
78
+ if (value === undefined)
79
+ return undefined;
80
+ if (!Array.isArray(value) || value.length > 50 || value.some(item => typeof item !== 'string')) {
81
+ throw new BadRequest(`${what} must be a list of short lines.`);
82
+ }
83
+ return value.map(item => item.trim()).filter(Boolean);
84
+ }
85
+ function record(value, what, valid) {
86
+ if (value === undefined)
87
+ return undefined;
88
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
89
+ throw new BadRequest(`${what} is not readable.`);
90
+ }
91
+ const entries = Object.entries(value).filter(([, item]) => valid(item));
92
+ return Object.fromEntries(entries);
93
+ }
94
+ const STATUSES = ['draft', 'exploring', 'promising', 'archived'];
95
+ const REVIEW_DECISIONS = ['explore', 'refine', 'select', 'reject'];
96
+ /** A decision as the local UI sends it, checked before it reaches the outbox. */
97
+ export function parseDecision(body) {
98
+ switch (body.kind) {
99
+ case 'select':
100
+ return { kind: 'select', reason: optionalText(body.reason, 'The reason') };
101
+ case 'reject':
102
+ return {
103
+ kind: 'reject',
104
+ reason: text(body.reason, 'The reason', 500),
105
+ why: optionalText(body.why, 'Why')
106
+ };
107
+ case 'review': {
108
+ const decision = body.decision;
109
+ if (decision !== undefined &&
110
+ decision !== '' &&
111
+ !REVIEW_DECISIONS.includes(decision)) {
112
+ throw new BadRequest('A review decides explore, refine, select or reject.');
113
+ }
114
+ return {
115
+ kind: 'review',
116
+ ...(decision ? { decision: decision } : {}),
117
+ reason: optionalText(body.reason, 'The reason'),
118
+ observations: lines(body.observations, 'Observations'),
119
+ fields: record(body.fields, 'The answers', (item) => typeof item === 'string'),
120
+ checklist: record(body.checklist, 'The checklist', (item) => typeof item === 'boolean')
121
+ };
122
+ }
123
+ case 'notes': {
124
+ const notes = {
125
+ likes: lines(body.likes, 'Likes'),
126
+ dislikes: lines(body.dislikes, 'Dislikes'),
127
+ designerNotes: body.designerNotes === undefined
128
+ ? undefined
129
+ : typeof body.designerNotes === 'string' && body.designerNotes.length <= 20_000
130
+ ? body.designerNotes
131
+ : (() => {
132
+ throw new BadRequest('The notes are too long.');
133
+ })()
134
+ };
135
+ if (Object.values(notes).every(item => item === undefined)) {
136
+ throw new BadRequest('There is nothing to save.');
137
+ }
138
+ return { kind: 'notes', ...notes };
139
+ }
140
+ case 'status':
141
+ if (!STATUSES.includes(body.status)) {
142
+ throw new BadRequest('The status is draft, exploring, promising or archived.');
143
+ }
144
+ return { kind: 'status', status: body.status };
145
+ default:
146
+ throw new BadRequest('Not a decision this studio knows.');
147
+ }
148
+ }
149
+ export class LocalStudio {
150
+ options;
151
+ terminals;
152
+ outbox;
153
+ jobs = new Map();
154
+ detections = null;
155
+ assets = new Map();
156
+ constructor(options) {
157
+ this.options = options;
158
+ this.terminals = options.pty.ok ? new Terminals(options.pty.pty) : null;
159
+ this.outbox = outboxFor(options.context.repoRoot);
160
+ }
161
+ get repoRoot() {
162
+ return this.options.context.repoRoot;
163
+ }
164
+ /** Every agent, found or not; asked again after a minute, or when `fresh`. */
165
+ agents(fresh = false) {
166
+ if (fresh || !this.detections || Date.now() - this.detections.at > DETECTION_FRESH_MS) {
167
+ const list = Promise.all(ADAPTERS.map(adapter => this.options.context.detect(adapter)));
168
+ this.detections = { at: Date.now(), list };
169
+ list.catch(() => (this.detections = null));
170
+ }
171
+ return this.detections.list;
172
+ }
173
+ async detection(adapter) {
174
+ const found = (await this.agents()).find(item => item.id === adapter.id);
175
+ return found ?? this.options.context.detect(adapter);
176
+ }
177
+ /** The command context, with agents found once rather than on every request. */
178
+ get context() {
179
+ return { ...this.options.context, detect: adapter => this.detection(adapter) };
180
+ }
181
+ async state() {
182
+ const { link, devUrl, port, pty, api } = this.options;
183
+ const [settings, agents, pending, dropped] = await Promise.all([
184
+ readSettings(this.options.context.configDir),
185
+ this.agents(),
186
+ this.outbox.pending(),
187
+ this.outbox.dropped()
188
+ ]);
189
+ let webUrl = null;
190
+ try {
191
+ webUrl = (await api.me()).webUrl ?? null;
192
+ }
193
+ catch {
194
+ // Offline: the UI works without the link to the web.
195
+ }
196
+ return {
197
+ version: STUDIO_VERSION,
198
+ project: { orgId: link.orgId, slug: link.project },
199
+ devUrl,
200
+ port,
201
+ webUrl,
202
+ terminal: pty.ok ? { builtin: true } : { builtin: false, reason: pty.reason },
203
+ agents: agents.map((item) => ({
204
+ id: item.id,
205
+ name: item.name,
206
+ found: item.found,
207
+ version: item.version,
208
+ signedIn: item.signedIn,
209
+ signIn: item.signIn,
210
+ headless: item.headless,
211
+ capabilities: item.capabilities
212
+ })),
213
+ defaultAgent: settings.defaultAgent,
214
+ outbox: { pending: pending.length, dropped }
215
+ };
216
+ }
217
+ async setDefaultAgent(agent) {
218
+ if (agent !== null && !ADAPTERS.some(item => item.id === agent)) {
219
+ throw new BadRequest('Choose one of the agents this studio supports.');
220
+ }
221
+ await saveSettings(this.options.context.configDir, {
222
+ defaultAgent: agent
223
+ });
224
+ }
225
+ /** The project from the backend, and which of its iterations are in this repo. */
226
+ async project() {
227
+ const { api, link } = this.options;
228
+ const tree = await api.project(link.orgId, link.project);
229
+ const iterations = listIterations(this.repoRoot);
230
+ const screenshots = {};
231
+ for (const key of iterations) {
232
+ const [page, component, iteration] = key.split('/');
233
+ const sizes = Object.keys(SIZES).filter(size => fs.existsSync(this.disk(screenshotPath(page, component, iteration, size))));
234
+ if (sizes.length)
235
+ screenshots[key] = sizes;
236
+ }
237
+ return { tree, local: { iterations, screenshots } };
238
+ }
239
+ async runs() {
240
+ const terminals = this.terminals?.list() ?? [];
241
+ return (await listRuns(this.repoRoot)).map(run => {
242
+ const job = this.jobs.get(run.runId);
243
+ return {
244
+ ...run,
245
+ terminal: terminals.filter(item => item.runId === run.runId).at(-1) ?? null,
246
+ headless: job ? { status: job.status, lines: job.lines, error: job.error } : null
247
+ };
248
+ });
249
+ }
250
+ async startRuns(body) {
251
+ const context = this.context;
252
+ const { api, link } = this.options;
253
+ const kind = this.runKind(body);
254
+ const { adapter, detection } = await chooseAgent(context, body.agent);
255
+ const executable = detection.executable;
256
+ if (body.mode === 'headless' && !detection.headless.ready) {
257
+ throw new BadRequest(detection.headless.reason);
258
+ }
259
+ // Decisions waiting in the outbox reach the server first, so this prompt remembers them.
260
+ await this.outbox.flush(api);
261
+ const request = {
262
+ page: body.page,
263
+ component: body.component,
264
+ agent: adapter.id,
265
+ mode: body.mode,
266
+ ...kind
267
+ };
268
+ // Iterations load the project's asset files from this server.
269
+ const runs = await startRuns(this.repoRoot, api, link, request, {
270
+ assetOrigin: localOrigin({ localPort: this.options.port })
271
+ });
272
+ const model = typeof body.model === 'string' && body.model ? body.model : null;
273
+ if (body.mode === 'headless') {
274
+ for (const run of runs)
275
+ this.runHeadless(adapter, detection, run, model);
276
+ return { runs, launched: { kind: 'headless' } };
277
+ }
278
+ const sessions = terminalSessions(adapter, executable, this.repoRoot, runs, model);
279
+ const launched = await this.open(sessions, runs.map(run => run.runId), body);
280
+ return { runs, launched };
281
+ }
282
+ /** Opens sessions in the built-in terminal, or the designer's own, or says what to paste. */
283
+ async open(sessions, runIds, where) {
284
+ const context = this.options.context;
285
+ if (this.terminals && where.terminal !== 'external') {
286
+ const terminals = sessions.map((session, index) => this.terminals.start({
287
+ title: session.title,
288
+ command: session.command,
289
+ args: session.args,
290
+ cwd: this.repoRoot,
291
+ env: context.env,
292
+ runId: runIds[index] ?? null,
293
+ cols: where.cols,
294
+ rows: where.rows
295
+ }));
296
+ return { kind: 'builtin', terminals };
297
+ }
298
+ const plan = planTerminal({
299
+ platform: context.platform,
300
+ env: context.env,
301
+ repoRoot: this.repoRoot,
302
+ sessions
303
+ });
304
+ if (plan.kind !== 'manual') {
305
+ try {
306
+ await context.launchTerminal(plan);
307
+ return { kind: 'external', terminal: plan.terminal };
308
+ }
309
+ catch (error) {
310
+ return {
311
+ kind: 'manual',
312
+ reason: `${plan.terminal} could not be opened: ${describeError(error)}`,
313
+ commands: sessions.map(session => manualCommand(context.platform, this.repoRoot, session))
314
+ };
315
+ }
316
+ }
317
+ return {
318
+ kind: 'manual',
319
+ reason: plan.reason,
320
+ commands: sessions.map(session => manualCommand(context.platform, this.repoRoot, session))
321
+ };
322
+ }
323
+ runHeadless(adapter, detection, run, model) {
324
+ const context = this.context;
325
+ const job = {
326
+ controller: new AbortController(),
327
+ lines: [],
328
+ status: 'running',
329
+ error: null
330
+ };
331
+ this.jobs.set(run.runId, job);
332
+ const say = (line) => {
333
+ job.lines.push(line);
334
+ if (job.lines.length > KEEP_LINES)
335
+ job.lines.splice(0, job.lines.length - KEEP_LINES);
336
+ };
337
+ void (async () => {
338
+ const invocation = adapter.headless(runTarget(this.repoRoot, run, model), detection.executable, context.env);
339
+ let outcome = 'failed';
340
+ let usage = null;
341
+ if ('refused' in invocation) {
342
+ job.error = invocation.refused;
343
+ }
344
+ else {
345
+ const result = await context.runHeadless(adapter, invocation, {
346
+ env: context.env,
347
+ model,
348
+ signal: job.controller.signal,
349
+ onEvent: event => {
350
+ const line = describeEvent(event);
351
+ if (line)
352
+ say(line);
353
+ }
354
+ });
355
+ outcome = result.ok ? undefined : result.cancelled ? 'cancelled' : 'failed';
356
+ usage = result.usage;
357
+ job.error = result.error;
358
+ }
359
+ await finishWithScreenshots(context, this.options.api, this.outbox, this.options.link, run.runId, {
360
+ outcome,
361
+ usage,
362
+ devUrl: this.options.devUrl,
363
+ screenshots: true
364
+ });
365
+ })()
366
+ .catch(error => {
367
+ job.error = describeError(error);
368
+ })
369
+ .finally(() => {
370
+ job.status = 'finished';
371
+ });
372
+ }
373
+ /** Stops what is running for a run: its unattended agent, or its terminal session. */
374
+ stopRun(runId) {
375
+ const job = this.jobs.get(runId);
376
+ if (job?.status === 'running') {
377
+ job.controller.abort();
378
+ return true;
379
+ }
380
+ const session = this.terminals
381
+ ?.list()
382
+ .filter(item => item.runId === runId && item.status === 'running')
383
+ .at(-1);
384
+ return session ? this.terminals.stop(session.id) : false;
385
+ }
386
+ async done(runId, outcome) {
387
+ if (outcome !== undefined && outcome !== 'failed' && outcome !== 'cancelled') {
388
+ throw new BadRequest('A run is marked failed or cancelled, or finished as it is.');
389
+ }
390
+ const run = await this.requireRun(runId);
391
+ if (this.jobs.get(run.runId)?.status === 'running') {
392
+ throw new BadRequest('This run is still going unattended. Stop it first.');
393
+ }
394
+ return finishWithScreenshots(this.context, this.options.api, this.outbox, this.options.link, run.runId, { outcome, devUrl: this.options.devUrl, screenshots: true });
395
+ }
396
+ /** Puts back one file a finished run changed outside its folder. */
397
+ async revert(runId, file) {
398
+ const run = await this.requireRun(runId);
399
+ const name = text(file, 'The file').replace(/\\/g, '/');
400
+ if (run.status !== 'finished')
401
+ throw new BadRequest('Finish the run before putting files back.');
402
+ // Only what the run was flagged for: anything else is the designer's own work.
403
+ if (!run.outOfScope.includes(name)) {
404
+ throw new BadRequest(`${name} is not among the files this run changed outside its folder.`);
405
+ }
406
+ return { file: name, result: await revertFile(this.repoRoot, run.runId, name) };
407
+ }
408
+ async prompt(runId) {
409
+ const run = await this.requireRun(runId);
410
+ return {
411
+ promptFile: run.promptFile,
412
+ prompt: fs.readFileSync(this.disk(run.promptFile), 'utf8')
413
+ };
414
+ }
415
+ async reviews(target) {
416
+ this.assertIteration(target);
417
+ const { api, link } = this.options;
418
+ return api.reviews(link.orgId, link.project, target.page, target.component, target.iteration);
419
+ }
420
+ async decide(target, decision) {
421
+ this.assertIteration(target);
422
+ const { api, link } = this.options;
423
+ const result = await sendDecision(api, this.outbox, link, target, decision);
424
+ return { status: result.status };
425
+ }
426
+ /** The component's web sketches that can be pulled, from the backend. */
427
+ async sketches(page, component) {
428
+ if (!SLUG.test(page) || !SLUG.test(component))
429
+ throw new BadRequest('Not a component.');
430
+ const { api, link } = this.options;
431
+ return api.sketches(link.orgId, link.project, page, component);
432
+ }
433
+ /** Pulls a web sketch into rough/ as a new local iteration, and says what the app still needs. */
434
+ async pull(target) {
435
+ this.assertIteration(target);
436
+ const { api, link } = this.options;
437
+ const pulled = await pullSketch(this.repoRoot, api, link, { page: target.page, component: target.component, sketch: target.iteration }, { assetOrigin: localOrigin({ localPort: this.options.port }) });
438
+ return { ...pulled, advice: pullAdvice(pulled) };
439
+ }
440
+ async promote(body) {
441
+ this.assertIteration(body);
442
+ const { api, link } = this.options;
443
+ const tree = await api.project(link.orgId, link.project);
444
+ const record = findComponent(tree, body.page, body.component);
445
+ const prepared = await preparePromotion(this.repoRoot, api, link, tree, {
446
+ page: body.page,
447
+ component: body.component,
448
+ iteration: body.iteration,
449
+ targetFile: body.targetFile?.trim() || undefined
450
+ });
451
+ const assets = prepared.copied.map(to => ({ to }));
452
+ const missingAssets = prepared.missing.map(item => ({ url: `${item.scope}/${item.file}` }));
453
+ const instruction = `Follow the instructions in ${prepared.promptFile}`;
454
+ let session;
455
+ try {
456
+ const { adapter, detection } = await chooseAgent(this.context, body.agent);
457
+ session = promoteSession(adapter, detection, this.repoRoot, { page: body.page, component: body.component, componentName: record.name }, prepared, null);
458
+ }
459
+ catch (error) {
460
+ return {
461
+ ok: true,
462
+ launched: false,
463
+ message: `${describeError(error)} Give your agent this instruction in the repo: ${instruction}`,
464
+ commands: [],
465
+ assets,
466
+ missingAssets,
467
+ terminal: null
468
+ };
469
+ }
470
+ const launched = await this.open([session], [null], body);
471
+ const where = launched.kind === 'builtin'
472
+ ? 'the built-in terminal'
473
+ : launched.kind === 'external'
474
+ ? launched.terminal
475
+ : null;
476
+ return {
477
+ ok: true,
478
+ launched: where !== null,
479
+ message: where
480
+ ? `Wrote ${prepared.promptFile} and opened the agent in ${where} to write ${prepared.targetFile}. Review the diff when it is done; nothing is committed.`
481
+ : `Wrote ${prepared.promptFile}. ${launched.kind === 'manual' ? launched.reason : ''}`.trim(),
482
+ commands: launched.kind === 'manual' ? launched.commands : [],
483
+ assets,
484
+ missingAssets,
485
+ terminal: launched.kind === 'builtin' ? (launched.terminals[0] ?? null) : null
486
+ };
487
+ }
488
+ /**
489
+ * A project or library asset file's bytes, for iterations in the repo's dev server: prompts
490
+ * name this server as their origin. Kept for a few minutes, so a page of images is one fetch
491
+ * each.
492
+ */
493
+ async asset(scope, file) {
494
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(file))
495
+ throw new BadRequest('Not an asset file.');
496
+ const key = `${scope}/${file}`;
497
+ const cached = this.assets.get(key);
498
+ if (cached && Date.now() - cached.at < ASSET_CACHE_MS)
499
+ return cached.bytes;
500
+ const { api, link } = this.options;
501
+ const bytes = await api.file(link.orgId, link.project, scope, file);
502
+ this.assets.set(key, { bytes, at: Date.now() });
503
+ let total = 0;
504
+ for (const [name, entry] of [...this.assets.entries()].reverse()) {
505
+ total += entry.bytes.length;
506
+ if (total > ASSET_CACHE_BYTES)
507
+ this.assets.delete(name);
508
+ }
509
+ return bytes;
510
+ }
511
+ /** A screenshot's file, when the iteration has one at that size. */
512
+ screenshotFile(target, size) {
513
+ this.assertIteration(target);
514
+ if (!(size in SIZES))
515
+ return null;
516
+ const file = this.disk(screenshotPath(target.page, target.component, target.iteration, size));
517
+ return fs.existsSync(file) ? file : null;
518
+ }
519
+ /** Sends what waits in the outbox; quiet when the server cannot be reached. */
520
+ async flushOutbox() {
521
+ try {
522
+ await this.outbox.flush(this.options.api);
523
+ }
524
+ catch {
525
+ // Tried again on the next tick.
526
+ }
527
+ }
528
+ /** Keeps rough/preview-registry.ts in step with the iteration folders. */
529
+ keepRegistry() {
530
+ try {
531
+ writePreviewRegistry(this.repoRoot);
532
+ }
533
+ catch {
534
+ // A folder being written mid-scan; the next tick catches up.
535
+ }
536
+ }
537
+ async heartbeat() {
538
+ await sendHeartbeat(this.context, await this.agents());
539
+ }
540
+ close() {
541
+ for (const job of this.jobs.values())
542
+ job.controller.abort();
543
+ this.terminals?.stopAll();
544
+ }
545
+ runKind(body) {
546
+ if (!SLUG.test(String(body.page)) || !SLUG.test(String(body.component))) {
547
+ throw new BadRequest('Name the page and component.');
548
+ }
549
+ if (body.mode !== 'interactive' && body.mode !== 'headless') {
550
+ throw new BadRequest('A run is interactive or headless.');
551
+ }
552
+ switch (body.kind) {
553
+ case 'generate': {
554
+ const directions = Array.isArray(body.directions) ? body.directions : [];
555
+ if (!directions.length || directions.length > 8) {
556
+ throw new BadRequest('Give one to eight directions.');
557
+ }
558
+ return {
559
+ kind: 'generate',
560
+ directions: directions.map(item => ({
561
+ direction: text(item?.direction, 'A direction', 500),
562
+ ...(typeof item?.hypothesis === 'string' && item.hypothesis.trim()
563
+ ? { hypothesis: text(item.hypothesis, 'The hypothesis', 1000) }
564
+ : {})
565
+ }))
566
+ };
567
+ }
568
+ case 'fork':
569
+ if (!ITERATION.test(String(body.parent)))
570
+ throw new BadRequest('Name the iteration to fork.');
571
+ return { kind: 'fork', parent: body.parent };
572
+ case 'refine': {
573
+ if (!ITERATION.test(String(body.parent))) {
574
+ throw new BadRequest('Name the iteration to refine.');
575
+ }
576
+ const observationIds = Array.isArray(body.observationIds)
577
+ ? body.observationIds.filter((id) => typeof id === 'string').slice(0, 3)
578
+ : [];
579
+ return {
580
+ kind: 'refine',
581
+ parent: body.parent,
582
+ preset: text(body.preset, 'The refinement', 40),
583
+ intent: typeof body.intent === 'string' ? body.intent.trim().slice(0, 4000) : '',
584
+ ...(observationIds.length ? { observationIds } : {}),
585
+ ...(typeof body.preserve === 'string' && body.preserve.trim()
586
+ ? { preserve: body.preserve.trim().slice(0, 2000) }
587
+ : {})
588
+ };
589
+ }
590
+ default:
591
+ throw new BadRequest('A run makes new directions, a fork, or a refinement.');
592
+ }
593
+ }
594
+ async requireRun(runId) {
595
+ let run = null;
596
+ try {
597
+ run = await readRun(this.repoRoot, runId);
598
+ }
599
+ catch {
600
+ run = null;
601
+ }
602
+ if (!run)
603
+ throw new BadRequest(`There is no run ${runId} in this repo.`);
604
+ return run;
605
+ }
606
+ assertIteration(target) {
607
+ try {
608
+ assertTarget(target.page, target.component, target.iteration);
609
+ }
610
+ catch (error) {
611
+ throw new BadRequest(error.message);
612
+ }
613
+ }
614
+ disk(relative) {
615
+ return path.join(this.repoRoot, ...relative.split('/'));
616
+ }
617
+ }
618
+ //# sourceMappingURL=studio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio.js","sourceRoot":"","sources":["../../src/server/studio.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,gGAAgG;AAChG,kDAAkD;AAClD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAInE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAe,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAgB,MAAM,uBAAuB,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAoC,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAwE9D,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC;AAClC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,GAA2B;IAC1C,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,mBAAmB;IACxB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,eAAe;IACpB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;CACnB,CAAC;AAEF,oEAAoE;AACpE,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,0BAA0B,CAAC;AAC/F,CAAC;AACD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,SAAS,aAAa,CAAC,KAAiB;IACtC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,KAAK,MAAM;YACT,OAAO,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAClF;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,OAAO,UAAW,SAAQ,KAAK;CAAG;AAExC,SAAS,IAAI,CAAC,KAAc,EAAE,IAAY,EAAE,GAAG,GAAG,IAAI;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrE,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAY,EAAE,GAAG,GAAG,MAAM;IAC9D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC;IAClG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,KAAc,EAAE,IAAY;IACzC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,iCAAiC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,IAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,MAAM,CAAI,KAAc,EAAE,IAAY,EAAE,KAAmC;IAClF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAsB,CAAC;AAC1D,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAC1E,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAE5E,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,QAAQ,IAAI,CAAC,IAAwB,EAAE,CAAC;QACtC,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC;gBAC5C,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;aACnC,CAAC;QACJ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,IACE,QAAQ,KAAK,SAAS;gBACtB,QAAQ,KAAK,EAAE;gBACf,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAiB,CAAC,EAC7C,CAAC;gBACD,MAAM,IAAI,UAAU,CAAC,qDAAqD,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAA6C,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChF,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC;gBACtD,MAAM,EAAE,MAAM,CACZ,IAAI,CAAC,MAAM,EACX,aAAa,EACb,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CACnD;gBACD,SAAS,EAAE,MAAM,CACf,IAAI,CAAC,SAAS,EACd,eAAe,EACf,CAAC,IAAI,EAAmB,EAAE,CAAC,OAAO,IAAI,KAAK,SAAS,CACrD;aACF,CAAC;QACJ,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG;gBACZ,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;gBACjC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC1C,aAAa,EACX,IAAI,CAAC,aAAa,KAAK,SAAS;oBAC9B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,MAAM;wBAC7E,CAAC,CAAC,IAAI,CAAC,aAAa;wBACpB,CAAC,CAAC,CAAC,GAAG,EAAE;4BACJ,MAAM,IAAI,UAAU,CAAC,yBAAyB,CAAC,CAAC;wBAClD,CAAC,CAAC,EAAE;aACb,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,UAAU,CAAC,2BAA2B,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;QACrC,CAAC;QACD,KAAK,QAAQ;YACX,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAe,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,UAAU,CAAC,wDAAwD,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAmC,EAAE,CAAC;QAC9E;YACE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,OAAO,WAAW;IAOO;IANpB,SAAS,CAAmB;IAC5B,MAAM,CAAS;IACP,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,UAAU,GAAsD,IAAI,CAAC;IAC5D,MAAM,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE3E,YAA6B,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;QACtD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,8EAA8E;IAC9E,MAAM,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,kBAAkB,EAAE,CAAC;YACtF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxF,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,OAAwB;QAC9C,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,gFAAgF;IAChF,IAAY,OAAO;QACjB,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACtD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7D,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC5C,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACrB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;QACD,OAAO;YACL,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YAClD,MAAM;YACN,IAAI;YACJ,MAAM;YACN,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;YAC7E,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAa,EAAE,CAAC,CAAC;gBACvC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;YACH,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;SAC7C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAc;QAClC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,UAAU,CAAC,gDAAgD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE;YACjD,YAAY,EAAE,KAAwB;SACvC,CAAC,CAAC;IACL,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,WAAW,GAA6B,EAAE,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;YAChF,MAAM,KAAK,GAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACzE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAC3E,CAAC;YACF,IAAI,KAAK,CAAC,MAAM;gBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO;gBACL,GAAG,GAAG;gBACN,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;gBAC3E,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;aAClF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAa;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,SAAS,CAAC,UAAW,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1D,MAAM,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,yFAAyF;QACzF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,OAAO,CAAC,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,IAAI;SACW,CAAC;QACrB,8DAA8D;QAC9D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;YAC9D,WAAW,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/E,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACzE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAC9B,QAAQ,EACR,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAC1B,IAAI,CACL,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,6FAA6F;IACrF,KAAK,CAAC,IAAI,CAChB,QAAmB,EACnB,MAAyB,EACzB,KAA0E;QAE1E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACrC,IAAI,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAChD,IAAI,CAAC,SAAU,CAAC,KAAK,CAAC;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,EAAE,IAAI,CAAC,QAAQ;gBAClB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI;gBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CACH,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ;SACT,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBACnC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,yBAAyB,aAAa,CAAC,KAAK,CAAC,EAAE;oBACvE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;iBAC3F,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAC3F,CAAC;IACJ,CAAC;IAEO,WAAW,CACjB,OAAwB,EACxB,SAAoB,EACpB,GAAc,EACd,KAAoB;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,GAAG,GAAgB;YACvB,UAAU,EAAE,IAAI,eAAe,EAAE;YACjC,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE;YAC3B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU;gBAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QACxF,CAAC,CAAC;QACF,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CACjC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EACpC,SAAS,CAAC,UAAW,EACrB,OAAO,CAAC,GAAG,CACZ,CAAC;YACF,IAAI,OAAO,GAAuC,QAAQ,CAAC;YAC3D,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;gBAC5B,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE;oBAC5D,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,KAAK;oBACL,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM;oBAC7B,OAAO,EAAE,KAAK,CAAC,EAAE;wBACf,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;wBAClC,IAAI,IAAI;4BAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;iBACF,CAAC,CAAC;gBACH,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC5E,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBACrB,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,MAAM,qBAAqB,CACzB,OAAO,EACP,IAAI,CAAC,OAAO,CAAC,GAAG,EAChB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,GAAG,CAAC,KAAK,EACT;gBACE,OAAO;gBACP,KAAK;gBACL,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;gBAC3B,WAAW,EAAE,IAAI;aAClB,CACF,CAAC;QACJ,CAAC,CAAC,EAAE;aACD,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,sFAAsF;IACtF,OAAO,CAAC,KAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,GAAG,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS;YAC5B,EAAE,IAAI,EAAE;aACP,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;aACjE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACV,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,OAAgB;QACxC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC7E,MAAM,IAAI,UAAU,CAAC,4DAA4D,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,qBAAqB,CAC1B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,CAAC,GAAG,EAChB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,GAAG,CAAC,KAAK,EACT,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAC5D,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAa;QACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU;YAC3B,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;QACpE,+EAA+E;QAC/E,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,8DAA8D,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;SAC3D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAChG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAoB,EAAE,QAAkB;QACnD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,SAAiB;QAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACxF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,kGAAkG;IAClG,KAAK,CAAC,IAAI,CAAC,MAAoB;QAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,IAAI,CAAC,QAAQ,EACb,GAAG,EACH,IAAI,EACJ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,EAC5E,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAC/D,CAAC;QACF,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IASb;QACC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;YACtE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,SAAS;SACjD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,WAAW,GAAG,8BAA8B,QAAQ,CAAC,UAAU,EAAE,CAAC;QAExE,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3E,OAAO,GAAG,cAAc,CACtB,OAAO,EACP,SAAS,EACT,IAAI,CAAC,QAAQ,EACb,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,EAC1E,QAAQ,EACR,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,kDAAkD,WAAW,EAAE;gBAC/F,QAAQ,EAAE,EAAE;gBACZ,MAAM;gBACN,aAAa;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,KAAK,GACT,QAAQ,CAAC,IAAI,KAAK,SAAS;YACzB,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU;gBAC5B,CAAC,CAAC,QAAQ,CAAC,QAAQ;gBACnB,CAAC,CAAC,IAAI,CAAC;QACb,OAAO;YACL,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,KAAK,KAAK,IAAI;YACxB,OAAO,EAAE,KAAK;gBACZ,CAAC,CAAC,SAAS,QAAQ,CAAC,UAAU,4BAA4B,KAAK,aAAa,QAAQ,CAAC,UAAU,0DAA0D;gBACzJ,CAAC,CAAC,SAAS,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE;YAC/F,QAAQ,EAAE,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;YAC7D,MAAM;YACN,aAAa;YACb,QAAQ,EAAE,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SAC/E,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAiB,EAAE,IAAY;QACzC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC3F,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,cAAc;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAC3E,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACjE,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,KAAK,GAAG,iBAAiB;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oEAAoE;IACpE,cAAc,CAAC,MAAoB,EAAE,IAAY;QAC/C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CACpB,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAA0B,CAAC,CAC5F,CAAC;QACF,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,YAAY;QACV,IAAI,CAAC;YACH,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAEO,OAAO,CAAC,IAAa;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5D,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;QAC5D,CAAC;QACD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;gBACxD,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAClC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC;wBACpD,GAAG,CAAC,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;4BAChE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE;4BAC/D,CAAC,CAAC,EAAE,CAAC;qBACR,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;YACD,KAAK,MAAM;gBACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACtC,MAAM,IAAI,UAAU,CAAC,6BAA6B,CAAC,CAAC;gBACtD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/C,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;oBACzC,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;gBACxD,CAAC;gBACD,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;oBACvD,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtF,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC;oBAC/C,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;oBAChF,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpD,GAAG,CAAC,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;wBAC3D,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;wBACnD,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;YACJ,CAAC;YACD;gBACE,MAAM,IAAI,UAAU,CAAC,sDAAsD,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,KAAa;QACpC,IAAI,GAAG,GAAqB,IAAI,CAAC;QACjC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,UAAU,CAAC,mBAAmB,KAAK,gBAAgB,CAAC,CAAC;QACzE,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,eAAe,CAAC,MAA8D;QACpF,IAAI,CAAC;YACH,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,UAAU,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,QAAgB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF"}