@fodx/codelens 2.4.1 → 2.5.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.
@@ -0,0 +1,590 @@
1
+ import { createHash } from "node:crypto";
2
+ import { spawnSync } from "node:child_process";
3
+ import { closeSync, constants as fsConstants, existsSync, lstatSync, mkdtempSync, openSync, rmSync, statSync, writeSync } from "node:fs";
4
+ import { homedir, tmpdir } from "node:os";
5
+ import { basename, dirname, join, resolve } from "node:path";
6
+ import { openDb } from "../db/db.js";
7
+ import { detectScope } from "../git/scope.js";
8
+ import { indexFile } from "../index/fts.js";
9
+ import { getOrCreateIndex } from "../index/manager.js";
10
+ import { ensureFreshIndex } from "../index/reindex.js";
11
+ import { scanFiles } from "../index/scanner.js";
12
+ import { setPendingPaths } from "../index/staleness.js";
13
+ import { ctxImpact } from "../tools/impact.js";
14
+ import { ctxSearch } from "../tools/search.js";
15
+ import { isInsideRepo, resolveReal } from "../util/paths.js";
16
+ import { runRgBaseline } from "./baseline.js";
17
+ import { aggregateRuns, artifactPaths, evaluateObservation, writeEvalArtifacts } from "./report.js";
18
+ import { generateEvalTasks, seededShuffle } from "./tasks.js";
19
+ const LEXICAL_WEIGHTS = {
20
+ fts: 0.50,
21
+ symbol: 0.22,
22
+ graph: 0,
23
+ code: 0.05,
24
+ pathHit: 0.10,
25
+ exact: 0.13,
26
+ recency: 0,
27
+ };
28
+ const FTS_ONLY_WEIGHTS = {
29
+ fts: 1,
30
+ symbol: 0,
31
+ graph: 0,
32
+ code: 0,
33
+ pathHit: 0,
34
+ exact: 0,
35
+ recency: 0,
36
+ };
37
+ class EvalProgressTracker {
38
+ callback;
39
+ started;
40
+ activePhase = "initialization";
41
+ constructor(callback, started) {
42
+ this.callback = callback;
43
+ this.started = started;
44
+ }
45
+ start(phase, message, counts = {}) {
46
+ this.activePhase = phase;
47
+ this.emit({ phase, status: "start", message, ...counts });
48
+ }
49
+ update(phase, message, counts = {}) {
50
+ this.activePhase = phase;
51
+ this.emit({ phase, status: "progress", message, ...counts });
52
+ }
53
+ complete(phase, message, counts = {}) {
54
+ this.emit({ phase, status: "complete", message, ...counts });
55
+ }
56
+ skipped(phase, message, counts = {}) {
57
+ this.emit({ phase, status: "skipped", message, ...counts });
58
+ }
59
+ error(phase, message, counts = {}) {
60
+ this.activePhase = phase;
61
+ this.emit({ phase, status: "error", message, ...counts });
62
+ }
63
+ failure(error) {
64
+ const message = error instanceof Error ? error.message : String(error);
65
+ this.error(this.activePhase, message);
66
+ return new Error(`evaluation failed during ${this.activePhase}: ${message}`, { cause: error });
67
+ }
68
+ emit(event) {
69
+ try {
70
+ this.callback?.({ ...event, elapsedMs: performance.now() - this.started });
71
+ }
72
+ catch {
73
+ // Progress reporting must never break an evaluation.
74
+ }
75
+ }
76
+ }
77
+ export function defaultEvalOptions(repoRoot) {
78
+ return {
79
+ repoRoot,
80
+ taskLimit: 100,
81
+ seed: 42,
82
+ repeats: 1,
83
+ resultLimit: 10,
84
+ scales: [500, 2000, "all"],
85
+ quick: false,
86
+ freshness: true,
87
+ thresholds: {
88
+ minRecallAtK: 0.6,
89
+ minMrr: 0.5,
90
+ minSuccessRate: 0.7,
91
+ },
92
+ };
93
+ }
94
+ export function quickEvalOptions(repoRoot) {
95
+ return {
96
+ ...defaultEvalOptions(repoRoot),
97
+ taskLimit: 20,
98
+ scales: [500],
99
+ freshness: false,
100
+ quick: true,
101
+ };
102
+ }
103
+ export function runRepositoryEval(input) {
104
+ const started = performance.now();
105
+ const startedAt = new Date().toISOString();
106
+ const progress = new EvalProgressTracker(input.onProgress, started);
107
+ let temp;
108
+ try {
109
+ progress.start("repository", `Validating repository ${input.repoRoot}`);
110
+ const requestedRoot = resolveReal(input.repoRoot);
111
+ const scope = detectScope(requestedRoot);
112
+ if (!scope)
113
+ throw new Error(`not a Git repository: ${requestedRoot}`);
114
+ const repoRoot = scope.repoRoot;
115
+ const initialStatus = gitStatus(repoRoot);
116
+ progress.complete("repository", `Using ${repoRoot} at ${scope.headSha.slice(0, 12)} (${scope.dirtyFiles.length} dirty files)`);
117
+ progress.start("scan", "Scanning indexable repository files");
118
+ const scanned = scanFiles(repoRoot);
119
+ if (scanned.length === 0)
120
+ throw new Error(`no indexable files found: ${repoRoot}`);
121
+ progress.complete("scan", `Found ${scanned.length} indexable files`, { current: scanned.length, total: scanned.length });
122
+ progress.start("setup", "Preparing evaluation scales and output paths");
123
+ const outputDirectory = input.outputDir ? canonicalOutputPath(input.outputDir) : defaultOutputDirectory(repoRoot);
124
+ if (isInsideRepo(repoRoot, outputDirectory))
125
+ throw new Error("evaluation output must be outside the target repository");
126
+ const artifacts = artifactPaths(outputDirectory);
127
+ temp = mkdtempSync(join(tmpdir(), "codelens-eval-"));
128
+ const skipped = [];
129
+ const scaleSpecs = resolveScaleSpecs(input.scales, scanned.length);
130
+ const scales = [];
131
+ progress.complete("setup", `Prepared ${scaleSpecs.length} scale${scaleSpecs.length === 1 ? "" : "s"}: ${scaleSpecs.map((spec) => spec.label).join(", ")}`);
132
+ for (let scaleIndex = 0; scaleIndex < scaleSpecs.length; scaleIndex++) {
133
+ const spec = scaleSpecs[scaleIndex];
134
+ const scaleCounts = { scale: spec.label, current: scaleIndex + 1, total: scaleSpecs.length };
135
+ progress.start("scale", `Starting scale ${spec.label} with ${spec.count} files`, scaleCounts);
136
+ const selected = selectFiles(scanned, spec.count, input.seed + scaleIndex * 1009);
137
+ const dbPath = join(temp, `eval-${scaleIndex}.db`);
138
+ const db = openDb(dbPath);
139
+ try {
140
+ progress.start("index", `Indexing ${selected.length} files for scale ${spec.label}`, { scale: spec.label, current: 0, total: selected.length });
141
+ const indexStart = performance.now();
142
+ const build = buildSubsetIndex(db, scope, selected, (current, total) => {
143
+ progress.update("index", `Indexed ${current}/${total} files for scale ${spec.label}`, { scale: spec.label, current, total });
144
+ });
145
+ const indexMs = performance.now() - indexStart;
146
+ progress.complete("index", `Indexed ${build.indexedFiles} files and ${build.totalChunks} chunks for scale ${spec.label} in ${formatDuration(indexMs)} (${build.skipped} skipped)`, { scale: spec.label, current: selected.length, total: selected.length });
147
+ const inventory = selected.map((file) => file.path);
148
+ const scaleTaskLimit = distributedLimit(input.taskLimit, scaleSpecs.length, scaleIndex);
149
+ progress.start("tasks", `Generating up to ${scaleTaskLimit} tasks for scale ${spec.label}`, { scale: spec.label });
150
+ const tasks = generateEvalTasks(db, build.indexId, repoRoot, inventory, scaleTaskLimit, input.seed + scaleIndex * 7919);
151
+ progress.complete("tasks", `Generated ${tasks.length} tasks for scale ${spec.label}`, { scale: spec.label, current: tasks.length, total: scaleTaskLimit });
152
+ if (scaleTaskLimit === 0)
153
+ skipped.push(`${spec.label}: no tasks allocated because --tasks is lower than the number of scales.`);
154
+ for (const type of ["locate", "callers", "tests", "history"]) {
155
+ if (!tasks.some((task) => task.type === type))
156
+ skipped.push(`${spec.label}: no ${type} tasks were generated.`);
157
+ }
158
+ const expectedRuns = tasks.length * 4 * Math.max(1, input.repeats);
159
+ progress.start("retrieval", `Running ${expectedRuns} retrieval checks for scale ${spec.label}`, { scale: spec.label, current: 0, total: expectedRuns });
160
+ const runs = runTaskSet(db, repoRoot, tasks, input.repeats, input.resultLimit, (current, total) => {
161
+ progress.update("retrieval", `Completed ${current}/${total} retrieval checks for scale ${spec.label}`, { scale: spec.label, current, total });
162
+ });
163
+ progress.complete("retrieval", `Completed ${runs.length} retrieval checks for scale ${spec.label}`, { scale: spec.label, current: runs.length, total: expectedRuns });
164
+ if (runs.some((run) => run.arm === "rg" && run.error === "ripgrep is not installed")) {
165
+ skipped.push("rg baseline unavailable because ripgrep is not installed.");
166
+ progress.skipped("retrieval", "rg baseline unavailable because ripgrep is not installed", { scale: spec.label });
167
+ }
168
+ const aggregates = aggregateByArm(runs);
169
+ scales.push({
170
+ label: spec.label,
171
+ requestedFiles: spec.requested,
172
+ indexedFiles: build.indexedFiles,
173
+ totalChunks: build.totalChunks,
174
+ skippedFiles: build.skipped,
175
+ indexMs,
176
+ dbBytes: databaseBytes(dbPath),
177
+ tasks,
178
+ runs,
179
+ aggregates,
180
+ });
181
+ progress.complete("scale", `Finished scale ${spec.label}: ${formatAggregateSummary(aggregates.full)}`, scaleCounts);
182
+ }
183
+ finally {
184
+ db.close();
185
+ }
186
+ }
187
+ let freshness;
188
+ if (input.freshness) {
189
+ progress.start("freshness", "Starting detached-worktree edit/delete freshness probe");
190
+ freshness = runFreshnessEval(repoRoot, input.seed, progress);
191
+ const freshnessMessage = freshness.attempted
192
+ ? `Freshness probe ${freshness.passed ? "passed" : "failed"} in ${formatDuration(freshness.elapsedMs ?? 0)}`
193
+ : `Freshness probe skipped: ${freshness.skippedReason ?? "not attempted"}`;
194
+ if (freshness.attempted && freshness.passed)
195
+ progress.complete("freshness", freshnessMessage);
196
+ else if (freshness.attempted)
197
+ progress.error("freshness", freshnessMessage);
198
+ else
199
+ progress.skipped("freshness", freshnessMessage);
200
+ }
201
+ else {
202
+ freshness = disabledFreshness();
203
+ progress.skipped("freshness", "Freshness probe disabled");
204
+ }
205
+ if (freshness.skippedReason)
206
+ skipped.push(`freshness: ${freshness.skippedReason}`);
207
+ progress.start("thresholds", "Checking configured quality thresholds");
208
+ const thresholdFailures = scales.flatMap((scale) => thresholdFailuresFor(scale, input));
209
+ if (input.freshness && freshness.attempted && !freshness.passed)
210
+ thresholdFailures.push("Freshness edit/delete probe failed.");
211
+ if (initialStatus !== gitStatus(repoRoot))
212
+ thresholdFailures.push("Target repository worktree changed during evaluation.");
213
+ progress.complete("thresholds", thresholdFailures.length === 0 ? "All configured thresholds passed" : `${thresholdFailures.length} configured threshold${thresholdFailures.length === 1 ? "" : "s"} failed`);
214
+ const completedAt = new Date().toISOString();
215
+ const result = {
216
+ version: 1,
217
+ repository: {
218
+ root: repoRoot,
219
+ branch: scope.branch,
220
+ headSha: scope.headSha,
221
+ dirtyFiles: scope.dirtyFiles.length,
222
+ totalFiles: scanned.length,
223
+ },
224
+ options: {
225
+ taskLimit: input.taskLimit,
226
+ seed: input.seed,
227
+ repeats: input.repeats,
228
+ resultLimit: input.resultLimit,
229
+ scales: input.scales,
230
+ quick: input.quick,
231
+ freshness: input.freshness,
232
+ thresholds: input.thresholds,
233
+ },
234
+ startedAt,
235
+ completedAt,
236
+ durationMs: performance.now() - started,
237
+ pass: scales.some((scale) => scale.tasks.length > 0) && thresholdFailures.length === 0,
238
+ thresholdFailures,
239
+ skipped: [...new Set(skipped)],
240
+ scales,
241
+ freshness,
242
+ artifacts,
243
+ };
244
+ progress.start("reports", `Writing evaluation artifacts to ${artifacts.directory}`);
245
+ writeEvalArtifacts(result);
246
+ progress.complete("reports", `Wrote results.json, report.md, and tasks.json to ${artifacts.directory}`);
247
+ progress.start("cleanup", "Removing temporary evaluation databases");
248
+ rmSync(temp, { recursive: true, force: true });
249
+ temp = undefined;
250
+ progress.complete("cleanup", "Removed temporary evaluation databases");
251
+ progress.complete("evaluation", `Evaluation ${result.pass ? "passed" : "failed thresholds"} in ${formatDuration(performance.now() - started)}`);
252
+ return result;
253
+ }
254
+ catch (error) {
255
+ throw progress.failure(error);
256
+ }
257
+ finally {
258
+ if (temp) {
259
+ progress.start("cleanup", "Removing temporary evaluation databases");
260
+ try {
261
+ rmSync(temp, { recursive: true, force: true });
262
+ progress.complete("cleanup", "Removed temporary evaluation databases");
263
+ }
264
+ catch (error) {
265
+ progress.error("cleanup", error instanceof Error ? error.message : String(error));
266
+ }
267
+ }
268
+ }
269
+ }
270
+ function buildSubsetIndex(db, scope, files, onProgress) {
271
+ const indexId = getOrCreateIndex(db, scope).id;
272
+ const knownFiles = new Set(files.map((file) => file.path));
273
+ let indexedFiles = 0;
274
+ let totalChunks = 0;
275
+ let skipped = 0;
276
+ const progressInterval = Math.max(1, Math.ceil(files.length / 20));
277
+ for (let index = 0; index < files.length; index++) {
278
+ const file = files[index];
279
+ try {
280
+ const indexed = indexFile(db, indexId, scope.repoRoot, file, knownFiles);
281
+ indexedFiles++;
282
+ totalChunks += indexed.chunkCount;
283
+ }
284
+ catch {
285
+ skipped++;
286
+ }
287
+ const current = index + 1;
288
+ if (current === files.length || current % progressInterval === 0)
289
+ onProgress?.(current, files.length);
290
+ }
291
+ setPendingPaths(indexId, []);
292
+ return { indexId, indexedFiles, totalChunks, skipped };
293
+ }
294
+ function runTaskSet(db, repoRoot, tasks, repeats, limit, onProgress) {
295
+ const runs = [];
296
+ const arms = ["full", "lexical", "fts", "rg"];
297
+ const total = tasks.length * arms.length * Math.max(1, repeats);
298
+ const progressInterval = Math.max(1, Math.ceil(total / 20));
299
+ for (let repeat = 0; repeat < Math.max(1, repeats); repeat++) {
300
+ for (const task of tasks) {
301
+ for (const arm of arms) {
302
+ const observation = arm === "rg"
303
+ ? runRgBaseline(repoRoot, task, limit)
304
+ : runCodeLens(db, task, limit, arm);
305
+ runs.push(evaluateObservation(task, arm, observation, limit));
306
+ if (runs.length === total || runs.length % progressInterval === 0)
307
+ onProgress?.(runs.length, total);
308
+ }
309
+ }
310
+ }
311
+ return runs;
312
+ }
313
+ function runCodeLens(db, task, limit, arm) {
314
+ const start = performance.now();
315
+ try {
316
+ let result;
317
+ let foundPaths;
318
+ if (arm === "full" && (task.type === "callers" || task.type === "tests") && task.sourcePath) {
319
+ result = ctxImpact(db, { path: task.sourcePath, depth: 2 });
320
+ const impact = result;
321
+ foundPaths = [
322
+ ...(task.type === "tests" ? (impact.affectedTests ?? []).map((item) => item.path) : []),
323
+ ...(impact.callers ?? []).map((item) => item.path),
324
+ ...(impact.affectedFiles ?? []).map((item) => item.path),
325
+ impact.target?.path,
326
+ ].filter((path) => !!path);
327
+ }
328
+ else {
329
+ const weights = arm === "lexical" ? LEXICAL_WEIGHTS : arm === "fts" ? FTS_ONLY_WEIGHTS : undefined;
330
+ result = ctxSearch(db, task.query, { limit, snippet: "none", weights });
331
+ foundPaths = result.results.map((item) => item.path);
332
+ }
333
+ foundPaths = [...new Set(foundPaths)].slice(0, limit);
334
+ return {
335
+ foundPaths,
336
+ toolCalls: 1,
337
+ bytesServed: Buffer.byteLength(JSON.stringify(result)),
338
+ bytesRead: 0,
339
+ elapsedMs: performance.now() - start,
340
+ };
341
+ }
342
+ catch (error) {
343
+ return {
344
+ foundPaths: [],
345
+ toolCalls: 1,
346
+ bytesServed: 0,
347
+ bytesRead: 0,
348
+ elapsedMs: performance.now() - start,
349
+ error: error instanceof Error ? error.message : String(error),
350
+ };
351
+ }
352
+ }
353
+ function runFreshnessEval(repoRoot, seed, progress) {
354
+ const start = performance.now();
355
+ const temp = resolveReal(mkdtempSync(join(tmpdir(), "codelens-eval-worktree-")));
356
+ const worktree = join(temp, "repo");
357
+ let db = null;
358
+ let worktreeAdded = false;
359
+ try {
360
+ progress.start("freshness-worktree", "Creating detached temporary worktree");
361
+ const added = spawnSync("git", ["worktree", "add", "--detach", "--quiet", worktree, "HEAD"], { cwd: repoRoot, encoding: "utf-8" });
362
+ if (added.status !== 0) {
363
+ const skippedReason = (added.stderr ?? "").trim() || "could not create temporary worktree";
364
+ progress.skipped("freshness-worktree", skippedReason);
365
+ return { enabled: true, attempted: false, passed: false, skippedReason };
366
+ }
367
+ worktreeAdded = true;
368
+ progress.complete("freshness-worktree", `Created detached worktree at ${worktree}`);
369
+ const scope = detectScope(worktree);
370
+ if (!scope) {
371
+ progress.skipped("freshness-worktree", "Temporary worktree scope detection failed");
372
+ return { enabled: true, attempted: false, passed: false, skippedReason: "temporary worktree scope detection failed" };
373
+ }
374
+ progress.start("freshness-scan", "Scanning temporary worktree for a safe probe file");
375
+ const scanned = scanFiles(worktree);
376
+ const candidates = seededShuffle(scanned.filter(isFreshnessCandidate), seed);
377
+ const selected = candidates.map((file) => ({ file, path: safeFreshnessPath(worktree, file) })).find((item) => item.path !== null);
378
+ if (!selected?.path) {
379
+ progress.skipped("freshness-scan", "No safe regular text file for freshness probe");
380
+ return { enabled: true, attempted: false, passed: false, skippedReason: "no safe regular text file for freshness probe" };
381
+ }
382
+ progress.complete("freshness-scan", `Selected ${selected.file.path} from ${scanned.length} files`);
383
+ db = openDb(join(temp, "freshness.db"));
384
+ progress.start("freshness-index", `Building freshness index for ${scanned.length} files`, { current: 0, total: scanned.length });
385
+ const build = buildSubsetIndex(db, scope, scanned, (current, total) => {
386
+ progress.update("freshness-index", `Indexed ${current}/${total} freshness files`, { current, total });
387
+ });
388
+ progress.complete("freshness-index", `Built freshness index with ${build.indexedFiles} files and ${build.totalChunks} chunks`, { current: scanned.length, total: scanned.length });
389
+ const token = `codelensfreshnessprobe${createHash("sha256").update(`${repoRoot}\0${seed}`).digest("hex").slice(0, 12)}`;
390
+ progress.start("freshness-edit", `Appending probe token to ${selected.file.path}`);
391
+ appendFreshnessProbe(selected.path, freshnessComment(selected.file.language, token));
392
+ ensureFreshIndex(db, scope, { budgetMs: 30000 });
393
+ const modifiedVisible = ctxSearch(db, token, { snippet: "none" }).results.some((result) => result.path === selected.file.path);
394
+ progress.complete("freshness-edit", `Modified content ${modifiedVisible ? "became visible" : "was not found"}`);
395
+ progress.start("freshness-delete", `Deleting probe file ${selected.file.path} in the temporary worktree`);
396
+ rmSync(selected.path, { force: true });
397
+ ensureFreshIndex(db, scope, { budgetMs: 30000 });
398
+ const deletedRemoved = !ctxSearch(db, token, { snippet: "none" }).results.some((result) => result.path === selected.file.path);
399
+ progress.complete("freshness-delete", `Deleted content ${deletedRemoved ? "was removed" : "remained searchable"}`);
400
+ return {
401
+ enabled: true,
402
+ attempted: true,
403
+ passed: modifiedVisible && deletedRemoved,
404
+ modifiedVisible,
405
+ deletedRemoved,
406
+ elapsedMs: performance.now() - start,
407
+ };
408
+ }
409
+ catch (error) {
410
+ const message = error instanceof Error ? error.message : String(error);
411
+ progress.error("freshness", message);
412
+ return {
413
+ enabled: true,
414
+ attempted: true,
415
+ passed: false,
416
+ elapsedMs: performance.now() - start,
417
+ error: message,
418
+ };
419
+ }
420
+ finally {
421
+ progress.start("freshness-cleanup", "Removing temporary worktree and Git metadata");
422
+ try {
423
+ db?.close();
424
+ }
425
+ catch { /* cleanup verification below catches remaining state */ }
426
+ cleanupTemporaryWorktree(repoRoot, temp, worktree, worktreeAdded);
427
+ progress.complete("freshness-cleanup", "Removed temporary worktree and Git metadata");
428
+ }
429
+ }
430
+ function appendFreshnessProbe(path, content) {
431
+ const fd = openSync(path, fsConstants.O_WRONLY | fsConstants.O_APPEND | fsConstants.O_NOFOLLOW);
432
+ try {
433
+ writeSync(fd, content);
434
+ }
435
+ finally {
436
+ closeSync(fd);
437
+ }
438
+ }
439
+ function safeFreshnessPath(worktree, file) {
440
+ const path = join(worktree, file.path);
441
+ try {
442
+ const stat = lstatSync(path);
443
+ if (!stat.isFile() || stat.isSymbolicLink())
444
+ return null;
445
+ const resolved = resolveReal(path);
446
+ return isInsideRepo(worktree, resolved) ? resolved : null;
447
+ }
448
+ catch {
449
+ return null;
450
+ }
451
+ }
452
+ function cleanupTemporaryWorktree(repoRoot, temp, worktree, worktreeAdded) {
453
+ let removalFailure;
454
+ if (worktreeAdded) {
455
+ const removed = spawnSync("git", ["worktree", "remove", "--force", worktree], { cwd: repoRoot, encoding: "utf-8" });
456
+ if (removed.error || removed.status !== 0)
457
+ removalFailure = removed.error?.message ?? ((removed.stderr ?? "").trim() || `exit ${removed.status}`);
458
+ }
459
+ let tempFailure;
460
+ try {
461
+ rmSync(temp, { recursive: true, force: true });
462
+ }
463
+ catch (error) {
464
+ tempFailure = error instanceof Error ? error.message : String(error);
465
+ }
466
+ if (!worktreeAdded) {
467
+ if (tempFailure)
468
+ throw new Error(`failed to remove evaluation temp directory: ${tempFailure}`);
469
+ return;
470
+ }
471
+ const pruned = spawnSync("git", ["worktree", "prune", "--expire", "now"], { cwd: repoRoot, encoding: "utf-8" });
472
+ if (pruned.error || pruned.status !== 0) {
473
+ throw new Error(`failed to prune temporary worktree metadata: ${pruned.error?.message ?? (pruned.stderr ?? "").trim()}`);
474
+ }
475
+ const listed = spawnSync("git", ["worktree", "list", "--porcelain"], { cwd: repoRoot, encoding: "utf-8" });
476
+ if (listed.error || listed.status !== 0)
477
+ throw new Error(`failed to verify temporary worktree cleanup: ${listed.error?.message ?? "git worktree list failed"}`);
478
+ if ((listed.stdout ?? "").split(/\r?\n/).includes(`worktree ${worktree}`)) {
479
+ throw new Error(`temporary worktree metadata remains registered${removalFailure ? ` after removal failed (${removalFailure})` : ""}: ${worktree}`);
480
+ }
481
+ if (tempFailure)
482
+ throw new Error(`failed to remove evaluation temp directory: ${tempFailure}`);
483
+ }
484
+ function resolveScaleSpecs(scales, total) {
485
+ const resolved = [];
486
+ const seenCounts = new Set();
487
+ const requestedScales = scales.length > 0 ? scales : ["all"];
488
+ for (const scale of requestedScales) {
489
+ const count = scale === "all" ? total : Math.max(1, Math.min(total, Math.floor(scale)));
490
+ if (seenCounts.has(count))
491
+ continue;
492
+ seenCounts.add(count);
493
+ resolved.push({ label: count === total ? "all" : String(count), requested: scale, count });
494
+ }
495
+ if (resolved.length === 0)
496
+ resolved.push({ label: "all", requested: "all", count: total });
497
+ return resolved;
498
+ }
499
+ function selectFiles(files, count, seed) {
500
+ if (count >= files.length)
501
+ return [...files].sort((a, b) => a.path.localeCompare(b.path));
502
+ return seededShuffle(files, seed).slice(0, count).sort((a, b) => a.path.localeCompare(b.path));
503
+ }
504
+ function aggregateByArm(runs) {
505
+ const output = {};
506
+ for (const arm of ["full", "lexical", "fts", "rg"]) {
507
+ const armRuns = runs.filter((run) => run.arm === arm);
508
+ if (armRuns.length > 0)
509
+ output[arm] = aggregateRuns(armRuns);
510
+ }
511
+ return output;
512
+ }
513
+ function thresholdFailuresFor(scale, options) {
514
+ if (scale.tasks.length === 0)
515
+ return [];
516
+ const metric = scale.aggregates.full;
517
+ if (!metric)
518
+ return [`${scale.label}: full CodeLens arm produced no metrics.`];
519
+ const failures = [];
520
+ if (metric.recallAtK < options.thresholds.minRecallAtK)
521
+ failures.push(`${scale.label}: full recall@${options.resultLimit} ${metric.recallAtK.toFixed(3)} < ${options.thresholds.minRecallAtK.toFixed(3)}`);
522
+ if (metric.mrr < options.thresholds.minMrr)
523
+ failures.push(`${scale.label}: full MRR ${metric.mrr.toFixed(3)} < ${options.thresholds.minMrr.toFixed(3)}`);
524
+ if (metric.successRate < options.thresholds.minSuccessRate)
525
+ failures.push(`${scale.label}: full success rate ${metric.successRate.toFixed(3)} < ${options.thresholds.minSuccessRate.toFixed(3)}`);
526
+ return failures;
527
+ }
528
+ function distributedLimit(total, count, index) {
529
+ const base = Math.floor(total / count);
530
+ return base + (index < total % count ? 1 : 0);
531
+ }
532
+ function isFreshnessCandidate(file) {
533
+ if (!file.language || file.size > 512 * 1024)
534
+ return false;
535
+ const base = basename(file.path).toLowerCase();
536
+ return !base.includes("lock") && !/(^|\/)(test|tests|__tests__)(\/|$)/i.test(file.path) && !/\.(test|spec)\./i.test(base);
537
+ }
538
+ function freshnessComment(language, token) {
539
+ if (language === "python" || language === "ruby" || language === "bash")
540
+ return `\n# ${token}\n`;
541
+ if (language === "markdown")
542
+ return `\n<!-- ${token} -->\n`;
543
+ return `\n// ${token}\n`;
544
+ }
545
+ function disabledFreshness() {
546
+ return { enabled: false, attempted: false, passed: true };
547
+ }
548
+ function databaseBytes(path) {
549
+ try {
550
+ return statSync(path).size;
551
+ }
552
+ catch {
553
+ return 0;
554
+ }
555
+ }
556
+ function canonicalOutputPath(path) {
557
+ let current = resolve(path);
558
+ const missing = [];
559
+ while (!existsSync(current)) {
560
+ const parent = dirname(current);
561
+ if (parent === current)
562
+ break;
563
+ missing.unshift(basename(current));
564
+ current = parent;
565
+ }
566
+ return join(resolveReal(current), ...missing);
567
+ }
568
+ function defaultOutputDirectory(repoRoot) {
569
+ const id = createHash("sha256").update(repoRoot).digest("hex").slice(0, 12);
570
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
571
+ return join(homedir(), ".codelens", "evals", id, stamp);
572
+ }
573
+ function formatDuration(elapsedMs) {
574
+ if (elapsedMs < 1000)
575
+ return `${elapsedMs.toFixed(0)}ms`;
576
+ if (elapsedMs < 60_000)
577
+ return `${(elapsedMs / 1000).toFixed(1)}s`;
578
+ const minutes = Math.floor(elapsedMs / 60_000);
579
+ return `${minutes}m ${((elapsedMs % 60_000) / 1000).toFixed(0)}s`;
580
+ }
581
+ function formatAggregateSummary(metric) {
582
+ if (!metric)
583
+ return "full arm produced no metrics";
584
+ return `full recall ${(metric.recallAtK * 100).toFixed(1)}%, MRR ${metric.mrr.toFixed(3)}, success ${(metric.successRate * 100).toFixed(1)}%`;
585
+ }
586
+ function gitStatus(repoRoot) {
587
+ const result = spawnSync("git", ["status", "--porcelain=v1", "-z"], { cwd: repoRoot, encoding: "utf-8" });
588
+ return result.status === 0 ? result.stdout ?? "" : "";
589
+ }
590
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/eval/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzI,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAiB,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAsB,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAc9D,MAAM,eAAe,GAAkB;IACrC,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,CAAC;CACX,CAAC;AACF,MAAM,gBAAgB,GAAkB;IACtC,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;CACX,CAAC;AAQF,MAAM,mBAAmB;IAIJ;IACA;IAJX,WAAW,GAAG,gBAAgB,CAAC;IAEvC,YACmB,QAA0C,EAC1C,OAAe;QADf,aAAQ,GAAR,QAAQ,CAAkC;QAC1C,YAAO,GAAP,OAAO,CAAQ;IAC/B,CAAC;IAEJ,KAAK,CAAC,KAAa,EAAE,OAAe,EAAE,SAAyB,EAAE;QAC/D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,OAAe,EAAE,SAAyB,EAAE;QAChE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,QAAQ,CAAC,KAAa,EAAE,OAAe,EAAE,SAAyB,EAAE;QAClE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,OAAe,EAAE,SAAyB,EAAE;QACjE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,KAAa,EAAE,OAAe,EAAE,SAAyB,EAAE;QAC/D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,KAAc;QACpB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,WAAW,KAAK,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjG,CAAC;IAEO,IAAI,CAAC,KAA2C;QACtD,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,GAAG;QACd,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC;QAC1B,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,IAAI;QACf,UAAU,EAAE;YACV,YAAY,EAAE,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,cAAc,EAAE,GAAG;SACpB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO;QACL,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QAC/B,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,CAAC,GAAG,CAAC;QACb,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACpE,IAAI,IAAwB,CAAC;IAE7B,IAAI,CAAC;QACH,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,yBAAyB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,aAAa,EAAE,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,QAAQ,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC;QAE/H,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,qCAAqC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QACnF,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,MAAM,kBAAkB,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEzH,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,8CAA8C,CAAC,CAAC;QACxE,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAClH,IAAI,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACxH,MAAM,SAAS,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,UAAU,CAAC,MAAM,SAAS,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE3J,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAE,CAAC;YACrC,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;YAC7F,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC9F,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,UAAU,KAAK,CAAC,CAAC;YACnD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,QAAQ,CAAC,MAAM,oBAAoB,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAChJ,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;oBACrE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,OAAO,IAAI,KAAK,oBAAoB,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/H,CAAC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;gBAC/C,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,KAAK,CAAC,YAAY,cAAc,KAAK,CAAC,WAAW,qBAAqB,IAAI,CAAC,KAAK,OAAO,cAAc,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,OAAO,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAE5P,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBACxF,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,oBAAoB,cAAc,oBAAoB,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnH,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC;gBACxH,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,KAAK,CAAC,MAAM,oBAAoB,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC3J,IAAI,cAAc,KAAK,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,0EAA0E,CAAC,CAAC;gBAChI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAU,EAAE,CAAC;oBACtE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;wBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,QAAQ,IAAI,wBAAwB,CAAC,CAAC;gBACjH,CAAC;gBAED,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,YAAY,+BAA+B,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;gBACxJ,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;oBAChG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,OAAO,IAAI,KAAK,+BAA+B,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChJ,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,IAAI,CAAC,MAAM,+BAA+B,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;gBACtK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,0BAA0B,CAAC,EAAE,CAAC;oBACrF,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;oBAC1E,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,0DAA0D,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnH,CAAC;gBACD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,cAAc,EAAE,IAAI,CAAC,SAAS;oBAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,YAAY,EAAE,KAAK,CAAC,OAAO;oBAC3B,OAAO;oBACP,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;oBAC9B,KAAK;oBACL,IAAI;oBACJ,UAAU;iBACX,CAAC,CAAC;gBACH,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,IAAI,CAAC,KAAK,KAAK,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACtH,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,SAA8B,CAAC;QACnC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,wDAAwD,CAAC,CAAC;YACtF,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7D,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS;gBAC1C,CAAC,CAAC,mBAAmB,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,OAAO,cAAc,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE;gBAC5G,CAAC,CAAC,4BAA4B,SAAS,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC;YAC7E,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM;gBAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;iBACzF,IAAI,SAAS,CAAC,SAAS;gBAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;;gBACvE,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,iBAAiB,EAAE,CAAC;YAChC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,SAAS,CAAC,aAAa;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;QAEnF,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,wCAAwC,CAAC,CAAC;QACvE,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACxF,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,iBAAiB,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC/H,IAAI,aAAa,KAAK,SAAS,CAAC,QAAQ,CAAC;YAAE,iBAAiB,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC3H,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,wBAAwB,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAE7M,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAe;YACzB,OAAO,EAAE,CAAC;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;gBACnC,UAAU,EAAE,OAAO,CAAC,MAAM;aAC3B;YACD,OAAO,EAAE;gBACP,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B;YACD,SAAS;YACT,WAAW;YACX,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO;YACvC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;YACtF,iBAAiB;YACjB,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM;YACN,SAAS;YACT,SAAS;SACV,CAAC;QAEF,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,mCAAmC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;QACpF,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,oDAAoD,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;QACxG,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,yCAAyC,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,GAAG,SAAS,CAAC;QACjB,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;QACvE,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,OAAO,cAAc,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAChJ,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,yCAAyC,CAAC,CAAC;YACrE,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,EAAqB,EACrB,KAAe,EACf,KAAoB,EACpB,UAAqD;IAErD,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;IACnE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACzE,YAAY,EAAE,CAAC;YACf,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,CAAC,MAAM,IAAI,OAAO,GAAG,gBAAgB,KAAK,CAAC;YAAE,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxG,CAAC;IACD,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CACjB,EAAqB,EACrB,QAAgB,EAChB,KAAiB,EACjB,OAAe,EACf,KAAa,EACb,UAAqD;IAErD,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5D,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,GAAG,KAAK,IAAI;oBAC9B,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC;oBACtC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,gBAAgB,KAAK,CAAC;oBAAE,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAClB,EAAqB,EACrB,IAAc,EACd,KAAa,EACb,GAA+B;IAE/B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,MAAe,CAAC;QACpB,IAAI,UAAoB,CAAC;QACzB,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5F,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,MAKd,CAAC;YACF,UAAU,GAAG;gBACX,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvF,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClD,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxD,MAAM,CAAC,MAAM,EAAE,IAAI;aACpB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;YACnG,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACxE,UAAU,GAAI,MAA+C,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjG,CAAC;QACD,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO;YACL,UAAU;YACV,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtD,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK;SACrC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK;YACpC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,IAAY,EAAE,QAA6B;IACrF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,EAAE,GAA6B,IAAI,CAAC;IACxC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,QAAQ,CAAC,KAAK,CAAC,oBAAoB,EAAE,sCAAsC,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACnI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,qCAAqC,CAAC;YAC3F,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAC3E,CAAC;QACD,aAAa,GAAG,IAAI,CAAC;QACrB,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QAEpF,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,2CAA2C,CAAC,CAAC;YACpF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,2CAA2C,EAAE,CAAC;QACxH,CAAC;QAED,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,mDAAmD,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAClI,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,+CAA+C,CAAC,CAAC;YACpF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,+CAA+C,EAAE,CAAC;QAC5H,CAAC;QACD,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,YAAY,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEnG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,gCAAgC,OAAO,CAAC,MAAM,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjI,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YACpE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,WAAW,OAAO,IAAI,KAAK,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxG,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,EAAE,8BAA8B,KAAK,CAAC,YAAY,cAAc,KAAK,CAAC,WAAW,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEnL,MAAM,KAAK,GAAG,yBAAyB,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACxH,QAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,4BAA4B,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACrF,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,MAAM,eAAe,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/H,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAEhH,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,uBAAuB,QAAQ,CAAC,IAAI,CAAC,IAAI,4BAA4B,CAAC,CAAC;QAC1G,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/H,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,EAAE,mBAAmB,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,eAAe,IAAI,cAAc;YACzC,eAAe;YACf,cAAc;YACd,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK;SACrC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK;YACpC,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE,8CAA8C,CAAC,CAAC;QACpF,IAAI,CAAC;YAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wDAAwD,CAAC,CAAC;QACvF,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAClE,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EAAE,6CAA6C,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,OAAe;IACzD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAChG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,IAAiB;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,IAAI,CAAC;QACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAgB,EAAE,IAAY,EAAE,QAAgB,EAAE,aAAsB;IACxG,IAAI,cAAkC,CAAC;IACvC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACpH,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpJ,CAAC;IACD,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,WAAW,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAC/I,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,IAAI,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,WAAW,EAAE,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAChH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3H,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3G,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,0BAA0B,EAAE,CAAC,CAAC;IAChK,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,iDAAiD,cAAc,CAAC,CAAC,CAAC,0BAA0B,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC,CAAC;IACrJ,CAAC;IACD,IAAI,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,WAAW,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,iBAAiB,CAAC,MAA6B,EAAE,KAAa;IACrE,MAAM,QAAQ,GAAuE,EAAE,CAAC;IACxF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,eAAe,GAA0B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpF,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB,EAAE,KAAa,EAAE,IAAY;IACpE,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1F,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,cAAc,CAAC,IAAmB;IACzC,MAAM,MAAM,GAAmE,EAAE,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAkB,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAsB,EAAE,OAAoB;IACxE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,0CAA0C,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,iBAAiB,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3M,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,cAAc,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzJ,IAAI,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,uBAAuB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClM,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACvC,OAAO,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAiB;IAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5H,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAuB,EAAE,KAAa;IAC9D,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,OAAO,KAAK,IAAI,CAAC;IACjG,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,UAAU,KAAK,QAAQ,CAAC;IAC5D,OAAO,QAAQ,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;AACzD,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM;QAC9B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACnC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,IAAI,SAAS,GAAG,IAAI;QAAE,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,IAAI,SAAS,GAAG,MAAM;QAAE,OAAO,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;IAC/C,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACpE,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA6C;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,8BAA8B,CAAC;IACnD,OAAO,eAAe,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAChJ,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1G,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC"}