context-vault 3.19.0 → 3.20.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.
- package/bin/cli.js +516 -4
- package/node_modules/@context-vault/core/dist/main.d.ts +1 -0
- package/node_modules/@context-vault/core/dist/main.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/main.js +2 -0
- package/node_modules/@context-vault/core/dist/main.js.map +1 -1
- package/node_modules/@context-vault/core/dist/search.d.ts +1 -0
- package/node_modules/@context-vault/core/dist/search.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/search.js +10 -1
- package/node_modules/@context-vault/core/dist/search.js.map +1 -1
- package/node_modules/@context-vault/core/dist/search.test.d.ts +2 -0
- package/node_modules/@context-vault/core/dist/search.test.d.ts.map +1 -0
- package/node_modules/@context-vault/core/dist/search.test.js +49 -0
- package/node_modules/@context-vault/core/dist/search.test.js.map +1 -0
- package/node_modules/@context-vault/core/package.json +9 -1
- package/node_modules/@context-vault/core/src/main.ts +3 -0
- package/node_modules/@context-vault/core/src/search.test.ts +59 -0
- package/node_modules/@context-vault/core/src/search.ts +11 -1
- package/package.json +2 -2
- package/.claude-plugin/README.md +0 -219
- package/.claude-plugin/plugin.json +0 -11
- package/commands/vault-cleanup.md +0 -43
- package/commands/vault-snapshot.md +0 -43
- package/commands/vault-status.md +0 -35
- package/dist/tools/session-start.d.ts +0 -25
- package/dist/tools/session-start.d.ts.map +0 -1
- package/dist/tools/session-start.js +0 -469
- package/dist/tools/session-start.js.map +0 -1
- package/skills/context-assembly/SKILL.md +0 -308
- package/skills/knowledge-capture/SKILL.md +0 -303
- package/skills/memory-management/SKILL.md +0 -237
- package/src/tools/session-start.ts +0 -527
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# /vault-snapshot — Create a Context Brief
|
|
2
|
-
|
|
3
|
-
Consolidate scattered vault entries on a topic into a single brief.
|
|
4
|
-
|
|
5
|
-
## Steps
|
|
6
|
-
|
|
7
|
-
1. Ask the user what topic they want a snapshot of. Also ask which project bucket to scope to (if not obvious from context).
|
|
8
|
-
|
|
9
|
-
2. Call `create_snapshot` with the topic as a **natural language search query** (not a slug):
|
|
10
|
-
```
|
|
11
|
-
create_snapshot({
|
|
12
|
-
topic: "API authentication decisions and patterns",
|
|
13
|
-
buckets: ["project-name"],
|
|
14
|
-
kinds: ["decision", "pattern"],
|
|
15
|
-
tags: ["authentication"]
|
|
16
|
-
})
|
|
17
|
-
```
|
|
18
|
-
All parameters except `topic` are optional. `kinds` filters by entry kind. `tags` adds tag filters. `buckets` scopes to a project.
|
|
19
|
-
|
|
20
|
-
3. The tool returns a short confirmation (not the brief content):
|
|
21
|
-
```
|
|
22
|
-
✓ Snapshot created → id: <entry-id>
|
|
23
|
-
title: <topic> — Context Brief
|
|
24
|
-
identity_key: snapshot-<slugified-topic>
|
|
25
|
-
synthesized from: N entries
|
|
26
|
-
```
|
|
27
|
-
The brief is saved to the vault as a `kind: brief` entry.
|
|
28
|
-
|
|
29
|
-
4. To show the user the brief, make a follow-up call:
|
|
30
|
-
```
|
|
31
|
-
get_context({ kind: "brief", identity_key: "snapshot-<slugified-topic>" })
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
5. Present the brief and offer next steps:
|
|
35
|
-
- "Share this with your team" via `publish_to_team({ id: "<entry-id>" })`
|
|
36
|
-
- "Create another snapshot on a related topic"
|
|
37
|
-
- "Search for more context" via `get_context`
|
|
38
|
-
|
|
39
|
-
## Tips
|
|
40
|
-
|
|
41
|
-
- The `topic` is used as a search query (hybrid FTS + semantic). Use descriptive natural language for best results. "API authentication decisions" works better than "api-auth".
|
|
42
|
-
- If "no entries found," try a broader query or different bucket.
|
|
43
|
-
- Snapshots are idempotent on `identity_key`. Re-running with the same topic updates the existing snapshot.
|
package/commands/vault-status.md
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# /vault-status — Vault Health Check
|
|
2
|
-
|
|
3
|
-
Check the health and metrics of your context vault.
|
|
4
|
-
|
|
5
|
-
## Steps
|
|
6
|
-
|
|
7
|
-
1. Call `context_status()` (no arguments needed).
|
|
8
|
-
2. The tool returns a structured markdown dashboard with sections for entries by kind, recall frequency, learning rate, stale knowledge, growth warnings, and suggested actions. Present it to the user.
|
|
9
|
-
3. After presenting the dashboard, add your own analysis (see below).
|
|
10
|
-
|
|
11
|
-
## Analysis Guidelines
|
|
12
|
-
|
|
13
|
-
**Positive signals to highlight:**
|
|
14
|
-
- High embedding coverage (>90%)
|
|
15
|
-
- Active recall (recall:save ratio above 1:1)
|
|
16
|
-
- Regular saves per session (>1.0)
|
|
17
|
-
- No stale paths or startup errors
|
|
18
|
-
|
|
19
|
-
**Warning signs to flag:**
|
|
20
|
-
- Embedding coverage below 80%: suggest running `context-vault reindex`
|
|
21
|
-
- Zero saves in 30 days: knowledge may be getting lost between sessions
|
|
22
|
-
- Stale paths detected: auto-reindex will fix on next search
|
|
23
|
-
- Growth warnings present: review the kind breakdown for noise (session, feedback entries dominating)
|
|
24
|
-
- Stale knowledge entries: the tool flags entries not updated within their kind-specific staleness window (pattern: 180d, decision: 365d, reference: 90d)
|
|
25
|
-
- Startup errors in the error log: point the user to the log path
|
|
26
|
-
|
|
27
|
-
**Recall ratio (JSON block at the end of the dashboard):**
|
|
28
|
-
- Below 0.10: most entries are never retrieved. Suggest better tagging, encoding_context, and snapshots.
|
|
29
|
-
- Above 0.25: healthy.
|
|
30
|
-
|
|
31
|
-
## Do NOT
|
|
32
|
-
|
|
33
|
-
- Fabricate metrics or example output. Only report what the tool returns.
|
|
34
|
-
- Suggest `npm run build` for any issue. The correct commands are `context-vault reindex`, `context-vault doctor`, or `context-vault setup`.
|
|
35
|
-
- Invent thresholds. Use the warnings the tool itself generates.
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import type { LocalCtx, SharedCtx, ToolResult } from '../types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Extract keywords from a signal string.
|
|
5
|
-
* Split on whitespace, filter stopwords and words under 4 chars, keep top 10.
|
|
6
|
-
*/
|
|
7
|
-
export declare function extractKeywords(signal: string): string[];
|
|
8
|
-
export declare const name = "recall";
|
|
9
|
-
export declare const description = "Search the vault using a raw signal (prompt text, error message, file path, or task context). Returns lightweight hints for proactive surfacing. Designed for runtime hooks, not direct user interaction.";
|
|
10
|
-
export declare const inputSchema: {
|
|
11
|
-
signal: z.ZodString;
|
|
12
|
-
signal_type: z.ZodEnum<{
|
|
13
|
-
prompt: "prompt";
|
|
14
|
-
task: "task";
|
|
15
|
-
error: "error";
|
|
16
|
-
file: "file";
|
|
17
|
-
}>;
|
|
18
|
-
bucket: z.ZodOptional<z.ZodString>;
|
|
19
|
-
session_id: z.ZodOptional<z.ZodString>;
|
|
20
|
-
max_hints: z.ZodOptional<z.ZodNumber>;
|
|
21
|
-
};
|
|
22
|
-
export declare function handler({ signal, signal_type, bucket, session_id, max_hints }: Record<string, any>, ctx: LocalCtx, { ensureIndexed }: SharedCtx): Promise<ToolResult>;
|
|
23
|
-
/** Reset session dedup state (for testing) */
|
|
24
|
-
export declare function _resetSessionState(): void;
|
|
25
|
-
//# sourceMappingURL=session-start.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/tools/session-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA0BnE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBxD;AAED,eAAO,MAAM,IAAI,WAAW,CAAC;AAE7B,eAAO,MAAM,WAAW,8MACqL,CAAC;AAE9M,eAAO,MAAM,WAAW;;;;;;;;;;;CAmBvB,CAAC;AAEF,wBAAsB,OAAO,CAC3B,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3E,GAAG,EAAE,QAAQ,EACb,EAAE,aAAa,EAAE,EAAE,SAAS,GAC3B,OAAO,CAAC,UAAU,CAAC,CAoarB;AAoBD,8CAA8C;AAC9C,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -1,469 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ok } from '../helpers.js';
|
|
3
|
-
import { isEmbedAvailable } from '@context-vault/core/embed';
|
|
4
|
-
import { getAutoMemory, findAutoMemoryOverlaps } from '../auto-memory.js';
|
|
5
|
-
import { getRemoteClient, getTeamId, getPublicVaults } from '../remote.js';
|
|
6
|
-
const SEMANTIC_SIMILARITY_THRESHOLD = 0.6;
|
|
7
|
-
const CO_RETRIEVAL_WEIGHT_CAP = 50;
|
|
8
|
-
const STOPWORDS = new Set([
|
|
9
|
-
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
10
|
-
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
11
|
-
'should', 'may', 'might', 'shall', 'can', 'need', 'must', 'ought',
|
|
12
|
-
'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'for', 'with',
|
|
13
|
-
'from', 'into', 'during', 'before', 'after', 'above', 'below',
|
|
14
|
-
'to', 'of', 'in', 'on', 'at', 'by', 'about', 'between', 'through',
|
|
15
|
-
'this', 'that', 'these', 'those', 'it', 'its', 'they', 'them',
|
|
16
|
-
'their', 'we', 'our', 'you', 'your', 'he', 'she', 'him', 'her',
|
|
17
|
-
'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other',
|
|
18
|
-
'some', 'such', 'no', 'only', 'own', 'same', 'than', 'too', 'very',
|
|
19
|
-
'just', 'also', 'now', 'then', 'here', 'there', 'when', 'where',
|
|
20
|
-
'how', 'what', 'which', 'who', 'whom', 'why', 'if', 'because',
|
|
21
|
-
'as', 'until', 'while', 'use', 'using', 'used',
|
|
22
|
-
]);
|
|
23
|
-
const DEFAULT_MAX_HINTS = 3;
|
|
24
|
-
/** Module-level session dedup map: session_id -> Set of surfaced entry IDs */
|
|
25
|
-
const sessionSurfaced = new Map();
|
|
26
|
-
/**
|
|
27
|
-
* Extract keywords from a signal string.
|
|
28
|
-
* Split on whitespace, filter stopwords and words under 4 chars, keep top 10.
|
|
29
|
-
*/
|
|
30
|
-
export function extractKeywords(signal) {
|
|
31
|
-
const words = signal
|
|
32
|
-
.toLowerCase()
|
|
33
|
-
.replace(/[^a-z0-9\s_-]/g, ' ')
|
|
34
|
-
.split(/\s+/)
|
|
35
|
-
.filter((w) => w.length >= 4 && !STOPWORDS.has(w));
|
|
36
|
-
const seen = new Set();
|
|
37
|
-
const unique = [];
|
|
38
|
-
for (const w of words) {
|
|
39
|
-
if (seen.has(w))
|
|
40
|
-
continue;
|
|
41
|
-
seen.add(w);
|
|
42
|
-
unique.push(w);
|
|
43
|
-
if (unique.length >= 10)
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
return unique;
|
|
47
|
-
}
|
|
48
|
-
export const name = 'recall';
|
|
49
|
-
export const description = 'Search the vault using a raw signal (prompt text, error message, file path, or task context). Returns lightweight hints for proactive surfacing. Designed for runtime hooks, not direct user interaction.';
|
|
50
|
-
export const inputSchema = {
|
|
51
|
-
signal: z
|
|
52
|
-
.string()
|
|
53
|
-
.describe('Raw text: prompt, error message, file path, or combined signal.'),
|
|
54
|
-
signal_type: z
|
|
55
|
-
.enum(['prompt', 'error', 'file', 'task'])
|
|
56
|
-
.describe('Type of signal, used to weight results.'),
|
|
57
|
-
bucket: z
|
|
58
|
-
.string()
|
|
59
|
-
.optional()
|
|
60
|
-
.describe('Scope results to a project bucket.'),
|
|
61
|
-
session_id: z
|
|
62
|
-
.string()
|
|
63
|
-
.optional()
|
|
64
|
-
.describe('Session identifier for dedup. Entries already surfaced this session are suppressed.'),
|
|
65
|
-
max_hints: z
|
|
66
|
-
.number()
|
|
67
|
-
.optional()
|
|
68
|
-
.describe('Maximum hints to return. Default: 3.'),
|
|
69
|
-
};
|
|
70
|
-
export async function handler({ signal, signal_type, bucket, session_id, max_hints }, ctx, { ensureIndexed }) {
|
|
71
|
-
const start = Date.now();
|
|
72
|
-
await ensureIndexed();
|
|
73
|
-
const keywords = extractKeywords(signal || '');
|
|
74
|
-
const limit = max_hints ?? DEFAULT_MAX_HINTS;
|
|
75
|
-
if (keywords.length === 0) {
|
|
76
|
-
const result = ok('No relevant entries found.');
|
|
77
|
-
result._meta = {
|
|
78
|
-
latency_ms: Date.now() - start,
|
|
79
|
-
method: 'none',
|
|
80
|
-
signal_keywords: [],
|
|
81
|
-
suppressed: 0,
|
|
82
|
-
};
|
|
83
|
-
return result;
|
|
84
|
-
}
|
|
85
|
-
// Build fast-path query: tag/title LIKE match for each keyword
|
|
86
|
-
const conditions = [];
|
|
87
|
-
const params = [];
|
|
88
|
-
for (const kw of keywords) {
|
|
89
|
-
conditions.push('(title LIKE ? OR tags LIKE ?)');
|
|
90
|
-
params.push(`%${kw}%`, `%${kw}%`);
|
|
91
|
-
}
|
|
92
|
-
const bucketClause = bucket ? ' AND tags LIKE ?' : '';
|
|
93
|
-
if (bucket)
|
|
94
|
-
params.push(`%"bucket:${bucket}"%`);
|
|
95
|
-
const sql = `SELECT id, title, substr(body, 1, 100) as summary, kind, tags, tier
|
|
96
|
-
FROM vault
|
|
97
|
-
WHERE indexed = 1
|
|
98
|
-
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
99
|
-
AND superseded_by IS NULL
|
|
100
|
-
AND (${conditions.join(' OR ')})${bucketClause}
|
|
101
|
-
LIMIT 20`;
|
|
102
|
-
let rows;
|
|
103
|
-
try {
|
|
104
|
-
rows = ctx.db.prepare(sql).all(...params);
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
rows = [];
|
|
108
|
-
}
|
|
109
|
-
// Session dedup
|
|
110
|
-
let suppressed = 0;
|
|
111
|
-
const bypassDedup = signal_type === 'error';
|
|
112
|
-
const sessionSet = session_id
|
|
113
|
-
? (sessionSurfaced.get(session_id) ?? (() => { const s = new Set(); sessionSurfaced.set(session_id, s); return s; })())
|
|
114
|
-
: null;
|
|
115
|
-
const hints = [];
|
|
116
|
-
for (const row of rows) {
|
|
117
|
-
if (hints.length >= limit)
|
|
118
|
-
break;
|
|
119
|
-
// Dedup check
|
|
120
|
-
if (sessionSet && !bypassDedup && sessionSet.has(row.id)) {
|
|
121
|
-
suppressed++;
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
const entryTags = row.tags ? JSON.parse(row.tags) : [];
|
|
125
|
-
// Score relevance: count how many keywords match title or tags
|
|
126
|
-
let matchCount = 0;
|
|
127
|
-
const titleLower = (row.title || '').toLowerCase();
|
|
128
|
-
const tagsLower = (row.tags || '').toLowerCase();
|
|
129
|
-
for (const kw of keywords) {
|
|
130
|
-
if (titleLower.includes(kw) || tagsLower.includes(kw))
|
|
131
|
-
matchCount++;
|
|
132
|
-
}
|
|
133
|
-
const isDurable = row.tier === 'durable';
|
|
134
|
-
const relevance = (matchCount >= 2 || (isDurable && matchCount >= 1)) ? 'high' : 'medium';
|
|
135
|
-
hints.push({
|
|
136
|
-
id: row.id,
|
|
137
|
-
title: row.title || '(untitled)',
|
|
138
|
-
summary: row.summary || '',
|
|
139
|
-
relevance,
|
|
140
|
-
kind: row.kind || 'knowledge',
|
|
141
|
-
tags: entryTags,
|
|
142
|
-
});
|
|
143
|
-
// Track surfaced
|
|
144
|
-
if (sessionSet)
|
|
145
|
-
sessionSet.add(row.id);
|
|
146
|
-
}
|
|
147
|
-
// Remote recall: merge hints from hosted API
|
|
148
|
-
const remoteClient = getRemoteClient(ctx.config);
|
|
149
|
-
if (remoteClient && hints.length < limit) {
|
|
150
|
-
try {
|
|
151
|
-
const remoteHints = await remoteClient.recall({
|
|
152
|
-
signal,
|
|
153
|
-
signal_type,
|
|
154
|
-
bucket,
|
|
155
|
-
max_hints: limit - hints.length,
|
|
156
|
-
});
|
|
157
|
-
const localIds = new Set(hints.map(h => h.id));
|
|
158
|
-
for (const rh of remoteHints) {
|
|
159
|
-
if (hints.length >= limit)
|
|
160
|
-
break;
|
|
161
|
-
if (localIds.has(rh.id))
|
|
162
|
-
continue;
|
|
163
|
-
if (sessionSet && !bypassDedup && sessionSet.has(rh.id)) {
|
|
164
|
-
suppressed++;
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
hints.push(rh);
|
|
168
|
-
if (sessionSet)
|
|
169
|
-
sessionSet.add(rh.id);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
catch (e) {
|
|
173
|
-
console.warn(`[context-vault] Remote recall failed: ${e.message}`);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Team vault recall: include team results if teamId is configured
|
|
177
|
-
const teamId = getTeamId(ctx.config);
|
|
178
|
-
if (remoteClient && teamId && hints.length < limit) {
|
|
179
|
-
try {
|
|
180
|
-
const teamHints = await remoteClient.teamRecall(teamId, {
|
|
181
|
-
signal,
|
|
182
|
-
signal_type,
|
|
183
|
-
bucket,
|
|
184
|
-
max_hints: limit - hints.length,
|
|
185
|
-
});
|
|
186
|
-
const existingIds = new Set(hints.map(h => h.id));
|
|
187
|
-
for (const th of teamHints) {
|
|
188
|
-
if (hints.length >= limit)
|
|
189
|
-
break;
|
|
190
|
-
if (existingIds.has(th.id))
|
|
191
|
-
continue;
|
|
192
|
-
if (sessionSet && !bypassDedup && sessionSet.has(th.id)) {
|
|
193
|
-
suppressed++;
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
hints.push({ ...th, tags: [...(th.tags || []), '[team]'] });
|
|
197
|
-
if (sessionSet)
|
|
198
|
-
sessionSet.add(th.id);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
catch (e) {
|
|
202
|
-
console.warn(`[context-vault] Team recall failed: ${e.message}`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
// Public vault recall: query each configured public vault
|
|
206
|
-
const publicVaultSlugs = getPublicVaults(ctx.config);
|
|
207
|
-
if (remoteClient && publicVaultSlugs.length > 0 && hints.length < limit) {
|
|
208
|
-
const publicRecalls = publicVaultSlugs.map(slug => remoteClient.publicRecall(slug, {
|
|
209
|
-
signal,
|
|
210
|
-
signal_type,
|
|
211
|
-
bucket,
|
|
212
|
-
max_hints: limit - hints.length,
|
|
213
|
-
}).catch(e => {
|
|
214
|
-
console.warn(`[context-vault] Public vault "${slug}" recall failed: ${e.message}`);
|
|
215
|
-
return [];
|
|
216
|
-
}));
|
|
217
|
-
try {
|
|
218
|
-
const allPublicHints = await Promise.all(publicRecalls);
|
|
219
|
-
const existingIds = new Set(hints.map(h => h.id));
|
|
220
|
-
for (const publicHints of allPublicHints) {
|
|
221
|
-
for (const ph of publicHints) {
|
|
222
|
-
if (hints.length >= limit)
|
|
223
|
-
break;
|
|
224
|
-
if (existingIds.has(ph.id))
|
|
225
|
-
continue;
|
|
226
|
-
if (sessionSet && !bypassDedup && sessionSet.has(ph.id)) {
|
|
227
|
-
suppressed++;
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
hints.push({ ...ph, tags: [...(ph.tags || []), '[public]'] });
|
|
231
|
-
if (sessionSet)
|
|
232
|
-
sessionSet.add(ph.id);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
catch (e) {
|
|
237
|
-
console.warn(`[context-vault] Public vault recall failed: ${e.message}`);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
let method = hints.length > 0 ? 'tag_match' : 'none';
|
|
241
|
-
// Associative recall: always search durables semantically (regardless of keyword hits)
|
|
242
|
-
if (signal_type !== 'file' && isEmbedAvailable()) {
|
|
243
|
-
try {
|
|
244
|
-
const durableCount = ctx.db.prepare("SELECT COUNT(*) as c FROM vault_vec v JOIN vault e ON e.rowid = v.rowid WHERE e.tier = 'durable'").get().c;
|
|
245
|
-
if (durableCount > 0) {
|
|
246
|
-
const queryVec = await ctx.embed(signal);
|
|
247
|
-
if (queryVec) {
|
|
248
|
-
// KNN against all vectors, then filter to durables in hydration
|
|
249
|
-
const vecRows = ctx.db
|
|
250
|
-
.prepare('SELECT v.rowid, v.distance FROM vault_vec v WHERE embedding MATCH ? ORDER BY distance LIMIT 15')
|
|
251
|
-
.all(queryVec);
|
|
252
|
-
// Merge content vectors (vault_vec) and context vectors (vault_ctx_vec)
|
|
253
|
-
// Content vectors match on what the entry says; context vectors match on
|
|
254
|
-
// when/where the decision applies (encoding_context), bridging vocabulary gaps.
|
|
255
|
-
let ctxVecRows = [];
|
|
256
|
-
try {
|
|
257
|
-
const ctxVecCount = ctx.db.prepare('SELECT COUNT(*) as c FROM vault_ctx_vec').get().c;
|
|
258
|
-
if (ctxVecCount > 0) {
|
|
259
|
-
ctxVecRows = ctx.db
|
|
260
|
-
.prepare('SELECT v.rowid, v.distance FROM vault_ctx_vec v WHERE embedding MATCH ? ORDER BY distance LIMIT 15')
|
|
261
|
-
.all(queryVec);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
// vault_ctx_vec may not exist or be empty
|
|
266
|
-
}
|
|
267
|
-
// Combine both vector result sets, keeping best distance per rowid
|
|
268
|
-
const mergedDistMap = new Map();
|
|
269
|
-
for (const vr of vecRows) {
|
|
270
|
-
mergedDistMap.set(vr.rowid, vr.distance);
|
|
271
|
-
}
|
|
272
|
-
for (const cr of ctxVecRows) {
|
|
273
|
-
const existing = mergedDistMap.get(cr.rowid);
|
|
274
|
-
if (existing === undefined || cr.distance < existing) {
|
|
275
|
-
mergedDistMap.set(cr.rowid, cr.distance);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
const allRowids = [...mergedDistMap.keys()];
|
|
279
|
-
if (allRowids.length) {
|
|
280
|
-
const placeholders = allRowids.map(() => '?').join(',');
|
|
281
|
-
const hydrated = ctx.db
|
|
282
|
-
.prepare(`SELECT rowid, id, title, substr(body, 1, 150) as summary, kind, tags, tier FROM vault
|
|
283
|
-
WHERE rowid IN (${placeholders})
|
|
284
|
-
AND tier = 'durable'
|
|
285
|
-
AND indexed = 1
|
|
286
|
-
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
287
|
-
AND superseded_by IS NULL`)
|
|
288
|
-
.all(...allRowids);
|
|
289
|
-
const byRowid = new Map();
|
|
290
|
-
for (const row of hydrated)
|
|
291
|
-
byRowid.set(row.rowid, row);
|
|
292
|
-
const existingIds = new Set(hints.map(h => h.id));
|
|
293
|
-
// Sort by distance (best first)
|
|
294
|
-
const sorted = allRowids
|
|
295
|
-
.map(rowid => ({ rowid, distance: mergedDistMap.get(rowid) }))
|
|
296
|
-
.sort((a, b) => a.distance - b.distance);
|
|
297
|
-
for (const { rowid, distance } of sorted) {
|
|
298
|
-
if (hints.length >= limit + 2)
|
|
299
|
-
break;
|
|
300
|
-
const row = byRowid.get(rowid);
|
|
301
|
-
if (!row)
|
|
302
|
-
continue;
|
|
303
|
-
if (existingIds.has(row.id))
|
|
304
|
-
continue;
|
|
305
|
-
const similarity = Math.max(0, 1 - distance / 2);
|
|
306
|
-
if (similarity < 0.45)
|
|
307
|
-
continue;
|
|
308
|
-
if (sessionSet && !bypassDedup && sessionSet.has(row.id)) {
|
|
309
|
-
suppressed++;
|
|
310
|
-
continue;
|
|
311
|
-
}
|
|
312
|
-
hints.push({
|
|
313
|
-
id: row.id,
|
|
314
|
-
title: row.title || '(untitled)',
|
|
315
|
-
summary: row.summary || '',
|
|
316
|
-
relevance: similarity >= 0.6 ? 'high' : 'medium',
|
|
317
|
-
kind: row.kind || 'knowledge',
|
|
318
|
-
tags: row.tags ? JSON.parse(row.tags) : [],
|
|
319
|
-
});
|
|
320
|
-
if (sessionSet)
|
|
321
|
-
sessionSet.add(row.id);
|
|
322
|
-
}
|
|
323
|
-
if (method === 'none' && hints.length > 0)
|
|
324
|
-
method = 'durable_semantic';
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
catch {
|
|
330
|
-
// Associative recall is best-effort
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
// Semantic fallback: when fast-path returns 0 results and signal is not file-based
|
|
334
|
-
if (hints.length === 0 && signal_type !== 'file' && isEmbedAvailable()) {
|
|
335
|
-
try {
|
|
336
|
-
const vecCount = ctx.db.prepare('SELECT COUNT(*) as c FROM vault_vec').get().c;
|
|
337
|
-
if (vecCount > 0) {
|
|
338
|
-
const queryVec = await ctx.embed(signal);
|
|
339
|
-
if (queryVec) {
|
|
340
|
-
const vecRows = ctx.db
|
|
341
|
-
.prepare('SELECT v.rowid, v.distance FROM vault_vec v WHERE embedding MATCH ? ORDER BY distance LIMIT 5')
|
|
342
|
-
.all(queryVec);
|
|
343
|
-
if (vecRows.length) {
|
|
344
|
-
const rowids = vecRows.map((vr) => vr.rowid);
|
|
345
|
-
const placeholders = rowids.map(() => '?').join(',');
|
|
346
|
-
let bucketFilter = '';
|
|
347
|
-
const hydrateParams = [...rowids];
|
|
348
|
-
if (bucket) {
|
|
349
|
-
bucketFilter = ' AND tags LIKE ?';
|
|
350
|
-
hydrateParams.push(`%"bucket:${bucket}"%`);
|
|
351
|
-
}
|
|
352
|
-
const hydrated = ctx.db
|
|
353
|
-
.prepare(`SELECT rowid, id, title, substr(body, 1, 100) as summary, kind, tags FROM vault WHERE rowid IN (${placeholders}) AND indexed = 1 AND (expires_at IS NULL OR expires_at > datetime('now')) AND superseded_by IS NULL${bucketFilter}`)
|
|
354
|
-
.all(...hydrateParams);
|
|
355
|
-
const byRowid = new Map();
|
|
356
|
-
for (const row of hydrated)
|
|
357
|
-
byRowid.set(row.rowid, row);
|
|
358
|
-
for (const vr of vecRows) {
|
|
359
|
-
if (hints.length >= limit)
|
|
360
|
-
break;
|
|
361
|
-
const row = byRowid.get(vr.rowid);
|
|
362
|
-
if (!row)
|
|
363
|
-
continue;
|
|
364
|
-
const similarity = Math.max(0, 1 - vr.distance / 2);
|
|
365
|
-
if (similarity < SEMANTIC_SIMILARITY_THRESHOLD)
|
|
366
|
-
continue;
|
|
367
|
-
// Session dedup
|
|
368
|
-
if (sessionSet && !bypassDedup && sessionSet.has(row.id)) {
|
|
369
|
-
suppressed++;
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
const entryTags = row.tags ? JSON.parse(row.tags) : [];
|
|
373
|
-
hints.push({
|
|
374
|
-
id: row.id,
|
|
375
|
-
title: row.title || '(untitled)',
|
|
376
|
-
summary: row.summary || '',
|
|
377
|
-
relevance: similarity >= 0.8 ? 'high' : 'medium',
|
|
378
|
-
kind: row.kind || 'knowledge',
|
|
379
|
-
tags: entryTags,
|
|
380
|
-
});
|
|
381
|
-
if (sessionSet)
|
|
382
|
-
sessionSet.add(row.id);
|
|
383
|
-
}
|
|
384
|
-
if (hints.length > 0)
|
|
385
|
-
method = 'semantic';
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
catch {
|
|
391
|
-
// Semantic fallback is best-effort; fast path already ran
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
const latency = Date.now() - start;
|
|
395
|
-
if (hints.length === 0) {
|
|
396
|
-
const result = ok('No relevant entries found.');
|
|
397
|
-
result._meta = {
|
|
398
|
-
latency_ms: latency,
|
|
399
|
-
method,
|
|
400
|
-
signal_keywords: keywords,
|
|
401
|
-
suppressed,
|
|
402
|
-
};
|
|
403
|
-
return result;
|
|
404
|
-
}
|
|
405
|
-
// Record co-retrieval pairs (fire and forget, non-blocking)
|
|
406
|
-
if (hints.length >= 2) {
|
|
407
|
-
recordCoRetrieval(ctx, hints.map((h) => h.id));
|
|
408
|
-
}
|
|
409
|
-
// Check for auto-memory overlap to avoid redundant surfacing
|
|
410
|
-
let autoMemoryOverlaps = [];
|
|
411
|
-
try {
|
|
412
|
-
const autoMemory = getAutoMemory();
|
|
413
|
-
if (autoMemory.detected && autoMemory.entries.length > 0) {
|
|
414
|
-
for (const h of hints) {
|
|
415
|
-
const searchText = [h.title, h.summary].filter(Boolean).join(' ');
|
|
416
|
-
const overlaps = findAutoMemoryOverlaps(autoMemory, searchText, 0.3);
|
|
417
|
-
if (overlaps.length > 0) {
|
|
418
|
-
autoMemoryOverlaps.push({
|
|
419
|
-
hint_id: h.id,
|
|
420
|
-
memory_file: overlaps[0].file,
|
|
421
|
-
memory_name: overlaps[0].name,
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
catch {
|
|
428
|
-
// Non-fatal
|
|
429
|
-
}
|
|
430
|
-
// Format output
|
|
431
|
-
const lines = [`[Vault: ${hints.length} ${hints.length === 1 ? 'entry' : 'entries'} may be relevant]`];
|
|
432
|
-
for (const h of hints) {
|
|
433
|
-
const overlap = autoMemoryOverlaps.find(o => o.hint_id === h.id);
|
|
434
|
-
const overlapNote = overlap ? ` [also in auto-memory: ${overlap.memory_name}]` : '';
|
|
435
|
-
lines.push(`- "${h.title}" (${h.kind}, ${h.relevance})${overlapNote}`);
|
|
436
|
-
}
|
|
437
|
-
lines.push('Use get_context to retrieve full details.');
|
|
438
|
-
const result = ok(lines.join('\n'));
|
|
439
|
-
result._meta = {
|
|
440
|
-
latency_ms: latency,
|
|
441
|
-
method,
|
|
442
|
-
signal_keywords: keywords,
|
|
443
|
-
suppressed,
|
|
444
|
-
hints,
|
|
445
|
-
auto_memory_overlaps: autoMemoryOverlaps.length > 0 ? autoMemoryOverlaps : undefined,
|
|
446
|
-
};
|
|
447
|
-
return result;
|
|
448
|
-
}
|
|
449
|
-
function recordCoRetrieval(ctx, ids) {
|
|
450
|
-
try {
|
|
451
|
-
const now = new Date().toISOString();
|
|
452
|
-
const upsert = ctx.db.prepare(`INSERT INTO co_retrievals (entry_a, entry_b, count, last_at) VALUES (?, ?, 1, ?)
|
|
453
|
-
ON CONFLICT(entry_a, entry_b) DO UPDATE SET count = MIN(count + 1, ?), last_at = ?`);
|
|
454
|
-
for (let i = 0; i < ids.length; i++) {
|
|
455
|
-
for (let j = i + 1; j < ids.length; j++) {
|
|
456
|
-
const [a, b] = ids[i] < ids[j] ? [ids[i], ids[j]] : [ids[j], ids[i]];
|
|
457
|
-
upsert.run(a, b, now, CO_RETRIEVAL_WEIGHT_CAP, now);
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
catch {
|
|
462
|
-
// Non-fatal: co-retrieval recording is best-effort
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
/** Reset session dedup state (for testing) */
|
|
466
|
-
export function _resetSessionState() {
|
|
467
|
-
sessionSurfaced.clear();
|
|
468
|
-
}
|
|
469
|
-
//# sourceMappingURL=session-start.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/tools/session-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG3E,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAC1C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;IACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IACjE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IAC5D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;IAC7D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;IACjE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IAC9D,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAC9D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAClE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;IAC/D,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS;IAC7D,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;CAC/C,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,8EAA8E;AAC9E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAG,MAAM;SACjB,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE;YAAE,MAAM;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GACtB,2MAA2M,CAAC;AAE9M,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CAAC,iEAAiE,CAAC;IAC9E,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SACzC,QAAQ,CAAC,yCAAyC,CAAC;IACtD,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;IACjD,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qFAAqF,CAAC;IAClG,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;CACpD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAuB,EAC3E,GAAa,EACb,EAAE,aAAa,EAAa;IAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,MAAM,aAAa,EAAE,CAAC;IAEtB,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,SAAS,IAAI,iBAAiB,CAAC;IAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,4BAA4B,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG;YACb,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC9B,MAAM,EAAE,MAAe;YACvB,eAAe,EAAE,EAAE;YACnB,UAAU,EAAE,CAAC;SACd,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+DAA+D;IAC/D,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,IAAI,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,CAAC;IAEhD,MAAM,GAAG,GAAG;;;;;aAKD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY;aACvC,CAAC;IAEZ,IAAI,IAAW,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,gBAAgB;IAChB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,WAAW,GAAG,WAAW,KAAK,OAAO,CAAC;IAC5C,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,GAAG,EAAU,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/H,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,KAAK,GAON,EAAE,CAAC;IAER,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;QAEjC,cAAc;QACd,IAAI,UAAU,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzD,UAAU,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAa,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjE,+DAA+D;QAC/D,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,UAAU,EAAE,CAAC;QACtE,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;QACzC,MAAM,SAAS,GAAsB,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE7G,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,YAAY;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;YAC1B,SAAS;YACT,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW;YAC7B,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,UAAU;YAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,6CAA6C;IAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC;gBAC5C,MAAM;gBACN,WAAW;gBACX,MAAM;gBACN,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM;aAChC,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/C,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;oBAAE,MAAM;gBACjC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAClC,IAAI,UAAU,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;oBACxD,UAAU,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,IAAI,UAAU;oBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,yCAA0C,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,YAAY,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE;gBACtD,MAAM;gBACN,WAAW;gBACX,MAAM;gBACN,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM;aAChC,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;oBAAE,MAAM;gBACjC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAAE,SAAS;gBACrC,IAAI,UAAU,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;oBACxD,UAAU,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC5D,IAAI,UAAU;oBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,uCAAwC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,YAAY,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACxE,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAChD,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE;YAC9B,MAAM;YACN,WAAW;YACX,MAAM;YACN,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM;SAChC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACX,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAI,oBAAqB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9F,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,KAAK,MAAM,WAAW,IAAI,cAAc,EAAE,CAAC;gBACzC,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;oBAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;oBACjC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAAE,SAAS;oBACrC,IAAI,UAAU,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;wBACxD,UAAU,EAAE,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;oBAC9D,IAAI,UAAU;wBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,+CAAgD,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAA2D,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAE7G,uFAAuF;IACvF,IAAI,WAAW,KAAK,MAAM,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,YAAY,GAChB,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,kGAAkG,CAAC,CAAC,GAAG,EACvH,CAAC,CAAC,CAAC;YAEJ,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,QAAQ,EAAE,CAAC;oBACb,gEAAgE;oBAChE,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE;yBACnB,OAAO,CACN,gGAAgG,CACjG;yBACA,GAAG,CAAC,QAAQ,CAA0C,CAAC;oBAE1D,wEAAwE;oBACxE,yEAAyE;oBACzE,gFAAgF;oBAChF,IAAI,UAAU,GAA0C,EAAE,CAAC;oBAC3D,IAAI,CAAC;wBACH,MAAM,WAAW,GACf,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAC9D,CAAC,CAAC,CAAC;wBACJ,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;4BACpB,UAAU,GAAG,GAAG,CAAC,EAAE;iCAChB,OAAO,CACN,oGAAoG,CACrG;iCACA,GAAG,CAAC,QAAQ,CAA0C,CAAC;wBAC5D,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,0CAA0C;oBAC5C,CAAC;oBAED,mEAAmE;oBACnE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;oBAChD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;wBACzB,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;oBAC3C,CAAC;oBACD,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;wBAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;wBAC7C,IAAI,QAAQ,KAAK,SAAS,IAAI,EAAE,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC;4BACrD,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;wBAC3C,CAAC;oBACH,CAAC;oBAED,MAAM,SAAS,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5C,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;wBACrB,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAExD,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE;6BACpB,OAAO,CACN;mCACmB,YAAY;;;;2CAIJ,CAC5B;6BACA,GAAG,CAAC,GAAG,SAAS,CAAU,CAAC;wBAE9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;wBACvC,KAAK,MAAM,GAAG,IAAI,QAAQ;4BAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;wBACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAElD,gCAAgC;wBAChC,MAAM,MAAM,GAAG,SAAS;6BACrB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAE,EAAE,CAAC,CAAC;6BAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;wBAE3C,KAAK,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,MAAM,EAAE,CAAC;4BACzC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC;gCAAE,MAAM;4BACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;4BAC/B,IAAI,CAAC,GAAG;gCAAE,SAAS;4BACnB,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gCAAE,SAAS;4BAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;4BACjD,IAAI,UAAU,GAAG,IAAI;gCAAE,SAAS;4BAEhC,IAAI,UAAU,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gCACzD,UAAU,EAAE,CAAC;gCACb,SAAS;4BACX,CAAC;4BAED,KAAK,CAAC,IAAI,CAAC;gCACT,EAAE,EAAE,GAAG,CAAC,EAAE;gCACV,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,YAAY;gCAChC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;gCAC1B,SAAS,EAAE,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;gCAChD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW;gCAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;6BAC3C,CAAC,CAAC;4BAEH,IAAI,UAAU;gCAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACzC,CAAC;wBAED,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;4BAAE,MAAM,GAAG,kBAAkB,CAAC;oBACzE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,KAAK,MAAM,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,QAAQ,GACZ,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAC1D,CAAC,CAAC,CAAC;YAEJ,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE;yBACnB,OAAO,CACN,+FAA+F,CAChG;yBACA,GAAG,CAAC,QAAQ,CAA0C,CAAC;oBAE1D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;wBAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAErD,IAAI,YAAY,GAAG,EAAE,CAAC;wBACtB,MAAM,aAAa,GAAU,CAAC,GAAG,MAAM,CAAC,CAAC;wBACzC,IAAI,MAAM,EAAE,CAAC;4BACX,YAAY,GAAG,kBAAkB,CAAC;4BAClC,aAAa,CAAC,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,CAAC;wBAC7C,CAAC;wBAED,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE;6BACpB,OAAO,CACN,mGAAmG,YAAY,uGAAuG,YAAY,EAAE,CACrO;6BACA,GAAG,CAAC,GAAG,aAAa,CAAU,CAAC;wBAElC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;wBACvC,KAAK,MAAM,GAAG,IAAI,QAAQ;4BAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;wBAExD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;4BACzB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;gCAAE,MAAM;4BACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;4BAClC,IAAI,CAAC,GAAG;gCAAE,SAAS;4BAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;4BACpD,IAAI,UAAU,GAAG,6BAA6B;gCAAE,SAAS;4BAEzD,gBAAgB;4BAChB,IAAI,UAAU,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gCACzD,UAAU,EAAE,CAAC;gCACb,SAAS;4BACX,CAAC;4BAED,MAAM,SAAS,GAAa,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;4BACjE,KAAK,CAAC,IAAI,CAAC;gCACT,EAAE,EAAE,GAAG,CAAC,EAAE;gCACV,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,YAAY;gCAChC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;gCAC1B,SAAS,EAAE,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;gCAChD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW;gCAC7B,IAAI,EAAE,SAAS;6BAChB,CAAC,CAAC;4BAEH,IAAI,UAAU;gCAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACzC,CAAC;wBAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;4BAAE,MAAM,GAAG,UAAU,CAAC;oBAC5C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,EAAE,CAAC,4BAA4B,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG;YACb,UAAU,EAAE,OAAO;YACnB,MAAM;YACN,eAAe,EAAE,QAAQ;YACzB,UAAU;SACX,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,4DAA4D;IAC5D,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,6DAA6D;IAC7D,IAAI,kBAAkB,GAAyE,EAAE,CAAC;IAClG,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;gBACrE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,kBAAkB,CAAC,IAAI,CAAC;wBACtB,OAAO,EAAE,CAAC,CAAC,EAAE;wBACb,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;wBAC7B,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;qBAC9B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,mBAAmB,CAAC,CAAC;IACvG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,0BAA0B,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,GAAG;QACb,UAAU,EAAE,OAAO;QACnB,MAAM;QACN,eAAe,EAAE,QAAQ;QACzB,UAAU;QACV,KAAK;QACL,oBAAoB,EAAE,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;KACrF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAa,EAAE,GAAa;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAC3B;0FACoF,CACrF,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,kBAAkB;IAChC,eAAe,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|