kratos-memory 1.0.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 (120) hide show
  1. package/AGENTS.md +25 -0
  2. package/LICENSE +21 -0
  3. package/bin/kratos-cli +7 -0
  4. package/dist/cli/capture-handler.d.ts +13 -0
  5. package/dist/cli/capture-handler.d.ts.map +1 -0
  6. package/dist/cli/capture-handler.js +112 -0
  7. package/dist/cli/capture-handler.js.map +1 -0
  8. package/dist/cli/commands/ask.d.ts +5 -0
  9. package/dist/cli/commands/ask.d.ts.map +1 -0
  10. package/dist/cli/commands/ask.js +64 -0
  11. package/dist/cli/commands/ask.js.map +1 -0
  12. package/dist/cli/commands/capture.d.ts +5 -0
  13. package/dist/cli/commands/capture.d.ts.map +1 -0
  14. package/dist/cli/commands/capture.js +31 -0
  15. package/dist/cli/commands/capture.js.map +1 -0
  16. package/dist/cli/commands/forget.d.ts +3 -0
  17. package/dist/cli/commands/forget.d.ts.map +1 -0
  18. package/dist/cli/commands/forget.js +12 -0
  19. package/dist/cli/commands/forget.js.map +1 -0
  20. package/dist/cli/commands/get.d.ts +3 -0
  21. package/dist/cli/commands/get.d.ts.map +1 -0
  22. package/dist/cli/commands/get.js +28 -0
  23. package/dist/cli/commands/get.js.map +1 -0
  24. package/dist/cli/commands/hooks.d.ts +2 -0
  25. package/dist/cli/commands/hooks.d.ts.map +1 -0
  26. package/dist/cli/commands/hooks.js +136 -0
  27. package/dist/cli/commands/hooks.js.map +1 -0
  28. package/dist/cli/commands/migrate.d.ts +5 -0
  29. package/dist/cli/commands/migrate.d.ts.map +1 -0
  30. package/dist/cli/commands/migrate.js +56 -0
  31. package/dist/cli/commands/migrate.js.map +1 -0
  32. package/dist/cli/commands/recent.d.ts +6 -0
  33. package/dist/cli/commands/recent.d.ts.map +1 -0
  34. package/dist/cli/commands/recent.js +21 -0
  35. package/dist/cli/commands/recent.js.map +1 -0
  36. package/dist/cli/commands/save.d.ts +8 -0
  37. package/dist/cli/commands/save.d.ts.map +1 -0
  38. package/dist/cli/commands/save.js +31 -0
  39. package/dist/cli/commands/save.js.map +1 -0
  40. package/dist/cli/commands/scan.d.ts +5 -0
  41. package/dist/cli/commands/scan.d.ts.map +1 -0
  42. package/dist/cli/commands/scan.js +28 -0
  43. package/dist/cli/commands/scan.js.map +1 -0
  44. package/dist/cli/commands/search.d.ts +8 -0
  45. package/dist/cli/commands/search.d.ts.map +1 -0
  46. package/dist/cli/commands/search.js +45 -0
  47. package/dist/cli/commands/search.js.map +1 -0
  48. package/dist/cli/commands/status.d.ts +3 -0
  49. package/dist/cli/commands/status.d.ts.map +1 -0
  50. package/dist/cli/commands/status.js +89 -0
  51. package/dist/cli/commands/status.js.map +1 -0
  52. package/dist/cli/commands/switch.d.ts +3 -0
  53. package/dist/cli/commands/switch.d.ts.map +1 -0
  54. package/dist/cli/commands/switch.js +18 -0
  55. package/dist/cli/commands/switch.js.map +1 -0
  56. package/dist/cli/core.d.ts +15 -0
  57. package/dist/cli/core.d.ts.map +1 -0
  58. package/dist/cli/core.js +18 -0
  59. package/dist/cli/core.js.map +1 -0
  60. package/dist/cli/index.d.ts +3 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +157 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/output.d.ts +22 -0
  65. package/dist/cli/output.d.ts.map +1 -0
  66. package/dist/cli/output.js +74 -0
  67. package/dist/cli/output.js.map +1 -0
  68. package/dist/compression/factory.d.ts +6 -0
  69. package/dist/compression/factory.d.ts.map +1 -0
  70. package/dist/compression/factory.js +8 -0
  71. package/dist/compression/factory.js.map +1 -0
  72. package/dist/compression/index.d.ts +10 -0
  73. package/dist/compression/index.d.ts.map +1 -0
  74. package/dist/compression/index.js +2 -0
  75. package/dist/compression/index.js.map +1 -0
  76. package/dist/compression/rule-compressor.d.ts +9 -0
  77. package/dist/compression/rule-compressor.d.ts.map +1 -0
  78. package/dist/compression/rule-compressor.js +43 -0
  79. package/dist/compression/rule-compressor.js.map +1 -0
  80. package/dist/memory-server/concept-store-enhanced.d.ts +88 -0
  81. package/dist/memory-server/concept-store-enhanced.d.ts.map +1 -0
  82. package/dist/memory-server/concept-store-enhanced.js +392 -0
  83. package/dist/memory-server/concept-store-enhanced.js.map +1 -0
  84. package/dist/memory-server/concept-store.d.ts +58 -0
  85. package/dist/memory-server/concept-store.d.ts.map +1 -0
  86. package/dist/memory-server/concept-store.js +329 -0
  87. package/dist/memory-server/concept-store.js.map +1 -0
  88. package/dist/memory-server/context-broker.d.ts +63 -0
  89. package/dist/memory-server/context-broker.d.ts.map +1 -0
  90. package/dist/memory-server/context-broker.js +340 -0
  91. package/dist/memory-server/context-broker.js.map +1 -0
  92. package/dist/memory-server/database.d.ts +108 -0
  93. package/dist/memory-server/database.d.ts.map +1 -0
  94. package/dist/memory-server/database.js +690 -0
  95. package/dist/memory-server/database.js.map +1 -0
  96. package/dist/project-manager.d.ts +77 -0
  97. package/dist/project-manager.d.ts.map +1 -0
  98. package/dist/project-manager.js +226 -0
  99. package/dist/project-manager.js.map +1 -0
  100. package/dist/security/data-retention.d.ts +104 -0
  101. package/dist/security/data-retention.d.ts.map +1 -0
  102. package/dist/security/data-retention.js +444 -0
  103. package/dist/security/data-retention.js.map +1 -0
  104. package/dist/security/encryption.d.ts +48 -0
  105. package/dist/security/encryption.d.ts.map +1 -0
  106. package/dist/security/encryption.js +131 -0
  107. package/dist/security/encryption.js.map +1 -0
  108. package/dist/security/pii-detector.d.ts +61 -0
  109. package/dist/security/pii-detector.d.ts.map +1 -0
  110. package/dist/security/pii-detector.js +220 -0
  111. package/dist/security/pii-detector.js.map +1 -0
  112. package/dist/types/index.d.ts +151 -0
  113. package/dist/types/index.d.ts.map +1 -0
  114. package/dist/types/index.js +2 -0
  115. package/dist/types/index.js.map +1 -0
  116. package/dist/utils/logger.d.ts +9 -0
  117. package/dist/utils/logger.d.ts.map +1 -0
  118. package/dist/utils/logger.js +10 -0
  119. package/dist/utils/logger.js.map +1 -0
  120. package/package.json +54 -0
