@songsid/agend 2.1.4 → 2.1.5-beta.10

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 (82) hide show
  1. package/dist/backend/claude-code.js +2 -2
  2. package/dist/backend/claude-code.js.map +1 -1
  3. package/dist/backend/types.d.ts +22 -0
  4. package/dist/backend/types.js +23 -1
  5. package/dist/backend/types.js.map +1 -1
  6. package/dist/channel/adapters/discord.d.ts +2 -0
  7. package/dist/channel/adapters/discord.js +25 -3
  8. package/dist/channel/adapters/discord.js.map +1 -1
  9. package/dist/channel/adapters/telegram.d.ts +5 -0
  10. package/dist/channel/adapters/telegram.js +11 -0
  11. package/dist/channel/adapters/telegram.js.map +1 -1
  12. package/dist/channel/types.d.ts +7 -0
  13. package/dist/cli.js +37 -37
  14. package/dist/cli.js.map +1 -1
  15. package/dist/config.js +38 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/daemon.d.ts +38 -0
  18. package/dist/daemon.js +95 -43
  19. package/dist/daemon.js.map +1 -1
  20. package/dist/fleet-context.d.ts +5 -0
  21. package/dist/fleet-manager.d.ts +126 -0
  22. package/dist/fleet-manager.js +688 -95
  23. package/dist/fleet-manager.js.map +1 -1
  24. package/dist/full-restart.d.ts +20 -0
  25. package/dist/full-restart.js +39 -0
  26. package/dist/full-restart.js.map +1 -0
  27. package/dist/locale.js +72 -2
  28. package/dist/locale.js.map +1 -1
  29. package/dist/login-controller.d.ts +127 -0
  30. package/dist/login-controller.js +450 -0
  31. package/dist/login-controller.js.map +1 -0
  32. package/dist/login-flows.d.ts +41 -3
  33. package/dist/login-flows.js +37 -5
  34. package/dist/login-flows.js.map +1 -1
  35. package/dist/login-manager.d.ts +12 -1
  36. package/dist/login-manager.js +64 -7
  37. package/dist/login-manager.js.map +1 -1
  38. package/dist/login-window-lock.d.ts +26 -0
  39. package/dist/login-window-lock.js +64 -0
  40. package/dist/login-window-lock.js.map +1 -0
  41. package/dist/restart-progress.d.ts +35 -5
  42. package/dist/restart-progress.js +195 -34
  43. package/dist/restart-progress.js.map +1 -1
  44. package/dist/service-restart-selection.d.ts +27 -0
  45. package/dist/service-restart-selection.js +25 -0
  46. package/dist/service-restart-selection.js.map +1 -0
  47. package/dist/tmux-manager.d.ts +19 -0
  48. package/dist/tmux-manager.js +79 -12
  49. package/dist/tmux-manager.js.map +1 -1
  50. package/dist/topic-commands.js +23 -7
  51. package/dist/topic-commands.js.map +1 -1
  52. package/dist/types.d.ts +18 -0
  53. package/dist/ui/web-terminal/terminal.css +17 -0
  54. package/dist/ui/web-terminal/terminal.html +44 -0
  55. package/dist/ui/web-terminal/terminal.js +148 -0
  56. package/dist/ui/web-terminal/vendor/LICENSE.addon-fit +19 -0
  57. package/dist/ui/web-terminal/vendor/LICENSE.addon-web-links +19 -0
  58. package/dist/ui/web-terminal/vendor/LICENSE.xterm +21 -0
  59. package/dist/ui/web-terminal/vendor/VENDORED.md +22 -0
  60. package/dist/ui/web-terminal/vendor/addon-fit.js +1 -0
  61. package/dist/ui/web-terminal/vendor/addon-web-links.js +1 -0
  62. package/dist/ui/web-terminal/vendor/xterm.css +285 -0
  63. package/dist/ui/web-terminal/vendor/xterm.js +1 -0
  64. package/dist/update-marker.d.ts +11 -1
  65. package/dist/update-marker.js +19 -4
  66. package/dist/update-marker.js.map +1 -1
  67. package/dist/update-progress.d.ts +1 -1
  68. package/dist/update-progress.js +12 -0
  69. package/dist/update-progress.js.map +1 -1
  70. package/dist/usage/providers.d.ts +39 -0
  71. package/dist/usage/providers.js +69 -3
  72. package/dist/usage/providers.js.map +1 -1
  73. package/dist/web-terminal-http.d.ts +61 -0
  74. package/dist/web-terminal-http.js +422 -0
  75. package/dist/web-terminal-http.js.map +1 -0
  76. package/dist/web-terminal.d.ts +336 -0
  77. package/dist/web-terminal.js +888 -0
  78. package/dist/web-terminal.js.map +1 -0
  79. package/dist/ws-server.d.ts +69 -0
  80. package/dist/ws-server.js +392 -0
  81. package/dist/ws-server.js.map +1 -0
  82. package/package.json +1 -1
