@promptframe/cli 0.1.57 → 0.1.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +19 -1
  2. package/dist/development-build-worker.d.ts +2 -0
  3. package/dist/development-build-worker.d.ts.map +1 -0
  4. package/dist/development-build-worker.js +184 -0
  5. package/dist/development-build-worker.js.map +1 -0
  6. package/dist/development-build.d.ts +22 -0
  7. package/dist/development-build.d.ts.map +1 -0
  8. package/dist/development-build.js +66 -0
  9. package/dist/development-build.js.map +1 -0
  10. package/dist/development-coordinator.d.ts +26 -0
  11. package/dist/development-coordinator.d.ts.map +1 -0
  12. package/dist/development-coordinator.js +114 -0
  13. package/dist/development-coordinator.js.map +1 -0
  14. package/dist/development-css.d.ts +10 -0
  15. package/dist/development-css.d.ts.map +1 -0
  16. package/dist/development-css.js +65 -0
  17. package/dist/development-css.js.map +1 -0
  18. package/dist/development-files.d.ts +6 -0
  19. package/dist/development-files.d.ts.map +1 -0
  20. package/dist/development-files.js +70 -0
  21. package/dist/development-files.js.map +1 -0
  22. package/dist/development-process.d.ts +15 -0
  23. package/dist/development-process.d.ts.map +1 -0
  24. package/dist/development-process.js +65 -0
  25. package/dist/development-process.js.map +1 -0
  26. package/dist/development-revisions.d.ts +58 -0
  27. package/dist/development-revisions.d.ts.map +1 -0
  28. package/dist/development-revisions.js +130 -0
  29. package/dist/development-revisions.js.map +1 -0
  30. package/dist/development-validation.d.ts +22 -0
  31. package/dist/development-validation.d.ts.map +1 -0
  32. package/dist/development-validation.js +122 -0
  33. package/dist/development-validation.js.map +1 -0
  34. package/dist/development-workspace.d.ts +25 -0
  35. package/dist/development-workspace.d.ts.map +1 -0
  36. package/dist/development-workspace.js +352 -0
  37. package/dist/development-workspace.js.map +1 -0
  38. package/dist/index.js +72 -203
  39. package/dist/index.js.map +1 -1
  40. package/dist/lifecycle.js +4 -4
  41. package/dist/lifecycle.js.map +1 -1
  42. package/package.json +10 -4
