@slicenfer/project-memory-runtime-core 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +12 -0
  3. package/dist/activation/engine.d.ts +27 -0
  4. package/dist/activation/engine.d.ts.map +1 -0
  5. package/dist/activation/engine.js +294 -0
  6. package/dist/activation/engine.js.map +1 -0
  7. package/dist/checkpoints.d.ts +12 -0
  8. package/dist/checkpoints.d.ts.map +1 -0
  9. package/dist/checkpoints.js +94 -0
  10. package/dist/checkpoints.js.map +1 -0
  11. package/dist/compiler/deterministic.d.ts +7 -0
  12. package/dist/compiler/deterministic.d.ts.map +1 -0
  13. package/dist/compiler/deterministic.js +385 -0
  14. package/dist/compiler/deterministic.js.map +1 -0
  15. package/dist/index.d.ts +4 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +4 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/ingestion/service.d.ts +7 -0
  20. package/dist/ingestion/service.d.ts.map +1 -0
  21. package/dist/ingestion/service.js +5 -0
  22. package/dist/ingestion/service.js.map +1 -0
  23. package/dist/recall/packet.d.ts +13 -0
  24. package/dist/recall/packet.d.ts.map +1 -0
  25. package/dist/recall/packet.js +155 -0
  26. package/dist/recall/packet.js.map +1 -0
  27. package/dist/runtime.d.ts +53 -0
  28. package/dist/runtime.d.ts.map +1 -0
  29. package/dist/runtime.js +708 -0
  30. package/dist/runtime.js.map +1 -0
  31. package/dist/scope.d.ts +6 -0
  32. package/dist/scope.d.ts.map +1 -0
  33. package/dist/scope.js +50 -0
  34. package/dist/scope.js.map +1 -0
  35. package/dist/storage/migrations/001_init.sql +113 -0
  36. package/dist/storage/migrations/002_constraints.sql +148 -0
  37. package/dist/storage/migrations/003_event_provenance.sql +36 -0
  38. package/dist/storage/migrations/004_event_capture_path.sql +37 -0
  39. package/dist/storage/migrations/005_activation_indices.sql +15 -0
  40. package/dist/storage/migrations/006_session_checkpoints.sql +54 -0
  41. package/dist/storage/migrations.d.ts +6 -0
  42. package/dist/storage/migrations.d.ts.map +1 -0
  43. package/dist/storage/migrations.js +19 -0
  44. package/dist/storage/migrations.js.map +1 -0
  45. package/dist/storage/sqlite.d.ts +36 -0
  46. package/dist/storage/sqlite.d.ts.map +1 -0
  47. package/dist/storage/sqlite.js +601 -0
  48. package/dist/storage/sqlite.js.map +1 -0
  49. package/dist/types.d.ts +294 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +36 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/utils.d.ts +16 -0
  54. package/dist/utils.d.ts.map +1 -0
  55. package/dist/utils.js +36 -0
  56. package/dist/utils.js.map +1 -0
  57. package/dist/validation.d.ts +24 -0
  58. package/dist/validation.d.ts.map +1 -0
  59. package/dist/validation.js +323 -0
  60. package/dist/validation.js.map +1 -0
  61. package/package.json +52 -0