@@ -0,0 +1,329 @@
1
+ import Database from 'better-sqlite3';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import fs from 'fs-extra';
5
+ import { Logger } from '../utils/logger.js';
6
+ const logger = new Logger('ConceptStore');
7
+ export class ConceptStore {
8
+ db;
9
+ static instances = new Map();
10
+ projectId;
11
+ constructor(projectId) {
12
+ this.projectId = projectId;
13
+ // ISOLATED concept store per project - no pollution!
14
+ const kratosHome = path.join(os.homedir(), '.kratos');
15
+ const dbPath = path.join(kratosHome, 'projects', projectId, 'databases', 'concepts.db');
16
+ fs.ensureDirSync(path.dirname(dbPath));
17
+ this.db = new Database(dbPath);
18
+ this.db.pragma('journal_mode = WAL');
19
+ this.initializeSchema();
20
+ logger.info(`Concept store ISOLATED for project: ${projectId}`);
21
+ }
22
+ static getInstance(projectId) {
23
+ const id = projectId || 'global';
24
+ if (!ConceptStore.instances.has(id)) {
25
+ ConceptStore.instances.set(id, new ConceptStore(id));
26
+ }
27
+ return ConceptStore.instances.get(id);
28
+ }
29
+ initializeSchema() {
30
+ this.db.exec(`
31
+ CREATE TABLE IF NOT EXISTS concepts (
32
+ id TEXT PRIMARY KEY,
33
+ title TEXT NOT NULL,
34
+ body TEXT NOT NULL,
35
+ tags TEXT DEFAULT '[]',
36
+ importance INTEGER DEFAULT 3 CHECK(importance >= 1 AND importance <= 5),
37
+ created_at INTEGER NOT NULL,
38
+ updated_at INTEGER NOT NULL
39
+ );
40
+
41
+ CREATE INDEX IF NOT EXISTS idx_concept_importance ON concepts(importance DESC);
42
+ CREATE INDEX IF NOT EXISTS idx_concept_created ON concepts(created_at DESC);
43
+
44
+ CREATE VIRTUAL TABLE IF NOT EXISTS concept_fts USING fts5(
45
+ title,
46
+ body,
47
+ content='concepts',
48
+ content_rowid='rowid',
49
+ tokenize='porter unicode61'
50
+ );
51
+
52
+ -- FTS sync triggers
53
+ CREATE TRIGGER IF NOT EXISTS concept_fts_insert AFTER INSERT ON concepts BEGIN
54
+ INSERT INTO concept_fts(rowid, title, body) VALUES (new.rowid, new.title, new.body);
55
+ END;
56
+
57
+ CREATE TRIGGER IF NOT EXISTS concept_fts_delete AFTER DELETE ON concepts BEGIN
58
+ DELETE FROM concept_fts WHERE rowid = old.rowid;
59
+ END;
60
+
61
+ CREATE TRIGGER IF NOT EXISTS concept_fts_update AFTER UPDATE ON concepts BEGIN
62
+ DELETE FROM concept_fts WHERE rowid = old.rowid;
63
+ INSERT INTO concept_fts(rowid, title, body) VALUES (new.rowid, new.title, new.body);
64
+ END;
65
+
66
+ -- Allowlist table for project-level concept permissions
67
+ CREATE TABLE IF NOT EXISTS project_allowlists (
68
+ project_id TEXT NOT NULL,
69
+ concept_id TEXT NOT NULL,
70
+ added_at INTEGER NOT NULL,
71
+ PRIMARY KEY (project_id, concept_id),
72
+ FOREIGN KEY (concept_id) REFERENCES concepts(id) ON DELETE CASCADE
73
+ );
74
+
75
+ CREATE INDEX IF NOT EXISTS idx_allowlist_project ON project_allowlists(project_id);
76
+ `);
77
+ // Seed initial concepts if empty
78
+ this.seedInitialConcepts();
79
+ }
80
+ seedInitialConcepts() {
81
+ const count = this.db.prepare('SELECT COUNT(*) as count FROM concepts').get();
82
+ if (count.count === 0) {
83
+ const initialConcepts = [
84
+ {
85
+ id: 'jwt-auth-v2',
86
+ title: 'JWT Authentication Pattern',
87
+ body: 'Standard JWT auth flow: 1) Client sends credentials 2) Server validates, generates JWT with claims 3) Client includes JWT in Authorization header 4) Server validates JWT signature & expiry 5) Extract user from claims. Key: Use RS256 for production, short expiry + refresh tokens.',
88
+ tags: ['jwt', 'auth', 'security', 'pattern'],
89
+ importance: 5
90
+ },
91
+ {
92
+ id: 's3-upload-checklist',
93
+ title: 'S3 Upload Security Checklist',
94
+ body: 'Before S3 uploads: Generate presigned URLs server-side, Set expiry < 5min, Validate file type/size, Use random S3 keys (not user filenames), Set bucket CORS policy, Enable versioning, Configure lifecycle rules, Monitor with CloudWatch',
95
+ tags: ['s3', 'aws', 'upload', 'security', 'checklist'],
96
+ importance: 5
97
+ },
98
+ {
99
+ id: 'rate-limiter-pattern',
100
+ title: 'API Rate Limiting Pattern',
101
+ body: 'Token bucket algorithm: Each user gets N tokens/minute. Request costs 1 token. If tokens=0, reject with 429. Refill tokens at fixed rate. Implementation: Redis INCR with TTL, or in-memory with sliding window. Add headers: X-RateLimit-Limit/Remaining/Reset.',
102
+ tags: ['api', 'rate-limit', 'security', 'pattern'],
103
+ importance: 4
104
+ },
105
+ {
106
+ id: 'error-boundary-react',
107
+ title: 'React Error Boundary Pattern',
108
+ body: 'Catch React component errors: class ErrorBoundary extends React.Component { componentDidCatch(error, info) { logError(error, info); } render() { if (hasError) return <Fallback />; return children; }}. Wrap at route level. Cannot catch: async errors, event handlers, SSR.',
109
+ tags: ['react', 'error-handling', 'pattern', 'frontend'],
110
+ importance: 4
111
+ },
112
+ {
113
+ id: 'db-migration-safety',
114
+ title: 'Safe Database Migration Checklist',
115
+ body: 'Safe migrations: Always backup first, Test rollback, Make backwards compatible, Separate schema vs data migrations, Add indexes CONCURRENTLY, Avoid NOT NULL without default, Use transactions, Monitor during deploy, Have recovery plan',
116
+ tags: ['database', 'migration', 'safety', 'checklist'],
117
+ importance: 5
118
+ }
119
+ ];
120
+ const stmt = this.db.prepare(`
121
+ INSERT INTO concepts (id, title, body, tags, importance, created_at, updated_at)
122
+ VALUES (?, ?, ?, ?, ?, ?, ?)
123
+ `);
124
+ const now = Date.now();
125
+ for (const concept of initialConcepts) {
126
+ stmt.run(concept.id, concept.title, concept.body, JSON.stringify(concept.tags), concept.importance, now, now);
127
+ }
128
+ logger.info(`Seeded ${initialConcepts.length} initial concepts`);
129
+ }
130
+ }
131
+ search(params) {
132
+ const k = params.k || 10;
133
+ // Handle special queries
134
+ const searchQuery = this.normalizeSearchQuery(params.q);
135
+ // Use different query based on whether we have a search term
136
+ let query;
137
+ let queryParams;
138
+ if (searchQuery === '*' || !searchQuery.trim()) {
139
+ // Return all concepts when wildcard or empty query
140
+ query = `
141
+ SELECT
142
+ c.*,
143
+ 1.0 as fts_score,
144
+ '' as snippet
145
+ FROM concepts c
146
+ `;
147
+ queryParams = [];
148
+ }
149
+ else {
150
+ // Normal FTS search
151
+ query = `
152
+ SELECT
153
+ c.*,
154
+ bm25(concept_fts) as fts_score,
155
+ snippet(concept_fts, 0, '[', ']', '...', 32) as snippet
156
+ FROM concepts c
157
+ JOIN concept_fts ON c.rowid = concept_fts.rowid
158
+ WHERE concept_fts MATCH ?
159
+ `;
160
+ queryParams = [searchQuery];
161
+ }
162
+ // Apply allowlist filter if project specified
163
+ if (params.projectId) {
164
+ if (searchQuery === '*') {
165
+ query += ` WHERE c.id IN (
166
+ SELECT concept_id FROM project_allowlists WHERE project_id = ?
167
+ )`;
168
+ }
169
+ else {
170
+ query += ` AND c.id IN (
171
+ SELECT concept_id FROM project_allowlists WHERE project_id = ?
172
+ )`;
173
+ }
174
+ queryParams.push(params.projectId);
175
+ }
176
+ else if (params.allowlist && params.allowlist.length > 0) {
177
+ if (searchQuery === '*') {
178
+ query += ` WHERE c.id IN (${params.allowlist.map(() => '?').join(',')})`;
179
+ }
180
+ else {
181
+ query += ` AND c.id IN (${params.allowlist.map(() => '?').join(',')})`;
182
+ }
183
+ queryParams.push(...params.allowlist);
184
+ }
185
+ // Add appropriate ordering and limit
186
+ if (searchQuery === '*') {
187
+ query += ' ORDER BY c.importance DESC, c.created_at DESC LIMIT ?';
188
+ }
189
+ else {
190
+ query += ' ORDER BY fts_score DESC, c.importance DESC LIMIT ?';
191
+ }
192
+ queryParams.push(k);
193
+ const stmt = this.db.prepare(query);
194
+ const results = stmt.all(...queryParams);
195
+ return results.map(row => ({
196
+ concept: this.rowToConcept(row),
197
+ score: -row.fts_score,
198
+ snippet: row.snippet
199
+ }));
200
+ }
201
+ get(id) {
202
+ const stmt = this.db.prepare('SELECT * FROM concepts WHERE id = ?');
203
+ const row = stmt.get(id);
204
+ return row ? this.rowToConcept(row) : null;
205
+ }
206
+ save(params) {
207
+ const now = Date.now();
208
+ const id = params.id || this.generateConceptId(params.title);
209
+ // Check body length constraint (600-900 chars recommended)
210
+ if (params.body.length > 1200) {
211
+ logger.warn(`Concept body exceeds recommended length: ${params.body.length} chars`);
212
+ }
213
+ const existing = this.get(id);
214
+ if (existing) {
215
+ // Update existing
216
+ const stmt = this.db.prepare(`
217
+ UPDATE concepts
218
+ SET title = ?, body = ?, tags = ?, importance = ?, updated_at = ?
219
+ WHERE id = ?
220
+ `);
221
+ stmt.run(params.title, params.body, JSON.stringify(params.tags || []), params.importance || existing.importance, now, id);
222
+ }
223
+ else {
224
+ // Insert new
225
+ const stmt = this.db.prepare(`
226
+ INSERT INTO concepts (id, title, body, tags, importance, created_at, updated_at)
227
+ VALUES (?, ?, ?, ?, ?, ?, ?)
228
+ `);
229
+ stmt.run(id, params.title, params.body, JSON.stringify(params.tags || []), params.importance || 3, now, now);
230
+ }
231
+ logger.info(`Concept saved: ${id} - ${params.title}`);
232
+ return { id };
233
+ }
234
+ updateAllowlist(params) {
235
+ const result = {};
236
+ if (params.add && params.add.length > 0) {
237
+ const stmt = this.db.prepare(`
238
+ INSERT OR IGNORE INTO project_allowlists (project_id, concept_id, added_at)
239
+ VALUES (?, ?, ?)
240
+ `);
241
+ const now = Date.now();
242
+ const added = [];
243
+ for (const conceptId of params.add) {
244
+ // Verify concept exists
245
+ if (this.get(conceptId)) {
246
+ const res = stmt.run(params.projectId, conceptId, now);
247
+ if (res.changes > 0) {
248
+ added.push(conceptId);
249
+ }
250
+ }
251
+ }
252
+ result.added = added;
253
+ }
254
+ if (params.remove && params.remove.length > 0) {
255
+ const stmt = this.db.prepare(`
256
+ DELETE FROM project_allowlists
257
+ WHERE project_id = ? AND concept_id = ?
258
+ `);
259
+ const removed = [];
260
+ for (const conceptId of params.remove) {
261
+ const res = stmt.run(params.projectId, conceptId);
262
+ if (res.changes > 0) {
263
+ removed.push(conceptId);
264
+ }
265
+ }
266
+ result.removed = removed;
267
+ }
268
+ if (params.list) {
269
+ const stmt = this.db.prepare(`
270
+ SELECT concept_id FROM project_allowlists
271
+ WHERE project_id = ?
272
+ ORDER BY added_at DESC
273
+ `);
274
+ const rows = stmt.all(params.projectId);
275
+ result.allowlist = rows.map(r => r.concept_id);
276
+ }
277
+ return result;
278
+ }
279
+ linkToProject(conceptId, projectId) {
280
+ const concept = this.get(conceptId);
281
+ if (!concept) {
282
+ throw new Error(`Concept not found: ${conceptId}`);
283
+ }
284
+ // This would call the project's memory.save with the concept data
285
+ // For now, we'll return a placeholder
286
+ const memoryId = `mem_linked_${conceptId}_${Date.now()}`;
287
+ logger.info(`Linked concept ${conceptId} to project ${projectId} as ${memoryId}`);
288
+ return { memoryId };
289
+ }
290
+ generateConceptId(title) {
291
+ // Generate readable ID from title
292
+ const base = title
293
+ .toLowerCase()
294
+ .replace(/[^a-z0-9]+/g, '-')
295
+ .replace(/^-|-$/g, '')
296
+ .substring(0, 30);
297
+ return `${base}-v${Date.now() % 1000}`;
298
+ }
299
+ normalizeSearchQuery(query) {
300
+ // Handle empty or whitespace-only queries
301
+ if (!query || !query.trim()) {
302
+ return '*';
303
+ }
304
+ // Handle wildcard queries
305
+ if (query.trim() === '*' || query.trim() === '**') {
306
+ return '*';
307
+ }
308
+ // Escape FTS5 special characters and return
309
+ return this.escapeQuery(query.trim());
310
+ }
311
+ escapeQuery(query) {
312
+ return query.replace(/["]/g, '""');
313
+ }
314
+ rowToConcept(row) {
315
+ return {
316
+ id: row.id,
317
+ title: row.title,
318
+ body: row.body,
319
+ tags: JSON.parse(row.tags),
320
+ importance: row.importance,
321
+ created_at: row.created_at,
322
+ updated_at: row.updated_at
323
+ };
324
+ }
325
+ close() {
326
+ this.db.close();
327
+ }
328
+ }
329
+ //# sourceMappingURL=concept-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concept-store.js","sourceRoot":"","sources":["../../src/memory-server/concept-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export interface ContextInjection {
2
+ id: string;
3
+ type: 'memory' | 'concept';
4
+ summary: string;
5
+ content: string;
6
+ score: number;
7
+ source: string;
8
+ byteSize: number;
9
+ }
10
+ export interface ContextPreview {
11
+ injections: ContextInjection[];
12
+ budgetUsed: number;
13
+ budgetLimit: number;
14
+ topK: number;
15
+ stats: {
16
+ projectMatches: number;
17
+ pathMatches: number;
18
+ conceptMatches: number;
19
+ totalCandidates: number;
20
+ };
21
+ }
22
+ export declare class ContextBroker {
23
+ private memoryDb;
24
+ private conceptStore;
25
+ private projectId;
26
+ private projectRoot;
27
+ constructor(projectRoot: string, projectId: string);
28
+ preview(params: {
29
+ open_files?: string[];
30
+ task: string;
31
+ budget_bytes?: number;
32
+ top_k?: number;
33
+ mode?: 'hard' | 'soft' | 'smart';
34
+ }): Promise<ContextPreview>;
35
+ private scoreMemories;
36
+ private scoreConcepts;
37
+ private selectByBudget;
38
+ private inferPathPrefixes;
39
+ private pathMatchStrength;
40
+ private hasPathMatch;
41
+ /**
42
+ * Extract meaningful search terms from a task description
43
+ * This improves FTS search by focusing on key terms
44
+ */
45
+ private extractSearchTerms;
46
+ private taskMatchStrength;
47
+ private recencyScore;
48
+ private formatMemoryForInjection;
49
+ private formatConceptForInjection;
50
+ private normalizeForDedupe;
51
+ private getProjectAllowlist;
52
+ private contextRules;
53
+ getRules(): {
54
+ maxMemoryAge: number;
55
+ minImportance: number;
56
+ pathBoostMultiplier: number;
57
+ conceptImportanceThreshold: number;
58
+ dedupeThreshold: number;
59
+ };
60
+ setRules(rules: Partial<typeof this.contextRules>): void;
61
+ close(): void;
62
+ }
63
+ //# sourceMappingURL=context-broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-broker.d.ts","sourceRoot":"","sources":["../../src/memory-server/context-broker.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAO5C,OAAO,CAAC,MAAM,EAAE;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;KAClC,GAAG,OAAO,CAAC,cAAc,CAAC;IA+E3B,OAAO,CAAC,aAAa;IAqErB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,wBAAwB;IAiBhC,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,kBAAkB;YAQZ,mBAAmB;IAcjC,OAAO,CAAC,YAAY,CAMlB;IAEF,QAAQ;;;;;;;IAIR,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC;IAKjD,KAAK;CAGN"}