@@ -0,0 +1,352 @@
1
+ import { randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { existsSync, lstatSync, opendirSync, realpathSync } from 'node:fs';
3
+ import { createServer as createHttpServer } from 'node:http';
4
+ import { dirname, join, posix, relative, resolve, sep } from 'node:path';
5
+ import { createServer as createViteServer } from 'vite';
6
+ import { buildDevelopmentContents } from './development-build.js';
7
+ import { DevelopmentModuleCoordinator } from './development-coordinator.js';
8
+ import { captureDevelopmentFiles } from './development-files.js';
9
+ import { DevelopmentContents } from './development-revisions.js';
10
+ const excluded = new Set(['node_modules', 'dist', '.git', '.component-packages', '.promptframe']);
11
+ const limits = { maximumFiles: 2048, maximumBytes: 16 * 1024 * 1024 };
12
+ const lockfiles = ['package-lock.json', 'npm-shrinkwrap.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lock', 'bun.lockb'];
13
+ /** One capture includes the module and its real shared pnpm lock bytes. Source
14
+ * aliases/parent imports remain explicitly unsupported by the common policy. */
15
+ export function captureDevelopmentModule(root, module) {
16
+ if (!module.path || module.path.includes('\\') || posix.isAbsolute(module.path)
17
+ || /^[A-Za-z]:/u.test(module.path)
18
+ || posix.normalize(module.path) !== module.path || module.path.split('/').some(part => !part || part === '.' || part === '..')) {
19
+ throw new Error('development.workspace.invalid_path');
20
+ }
21
+ const base = realpathSync(root), directory = resolve(base, module.path);
22
+ for (let path = directory; path !== base; path = dirname(path)) {
23
+ if (lstatSync(path).isSymbolicLink())
24
+ throw new Error('development.capture.symlink');
25
+ }
26
+ const names = [];
27
+ let entries = 0;
28
+ const walk = (directory, prefix, depth) => {
29
+ if (depth > 32)
30
+ throw new Error('development.capture.directory_limit');
31
+ const handle = opendirSync(directory);
32
+ try {
33
+ for (let entry = handle.readSync(); entry; entry = handle.readSync()) {
34
+ if (++entries > 8192)
35
+ throw new Error('development.capture.directory_limit');
36
+ if (excluded.has(entry.name))
37
+ continue;
38
+ const path = join(directory, entry.name), name = prefix + entry.name;
39
+ if (entry.isSymbolicLink())
40
+ throw new Error('development.capture.symlink');
41
+ if (entry.isDirectory())
42
+ walk(path, name + '/', depth + 1);
43
+ else if (entry.isFile()) {
44
+ names.push(name);
45
+ if (names.length > limits.maximumFiles)
46
+ throw new Error('development.contents.file_count');
47
+ }
48
+ else
49
+ throw new Error('development.capture.not_file');
50
+ }
51
+ }
52
+ finally {
53
+ handle.closeSync();
54
+ }
55
+ };
56
+ walk(directory, '', 0);
57
+ const sharedLock = !lockfiles.some(name => names.includes(name))
58
+ && existsSync(join(base, 'pnpm-workspace.yaml')) && existsSync(join(base, 'pnpm-lock.yaml'));
59
+ const prefix = module.path + '/';
60
+ const paths = names.map(name => prefix + name);
61
+ if (sharedLock)
62
+ paths.push('pnpm-workspace.yaml', 'pnpm-lock.yaml');
63
+ paths.push('promptframe-workspace.json');
64
+ const captured = captureDevelopmentFiles(base, paths, limits);
65
+ const normalized = new DevelopmentContents(captured.readFiles().map(file => ({
66
+ path: file.path.startsWith(prefix) ? file.path.slice(prefix.length)
67
+ : file.path === 'promptframe-workspace.json' ? 'promptframe-workspace.captured.json' : file.path,
68
+ bytes: file.bytes,
69
+ })), limits);
70
+ const manifest = normalized.readFiles().find(file => file.path === 'manifest.json');
71
+ if (!manifest || JSON.parse(Buffer.from(manifest.bytes).toString()).id !== module.id) {
72
+ throw new Error('development.workspace.manifest_id_mismatch');
73
+ }
74
+ const declaration = normalized.readFiles().find(file => file.path === 'promptframe-workspace.captured.json');
75
+ const workspace = JSON.parse(Buffer.from(declaration.bytes).toString());
76
+ if (workspace.schemaVersion !== 'promptframe-workspace.v0.1.0' || !Array.isArray(workspace.components)
77
+ || !workspace.components.some(entry => entry?.id === module.id && entry.path === module.path)) {
78
+ throw new Error('development.workspace.declaration_changed');
79
+ }
80
+ return normalized;
81
+ }
82
+ /** A single root Vite watcher plus a closed HTTP surface. Vite's raw-source,
83
+ * HTML, /@fs, HMR and plugin/config serving middleware is never attached. */
84
+ export async function startDevelopmentWorkspace(options) {
85
+ const root = realpathSync(options.root), origin = new URL(options.studioOrigin);
86
+ const host = options.host ?? '127.0.0.1', port = options.port ?? 0;
87
+ if (!['http:', 'https:'].includes(origin.protocol) || origin.username || origin.password
88
+ || origin.pathname !== '/' || origin.search || origin.hash || origin.origin === 'null') {
89
+ throw new Error('development.connection.invalid_origin');
90
+ }
91
+ if (!['127.0.0.1', '::1'].includes(host) || !Number.isSafeInteger(port) || port < 0 || port > 65535) {
92
+ throw new Error('development.connection.invalid_address');
93
+ }
94
+ if (!options.modules.length || options.modules.length > 32)
95
+ throw new Error('development.registry.module_limit');
96
+ const modules = new Map(options.modules.map(module => [module.id, Object.freeze({ ...module })]));
97
+ for (const module of modules.values()) {
98
+ if (typeof module.id !== 'string' || !module.id.trim() || module.id.length > 256 || /[\u0000-\u001f]/u.test(module.id)) {
99
+ throw new Error('development.module.invalid_identity');
100
+ }
101
+ }
102
+ if (modules.size !== options.modules.length || new Set([...modules.values()].map(module => module.path)).size !== modules.size) {
103
+ throw new Error('development.registry.duplicate_module');
104
+ }
105
+ const credential = randomBytes(32).toString('hex'), connectionId = randomBytes(16).toString('hex');
106
+ const expiresAt = Date.now() + 10 * 60_000;
107
+ const controller = new AbortController(), listeners = new Set();
108
+ const pending = new Set(), resident = new Map();
109
+ let pumping, checkingId;
110
+ let closed = false, expectedHost = '', responseBytes = 0, watcherDiagnostic;
111
+ const coordinator = new DevelopmentModuleCoordinator({ maximumModules: 32,
112
+ capture(id) {
113
+ const module = modules.get(id);
114
+ if (!module)
115
+ throw new Error('development.workspace.module_missing');
116
+ return captureDevelopmentModule(root, module);
117
+ },
118
+ async build(source, compilerOptions) {
119
+ const built = await buildDevelopmentContents(source, compilerOptions);
120
+ // Include the old checked output while a replacement is still pending.
121
+ if ([...resident.values()].reduce((a, b) => a + b, 0) + built.artifacts.byteLength > 64 * 1024 * 1024) {
122
+ throw new Error('development.workspace.artifact_budget');
123
+ }
124
+ return built;
125
+ },
126
+ });
127
+ const registry = () => ({ contractVersion: 'promptframe-development.v1', connectionId,
128
+ expiresAt: new Date(expiresAt).toISOString(), watcherDiagnostic, modules: [...modules.keys()].map(id => {
129
+ const state = coordinator.state(id), receipt = coordinator.buildReceipt(id);
130
+ const checking = pending.has(id) || checkingId === id;
131
+ return { moduleId: id, status: checking ? 'checking' : state?.status ?? 'checking',
132
+ sourceRevision: !checking || state?.status === 'checking' ? state?.sourceRevision : undefined,
133
+ diagnostic: state?.diagnostic, ...(state?.lastChecked && receipt ? { lastChecked: {
134
+ sourceRevision: state.lastChecked.sourceRevision, artifactRevision: receipt.artifacts.revision,
135
+ checkerKey: state.lastChecked.checkerKey, entries: receipt.entries, runtimeImports: receipt.runtimeImports,
136
+ } } : {}) };
137
+ }) });
138
+ const notify = () => {
139
+ const data = `event: registry\ndata: ${JSON.stringify(registry())}\n\n`;
140
+ for (const listener of listeners) {
141
+ try {
142
+ if (!listener.write(data))
143
+ listener.destroy();
144
+ }
145
+ catch {
146
+ listener.destroy();
147
+ }
148
+ }
149
+ };
150
+ const enqueue = (id) => {
151
+ if (closed || Date.now() >= expiresAt || !modules.has(id))
152
+ return;
153
+ pending.add(id);
154
+ if (pumping)
155
+ return;
156
+ // One compiler at a time; a failing module never removes another's output.
157
+ pumping = Promise.resolve().then(async () => {
158
+ while (pending.size && !closed) {
159
+ const id = pending.values().next().value;
160
+ pending.delete(id);
161
+ checkingId = id;
162
+ const job = coordinator.refresh(id, { signal: controller.signal });
163
+ notify();
164
+ if (await job)
165
+ resident.set(id, coordinator.buildReceipt(id).artifacts.byteLength);
166
+ checkingId = undefined;
167
+ notify();
168
+ }
169
+ }).finally(() => { pumping = undefined; });
170
+ };
171
+ // Explicit reads recapture too. Watch delivery/debounce is never authority.
172
+ const observe = (onlyId) => {
173
+ const revisions = new Map();
174
+ for (const [id, module] of modules) {
175
+ if (onlyId && onlyId !== id)
176
+ continue;
177
+ try {
178
+ const current = captureDevelopmentModule(root, module), state = coordinator.state(id);
179
+ revisions.set(id, current.revision);
180
+ if (state?.sourceRevision !== current.revision)
181
+ enqueue(id);
182
+ }
183
+ catch {
184
+ const state = coordinator.state(id);
185
+ if (state?.status !== 'failed' || state.sourceRevision !== undefined)
186
+ enqueue(id);
187
+ }
188
+ }
189
+ return revisions;
190
+ };
191
+ const json = (response, status, body) => {
192
+ response.writeHead(status, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store', 'X-Content-Type-Options': 'nosniff' });
193
+ response.end(JSON.stringify(body));
194
+ };
195
+ const http = createHttpServer((request, response) => {
196
+ const reject = (status, code) => {
197
+ response.setHeader('Connection', 'close');
198
+ json(response, status, { success: false, code });
199
+ };
200
+ if (request.headers.host !== expectedHost)
201
+ return reject(403, 'development.connection.host_rejected');
202
+ if (request.headers.origin !== origin.origin)
203
+ return reject(403, 'development.connection.origin_rejected');
204
+ response.setHeader('Access-Control-Allow-Origin', origin.origin);
205
+ response.setHeader('Vary', 'Origin');
206
+ if (request.method === 'OPTIONS') {
207
+ if (request.headers['access-control-request-method'] !== 'GET'
208
+ || (request.headers['access-control-request-headers'] ?? '').toString().toLowerCase().split(',').some(header => header.trim() !== 'authorization')) {
209
+ return reject(403, 'development.connection.preflight_rejected');
210
+ }
211
+ response.writeHead(204, { 'Access-Control-Allow-Methods': 'GET', 'Access-Control-Allow-Headers': 'Authorization',
212
+ 'Access-Control-Allow-Private-Network': 'true', 'Access-Control-Max-Age': '60' });
213
+ return response.end();
214
+ }
215
+ if (request.method !== 'GET')
216
+ return reject(405, 'development.connection.read_only');
217
+ if (Date.now() >= expiresAt)
218
+ return reject(401, 'development.connection.expired');
219
+ const bearer = request.headers.authorization;
220
+ if (typeof bearer !== 'string' || !/^Bearer [a-f0-9]{64}$/u.test(bearer)
221
+ || !timingSafeEqual(Buffer.from(bearer), Buffer.from('Bearer ' + credential))) {
222
+ return reject(401, 'development.connection.credential_rejected');
223
+ }
224
+ if (!request.url?.startsWith('/') || request.url.startsWith('//') || request.url.includes('?')) {
225
+ return reject(400, 'development.connection.invalid_path');
226
+ }
227
+ if (request.url === '/__promptframe/registry') {
228
+ observe();
229
+ return json(response, 200, registry());
230
+ }
231
+ if (request.url === '/__promptframe/events') {
232
+ if (listeners.size >= 8)
233
+ return reject(503, 'development.connection.observer_limit');
234
+ observe();
235
+ response.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-store' });
236
+ listeners.add(response);
237
+ response.on('close', () => listeners.delete(response));
238
+ response.on('error', () => response.destroy());
239
+ response.write(`event: registry\ndata: ${JSON.stringify(registry())}\n\n`);
240
+ return;
241
+ }
242
+ const match = /^\/__promptframe\/modules\/([^/]+)\/bundle\/([a-f0-9]{64})$/u.exec(request.url);
243
+ if (!match)
244
+ return reject(404, 'development.connection.route_missing');
245
+ let id;
246
+ try {
247
+ id = decodeURIComponent(match[1]);
248
+ }
249
+ catch {
250
+ return reject(400, 'development.connection.invalid_path');
251
+ }
252
+ if (!modules.has(id))
253
+ return reject(404, 'development.workspace.module_missing');
254
+ const revisions = observe(id);
255
+ const state = coordinator.state(id), receipt = coordinator.buildReceipt(id);
256
+ if (!state?.lastChecked || !receipt || revisions.get(id) !== receipt.sourceRevision
257
+ || receipt.artifacts.revision !== 'sha256:' + match[2]) {
258
+ return reject(409, 'development.workspace.bundle_not_current');
259
+ }
260
+ const reservation = receipt.artifacts.byteLength * 5 + 4 * 1024 * 1024;
261
+ if (responseBytes + reservation > 48 * 1024 * 1024)
262
+ return reject(503, 'development.connection.response_budget');
263
+ responseBytes += reservation;
264
+ let released = false;
265
+ const release = () => { if (!released) {
266
+ released = true;
267
+ responseBytes -= reservation;
268
+ } };
269
+ response.once('finish', release);
270
+ response.once('close', release);
271
+ try {
272
+ // A single exact bundle contains all chunks/resources: no live source or
273
+ // credential is passed into component ESM. The consumer still isolates it.
274
+ json(response, 200, { connectionId, moduleId: id, sourceRevision: receipt.sourceRevision,
275
+ artifactRevision: receipt.artifacts.revision, entries: receipt.entries, runtimeImports: receipt.runtimeImports,
276
+ files: receipt.artifacts.readFiles().map(file => ({ path: file.path, base64: Buffer.from(file.bytes).toString('base64') })) });
277
+ }
278
+ catch {
279
+ response.destroy();
280
+ }
281
+ });
282
+ http.maxConnections = 64;
283
+ http.headersTimeout = 5000;
284
+ http.requestTimeout = 5000;
285
+ http.keepAliveTimeout = 3000;
286
+ http.on('upgrade', (_request, socket) => socket.destroy());
287
+ const vite = await createViteServer({ root, configFile: false, envFile: false, publicDir: false,
288
+ mode: 'development', appType: 'custom', logLevel: 'silent',
289
+ server: { middlewareMode: true, hmr: false, ws: false,
290
+ watch: { followSymlinks: false, ignored: ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/.promptframe/**', '**/.component-packages/**'] } },
291
+ });
292
+ const changed = (_event, path) => {
293
+ const local = relative(root, resolve(path)).split(sep).join('/');
294
+ for (const [id, module] of modules) {
295
+ if (local === module.path || local.startsWith(module.path + '/') || local === 'pnpm-lock.yaml'
296
+ || local === 'package.json' || local === 'pnpm-workspace.yaml' || local === 'promptframe-workspace.json')
297
+ enqueue(id);
298
+ }
299
+ };
300
+ vite.watcher.on('all', changed);
301
+ vite.watcher.on('error', () => { watcherDiagnostic = 'development.workspace.watch_failed'; notify(); });
302
+ try {
303
+ await new Promise((resolve, reject) => {
304
+ http.once('error', reject);
305
+ http.listen(port, host, () => { http.removeListener('error', reject); resolve(); });
306
+ });
307
+ }
308
+ catch (error) {
309
+ await vite.close();
310
+ throw error;
311
+ }
312
+ const address = http.address();
313
+ if (!address || typeof address === 'string') {
314
+ await vite.close();
315
+ http.close();
316
+ throw new Error('development.connection.no_address');
317
+ }
318
+ expectedHost = `${host === '::1' ? '[::1]' : host}:${address.port}`;
319
+ for (const id of modules.keys())
320
+ enqueue(id);
321
+ const expiry = setTimeout(() => {
322
+ controller.abort(new Error('development.connection.expired'));
323
+ pending.clear();
324
+ for (const response of listeners) {
325
+ response.write('event: expired\ndata: {"code":"development.connection.expired"}\n\n');
326
+ response.end();
327
+ }
328
+ listeners.clear();
329
+ }, expiresAt - Date.now());
330
+ expiry.unref();
331
+ let closePromise;
332
+ return Object.freeze({ connectionId, url: `http://${expectedHost}`, studioOrigin: origin.origin,
333
+ credential, expiresAt: new Date(expiresAt).toISOString(),
334
+ close() {
335
+ return closePromise ??= (async () => {
336
+ closed = true;
337
+ clearTimeout(expiry);
338
+ controller.abort(new Error('development.workspace.closed'));
339
+ pending.clear();
340
+ for (const response of listeners)
341
+ response.end();
342
+ listeners.clear();
343
+ const httpClosed = new Promise((resolve, reject) => http.close(error => error ? reject(error) : resolve()));
344
+ http.closeAllConnections();
345
+ await pumping;
346
+ await vite.close();
347
+ await httpClosed;
348
+ })();
349
+ },
350
+ });
351
+ }
352
+ //# sourceMappingURL=development-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-workspace.js","sourceRoot":"","sources":["../src/development-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAuB,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,CAAC,CAAC,CAAC;AAClG,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;AACtE,MAAM,SAAS,GAAG,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAGvH;gFACgF;AAChF,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,MAAkC;IACvF,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;WAC1E,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;WAC/B,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACjI,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACxE,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,KAAa,EAAQ,EAAE;QACtE,IAAI,KAAK,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACrE,IAAI,EAAE,OAAO,GAAG,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBAC7E,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;gBACrE,IAAI,KAAK,CAAC,cAAc,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC3E,IAAI,KAAK,CAAC,WAAW,EAAE;oBAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;qBACtD,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY;wBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC7F,CAAC;;oBAAM,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;gBAAS,CAAC;YAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAAC,CAAC;IACnC,CAAC,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACvB,MAAM,UAAU,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WAC3D,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,IAAI,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YACjE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,4BAA4B,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;QAClG,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,qCAAqC,CAAE,CAAC;IAC9G,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAErE,CAAC;IACF,IAAI,SAAS,CAAC,aAAa,KAAK,8BAA8B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;WACjG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;6EAC6E;AAC7E,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAG/C;IACC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;WACnF,MAAM,CAAC,QAAQ,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACpG,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACjH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACvH,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/H,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,EAAE,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxE,IAAI,OAAkC,EAAE,UAA8B,CAAC;IACvE,IAAI,MAAM,GAAG,KAAK,EAAE,YAAY,GAAG,EAAE,EAAE,aAAa,GAAG,CAAC,EAAE,iBAAqC,CAAC;IAChG,MAAM,WAAW,GAAG,IAAI,4BAA4B,CAAC,EAAE,cAAc,EAAE,EAAE;QACvE,OAAO,CAAC,EAAE;YACR,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACrE,OAAO,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe;YACjC,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YACtE,uEAAuE;YACvE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBACtG,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,4BAA4B,EAAE,YAAY;QACnF,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACrG,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,KAAK,EAAE,CAAC;YACtD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,UAAU;gBAChF,cAAc,EAAE,CAAC,QAAQ,IAAI,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS;gBAC7F,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE;wBAChF,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ;wBAC9F,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc;qBAC3G,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAChB,CAAC,CAAC,EAAE,CAAC,CAAC;IACR,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,IAAI,GAAG,0BAA0B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;QACxE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;QACtF,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE;QAC7B,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO;YAAE,OAAO;QACpB,2EAA2E;QAC3E,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC1C,OAAO,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;gBAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC9D,UAAU,GAAG,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBACnE,MAAM,EAAE,CAAC;gBACT,IAAI,MAAM,GAAG;oBAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,CAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACpF,UAAU,GAAG,SAAS,CAAC;gBACvB,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,4EAA4E;IAC5E,MAAM,OAAO,GAAG,CAAC,MAAe,EAAE,EAAE;QAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,MAAM,IAAI,MAAM,KAAK,EAAE;gBAAE,SAAS;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtF,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpC,IAAI,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ;oBAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,KAAK,EAAE,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS;oBAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,QAAwB,EAAE,MAAc,EAAE,IAAa,EAAE,EAAE;QACvE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,wBAAwB,EAAE,SAAS,EAAE,CAAC,CAAC;QACrI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE;YAC9C,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC;QACF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,sCAAsC,CAAC,CAAC;QACtG,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;QAC3G,QAAQ,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvG,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,KAAK,KAAK;mBACzD,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,eAAe,CAAC,EAAE,CAAC;gBACrJ,OAAO,MAAM,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC;YAClE,CAAC;YACD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,8BAA8B,EAAE,KAAK,EAAE,8BAA8B,EAAE,eAAe;gBAC9G,sCAAsC,EAAE,MAAM,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC;eACnE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;YAChF,OAAO,MAAM,CAAC,GAAG,EAAE,4CAA4C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,MAAM,CAAC,GAAG,EAAE,qCAAqC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,KAAK,yBAAyB,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAAC,CAAC;QACrG,IAAI,OAAO,CAAC,GAAG,KAAK,uBAAuB,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC;gBAAE,OAAO,MAAM,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAC;YACrF,OAAO,EAAE,CAAC;YACV,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;YAC9F,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/C,QAAQ,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;YAAC,OAAO;QACrF,CAAC;QACD,MAAM,KAAK,GAAG,8DAA8D,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,sCAAsC,CAAC,CAAC;QACvE,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YAAC,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,MAAM,CAAC,GAAG,EAAE,qCAAqC,CAAC,CAAC;QAAC,CAAC;QAChH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,sCAAsC,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,cAAc;eAC9E,OAAO,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,MAAM,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACvE,IAAI,aAAa,GAAG,WAAW,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;QACjH,aAAa,IAAI,WAAW,CAAC;QAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,QAAQ,GAAG,IAAI,CAAC;YAAC,aAAa,IAAI,WAAW,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,yEAAyE;YACzE,2EAA2E;YAC3E,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtF,gBAAgB,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc;gBAC9G,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACnI,CAAC;QAAC,MAAM,CAAC;YAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/G,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK;QAC7F,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;QAC1D,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK;YACnD,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,2BAA2B,CAAC,EAAE,EAAE;KACrJ,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,KAAK,KAAK,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,KAAK,gBAAgB;mBACzF,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,qBAAqB,IAAI,KAAK,KAAK,4BAA4B;gBAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,iBAAiB,GAAG,oCAAoC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,IAAI,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAAC,CAAC;IACxI,YAAY,GAAG,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACpE,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAAC,QAAQ,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;YAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAAC,CAAC;QAC5I,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3B,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,IAAI,YAAuC,CAAC;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM;QAC7F,UAAU,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;QACxD,KAAK;YACH,OAAO,YAAY,KAAK,CAAC,KAAK,IAAI,EAAE;gBAClC,MAAM,GAAG,IAAI,CAAC;gBAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACjG,OAAO,CAAC,KAAK,EAAE,CAAC;gBAAC,KAAK,MAAM,QAAQ,IAAI,SAAS;oBAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;gBAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBACrF,MAAM,UAAU,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAClH,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAAC,MAAM,OAAO,CAAC;gBAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,UAAU,CAAC;YAClF,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}