@@ -0,0 +1,601 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import Database from "better-sqlite3";
4
+ import { normalizeClaimScope, singletonScopeCompatible } from "../scope.js";
5
+ import { validateClaimRecord, validateEventRecord, validateOutcomeRecord, assertClaimTransitionAllowed, validateSessionCheckpointRecord, } from "../validation.js";
6
+ import { loadSqlMigrations } from "./migrations.js";
7
+ import { nowIso } from "../utils.js";
8
+ function serializeJson(value) {
9
+ if (value === undefined)
10
+ return null;
11
+ return JSON.stringify(value);
12
+ }
13
+ const BUSY_TIMEOUT_MS = 5000;
14
+ const BUSY_RETRY_MAX = 5;
15
+ const BUSY_RETRY_BASE_DELAY_MS = 50;
16
+ /** Shared buffer for Atomics.wait-based synchronous sleep (non-spinning). */
17
+ const SLEEP_BUFFER = new Int32Array(new SharedArrayBuffer(4));
18
+ function withBusyRetry(fn, maxRetries = BUSY_RETRY_MAX) {
19
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
20
+ try {
21
+ return fn();
22
+ }
23
+ catch (error) {
24
+ const message = error instanceof Error ? error.message : String(error);
25
+ const isBusy = message.includes("SQLITE_BUSY") || message.includes("database is locked");
26
+ if (!isBusy || attempt === maxRetries)
27
+ throw error;
28
+ // Exponential backoff with jitter — non-spinning synchronous sleep
29
+ const delay = BUSY_RETRY_BASE_DELAY_MS * Math.pow(2, attempt) * (0.5 + Math.random() * 0.5);
30
+ Atomics.wait(SLEEP_BUFFER, 0, 0, Math.ceil(delay));
31
+ }
32
+ }
33
+ // Unreachable, but satisfies TS
34
+ throw new Error("withBusyRetry: exhausted retries");
35
+ }
36
+ function nullable(value) {
37
+ return value ?? null;
38
+ }
39
+ function ensureDir(dirPath) {
40
+ fs.mkdirSync(dirPath, { recursive: true });
41
+ }
42
+ export function resolveRuntimePaths(config = {}) {
43
+ const dataDir = config.dataDir ?? path.join(process.cwd(), ".memory");
44
+ const dbPath = config.dbPath ?? path.join(dataDir, "runtime.sqlite");
45
+ return { dataDir, dbPath };
46
+ }
47
+ export class RuntimeStorage {
48
+ paths;
49
+ db;
50
+ constructor(config = {}) {
51
+ this.paths = resolveRuntimePaths(config);
52
+ ensureDir(this.paths.dataDir);
53
+ ensureDir(path.dirname(this.paths.dbPath));
54
+ this.db = new Database(this.paths.dbPath);
55
+ this.db.pragma("journal_mode = WAL");
56
+ this.db.pragma("foreign_keys = ON");
57
+ this.db.pragma(`busy_timeout = ${BUSY_TIMEOUT_MS}`);
58
+ }
59
+ close() {
60
+ this.db.close();
61
+ }
62
+ transact(fn) {
63
+ const tx = this.db.transaction(fn);
64
+ return withBusyRetry(() => tx());
65
+ }
66
+ applyMigrations() {
67
+ const migrations = loadSqlMigrations();
68
+ this.db.exec(`
69
+ CREATE TABLE IF NOT EXISTS schema_migrations (
70
+ id TEXT PRIMARY KEY,
71
+ applied_at TEXT NOT NULL
72
+ );
73
+ `);
74
+ const hasMigration = this.db.prepare("SELECT 1 FROM schema_migrations WHERE id = ? LIMIT 1");
75
+ const insertMigration = this.db.prepare("INSERT INTO schema_migrations (id, applied_at) VALUES (?, ?)");
76
+ let applied = 0;
77
+ for (const migration of migrations) {
78
+ const exists = hasMigration.get(migration.id);
79
+ if (exists)
80
+ continue;
81
+ const tx = this.db.transaction(() => {
82
+ this.db.exec(migration.sql);
83
+ insertMigration.run(migration.id, nowIso());
84
+ });
85
+ tx();
86
+ applied += 1;
87
+ }
88
+ return applied;
89
+ }
90
+ insertEvent(event) {
91
+ this.insertEventWithResult(event);
92
+ }
93
+ insertEventWithResult(event) {
94
+ validateEventRecord(event);
95
+ const stmt = this.db.prepare(`
96
+ INSERT OR IGNORE INTO ledger_events (
97
+ id, ts, project_id, session_id, workspace_id, repo_id, parent_event_id, causation_id,
98
+ agent_id, agent_version, event_type, content, capture_path, source_kind, trust_level, scope_json, metadata_json, created_at
99
+ ) VALUES (
100
+ @id, @ts, @project_id, @session_id, @workspace_id, @repo_id, @parent_event_id, @causation_id,
101
+ @agent_id, @agent_version, @event_type, @content, @capture_path, @source_kind, @trust_level, @scope_json, @metadata_json, @created_at
102
+ )
103
+ `);
104
+ const result = stmt.run({
105
+ id: event.id,
106
+ ts: event.ts,
107
+ project_id: event.project_id,
108
+ session_id: nullable(event.session_id),
109
+ workspace_id: nullable(event.workspace_id),
110
+ repo_id: nullable(event.repo_id),
111
+ parent_event_id: nullable(event.parent_event_id),
112
+ causation_id: nullable(event.causation_id),
113
+ agent_id: event.agent_id,
114
+ agent_version: event.agent_version,
115
+ event_type: event.event_type,
116
+ content: event.content,
117
+ capture_path: nullable(event.capture_path),
118
+ source_kind: nullable(event.source_kind),
119
+ trust_level: nullable(event.trust_level),
120
+ scope_json: serializeJson(event.scope),
121
+ metadata_json: serializeJson(event.metadata),
122
+ created_at: nowIso(),
123
+ });
124
+ return result.changes > 0;
125
+ }
126
+ insertClaim(claim) {
127
+ this.upsertClaim(claim);
128
+ }
129
+ upsertClaim(claim) {
130
+ const normalizedClaim = this.normalizeClaim(claim);
131
+ validateClaimRecord(normalizedClaim);
132
+ const stmt = this.db.prepare(`
133
+ INSERT INTO claims (
134
+ id, created_at, project_id, type, assertion_kind, canonical_key, cardinality, content,
135
+ source_event_ids_json, confidence, importance, outcome_score, verification_status,
136
+ verification_method, status, pinned, valid_from, valid_to, supersedes_json,
137
+ last_verified_at, last_activated_at, scope_json, thread_status, resolved_at, resolution_rules_json
138
+ ) VALUES (
139
+ @id, @created_at, @project_id, @type, @assertion_kind, @canonical_key, @cardinality, @content,
140
+ @source_event_ids_json, @confidence, @importance, @outcome_score, @verification_status,
141
+ @verification_method, @status, @pinned, @valid_from, @valid_to, @supersedes_json,
142
+ @last_verified_at, @last_activated_at, @scope_json, @thread_status, @resolved_at, @resolution_rules_json
143
+ )
144
+ ON CONFLICT(id) DO UPDATE SET
145
+ created_at = excluded.created_at,
146
+ project_id = excluded.project_id,
147
+ type = excluded.type,
148
+ assertion_kind = excluded.assertion_kind,
149
+ canonical_key = excluded.canonical_key,
150
+ cardinality = excluded.cardinality,
151
+ content = excluded.content,
152
+ source_event_ids_json = excluded.source_event_ids_json,
153
+ confidence = excluded.confidence,
154
+ importance = excluded.importance,
155
+ outcome_score = excluded.outcome_score,
156
+ verification_status = excluded.verification_status,
157
+ verification_method = excluded.verification_method,
158
+ status = excluded.status,
159
+ pinned = excluded.pinned,
160
+ valid_from = excluded.valid_from,
161
+ valid_to = excluded.valid_to,
162
+ supersedes_json = excluded.supersedes_json,
163
+ last_verified_at = excluded.last_verified_at,
164
+ last_activated_at = excluded.last_activated_at,
165
+ scope_json = excluded.scope_json,
166
+ thread_status = excluded.thread_status,
167
+ resolved_at = excluded.resolved_at,
168
+ resolution_rules_json = excluded.resolution_rules_json
169
+ `);
170
+ this.transact(() => {
171
+ stmt.run({
172
+ id: normalizedClaim.id,
173
+ created_at: normalizedClaim.created_at,
174
+ project_id: normalizedClaim.project_id,
175
+ type: normalizedClaim.type,
176
+ assertion_kind: normalizedClaim.assertion_kind,
177
+ canonical_key: normalizedClaim.canonical_key,
178
+ cardinality: normalizedClaim.cardinality,
179
+ content: normalizedClaim.content,
180
+ source_event_ids_json: serializeJson(normalizedClaim.source_event_ids),
181
+ confidence: normalizedClaim.confidence,
182
+ importance: normalizedClaim.importance,
183
+ outcome_score: normalizedClaim.outcome_score,
184
+ verification_status: normalizedClaim.verification_status,
185
+ verification_method: nullable(normalizedClaim.verification_method),
186
+ status: normalizedClaim.status,
187
+ supersedes_json: serializeJson(normalizedClaim.supersedes),
188
+ scope_json: serializeJson(normalizedClaim.scope),
189
+ resolution_rules_json: serializeJson(normalizedClaim.resolution_rules),
190
+ pinned: normalizedClaim.pinned ? 1 : 0,
191
+ valid_from: nullable(normalizedClaim.valid_from),
192
+ valid_to: nullable(normalizedClaim.valid_to),
193
+ last_verified_at: nullable(normalizedClaim.last_verified_at),
194
+ last_activated_at: nullable(normalizedClaim.last_activated_at),
195
+ thread_status: nullable(normalizedClaim.thread_status),
196
+ resolved_at: nullable(normalizedClaim.resolved_at),
197
+ });
198
+ this.assertActiveSingletonInvariant(normalizedClaim);
199
+ });
200
+ }
201
+ insertOutcome(outcome) {
202
+ this.upsertOutcome(outcome);
203
+ }
204
+ upsertOutcome(outcome) {
205
+ validateOutcomeRecord(outcome);
206
+ const stmt = this.db.prepare(`
207
+ INSERT OR REPLACE INTO claim_outcomes (
208
+ id, ts, project_id, related_event_ids_json, related_claim_ids_json, outcome_type, strength, notes
209
+ ) VALUES (
210
+ @id, @ts, @project_id, @related_event_ids_json, @related_claim_ids_json, @outcome_type, @strength, @notes
211
+ )
212
+ `);
213
+ stmt.run({
214
+ id: outcome.id,
215
+ ts: outcome.ts,
216
+ project_id: outcome.project_id,
217
+ related_event_ids_json: serializeJson(outcome.related_event_ids),
218
+ related_claim_ids_json: serializeJson(outcome.related_claim_ids),
219
+ outcome_type: outcome.outcome_type,
220
+ strength: outcome.strength,
221
+ notes: nullable(outcome.notes),
222
+ });
223
+ }
224
+ insertSessionCheckpoint(checkpoint) {
225
+ this.upsertSessionCheckpoint(checkpoint);
226
+ }
227
+ upsertSessionCheckpoint(checkpoint) {
228
+ validateSessionCheckpointRecord(checkpoint);
229
+ const stmt = this.db.prepare(`
230
+ INSERT INTO session_checkpoints (
231
+ id, created_at, project_id, session_id, workspace_id, branch, repo_head, status, source,
232
+ summary, current_goal, next_action, blocking_reason, hot_claim_ids_json, hot_files_json,
233
+ evidence_refs_json, packet_hash, hot_file_digests_json, stale_reason
234
+ ) VALUES (
235
+ @id, @created_at, @project_id, @session_id, @workspace_id, @branch, @repo_head, @status, @source,
236
+ @summary, @current_goal, @next_action, @blocking_reason, @hot_claim_ids_json, @hot_files_json,
237
+ @evidence_refs_json, @packet_hash, @hot_file_digests_json, @stale_reason
238
+ )
239
+ ON CONFLICT(project_id, session_id, source, packet_hash) DO UPDATE SET
240
+ branch = excluded.branch,
241
+ repo_head = excluded.repo_head,
242
+ status = excluded.status,
243
+ summary = excluded.summary,
244
+ current_goal = excluded.current_goal,
245
+ next_action = excluded.next_action,
246
+ blocking_reason = excluded.blocking_reason,
247
+ hot_claim_ids_json = excluded.hot_claim_ids_json,
248
+ hot_files_json = excluded.hot_files_json,
249
+ evidence_refs_json = excluded.evidence_refs_json,
250
+ hot_file_digests_json = excluded.hot_file_digests_json,
251
+ stale_reason = excluded.stale_reason
252
+ `);
253
+ stmt.run({
254
+ id: checkpoint.id,
255
+ created_at: checkpoint.created_at,
256
+ project_id: checkpoint.project_id,
257
+ session_id: checkpoint.session_id,
258
+ workspace_id: nullable(checkpoint.workspace_id),
259
+ branch: nullable(checkpoint.branch),
260
+ repo_head: nullable(checkpoint.repo_head),
261
+ status: checkpoint.status,
262
+ source: checkpoint.source,
263
+ summary: checkpoint.summary,
264
+ current_goal: nullable(checkpoint.current_goal),
265
+ next_action: nullable(checkpoint.next_action),
266
+ blocking_reason: nullable(checkpoint.blocking_reason),
267
+ hot_claim_ids_json: serializeJson(checkpoint.hot_claim_ids),
268
+ hot_files_json: serializeJson(checkpoint.hot_files),
269
+ evidence_refs_json: serializeJson(checkpoint.evidence_refs),
270
+ packet_hash: checkpoint.packet_hash,
271
+ hot_file_digests_json: serializeJson(checkpoint.hot_file_digests),
272
+ stale_reason: nullable(checkpoint.stale_reason),
273
+ });
274
+ }
275
+ listEvents(projectId) {
276
+ const rows = projectId
277
+ ? this.db
278
+ .prepare("SELECT * FROM ledger_events WHERE project_id = ? ORDER BY ts ASC")
279
+ .all(projectId)
280
+ : this.db.prepare("SELECT * FROM ledger_events ORDER BY ts ASC").all();
281
+ return rows.map((row) => mapEventRow(row));
282
+ }
283
+ listClaims(projectId) {
284
+ const rows = projectId
285
+ ? this.db
286
+ .prepare("SELECT * FROM claims WHERE project_id = ? ORDER BY created_at ASC")
287
+ .all(projectId)
288
+ : this.db.prepare("SELECT * FROM claims ORDER BY created_at ASC").all();
289
+ return rows.map((row) => mapClaimRow(row));
290
+ }
291
+ listOutcomes(projectId) {
292
+ const rows = projectId
293
+ ? this.db
294
+ .prepare("SELECT * FROM claim_outcomes WHERE project_id = ? ORDER BY ts ASC")
295
+ .all(projectId)
296
+ : this.db.prepare("SELECT * FROM claim_outcomes ORDER BY ts ASC").all();
297
+ return rows.map((row) => mapOutcomeRow(row));
298
+ }
299
+ listSessionCheckpoints(projectId) {
300
+ const rows = projectId
301
+ ? this.db
302
+ .prepare("SELECT * FROM session_checkpoints WHERE project_id = ? ORDER BY created_at ASC")
303
+ .all(projectId)
304
+ : this.db.prepare("SELECT * FROM session_checkpoints ORDER BY created_at ASC").all();
305
+ return rows.map((row) => mapSessionCheckpointRow(row));
306
+ }
307
+ getLatestSessionCheckpoint(projectId, workspaceId, status) {
308
+ const workspacePredicate = workspaceId
309
+ ? "AND workspace_id = @workspace_id"
310
+ : "";
311
+ const statusPredicate = status ? "AND status = @status" : "";
312
+ const stmt = this.db.prepare(`
313
+ SELECT * FROM session_checkpoints
314
+ WHERE project_id = @project_id
315
+ ${workspacePredicate}
316
+ ${statusPredicate}
317
+ ORDER BY created_at DESC
318
+ LIMIT 1
319
+ `);
320
+ const row = stmt.get({
321
+ project_id: projectId,
322
+ workspace_id: workspaceId ?? null,
323
+ status: status ?? null,
324
+ });
325
+ if (row)
326
+ return mapSessionCheckpointRow(row);
327
+ if (workspaceId) {
328
+ const fallback = this.db.prepare(`
329
+ SELECT * FROM session_checkpoints
330
+ WHERE project_id = @project_id
331
+ ${statusPredicate}
332
+ ORDER BY created_at DESC
333
+ LIMIT 1
334
+ `).get({
335
+ project_id: projectId,
336
+ status: status ?? null,
337
+ });
338
+ if (fallback)
339
+ return mapSessionCheckpointRow(fallback);
340
+ }
341
+ return undefined;
342
+ }
343
+ getClaimById(claimId) {
344
+ const row = this.db.prepare("SELECT * FROM claims WHERE id = ?").get(claimId);
345
+ if (!row)
346
+ return undefined;
347
+ return mapClaimRow(row);
348
+ }
349
+ touchClaims(projectId, claimIds, activatedAt) {
350
+ const uniqueClaimIds = Array.from(new Set(claimIds.filter(Boolean)));
351
+ if (uniqueClaimIds.length === 0)
352
+ return 0;
353
+ const placeholders = uniqueClaimIds.map(() => "?").join(", ");
354
+ const stmt = this.db.prepare(`
355
+ UPDATE claims
356
+ SET last_activated_at = ?
357
+ WHERE project_id = ?
358
+ AND id IN (${placeholders})
359
+ `);
360
+ const result = stmt.run(activatedAt, projectId, ...uniqueClaimIds);
361
+ return result.changes;
362
+ }
363
+ findCompatibleActiveSingletonClaims(projectId, canonicalKey, scope, excludeClaimId) {
364
+ const rows = this.db
365
+ .prepare(`
366
+ SELECT * FROM claims
367
+ WHERE project_id = ?
368
+ AND canonical_key = ?
369
+ AND cardinality = 'singleton'
370
+ AND status = 'active'
371
+ ORDER BY created_at ASC
372
+ `)
373
+ .all(projectId, canonicalKey);
374
+ return rows
375
+ .map((row) => mapClaimRow(row))
376
+ .filter((claim) => claim.id !== excludeClaimId && singletonScopeCompatible(claim.scope, scope));
377
+ }
378
+ supersedeClaim(oldClaimId, newClaimId, reason, triggerType, actor) {
379
+ const existing = this.db
380
+ .prepare("SELECT project_id, status, supersedes_json FROM claims WHERE id = ?")
381
+ .get(oldClaimId);
382
+ if (!existing)
383
+ return;
384
+ assertClaimTransitionAllowed(existing.status, "superseded", "supersede_claim");
385
+ const supersedes = existing.supersedes_json
386
+ ? JSON.parse(existing.supersedes_json)
387
+ : [];
388
+ if (!supersedes.includes(newClaimId))
389
+ supersedes.push(newClaimId);
390
+ const updateStmt = this.db.prepare(`
391
+ UPDATE claims
392
+ SET status = 'superseded',
393
+ supersedes_json = ?
394
+ WHERE id = ?
395
+ `);
396
+ updateStmt.run(JSON.stringify(supersedes), oldClaimId);
397
+ const insertTransition = this.db.prepare(`
398
+ INSERT OR REPLACE INTO claim_transitions (
399
+ id, ts, project_id, claim_id, from_status, to_status, reason, trigger_type, trigger_ref, actor
400
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
401
+ `);
402
+ insertTransition.run(`trn-${oldClaimId}-${newClaimId}`, nowIso(), existing.project_id, oldClaimId, existing.status, "superseded", reason, triggerType, newClaimId, actor);
403
+ }
404
+ insertClaimTransition(transition) {
405
+ const stmt = this.db.prepare(`
406
+ INSERT OR REPLACE INTO claim_transitions (
407
+ id, ts, project_id, claim_id, from_status, to_status, reason, trigger_type, trigger_ref, actor
408
+ ) VALUES (
409
+ @id, @ts, @project_id, @claim_id, @from_status, @to_status, @reason, @trigger_type, @trigger_ref, @actor
410
+ )
411
+ `);
412
+ stmt.run({
413
+ ...transition,
414
+ from_status: nullable(transition.from_status),
415
+ trigger_ref: nullable(transition.trigger_ref),
416
+ });
417
+ }
418
+ insertActivationLog(log) {
419
+ const stmt = this.db.prepare(`
420
+ INSERT OR REPLACE INTO activation_logs (
421
+ id, ts, project_id, claim_id, eligibility_result, suppression_reason, rank_score, packing_decision, activation_reasons_json
422
+ ) VALUES (
423
+ @id, @ts, @project_id, @claim_id, @eligibility_result, @suppression_reason, @rank_score, @packing_decision, @activation_reasons_json
424
+ )
425
+ `);
426
+ stmt.run({
427
+ ...log,
428
+ suppression_reason: nullable(log.suppression_reason),
429
+ rank_score: log.rank_score ?? null,
430
+ packing_decision: nullable(log.packing_decision),
431
+ activation_reasons_json: serializeJson(log.activation_reasons),
432
+ });
433
+ }
434
+ listActivationLogs(projectId) {
435
+ const rows = projectId
436
+ ? this.db
437
+ .prepare("SELECT * FROM activation_logs WHERE project_id = ? ORDER BY ts ASC")
438
+ .all(projectId)
439
+ : this.db.prepare("SELECT * FROM activation_logs ORDER BY ts ASC").all();
440
+ return rows.map((row) => mapActivationLogRow(row));
441
+ }
442
+ listClaimTransitions(projectId) {
443
+ const rows = projectId
444
+ ? this.db
445
+ .prepare("SELECT * FROM claim_transitions WHERE project_id = ? ORDER BY ts ASC")
446
+ .all(projectId)
447
+ : this.db.prepare("SELECT * FROM claim_transitions ORDER BY ts ASC").all();
448
+ return rows.map((row) => mapTransitionRow(row));
449
+ }
450
+ getStats() {
451
+ const count = (table) => {
452
+ const row = this.db.prepare(`SELECT COUNT(*) as count FROM ${table}`).get();
453
+ return row.count;
454
+ };
455
+ return {
456
+ events: count("ledger_events"),
457
+ claims: count("claims"),
458
+ outcomes: count("claim_outcomes"),
459
+ transitions: count("claim_transitions"),
460
+ activationLogs: count("activation_logs"),
461
+ checkpoints: count("session_checkpoints"),
462
+ migrationsApplied: count("schema_migrations"),
463
+ };
464
+ }
465
+ normalizeClaim(claim) {
466
+ return {
467
+ ...claim,
468
+ scope: normalizeClaimScope(claim.scope),
469
+ };
470
+ }
471
+ assertActiveSingletonInvariant(claim) {
472
+ if (claim.cardinality !== "singleton" || claim.status !== "active")
473
+ return;
474
+ const conflicts = this.findCompatibleActiveSingletonClaims(claim.project_id, claim.canonical_key, claim.scope, claim.id);
475
+ if (conflicts.length === 0)
476
+ return;
477
+ throw new Error(`active singleton invariant violated for ${claim.project_id}:${claim.canonical_key}`);
478
+ }
479
+ }
480
+ /* ───────────────────── Row mapping functions ───────────────────── */
481
+ function mapEventRow(row) {
482
+ return {
483
+ id: row.id,
484
+ ts: row.ts,
485
+ project_id: row.project_id,
486
+ session_id: row.session_id ?? undefined,
487
+ workspace_id: row.workspace_id ?? undefined,
488
+ repo_id: row.repo_id ?? undefined,
489
+ parent_event_id: row.parent_event_id ?? undefined,
490
+ causation_id: row.causation_id ?? undefined,
491
+ agent_id: row.agent_id,
492
+ agent_version: row.agent_version,
493
+ event_type: row.event_type,
494
+ content: row.content,
495
+ capture_path: (row.capture_path ?? undefined),
496
+ source_kind: (row.source_kind ?? undefined),
497
+ trust_level: (row.trust_level ?? undefined),
498
+ scope: row.scope_json ? JSON.parse(row.scope_json) : undefined,
499
+ metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
500
+ };
501
+ }
502
+ function mapClaimRow(row) {
503
+ return {
504
+ id: row.id,
505
+ created_at: row.created_at,
506
+ project_id: row.project_id,
507
+ type: row.type,
508
+ assertion_kind: row.assertion_kind,
509
+ canonical_key: row.canonical_key,
510
+ cardinality: row.cardinality,
511
+ content: row.content,
512
+ source_event_ids: JSON.parse(row.source_event_ids_json),
513
+ confidence: row.confidence,
514
+ importance: row.importance,
515
+ outcome_score: row.outcome_score,
516
+ verification_status: row.verification_status,
517
+ verification_method: row.verification_method ?? undefined,
518
+ status: row.status,
519
+ pinned: Boolean(row.pinned),
520
+ valid_from: row.valid_from ?? undefined,
521
+ valid_to: row.valid_to ?? undefined,
522
+ supersedes: row.supersedes_json ? JSON.parse(row.supersedes_json) : undefined,
523
+ last_verified_at: row.last_verified_at ?? undefined,
524
+ last_activated_at: row.last_activated_at ?? undefined,
525
+ scope: row.scope_json ? JSON.parse(row.scope_json) : undefined,
526
+ thread_status: (row.thread_status ?? undefined),
527
+ resolved_at: row.resolved_at ?? undefined,
528
+ resolution_rules: row.resolution_rules_json
529
+ ? JSON.parse(row.resolution_rules_json)
530
+ : undefined,
531
+ };
532
+ }
533
+ function mapOutcomeRow(row) {
534
+ return {
535
+ id: row.id,
536
+ ts: row.ts,
537
+ project_id: row.project_id,
538
+ related_event_ids: JSON.parse(row.related_event_ids_json),
539
+ related_claim_ids: row.related_claim_ids_json
540
+ ? JSON.parse(row.related_claim_ids_json)
541
+ : undefined,
542
+ outcome_type: row.outcome_type,
543
+ strength: row.strength,
544
+ notes: row.notes ?? undefined,
545
+ };
546
+ }
547
+ function mapTransitionRow(row) {
548
+ return {
549
+ id: row.id,
550
+ ts: row.ts,
551
+ project_id: row.project_id,
552
+ claim_id: row.claim_id,
553
+ from_status: (row.from_status ?? undefined),
554
+ to_status: row.to_status,
555
+ reason: row.reason,
556
+ trigger_type: row.trigger_type,
557
+ trigger_ref: row.trigger_ref ?? undefined,
558
+ actor: row.actor,
559
+ };
560
+ }
561
+ function mapActivationLogRow(row) {
562
+ return {
563
+ id: row.id,
564
+ ts: row.ts,
565
+ project_id: row.project_id,
566
+ claim_id: row.claim_id,
567
+ eligibility_result: row.eligibility_result,
568
+ suppression_reason: (row.suppression_reason ?? undefined),
569
+ rank_score: row.rank_score ?? undefined,
570
+ packing_decision: (row.packing_decision ?? undefined),
571
+ activation_reasons: row.activation_reasons_json
572
+ ? JSON.parse(row.activation_reasons_json)
573
+ : undefined,
574
+ };
575
+ }
576
+ function mapSessionCheckpointRow(row) {
577
+ return {
578
+ id: row.id,
579
+ created_at: row.created_at,
580
+ project_id: row.project_id,
581
+ session_id: row.session_id,
582
+ workspace_id: row.workspace_id ?? undefined,
583
+ branch: row.branch ?? undefined,
584
+ repo_head: row.repo_head ?? undefined,
585
+ status: row.status,
586
+ source: row.source,
587
+ summary: row.summary,
588
+ current_goal: row.current_goal ?? undefined,
589
+ next_action: row.next_action ?? undefined,
590
+ blocking_reason: row.blocking_reason ?? undefined,
591
+ hot_claim_ids: JSON.parse(row.hot_claim_ids_json),
592
+ hot_files: JSON.parse(row.hot_files_json),
593
+ evidence_refs: JSON.parse(row.evidence_refs_json),
594
+ packet_hash: row.packet_hash,
595
+ hot_file_digests: row.hot_file_digests_json
596
+ ? JSON.parse(row.hot_file_digests_json)
597
+ : undefined,
598
+ stale_reason: row.stale_reason ?? undefined,
599
+ };
600
+ }
601
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AActC,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyHrC,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,SAAS,aAAa,CAAI,EAAW,EAAE,aAAqB,cAAc;IACxE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;YACzF,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,UAAU;gBAAE,MAAM,KAAK,CAAC;YAEnD,mEAAmE;YACnE,MAAM,KAAK,GAAG,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,gCAAgC;IAChC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAI,KAAoB;IACvC,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAwB,EAAE;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,OAAO,cAAc;IAChB,KAAK,CAAe;IACpB,EAAE,CAAoB;IAE/B,YAAY,SAAwB,EAAE;QACpC,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACzC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,eAAe,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ,CAAI,EAAW;QACrB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,eAAe;QACb,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;QAEvC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;KAKZ,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAClC,sDAAsD,CACvD,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACrC,8DAA8D,CAC/D,CAAC;QAEF,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,MAAM;gBAAE,SAAS;YAErB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBAClC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC5B,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,EAAE,EAAE,CAAC;YACL,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,KAAsB;QAChC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,qBAAqB,CAAC,KAAsB;QAC1C,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQ5B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;YACtB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;YACtC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;YAC1C,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;YAChC,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;YAChD,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;YAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;YAC1C,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;YACxC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;YACxC,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;YACtC,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC5C,UAAU,EAAE,MAAM,EAAE;SACrB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,WAAW,CAAC,KAAY;QACtB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,KAAY;QACtB,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACnD,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqC5B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACjB,IAAI,CAAC,GAAG,CAAC;gBACP,EAAE,EAAE,eAAe,CAAC,EAAE;gBACtB,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,IAAI,EAAE,eAAe,CAAC,IAAI;gBAC1B,cAAc,EAAE,eAAe,CAAC,cAAc;gBAC9C,aAAa,EAAE,eAAe,CAAC,aAAa;gBAC5C,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,OAAO,EAAE,eAAe,CAAC,OAAO;gBAChC,qBAAqB,EAAE,aAAa,CAAC,eAAe,CAAC,gBAAgB,CAAC;gBACtE,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,UAAU,EAAE,eAAe,CAAC,UAAU;gBACtC,aAAa,EAAE,eAAe,CAAC,aAAa;gBAC5C,mBAAmB,EAAE,eAAe,CAAC,mBAAmB;gBACxD,mBAAmB,EAAE,QAAQ,CAAC,eAAe,CAAC,mBAAmB,CAAC;gBAClE,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,eAAe,EAAE,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC;gBAC1D,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC;gBAChD,qBAAqB,EAAE,aAAa,CAAC,eAAe,CAAC,gBAAgB,CAAC;gBACtE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC;gBAChD,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC;gBAC5C,gBAAgB,EAAE,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC;gBAC5D,iBAAiB,EAAE,QAAQ,CAAC,eAAe,CAAC,iBAAiB,CAAC;gBAC9D,aAAa,EAAE,QAAQ,CAAC,eAAe,CAAC,aAAa,CAAC;gBACtD,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC;aACnD,CAAC,CAAC;YAEH,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,OAAgB;QAC5B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,aAAa,CAAC,OAAgB;QAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,sBAAsB,EAAE,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAChE,sBAAsB,EAAE,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAChE,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB,CAAC,UAA6B;QACnD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,uBAAuB,CAAC,UAA6B;QACnD,+BAA+B,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;KAuB5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;YAC/C,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YACnC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;YACzC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;YAC/C,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;YAC7C,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC;YACrD,kBAAkB,EAAE,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC;YAC3D,cAAc,EAAE,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,kBAAkB,EAAE,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC;YAC3D,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,qBAAqB,EAAE,aAAa,CAAC,UAAU,CAAC,gBAAgB,CAAC;YACjE,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,SAAkB;QAC3B,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAE,IAAI,CAAC,EAAE;iBACL,OAAO,CAAC,kEAAkE,CAAC;iBAC3E,GAAG,CAAC,SAAS,CAAgB;YAClC,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,EAAiB,CAAC;QAEzF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU,CAAC,SAAkB;QAC3B,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAE,IAAI,CAAC,EAAE;iBACL,OAAO,CAAC,mEAAmE,CAAC;iBAC5E,GAAG,CAAC,SAAS,CAAgB;YAClC,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAAiB,CAAC;QAE1F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,YAAY,CAAC,SAAkB;QAC7B,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAE,IAAI,CAAC,EAAE;iBACL,OAAO,CAAC,mEAAmE,CAAC;iBAC5E,GAAG,CAAC,SAAS,CAAkB;YACpC,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAAmB,CAAC;QAE5F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,sBAAsB,CAAC,SAAkB;QACvC,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAE,IAAI,CAAC,EAAE;iBACL,OAAO,CAAC,gFAAgF,CAAC;iBACzF,GAAG,CAAC,SAAS,CAA4B;YAC9C,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,EAA6B,CAAC;QAEnH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,0BAA0B,CACxB,SAAiB,EACjB,WAAoB,EACpB,MAAgC;QAEhC,MAAM,kBAAkB,GAAG,WAAW;YACpC,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;UAGvB,kBAAkB;UAClB,eAAe;;;KAGpB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACnB,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,WAAW,IAAI,IAAI;YACjC,MAAM,EAAE,MAAM,IAAI,IAAI;SACvB,CAAqC,CAAC;QACvC,IAAI,GAAG;YAAE,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;YAG3B,eAAe;;;OAGpB,CAAC,CAAC,GAAG,CAAC;gBACL,UAAU,EAAE,SAAS;gBACrB,MAAM,EAAE,MAAM,IAAI,IAAI;aACvB,CAAqC,CAAC;YACvC,IAAI,QAAQ;gBAAE,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,OAAe;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAyB,CAAC;QACtG,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,QAAkB,EAAE,WAAmB;QACpE,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAE1C,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;qBAIZ,YAAY;KAC5B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,mCAAmC,CACjC,SAAiB,EACjB,YAAoB,EACpB,KAA6B,EAC7B,cAAuB;QAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC;;;;;;;OAOR,CAAC;aACD,GAAG,CAAC,SAAS,EAAE,YAAY,CAAe,CAAC;QAE9C,OAAO,IAAI;aACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aAC9B,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,EAAE,KAAK,cAAc,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAC9E,CAAC;IACN,CAAC;IAED,cAAc,CAAC,UAAkB,EAAE,UAAkB,EAAE,MAAc,EAAE,WAAmB,EAAE,KAAa;QACvG,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE;aACrB,OAAO,CAAC,qEAAqE,CAAC;aAC9E,GAAG,CAAC,UAAU,CAA6B,CAAC;QAE/C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,4BAA4B,CAC1B,QAAQ,CAAC,MAAyB,EAClC,YAAY,EACZ,iBAAiB,CAClB,CAAC;QAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,eAAe;YACzC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAc;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAElE,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAKlC,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;QAEvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIxC,CAAC,CAAC;QAEH,gBAAgB,CAAC,GAAG,CAClB,OAAO,UAAU,IAAI,UAAU,EAAE,EACjC,MAAM,EAAE,EACR,QAAQ,CAAC,UAAU,EACnB,UAAU,EACV,QAAQ,CAAC,MAAM,EACf,YAAY,EACZ,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,CACN,CAAC;IACJ,CAAC;IAED,qBAAqB,CAAC,UAA2B;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,GAAG,UAAU;YACb,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;YAC7C,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,GAAkB;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,GAAG,GAAG;YACN,kBAAkB,EAAE,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC;YACpD,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;YAClC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAChD,uBAAuB,EAAE,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,SAAkB;QACnC,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAE,IAAI,CAAC,EAAE;iBACL,OAAO,CAAC,oEAAoE,CAAC;iBAC7E,GAAG,CAAC,SAAS,CAAwB;YAC1C,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAyB,CAAC;QAEnG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,oBAAoB,CAAC,SAAkB;QACrC,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAE,IAAI,CAAC,EAAE;iBACL,OAAO,CAAC,sEAAsE,CAAC;iBAC/E,GAAG,CAAC,SAAS,CAAqB;YACvC,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,EAAsB,CAAC;QAElG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,QAAQ;QACN,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAc,CAAC;YACxF,OAAO,GAAG,CAAC,KAAK,CAAC;QACnB,CAAC,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC;YAC9B,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;YACvB,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC;YACjC,WAAW,EAAE,KAAK,CAAC,mBAAmB,CAAC;YACvC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC;YACxC,WAAW,EAAE,KAAK,CAAC,qBAAqB,CAAC;YACzC,iBAAiB,EAAE,KAAK,CAAC,mBAAmB,CAAC;SAC9C,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,KAAY;QACjC,OAAO;YACL,GAAG,KAAK;YACR,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC;SACxC,CAAC;IACJ,CAAC;IAEO,8BAA8B,CAAC,KAAY;QACjD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;QAE3E,MAAM,SAAS,GAAG,IAAI,CAAC,mCAAmC,CACxD,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,EAAE,CACT,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,MAAM,IAAI,KAAK,CACb,2CAA2C,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,aAAa,EAAE,CACrF,CAAC;IACJ,CAAC;CACF;AAED,uEAAuE;AAEvE,SAAS,WAAW,CAAC,GAAa;IAChC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACvC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC3C,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;QACjC,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,SAAS;QACjD,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,UAAU,EAAE,GAAG,CAAC,UAA2C;QAC3D,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,YAAY,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS,CAAoC;QAChF,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAmC;QAC7E,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAmC;QAC7E,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9D,QAAQ,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAa;IAChC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,IAAI,EAAE,GAAG,CAAC,IAAqB;QAC/B,cAAc,EAAE,GAAG,CAAC,cAAyC;QAC7D,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,WAAW,EAAE,GAAG,CAAC,WAAmC;QACpD,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACvD,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,mBAAmB,EAAE,GAAG,CAAC,mBAAmD;QAC5E,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,IAAI,SAAS;QACzD,MAAM,EAAE,GAAG,CAAC,MAAyB;QACrC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACvC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,SAAS;QACnC,UAAU,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7E,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,SAAS;QACnD,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;QACrD,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9D,aAAa,EAAE,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,CAA2B;QACzE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACzC,gBAAgB,EAAE,GAAG,CAAC,qBAAqB;YACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;YACvC,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAe;IACpC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;QACzD,iBAAiB,EAAE,GAAG,CAAC,sBAAsB;YAC3C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACxC,CAAC,CAAC,SAAS;QACb,YAAY,EAAE,GAAG,CAAC,YAAuC;QACzD,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAkB;IAC1C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAmC;QAC7E,SAAS,EAAE,GAAG,CAAC,SAAyC;QACxD,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACzC,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAqB;IAChD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,kBAAkB,EAAE,GAAG,CAAC,kBAAyD;QACjF,kBAAkB,EAAE,CAAC,GAAG,CAAC,kBAAkB,IAAI,SAAS,CAAwC;QAChG,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;QACvC,gBAAgB,EAAE,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS,CAAsC;QAC1F,kBAAkB,EAAE,GAAG,CAAC,uBAAuB;YAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACzC,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAyB;IACxD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC3C,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;QAC/B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;QACrC,MAAM,EAAE,GAAG,CAAC,MAAqC;QACjD,MAAM,EAAE,GAAG,CAAC,MAAqC;QACjD,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;QAC3C,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;QACzC,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,SAAS;QACjD,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACjD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;QACzC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACjD,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,gBAAgB,EAAE,GAAG,CAAC,qBAAqB;YACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;YACvC,CAAC,CAAC,SAAS;QACb,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;KAC5C,CAAC;AACJ,CAAC"}