@@ -0,0 +1,422 @@
1
+ /**
2
+ * Per-session HTTP listener for one WebTerminalSession.
3
+ *
4
+ * One `127.0.0.1:0` listener per session, closed with the session — it is not
5
+ * the dashboard/health server, so a tunnel pointed at it (phase 3) can reach
6
+ * nothing else. Routes (sid must match exactly, everything else is 404):
7
+ *
8
+ * GET /t/<sid>/ static page — NO side effects (link-preview
9
+ * bots fetch it), NO secret in the URL
10
+ * GET /t/<sid> 302 → /t/<sid>/ (the page references its
11
+ * assets relatively; without the trailing
12
+ * slash a browser resolves them under /t/)
13
+ * GET /t/<sid>/assets/<file> vendored xterm.js + page script/style
14
+ * POST /t/<sid>/open {token} → token gate → HttpOnly cookie
15
+ * GET /t/<sid>/ws (upgrade) cookie + Origin → WebSocket to the pane
16
+ *
17
+ * Origin must equal Host on /open and /ws (CSRF/cross-site WS). Cookie is
18
+ * HttpOnly; SameSite=Strict; Path=/t/<sid>. Limits: 4 KB frames, 64 inbound
19
+ * frames/s (control frames included, enforced in the parser), 1 KB /open
20
+ * body, 64 KB of input waiting for tmux, 1 MB of output waiting for the
21
+ * browser; resize clamped by the session.
22
+ *
23
+ * Every entry point has an error boundary: a malformed request target or an
24
+ * unexpected throw answers 400/500 and never becomes an unhandled rejection
25
+ * or uncaught exception in the fleet process.
26
+ */
27
+ import { createServer } from "node:http";
28
+ import { readFileSync, existsSync } from "node:fs";
29
+ import { join, dirname } from "node:path";
30
+ import { fileURLToPath } from "node:url";
31
+ import { acceptWebSocket, rejectUpgrade } from "./ws-server.js";
32
+ const __dirname = dirname(fileURLToPath(import.meta.url));
33
+ const DEFAULT_ASSETS_DIR = join(__dirname, "ui", "web-terminal");
34
+ const MAX_OPEN_BODY = 1024;
35
+ const MAX_WS_FRAME = 4096;
36
+ const MAX_FRAMES_PER_SECOND = 64;
37
+ const MAX_OUTBOUND_BUFFERED = 1024 * 1024;
38
+ /** One admin browser needs a handful of sockets; anything beyond this is refused (M3: URL holders must not exhaust the fleet process). */
39
+ export const MAX_CONNECTIONS = 8;
40
+ const MAX_REQUESTS_PER_SOCKET = 100;
41
+ const RESPONSE_TIMEOUT_MS = 15_000;
42
+ const ASSETS = {
43
+ "terminal.js": { file: "terminal.js", type: "text/javascript; charset=utf-8" },
44
+ "terminal.css": { file: "terminal.css", type: "text/css; charset=utf-8" },
45
+ "xterm.js": { file: join("vendor", "xterm.js"), type: "text/javascript; charset=utf-8" },
46
+ "xterm.css": { file: join("vendor", "xterm.css"), type: "text/css; charset=utf-8" },
47
+ "addon-fit.js": { file: join("vendor", "addon-fit.js"), type: "text/javascript; charset=utf-8" },
48
+ "addon-web-links.js": { file: join("vendor", "addon-web-links.js"), type: "text/javascript; charset=utf-8" },
49
+ };
50
+ /**
51
+ * The request target as a plain path, or null when it is not a valid
52
+ * origin-form target. `new URL` throws on `GET http://%` and friends, and
53
+ * absolute-form / authority-form targets are not something a browser sends
54
+ * to us — all of that is a 400, never an exception (B1).
55
+ */
56
+ export function safeRequestPath(rawUrl) {
57
+ // origin-form only: starts with a single "/" ("//host/x" is scheme-relative, not a path)
58
+ if (!rawUrl || rawUrl.length > 2048 || !rawUrl.startsWith("/") || rawUrl.startsWith("//"))
59
+ return null;
60
+ try {
61
+ return new URL(rawUrl, "http://localhost").pathname;
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ export class WebTerminalHttpServer {
68
+ session;
69
+ logger;
70
+ server = null;
71
+ port = 0;
72
+ ws = null;
73
+ sockets = new Set();
74
+ assetsDir;
75
+ bind;
76
+ hostname;
77
+ unsubscribeFinished = null;
78
+ /** Immutable assets, read once at listen() — no per-request disk I/O (M3). */
79
+ assetCache = new Map();
80
+ constructor(session, logger, opts = {}) {
81
+ this.session = session;
82
+ this.logger = logger;
83
+ this.assetsDir = opts.assetsDir ?? DEFAULT_ASSETS_DIR;
84
+ this.bind = opts.bind ?? "127.0.0.1";
85
+ this.hostname = opts.hostname ?? "localhost";
86
+ }
87
+ get pagePath() { return `/t/${this.session.sid}`; }
88
+ /**
89
+ * The URL handed to the admin ends with "/" on purpose: terminal.html loads
90
+ * `assets/…` relative to the document, and relative resolution drops the last
91
+ * path segment of a slash-less URL (`/t/<sid>` → `/t/assets/…`, a 404 that
92
+ * left the first real-browser acceptance with no xterm and a blocked form).
93
+ */
94
+ get pageUrl() { return `http://${this.hostname}:${this.port}${this.pagePath}/`; }
95
+ /** Start listening; returns the URL to hand the admin (it contains no secret). */
96
+ async listen() {
97
+ if (this.server)
98
+ throw new Error("already listening");
99
+ this.preloadAssets();
100
+ const server = createServer((req, res) => {
101
+ // Error boundary: nothing thrown by a request may escape to the process.
102
+ Promise.resolve().then(() => this.handle(req, res)).catch(err => {
103
+ this.logger.warn({ sid: this.session.sid, err: err.message }, "web terminal request failed");
104
+ try {
105
+ this.text(res, 500, "internal error");
106
+ }
107
+ catch {
108
+ res.destroy();
109
+ }
110
+ });
111
+ });
112
+ server.on("upgrade", (req, socket, head) => {
113
+ try {
114
+ this.handleUpgrade(req, socket, head);
115
+ }
116
+ catch (err) {
117
+ this.logger.warn({ sid: this.session.sid, err: err.message }, "web terminal upgrade failed");
118
+ rejectUpgrade(socket, 500, "Internal Server Error");
119
+ }
120
+ });
121
+ server.on("clientError", (_err, socket) => {
122
+ // Node's own HTTP parser rejected the request (malformed request line/headers).
123
+ if (!socket.destroyed)
124
+ socket.end("HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n");
125
+ });
126
+ server.on("connection", socket => {
127
+ if (this.sockets.size >= MAX_CONNECTIONS) {
128
+ // More sockets than one browser could need: refuse before any parsing.
129
+ socket.destroy();
130
+ return;
131
+ }
132
+ this.sockets.add(socket);
133
+ socket.on("error", () => { });
134
+ socket.on("close", () => this.sockets.delete(socket));
135
+ });
136
+ server.headersTimeout = 10_000;
137
+ server.requestTimeout = 15_000;
138
+ server.maxRequestsPerSocket = MAX_REQUESTS_PER_SOCKET;
139
+ // A peer that stops reading a response (slow-loris on a 489 KB asset) is cut off.
140
+ server.timeout = RESPONSE_TIMEOUT_MS;
141
+ server.on("timeout", socket => socket.destroy());
142
+ this.server = server;
143
+ await new Promise((resolve, reject) => {
144
+ server.once("error", reject);
145
+ server.listen(0, this.bind, () => { server.off("error", reject); resolve(); });
146
+ });
147
+ const address = server.address();
148
+ this.port = typeof address === "object" && address ? address.port : 0;
149
+ const onFinished = () => { void this.close(); };
150
+ this.session.once("finished", onFinished);
151
+ this.unsubscribeFinished = () => this.session.off("finished", onFinished);
152
+ return { port: this.port, url: this.pageUrl };
153
+ }
154
+ async close() {
155
+ this.unsubscribeFinished?.();
156
+ this.unsubscribeFinished = null;
157
+ const server = this.server;
158
+ this.server = null;
159
+ try {
160
+ this.ws?.close(1001, "session closed");
161
+ }
162
+ catch { /* gone */ }
163
+ this.ws = null;
164
+ if (!server)
165
+ return;
166
+ await new Promise(resolve => {
167
+ server.close(() => resolve());
168
+ // Idle keep-alive connections would otherwise hold close() open.
169
+ for (const s of this.sockets)
170
+ s.destroy();
171
+ setTimeout(resolve, 500).unref?.();
172
+ });
173
+ }
174
+ // ── HTTP ──
175
+ handle(req, res) {
176
+ res.setHeader("Cache-Control", "no-store");
177
+ res.setHeader("Referrer-Policy", "no-referrer");
178
+ res.setHeader("X-Content-Type-Options", "nosniff");
179
+ res.setHeader("X-Frame-Options", "DENY");
180
+ const path = safeRequestPath(req.url);
181
+ if (path === null)
182
+ return this.text(res, 400, "bad request");
183
+ const base = this.pagePath;
184
+ if (path === base) {
185
+ // A pasted or hand-typed link without the trailing slash: send the
186
+ // browser to the canonical form so its relative asset URLs resolve.
187
+ if (req.method !== "GET")
188
+ return this.text(res, 405, "method not allowed");
189
+ return this.redirect(res, `${base}/`);
190
+ }
191
+ if (path === `${base}/`) {
192
+ if (req.method !== "GET")
193
+ return this.text(res, 405, "method not allowed");
194
+ return this.page(res);
195
+ }
196
+ if (path.startsWith(`${base}/assets/`)) {
197
+ if (req.method !== "GET")
198
+ return this.text(res, 405, "method not allowed");
199
+ return this.asset(res, path.slice(`${base}/assets/`.length));
200
+ }
201
+ if (path === `${base}/open`) {
202
+ if (req.method !== "POST")
203
+ return this.text(res, 405, "method not allowed");
204
+ return this.open(req, res);
205
+ }
206
+ if (path === `${base}/ws`)
207
+ return this.text(res, 426, "upgrade required");
208
+ return this.text(res, 404, "not found");
209
+ }
210
+ page(res) {
211
+ const html = this.readAsset("terminal.html");
212
+ if (!html)
213
+ return this.text(res, 500, "terminal page missing");
214
+ res.setHeader("Content-Security-Policy",
215
+ // xterm.js injects a <style> element for its DOM renderer, hence 'unsafe-inline' for styles only.
216
+ "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src data:; base-uri 'none'; form-action 'none'; frame-ancestors 'none'");
217
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
218
+ res.end(html);
219
+ }
220
+ asset(res, name) {
221
+ const entry = ASSETS[name];
222
+ if (!entry)
223
+ return this.text(res, 404, "not found");
224
+ const body = this.readAsset(entry.file);
225
+ if (!body)
226
+ return this.text(res, 404, "not found");
227
+ res.writeHead(200, { "Content-Type": entry.type });
228
+ res.end(body);
229
+ }
230
+ preloadAssets() {
231
+ for (const rel of ["terminal.html", ...Object.values(ASSETS).map(a => a.file)]) {
232
+ const p = join(this.assetsDir, rel);
233
+ if (!existsSync(p))
234
+ continue;
235
+ try {
236
+ this.assetCache.set(rel, readFileSync(p));
237
+ }
238
+ catch { /* served as 404/500 */ }
239
+ }
240
+ }
241
+ readAsset(rel) {
242
+ return this.assetCache.get(rel) ?? null;
243
+ }
244
+ open(req, res) {
245
+ if (!this.originMatchesHost(req))
246
+ return this.json(res, 403, { error: "origin mismatch" });
247
+ if (!String(req.headers["content-type"] ?? "").startsWith("application/json")) {
248
+ return this.json(res, 415, { error: "json required" });
249
+ }
250
+ let size = 0;
251
+ const chunks = [];
252
+ let tooLarge = false;
253
+ req.on("data", (c) => {
254
+ size += c.length;
255
+ if (size > MAX_OPEN_BODY) {
256
+ tooLarge = true;
257
+ this.json(res, 413, { error: "body too large" });
258
+ req.destroy();
259
+ return;
260
+ }
261
+ chunks.push(c);
262
+ });
263
+ req.on("end", () => {
264
+ if (tooLarge)
265
+ return;
266
+ try {
267
+ let token = "";
268
+ try {
269
+ const parsed = JSON.parse(Buffer.concat(chunks).toString("utf8"));
270
+ token = typeof parsed.token === "string" ? parsed.token : "";
271
+ }
272
+ catch {
273
+ return this.json(res, 400, { error: "bad json" });
274
+ }
275
+ if (!token)
276
+ return this.json(res, 400, { error: "token required" });
277
+ const outcome = this.session.redeemToken(token);
278
+ switch (outcome.result) {
279
+ case "ok": {
280
+ const secure = this.isHttps(req) ? "; Secure" : "";
281
+ res.setHeader("Set-Cookie", `${this.cookieName}=${outcome.cookie}; HttpOnly; SameSite=Strict; Path=${this.pagePath}${secure}`);
282
+ return this.json(res, 204, null);
283
+ }
284
+ case "bad": return this.json(res, 403, { error: "invalid token", remaining: outcome.remaining });
285
+ case "used": return this.json(res, 409, { error: "token already used" });
286
+ case "locked": return this.json(res, 410, { error: "session destroyed after repeated failures" });
287
+ case "finished": return this.json(res, 410, { error: "session ended" });
288
+ }
289
+ }
290
+ catch (err) {
291
+ this.logger.warn({ sid: this.session.sid, err: err.message }, "web terminal /open failed");
292
+ this.json(res, 500, { error: "internal error" });
293
+ }
294
+ });
295
+ req.on("error", () => { });
296
+ }
297
+ // ── WebSocket ──
298
+ handleUpgrade(req, socket, head) {
299
+ this.sockets.add(socket);
300
+ socket.on("error", () => { });
301
+ socket.on("close", () => this.sockets.delete(socket));
302
+ const path = safeRequestPath(req.url);
303
+ if (path === null)
304
+ return rejectUpgrade(socket, 400, "Bad Request");
305
+ if (path !== `${this.pagePath}/ws`)
306
+ return rejectUpgrade(socket, 404, "Not Found");
307
+ if (!this.originMatchesHost(req))
308
+ return rejectUpgrade(socket, 403, "Forbidden");
309
+ if (!this.session.checkCookie(this.cookie(req)))
310
+ return rejectUpgrade(socket, 403, "Forbidden");
311
+ if (this.session.state !== "running")
312
+ return rejectUpgrade(socket, 410, "Gone");
313
+ const ws = acceptWebSocket(req, socket, head, {
314
+ maxPayload: MAX_WS_FRAME,
315
+ maxFramesPerSecond: MAX_FRAMES_PER_SECOND,
316
+ maxBufferedBytes: MAX_OUTBOUND_BUFFERED,
317
+ });
318
+ if (!ws)
319
+ return;
320
+ const previous = this.ws;
321
+ this.ws = ws;
322
+ if (previous && previous !== ws) {
323
+ try {
324
+ previous.close(4000, "replaced");
325
+ }
326
+ catch { /* gone */ }
327
+ }
328
+ const detach = this.session.attachClient({
329
+ send: data => { ws.send(data); }, // a slow browser is dropped inside send() (1008)
330
+ close: (code, reason) => { ws.close(code, reason); },
331
+ });
332
+ ws.on("message", (data, isBinary) => {
333
+ // Fence: only the CURRENT browser may type. A replaced or closing
334
+ // socket cannot inject even if a frame was already in flight (B3).
335
+ if (this.ws !== ws || ws.closed)
336
+ return;
337
+ if (isBinary) {
338
+ if (!this.session.input(data)) {
339
+ ws.close(1008, "input backlog"); // > MAX_PENDING_INPUT_BYTES waiting for tmux (B4)
340
+ }
341
+ return;
342
+ }
343
+ let msg;
344
+ try {
345
+ msg = JSON.parse(data);
346
+ }
347
+ catch {
348
+ return;
349
+ }
350
+ if (msg.t === "resize" && typeof msg.cols === "number" && typeof msg.rows === "number") {
351
+ this.session.resize(msg.cols, msg.rows);
352
+ }
353
+ else if (msg.t === "cancel") {
354
+ // The authenticated browser's Stop button: end the session for real,
355
+ // not merely a Ctrl-C the CLI might ignore.
356
+ void this.session.cancel("stopped from the browser");
357
+ }
358
+ });
359
+ ws.on("close", () => { detach(); if (this.ws === ws)
360
+ this.ws = null; });
361
+ ws.on("protocolError", (e) => this.logger.info({ sid: this.session.sid, code: e.code, reason: e.reason }, "web terminal ws closed by policy"));
362
+ ws.on("error", () => { });
363
+ this.logger.info({ sid: this.session.sid, ip: req.socket.remoteAddress, ua: String(req.headers["user-agent"] ?? "").slice(0, 120) }, "web_terminal_ws_connected");
364
+ }
365
+ // ── Helpers ──
366
+ get cookieName() { return `agend_term_${this.session.sid.slice(0, 12)}`; }
367
+ cookie(req) {
368
+ const raw = String(req.headers.cookie ?? "");
369
+ for (const part of raw.split(";")) {
370
+ const [k, ...v] = part.trim().split("=");
371
+ if (k === this.cookieName)
372
+ return v.join("=");
373
+ }
374
+ return undefined;
375
+ }
376
+ /** Origin must be present and its host must equal the Host header (what the browser typed). */
377
+ originMatchesHost(req) {
378
+ const origin = req.headers.origin;
379
+ const host = req.headers.host;
380
+ if (!origin || !host)
381
+ return false;
382
+ try {
383
+ return new URL(String(origin)).host === String(host);
384
+ }
385
+ catch {
386
+ return false;
387
+ }
388
+ }
389
+ isHttps(req) {
390
+ const proto = String(req.headers["x-forwarded-proto"] ?? "").split(",")[0].trim().toLowerCase();
391
+ return proto === "https" || Boolean(req.socket.encrypted);
392
+ }
393
+ redirect(res, location) {
394
+ if (res.headersSent) {
395
+ res.end();
396
+ return;
397
+ }
398
+ // 302 (not 301): nothing about this session-scoped path is worth caching.
399
+ res.writeHead(302, { Location: location, "Content-Type": "text/plain; charset=utf-8" });
400
+ res.end(`see ${location}\n`);
401
+ }
402
+ text(res, status, body) {
403
+ if (res.headersSent) {
404
+ res.end();
405
+ return;
406
+ }
407
+ res.writeHead(status, { "Content-Type": "text/plain; charset=utf-8" });
408
+ res.end(`${body}\n`);
409
+ }
410
+ json(res, status, body) {
411
+ if (res.headersSent)
412
+ return;
413
+ if (status === 204) {
414
+ res.writeHead(204);
415
+ res.end();
416
+ return;
417
+ }
418
+ res.writeHead(status, { "Content-Type": "application/json; charset=utf-8" });
419
+ res.end(JSON.stringify(body));
420
+ }
421
+ }
422
+ //# sourceMappingURL=web-terminal-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-terminal-http.js","sourceRoot":"","sources":["../src/web-terminal-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AAEjG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAqB,MAAM,gBAAgB,CAAC;AAGnF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAEjE,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1C,0IAA0I;AAC1I,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAM,MAAM,GAAmD;IAC7D,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gCAAgC,EAAE;IAC9E,cAAc,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACzE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE;IACxF,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACnF,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE;IAChG,oBAAoB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE;CAC7G,CAAC;AAUF;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,yFAAyF;IACzF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvG,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,qBAAqB;IAab;IACA;IAbX,MAAM,GAAkB,IAAI,CAAC;IAC7B,IAAI,GAAG,CAAC,CAAC;IACT,EAAE,GAAwB,IAAI,CAAC;IACtB,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5B,SAAS,CAAS;IAClB,IAAI,CAAS;IACb,QAAQ,CAAS;IAC1B,mBAAmB,GAAwB,IAAI,CAAC;IACxD,8EAA8E;IAC7D,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExD,YACmB,OAA2B,EAC3B,MAAsB,EACvC,OAA+B,EAAE;QAFhB,YAAO,GAAP,OAAO,CAAoB;QAC3B,WAAM,GAAN,MAAM,CAAgB;QAGvC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC;IAC/C,CAAC;IAED,IAAI,QAAQ,KAAa,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAE3D;;;;;OAKG;IACH,IAAI,OAAO,KAAa,OAAO,UAAU,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAEzF,kFAAkF;IAClF,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,yEAAyE;YACzE,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,6BAA6B,CAAC,CAAC;gBACxG,IAAI,CAAC;oBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBAAC,CAAC;YACzE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAgB,EAAE,IAAI,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,6BAA6B,CAAC,CAAC;gBACxG,aAAa,CAAC,MAAgB,EAAE,GAAG,EAAE,uBAAuB,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACxC,gFAAgF;YAChF,IAAI,CAAE,MAAiB,CAAC,SAAS;gBAAG,MAAiB,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE;YAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;gBACzC,uEAAuE;gBACvE,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAmC,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC;QAC/B,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC;QAC/B,MAAM,CAAC,oBAAoB,GAAG,uBAAuB,CAAC;QACtD,kFAAkF;QAClF,MAAM,CAAC,OAAO,GAAG,mBAAmB,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,mBAAmB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAChC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,iEAAiE;YACjE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;gBAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1C,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa;IAEL,MAAM,CAAC,GAAoB,EAAE,GAAmB;QACtD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC3C,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAChD,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;QACnD,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE3B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,mEAAmE;YACnE,oEAAoE;YACpE,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;YAC3E,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;YACxB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;YAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC;YACvC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;YAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;YAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC;IAEO,IAAI,CAAC,GAAmB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,CAAC,CAAC;QAC/D,GAAG,CAAC,SAAS,CAAC,yBAAyB;QACrC,kGAAkG;QAClG,yKAAyK,CAAC,CAAC;QAC7K,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,GAAmB,EAAE,IAAY;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACnD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAEO,aAAa;QACnB,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC7B,IAAI,CAAC;gBAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAEO,IAAI,CAAC,GAAoB,EAAE,GAAmB;QACpD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC3F,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YAC3B,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;YACjB,IAAI,IAAI,GAAG,aAAa,EAAE,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,QAAQ;gBAAE,OAAO;YACrB,IAAI,CAAC;gBACH,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAwB,CAAC;oBACzF,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBACpD,CAAC;gBACD,IAAI,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAChD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;oBACvB,KAAK,IAAI,CAAC,CAAC,CAAC;wBACV,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;wBACnD,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,qCAAqC,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,CAAC;wBAC/H,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBACnC,CAAC;oBACD,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;oBACjG,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;oBACzE,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;oBAClG,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,2BAA2B,CAAC,CAAC;gBACtG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA0B,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,kBAAkB;IAEV,aAAa,CAAC,GAAoB,EAAE,MAAc,EAAE,IAAY;QACtE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAoB,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACpE,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,KAAK;YAAE,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAAE,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAChG,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAEhF,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;YAC5C,UAAU,EAAE,YAAY;YACxB,kBAAkB,EAAE,qBAAqB;YACzC,gBAAgB,EAAE,qBAAqB;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,QAAQ,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QAEnG,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAe,iDAAiD;YAChG,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;SACrD,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAqB,EAAE,QAAiB,EAAE,EAAE;YAC5D,kEAAkE;YAClE,mEAAmE;YACnE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM;gBAAE,OAAO;YACxC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAc,CAAC,EAAE,CAAC;oBACxC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAY,kDAAkD;gBAChG,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,GAAoD,CAAC;YACzD,IAAI,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC3D,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC9B,qEAAqE;gBACrE,4CAA4C;gBAC5C,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;YAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAmC,EAAE,EAAE,CAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAC;QACnH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA4B,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC;IACpK,CAAC;IAED,gBAAgB;IAEhB,IAAY,UAAU,KAAa,OAAO,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAElF,MAAM,CAAC,GAAoB;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,+FAA+F;IACvF,iBAAiB,CAAC,GAAoB;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,CAAC;YAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IACvF,CAAC;IAEO,OAAO,CAAC,GAAoB;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChG,OAAO,KAAK,KAAK,OAAO,IAAI,OAAO,CAAE,GAAG,CAAC,MAA2C,CAAC,SAAS,CAAC,CAAC;IAClG,CAAC;IAEO,QAAQ,CAAC,GAAmB,EAAE,QAAgB;QACpD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC3C,0EAA0E;QAC1E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACxF,GAAG,CAAC,GAAG,CAAC,OAAO,QAAQ,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEO,IAAI,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAY;QAC5D,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC3C,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACvB,CAAC;IAEO,IAAI,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;QAC7D,IAAI,GAAG,CAAC,WAAW;YAAE,OAAO;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9D,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,CAAC,CAAC;QAC7E,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;CACF"}