eklavya 1.18.3 → 1.19.1
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/README.md +1 -1
- package/dist/assets/dashboard.html +570 -15
- package/dist/assets/tutor/SKILL.md +5 -5
- package/dist/assets/tutor/references/focus-and-level.md +34 -5
- package/dist/assets/tutor/references/grading.md +1 -1
- package/dist/cli.js +753 -41
- package/dist/cli.js.map +1 -1
- package/dist/config-path.js +156 -0
- package/dist/config-path.js.map +1 -0
- package/dist/config.js +448 -31
- package/dist/config.js.map +1 -1
- package/dist/dashboard.js +357 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/eval/retrieval-score.js +77 -0
- package/dist/eval/retrieval-score.js.map +1 -0
- package/dist/hooks/capture-tool.js +107 -0
- package/dist/hooks/capture-tool.js.map +1 -0
- package/dist/hooks/checkpoint-quiz.js +2 -2
- package/dist/hooks/checkpoint-quiz.js.map +1 -1
- package/dist/hooks/lib.js +4 -30
- package/dist/hooks/lib.js.map +1 -1
- package/dist/hooks/memory-lib.js +181 -0
- package/dist/hooks/memory-lib.js.map +1 -0
- package/dist/hooks/pre-tool-gate.js +2 -2
- package/dist/hooks/pre-tool-gate.js.map +1 -1
- package/dist/hooks/prompt-submit-nudge.js +57 -20
- package/dist/hooks/prompt-submit-nudge.js.map +1 -1
- package/dist/hooks/session-start.js +110 -80
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop-quiz-check.js +58 -38
- package/dist/hooks/stop-quiz-check.js.map +1 -1
- package/dist/hooks/subagent-start.js +2 -2
- package/dist/hooks/subagent-start.js.map +1 -1
- package/dist/install.js +37 -0
- package/dist/install.js.map +1 -1
- package/dist/memory/capture.js +123 -0
- package/dist/memory/capture.js.map +1 -0
- package/dist/memory/code.js +186 -0
- package/dist/memory/code.js.map +1 -0
- package/dist/memory/collections.js +87 -0
- package/dist/memory/collections.js.map +1 -0
- package/dist/memory/embed.js +81 -0
- package/dist/memory/embed.js.map +1 -0
- package/dist/memory/hosts.js +71 -0
- package/dist/memory/hosts.js.map +1 -0
- package/dist/memory/identity.js +74 -0
- package/dist/memory/identity.js.map +1 -0
- package/dist/memory/import.js +916 -0
- package/dist/memory/import.js.map +1 -0
- package/dist/memory/learning.js +148 -0
- package/dist/memory/learning.js.map +1 -0
- package/dist/memory/notify.js +220 -0
- package/dist/memory/notify.js.map +1 -0
- package/dist/memory/privacy.js +117 -0
- package/dist/memory/privacy.js.map +1 -0
- package/dist/memory/provider.js +155 -0
- package/dist/memory/provider.js.map +1 -0
- package/dist/memory/recall.js +327 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/memory/replay.js +174 -0
- package/dist/memory/replay.js.map +1 -0
- package/dist/memory/search.js +143 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/spool.js +93 -0
- package/dist/memory/spool.js.map +1 -0
- package/dist/memory/store.js +399 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/summarize.js +178 -0
- package/dist/memory/summarize.js.map +1 -0
- package/dist/memory/sync.js +595 -0
- package/dist/memory/sync.js.map +1 -0
- package/dist/memory/tokens.js +55 -0
- package/dist/memory/tokens.js.map +1 -0
- package/dist/memory/worker.js +207 -0
- package/dist/memory/worker.js.map +1 -0
- package/dist/migrations/009_memory.sql +226 -0
- package/dist/migrations/010_import.sql +26 -0
- package/dist/migrations/011_sync.sql +76 -0
- package/dist/migrations/012_job_backoff.sql +13 -0
- package/dist/migrations/013_batch_provenance.sql +18 -0
- package/dist/migrations/014_batch_events_index.sql +18 -0
- package/dist/packs.js +26 -12
- package/dist/packs.js.map +1 -1
- package/dist/paths.js +60 -0
- package/dist/paths.js.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/agents/tutor.md +3 -1
- package/dist/plugin/cli/CLAUDE.md +32 -8
- package/dist/plugin/cli/eklavya-gate +80 -9
- package/dist/plugin/hooks/CLAUDE.md +44 -19
- package/dist/plugin/hooks/hooks.json +10 -0
- package/dist/plugin/scripts/install-git-hook.sh +2 -1
- package/dist/plugin/skills/CLAUDE.md +29 -17
- package/dist/plugin/skills/gate/SKILL.md +1 -1
- package/dist/plugin/skills/level/SKILL.md +3 -3
- package/dist/plugin/skills/memory/SKILL.md +88 -0
- package/dist/plugin/skills/mode/SKILL.md +24 -16
- package/dist/plugin/skills/pack/SKILL.md +8 -4
- package/dist/plugin/skills/progress/SKILL.md +1 -1
- package/dist/plugin/skills/quiz/SKILL.md +2 -2
- package/dist/plugin/skills/setup/SKILL.md +25 -11
- package/dist/plugin/skills/tutor/SKILL.md +5 -5
- package/dist/plugin/skills/tutor/references/focus-and-level.md +34 -5
- package/dist/plugin/skills/tutor/references/grading.md +1 -1
- package/dist/session.js +1 -1
- package/dist/statusline.js +20 -6
- package/dist/statusline.js.map +1 -1
- package/dist/store.js +2 -2
- package/dist/store.js.map +1 -1
- package/dist/surface.js +1 -1
- package/dist/time.js +41 -0
- package/dist/time.js.map +1 -0
- package/dist/tools/code_tools.js +73 -0
- package/dist/tools/code_tools.js.map +1 -0
- package/dist/tools/collection_tools.js +92 -0
- package/dist/tools/collection_tools.js.map +1 -0
- package/dist/tools/config_tools.js +165 -32
- package/dist/tools/config_tools.js.map +1 -1
- package/dist/tools/get_learner_profile.js +2 -1
- package/dist/tools/get_learner_profile.js.map +1 -1
- package/dist/tools/get_session_quiz_plan.js +15 -9
- package/dist/tools/get_session_quiz_plan.js.map +1 -1
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory_read_tools.js +277 -0
- package/dist/tools/memory_read_tools.js.map +1 -0
- package/dist/tools/memory_write_tools.js +115 -0
- package/dist/tools/memory_write_tools.js.map +1 -0
- package/dist/tools/types.js +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/user-skill/eklavya/SKILL.md +95 -25
- package/package.json +2 -1
package/dist/config.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { globalConfigPath } from './paths.js';
|
|
4
|
+
import { globalConfigPath, projectConfigPath } from './paths.js';
|
|
5
5
|
export const DEFAULT_CONFIG = {
|
|
6
|
-
|
|
6
|
+
quiz: { enabled: true, enforced: false },
|
|
7
7
|
focus: 'concept',
|
|
8
8
|
focus_topic: null,
|
|
9
9
|
cadence: 'interleaved',
|
|
@@ -18,8 +18,44 @@ export const DEFAULT_CONFIG = {
|
|
|
18
18
|
quiet: false,
|
|
19
19
|
max_new_concepts_per_session: 8,
|
|
20
20
|
max_stop_blocks_per_session: 3,
|
|
21
|
+
memory: {
|
|
22
|
+
enabled: true,
|
|
23
|
+
capture: 'full',
|
|
24
|
+
batch_max_events: 40,
|
|
25
|
+
retention_days: null,
|
|
26
|
+
},
|
|
27
|
+
privacy: {
|
|
28
|
+
exclude_paths: [],
|
|
29
|
+
exclude_tools: [],
|
|
30
|
+
redact_patterns: [],
|
|
31
|
+
},
|
|
32
|
+
retrieval: {
|
|
33
|
+
mode: 'hybrid',
|
|
34
|
+
max_items: 6,
|
|
35
|
+
max_tokens: 1200,
|
|
36
|
+
cross_project: false,
|
|
37
|
+
},
|
|
38
|
+
providers: {
|
|
39
|
+
observer: null,
|
|
40
|
+
embeddings: null,
|
|
41
|
+
},
|
|
42
|
+
notifications: {
|
|
43
|
+
enabled: false,
|
|
44
|
+
sinks: [],
|
|
45
|
+
},
|
|
46
|
+
sync: {
|
|
47
|
+
enabled: false,
|
|
48
|
+
target: null,
|
|
49
|
+
device_id: null,
|
|
50
|
+
},
|
|
21
51
|
};
|
|
22
|
-
|
|
52
|
+
/**
|
|
53
|
+
* The file Eklavya used to keep inside the checkout, and no longer does.
|
|
54
|
+
*
|
|
55
|
+
* Still named here for one reason: `migrateLegacyRepoConfig` has to recognise
|
|
56
|
+
* it, lift it out and delete it. Nothing reads it as configuration any more.
|
|
57
|
+
*/
|
|
58
|
+
export const LEGACY_REPO_CONFIG_FILE = '.eklavya.json';
|
|
23
59
|
function realPath(p) {
|
|
24
60
|
try {
|
|
25
61
|
return fs.realpathSync(p);
|
|
@@ -42,40 +78,34 @@ function readJson(file) {
|
|
|
42
78
|
}
|
|
43
79
|
}
|
|
44
80
|
/**
|
|
45
|
-
* Walks up from `cwd`
|
|
46
|
-
*
|
|
47
|
-
*
|
|
81
|
+
* Walks up from `cwd` to the git root, which is the only thing a checkout still
|
|
82
|
+
* tells us: settings themselves live outside it, under `~/.eklavya/projects/`.
|
|
83
|
+
*
|
|
84
|
+
* Keeps its name because it is on the call path of every hook, the packs loader
|
|
85
|
+
* and the session pointer, and because "find the repo this config belongs to"
|
|
86
|
+
* is still exactly what it does.
|
|
48
87
|
*/
|
|
49
88
|
export function findRepoConfig(cwd = process.cwd()) {
|
|
50
89
|
// Resolve symlinks: `git rev-parse --show-toplevel` reports the real path, and
|
|
51
90
|
// the git pre-commit hook matches gate rows on it. On macOS /tmp is a symlink
|
|
52
91
|
// to /private/tmp, so without this the two sides silently never match.
|
|
53
92
|
let dir = realPath(path.resolve(cwd));
|
|
54
|
-
let repoPath = null;
|
|
55
|
-
let repoRoot = null;
|
|
56
93
|
for (;;) {
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
if (!repoRoot && fs.existsSync(path.join(dir, '.git'))) {
|
|
61
|
-
repoRoot = dir;
|
|
62
|
-
// The git root is the boundary: a config above it belongs to another project.
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
94
|
+
if (fs.existsSync(path.join(dir, '.git')))
|
|
95
|
+
return { repoRoot: dir };
|
|
65
96
|
const parent = path.dirname(dir);
|
|
66
97
|
if (parent === dir || dir === os.homedir())
|
|
67
|
-
|
|
98
|
+
return { repoRoot: null };
|
|
68
99
|
dir = parent;
|
|
69
100
|
}
|
|
70
|
-
return { repoPath, repoRoot };
|
|
71
101
|
}
|
|
72
102
|
/**
|
|
73
103
|
* The main checkout behind a git worktree, or the path unchanged.
|
|
74
104
|
*
|
|
75
105
|
* A linked worktree's `.git` is a file reading `gitdir: <main>/.git/worktrees/<name>`,
|
|
76
106
|
* so `findRepoConfig` stops there and reports the worktree as the git root. That
|
|
77
|
-
* is right for finding
|
|
78
|
-
*
|
|
107
|
+
* is right for finding the checkout you are standing in, and wrong for
|
|
108
|
+
* identity: a branch parked in a worktree is the same codebase,
|
|
79
109
|
* and keying a project on the worktree path mints a fresh project, at `easy`,
|
|
80
110
|
* every time someone starts a branch.
|
|
81
111
|
*/
|
|
@@ -106,8 +136,6 @@ export function mainRepoRoot(repoRoot) {
|
|
|
106
136
|
}
|
|
107
137
|
function coerce(raw, base) {
|
|
108
138
|
const out = { ...base };
|
|
109
|
-
if (raw.mode === 'ambient' || raw.mode === 'enforced' || raw.mode === 'off')
|
|
110
|
-
out.mode = raw.mode;
|
|
111
139
|
if (raw.focus === 'project' || raw.focus === 'concept' || raw.focus === 'learn')
|
|
112
140
|
out.focus = raw.focus;
|
|
113
141
|
if (raw.cadence === 'interleaved' || raw.cadence === 'end')
|
|
@@ -158,29 +186,418 @@ function coerce(raw, base) {
|
|
|
158
186
|
raw.max_stop_blocks_per_session >= 0) {
|
|
159
187
|
out.max_stop_blocks_per_session = Math.floor(raw.max_stop_blocks_per_session);
|
|
160
188
|
}
|
|
189
|
+
coerceNamespaces(raw, out);
|
|
190
|
+
return out;
|
|
191
|
+
}
|
|
192
|
+
function stringArray(value) {
|
|
193
|
+
return Array.isArray(value) && value.every((v) => typeof v === 'string') ? value : null;
|
|
194
|
+
}
|
|
195
|
+
function sinkOf(value) {
|
|
196
|
+
if (!value || typeof value !== 'object')
|
|
197
|
+
return null;
|
|
198
|
+
const v = value;
|
|
199
|
+
if (v.kind !== 'webhook' && v.kind !== 'command' && v.kind !== 'file')
|
|
200
|
+
return null;
|
|
201
|
+
if (typeof v.target !== 'string' || !v.target.trim())
|
|
202
|
+
return null;
|
|
203
|
+
return {
|
|
204
|
+
kind: v.kind,
|
|
205
|
+
target: v.target.trim(),
|
|
206
|
+
args: stringArray(v.args) ?? undefined,
|
|
207
|
+
events: stringArray(v.events) ?? undefined,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function provider(value) {
|
|
211
|
+
if (!value || typeof value !== 'object')
|
|
212
|
+
return null;
|
|
213
|
+
const v = value;
|
|
214
|
+
if (v.kind !== 'anthropic')
|
|
215
|
+
return null;
|
|
216
|
+
if (typeof v.model !== 'string' || !v.model.trim())
|
|
217
|
+
return null;
|
|
218
|
+
// A key in the config file would end up in every export, log and dashboard
|
|
219
|
+
// payload that ever prints configuration (PRD SEC-01). Only the name of the
|
|
220
|
+
// variable holding it lives here.
|
|
221
|
+
const keyEnv = typeof v.api_key_env === 'string' && v.api_key_env.trim() ? v.api_key_env.trim() : 'ANTHROPIC_API_KEY';
|
|
222
|
+
return { kind: 'anthropic', model: v.model.trim(), api_key_env: keyEnv };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* The namespaced half. Unknown keys are left alone rather than dropped: the
|
|
226
|
+
* resolved `raw` still carries them, so `eklavya doctor` can report a typo
|
|
227
|
+
* instead of the setting silently doing nothing.
|
|
228
|
+
*/
|
|
229
|
+
function coerceNamespaces(raw, out) {
|
|
230
|
+
const quiz = raw.quiz;
|
|
231
|
+
if (quiz && typeof quiz === 'object') {
|
|
232
|
+
out.quiz = { ...out.quiz };
|
|
233
|
+
if (typeof quiz.enabled === 'boolean')
|
|
234
|
+
out.quiz.enabled = quiz.enabled;
|
|
235
|
+
if (typeof quiz.enforced === 'boolean')
|
|
236
|
+
out.quiz.enforced = quiz.enforced;
|
|
237
|
+
}
|
|
238
|
+
// The one combination the flag pair can express and the old enum could not:
|
|
239
|
+
// a gate holding commits until questions are passed, with the questions
|
|
240
|
+
// switched off. Nothing would ever ask, so nothing would ever pass, and the
|
|
241
|
+
// developer would be locked out of `git commit` in their own repository with
|
|
242
|
+
// no message explaining which setting did it.
|
|
243
|
+
//
|
|
244
|
+
// `enabled` wins. The alternative -- honouring `enforced` by turning
|
|
245
|
+
// questions back on -- overrides an explicit request for silence in order to
|
|
246
|
+
// start interrupting someone, which is the worse way to be wrong. It also
|
|
247
|
+
// fails safe: the cost here is a gate that does not hold, and `eklavya doctor`
|
|
248
|
+
// reports the contradiction rather than leaving it to be discovered at the
|
|
249
|
+
// first blocked commit.
|
|
250
|
+
if (!out.quiz.enabled)
|
|
251
|
+
out.quiz.enforced = false;
|
|
252
|
+
const memory = raw.memory;
|
|
253
|
+
if (memory && typeof memory === 'object') {
|
|
254
|
+
out.memory = { ...out.memory };
|
|
255
|
+
if (typeof memory.enabled === 'boolean')
|
|
256
|
+
out.memory.enabled = memory.enabled;
|
|
257
|
+
if (memory.capture === 'full' || memory.capture === 'minimal' || memory.capture === 'off') {
|
|
258
|
+
out.memory.capture = memory.capture;
|
|
259
|
+
}
|
|
260
|
+
if (typeof memory.batch_max_events === 'number' && memory.batch_max_events > 0) {
|
|
261
|
+
out.memory.batch_max_events = Math.floor(memory.batch_max_events);
|
|
262
|
+
}
|
|
263
|
+
if (typeof memory.retention_days === 'number' && memory.retention_days > 0) {
|
|
264
|
+
out.memory.retention_days = Math.floor(memory.retention_days);
|
|
265
|
+
}
|
|
266
|
+
else if (memory.retention_days === null) {
|
|
267
|
+
out.memory.retention_days = null;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const privacy = raw.privacy;
|
|
271
|
+
if (privacy && typeof privacy === 'object') {
|
|
272
|
+
out.privacy = { ...out.privacy };
|
|
273
|
+
const paths = stringArray(privacy.exclude_paths);
|
|
274
|
+
if (paths)
|
|
275
|
+
out.privacy.exclude_paths = paths;
|
|
276
|
+
const tools = stringArray(privacy.exclude_tools);
|
|
277
|
+
if (tools)
|
|
278
|
+
out.privacy.exclude_tools = tools;
|
|
279
|
+
const patterns = stringArray(privacy.redact_patterns);
|
|
280
|
+
if (patterns)
|
|
281
|
+
out.privacy.redact_patterns = patterns;
|
|
282
|
+
}
|
|
283
|
+
const retrieval = raw.retrieval;
|
|
284
|
+
if (retrieval && typeof retrieval === 'object') {
|
|
285
|
+
out.retrieval = { ...out.retrieval };
|
|
286
|
+
if (retrieval.mode === 'keyword' || retrieval.mode === 'semantic' || retrieval.mode === 'hybrid') {
|
|
287
|
+
out.retrieval.mode = retrieval.mode;
|
|
288
|
+
}
|
|
289
|
+
if (typeof retrieval.max_items === 'number' && retrieval.max_items > 0) {
|
|
290
|
+
out.retrieval.max_items = Math.floor(retrieval.max_items);
|
|
291
|
+
}
|
|
292
|
+
if (typeof retrieval.max_tokens === 'number' && retrieval.max_tokens > 0) {
|
|
293
|
+
out.retrieval.max_tokens = Math.floor(retrieval.max_tokens);
|
|
294
|
+
}
|
|
295
|
+
if (typeof retrieval.cross_project === 'boolean')
|
|
296
|
+
out.retrieval.cross_project = retrieval.cross_project;
|
|
297
|
+
}
|
|
298
|
+
const notifications = raw.notifications;
|
|
299
|
+
if (notifications && typeof notifications === 'object') {
|
|
300
|
+
out.notifications = { ...out.notifications };
|
|
301
|
+
if (typeof notifications.enabled === 'boolean')
|
|
302
|
+
out.notifications.enabled = notifications.enabled;
|
|
303
|
+
if (Array.isArray(notifications.sinks)) {
|
|
304
|
+
out.notifications.sinks = notifications.sinks.flatMap((entry) => {
|
|
305
|
+
const sink = sinkOf(entry);
|
|
306
|
+
return sink ? [sink] : [];
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
const providers = raw.providers;
|
|
311
|
+
if (providers && typeof providers === 'object') {
|
|
312
|
+
out.providers = {
|
|
313
|
+
observer: provider(providers.observer),
|
|
314
|
+
embeddings: provider(providers.embeddings),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
const sync = raw.sync;
|
|
318
|
+
if (sync && typeof sync === 'object') {
|
|
319
|
+
out.sync = { ...out.sync };
|
|
320
|
+
if (typeof sync.enabled === 'boolean')
|
|
321
|
+
out.sync.enabled = sync.enabled;
|
|
322
|
+
if (typeof sync.target === 'string' && sync.target.trim()) {
|
|
323
|
+
out.sync.target = sync.target.trim();
|
|
324
|
+
}
|
|
325
|
+
else if (sync.target === null) {
|
|
326
|
+
out.sync.target = null;
|
|
327
|
+
}
|
|
328
|
+
if (typeof sync.device_id === 'string' && sync.device_id.trim()) {
|
|
329
|
+
out.sync.device_id = sync.device_id.trim();
|
|
330
|
+
}
|
|
331
|
+
else if (sync.device_id === null) {
|
|
332
|
+
out.sync.device_id = null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Keys a file that arrived by `git clone` may not set, ever.
|
|
338
|
+
*
|
|
339
|
+
* `REPO_FORBIDDEN_KEYS` was deleted with the committed settings file, on the
|
|
340
|
+
* reasoning that nothing arrives from a stranger any more. That is true of
|
|
341
|
+
* `~/.eklavya/projects/`, and **not** true of the one path that still reads a
|
|
342
|
+
* checkout: a repository shipping a legacy `.eklavya.json` is still handing
|
|
343
|
+
* this machine a configuration file somebody else wrote, right up until a
|
|
344
|
+
* session moves it. Without this the removal reintroduced the exact RCE the old
|
|
345
|
+
* list existed to stop — a `command` notification sink of `/bin/sh -c ...`,
|
|
346
|
+
* fired by the Stop hook's automatic wrap-up, on `git clone` plus ten minutes —
|
|
347
|
+
* and `migrateLegacyRepoConfig` then laundered it into the trusted location, so
|
|
348
|
+
* it survived the file being deleted.
|
|
349
|
+
*
|
|
350
|
+
* Each one has an effect *outside* the session: `notifications` runs a command
|
|
351
|
+
* or posts somewhere, `sync` writes files, `providers` sends this machine's
|
|
352
|
+
* work to an API, and `retrieval.cross_project` widens what the model sees. A
|
|
353
|
+
* dial is safe to inherit from a stranger; these are not.
|
|
354
|
+
*/
|
|
355
|
+
const CLONED_FORBIDDEN = ['notifications', 'sync', 'providers'];
|
|
356
|
+
/**
|
|
357
|
+
* The same filter, applied to anything read out of a checkout. Dropped in
|
|
358
|
+
* silence rather than reported: the file is on its way to being deleted, and
|
|
359
|
+
* there is no setting to explain because it never applied.
|
|
360
|
+
*/
|
|
361
|
+
function withoutUntrustedKeys(raw) {
|
|
362
|
+
const out = {};
|
|
363
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
364
|
+
if (CLONED_FORBIDDEN.includes(key))
|
|
365
|
+
continue;
|
|
366
|
+
if (key === 'retrieval' && value && typeof value === 'object' && !Array.isArray(value)) {
|
|
367
|
+
// One key of this namespace is the dangerous one; the rest of it is an
|
|
368
|
+
// ordinary preference, so the namespace is trimmed rather than dropped.
|
|
369
|
+
const { cross_project: _crossProject, ...rest } = value;
|
|
370
|
+
out[key] = rest;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
out[key] = value;
|
|
374
|
+
}
|
|
161
375
|
return out;
|
|
162
376
|
}
|
|
163
|
-
/**
|
|
377
|
+
/**
|
|
378
|
+
* A `<repo>/.eklavya.json` lifted out of the checkout, then deleted.
|
|
379
|
+
*
|
|
380
|
+
* Silent and automatic, by decision: a settings file in a repository was a
|
|
381
|
+
* mistake to be undone, not a choice to be confirmed every session. Prompting
|
|
382
|
+
* would put the mistake on screen once per project per developer for ever.
|
|
383
|
+
*
|
|
384
|
+
* **The two roots differ in a linked worktree**, and both matter. `.eklavya.json`
|
|
385
|
+
* was a *committed* file, so a worktree has its own checked-out copy of it: the
|
|
386
|
+
* file to delete is the one in the checkout you are standing in, while the
|
|
387
|
+
* settings belong to the main checkout's key, since a worktree is a branch of
|
|
388
|
+
* the same codebase rather than a project to configure again. Reading from the
|
|
389
|
+
* main root instead left every worktree's copy sitting in its working tree for
|
|
390
|
+
* ever — the file the whole change exists to remove.
|
|
391
|
+
*
|
|
392
|
+
* **It is never called from `loadConfig`.** That was the first shape and it was
|
|
393
|
+
* wrong: `loadConfig` runs from every hook, every tool call and the statusline
|
|
394
|
+
* on every prompt render, so putting a write behind it made a read function
|
|
395
|
+
* mutate the filesystem from a dozen call sites that had no business doing so.
|
|
396
|
+
* The test suite found it the honest way -- a run scattered thirty directories
|
|
397
|
+
* through the real `~/.eklavya/projects/`, because only spawned children had
|
|
398
|
+
* `EKLAVYA_HOME` pointed somewhere safe. A read that writes is a read nobody can
|
|
399
|
+
* reason about.
|
|
400
|
+
*
|
|
401
|
+
* So it is called from the three places that are genuinely a moment of work:
|
|
402
|
+
* the SessionStart hook, `eklavya doctor`, and `eklavya config`. SessionStart is
|
|
403
|
+
* what makes it feel automatic -- the move happens on the next session, with
|
|
404
|
+
* nothing on screen -- and `loadConfig` reads the legacy file as a fallback in
|
|
405
|
+
* the meantime, so settings never stop applying in the window before it runs.
|
|
406
|
+
*
|
|
407
|
+
* Three properties still matter, because sessions start in parallel:
|
|
408
|
+
*
|
|
409
|
+
* It never throws. A read-only checkout, a file owned by somebody else, a
|
|
410
|
+
* home directory that will not take a write -- all of them fall through to
|
|
411
|
+
* returning `false`, and the caller reads the legacy file this one time
|
|
412
|
+
* rather than losing the settings.
|
|
413
|
+
*
|
|
414
|
+
* It never loses a setting. When project config already exists the legacy
|
|
415
|
+
* keys are merged *underneath* it, so the newer file still wins and nothing
|
|
416
|
+
* in the old one is dropped on the floor.
|
|
417
|
+
*
|
|
418
|
+
* It is safe to lose a race. The write is temp-file-plus-rename, and the
|
|
419
|
+
* unlink tolerates a file another process already removed.
|
|
420
|
+
*/
|
|
421
|
+
export function migrateLegacyRepoConfig(checkoutRoot, projectRoot = checkoutRoot) {
|
|
422
|
+
const legacyPath = path.join(checkoutRoot, LEGACY_REPO_CONFIG_FILE);
|
|
423
|
+
try {
|
|
424
|
+
if (!fs.existsSync(legacyPath))
|
|
425
|
+
return false;
|
|
426
|
+
const legacy = readJson(legacyPath);
|
|
427
|
+
// Unreadable or malformed: left exactly where it is. A trailing comma in a
|
|
428
|
+
// hand-edited file is still somebody's settings, and deleting it would lose
|
|
429
|
+
// them for good; `loadConfig` reads it as empty, so it does no harm there.
|
|
430
|
+
if (!legacy)
|
|
431
|
+
return false;
|
|
432
|
+
const target = projectConfigPath(projectRoot);
|
|
433
|
+
const existing = readJson(target) ?? {};
|
|
434
|
+
// Filtered on the way in. Everything under ~/.eklavya/projects/ is
|
|
435
|
+
// treated as written by the developer, so copying a cloned file's keys
|
|
436
|
+
// there verbatim would launder them into trust and outlive the deletion.
|
|
437
|
+
// A target stamped for another checkout makes `writeConfigFile` throw, so
|
|
438
|
+
// a slug collision keeps the legacy file rather than taking over the other.
|
|
439
|
+
writeConfigFile(target, {
|
|
440
|
+
...withoutUntrustedKeys(legacy),
|
|
441
|
+
...existing,
|
|
442
|
+
project: projectRoot,
|
|
443
|
+
});
|
|
444
|
+
fs.rmSync(legacyPath, { force: true });
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* `mode` rewritten to the `quiz` namespace that replaced it, one file at a time.
|
|
453
|
+
*
|
|
454
|
+
* This stays forever. A config written against `mode` outlives the rename by
|
|
455
|
+
* years, and dropping the alias would not error -- `coerce` ignores keys it does
|
|
456
|
+
* not know, so the dial would silently revert to the default.
|
|
457
|
+
*
|
|
458
|
+
* It runs **per file, before `mergeConfigs`**, and that is the whole subtlety.
|
|
459
|
+
* Resolving the alias on the merged object instead makes the two precedence
|
|
460
|
+
* rules fight: within one file an explicit `quiz` should beat a `mode` left
|
|
461
|
+
* lying beside it, and across files the project should beat the global whichever
|
|
462
|
+
* spelling each one used. Merged first, a global `quiz` silently outranked a
|
|
463
|
+
* project `mode`.
|
|
464
|
+
*/
|
|
465
|
+
function normalizeLegacyKeys(raw) {
|
|
466
|
+
const fromMode = raw.mode === 'ambient'
|
|
467
|
+
? { enabled: true, enforced: false }
|
|
468
|
+
: raw.mode === 'enforced'
|
|
469
|
+
? { enabled: true, enforced: true }
|
|
470
|
+
: raw.mode === 'off'
|
|
471
|
+
? { enabled: false, enforced: false }
|
|
472
|
+
: null;
|
|
473
|
+
if (!fromMode)
|
|
474
|
+
return raw;
|
|
475
|
+
// `mode` is dropped rather than carried along, so `overrides` compares the one
|
|
476
|
+
// key that now means something and nothing downstream sees two spellings.
|
|
477
|
+
const { mode: _mode, ...rest } = raw;
|
|
478
|
+
const explicit = raw.quiz && typeof raw.quiz === 'object' && !Array.isArray(raw.quiz)
|
|
479
|
+
? raw.quiz
|
|
480
|
+
: {};
|
|
481
|
+
return { ...rest, quiz: { ...fromMode, ...explicit } };
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Global then repo, one level deep for the namespaces.
|
|
485
|
+
*
|
|
486
|
+
* A flat spread is right for the dials and wrong for the namespaces: a repo
|
|
487
|
+
* setting `memory.capture` would replace the whole `memory` object and take
|
|
488
|
+
* the developer's `memory.enabled` with it. One level is all the schema has,
|
|
489
|
+
* so one level is all this does.
|
|
490
|
+
*/
|
|
491
|
+
function mergeConfigs(base, over) {
|
|
492
|
+
const merged = { ...base };
|
|
493
|
+
for (const [key, value] of Object.entries(over)) {
|
|
494
|
+
const existing = merged[key];
|
|
495
|
+
const bothObjects = value !== null && typeof value === 'object' && !Array.isArray(value) &&
|
|
496
|
+
existing !== null && typeof existing === 'object' && !Array.isArray(existing);
|
|
497
|
+
merged[key] = bothObjects
|
|
498
|
+
? { ...existing, ...value }
|
|
499
|
+
: value;
|
|
500
|
+
}
|
|
501
|
+
return merged;
|
|
502
|
+
}
|
|
164
503
|
export function loadConfig(cwd = process.cwd()) {
|
|
165
504
|
const globalPath = globalConfigPath();
|
|
166
|
-
const {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
const
|
|
505
|
+
const { repoRoot } = findRepoConfig(cwd);
|
|
506
|
+
// A worktree is a branch of the same codebase, not a new project to configure
|
|
507
|
+
// from scratch -- the same fold `projectKey` applies to levels and mastery.
|
|
508
|
+
const projectRoot = repoRoot ? mainRepoRoot(repoRoot) : null;
|
|
509
|
+
const projectPath = projectRoot ? projectConfigPath(projectRoot) : null;
|
|
510
|
+
// Read-only, deliberately and permanently: see `migrateLegacyRepoConfig`.
|
|
511
|
+
let projectRaw = {};
|
|
512
|
+
if (repoRoot && projectRoot && projectPath) {
|
|
513
|
+
const onDisk = readJson(projectPath);
|
|
514
|
+
if (onDisk && belongsTo(onDisk, projectRoot)) {
|
|
515
|
+
projectRaw = onDisk;
|
|
516
|
+
}
|
|
517
|
+
else if (!onDisk) {
|
|
518
|
+
// Nothing outside the checkout yet. A legacy file still sitting in the
|
|
519
|
+
// repo is read until the next session moves it, so settings never stop
|
|
520
|
+
// applying in the window before the migration runs. A file that *is*
|
|
521
|
+
// there but belongs to another checkout falls through to global instead:
|
|
522
|
+
// that is a slug collision, and the legacy file is not the answer to it.
|
|
523
|
+
// From the checkout you are standing in: in a worktree that is where the
|
|
524
|
+
// committed copy actually is, and the main root may already be migrated.
|
|
525
|
+
//
|
|
526
|
+
// Filtered, because this is the one path left that reads a file which may
|
|
527
|
+
// have arrived by `git clone`. It applies for exactly as long as it takes
|
|
528
|
+
// a session to move the file, and that window is long enough to run a
|
|
529
|
+
// notification sink.
|
|
530
|
+
projectRaw = withoutUntrustedKeys(readJson(path.join(repoRoot, LEGACY_REPO_CONFIG_FILE)) ?? {});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
const globalRaw = normalizeLegacyKeys(readJson(globalPath) ?? {});
|
|
534
|
+
const projectNormalized = normalizeLegacyKeys(withoutBookkeeping(projectRaw));
|
|
535
|
+
const raw = mergeConfigs(globalRaw, projectNormalized);
|
|
536
|
+
const overrides = Object.keys(projectNormalized).filter((key) => key in globalRaw &&
|
|
537
|
+
JSON.stringify(globalRaw[key]) !== JSON.stringify(projectNormalized[key]));
|
|
171
538
|
return {
|
|
172
539
|
config: coerce(raw, DEFAULT_CONFIG),
|
|
173
540
|
raw,
|
|
174
541
|
globalPath,
|
|
175
|
-
|
|
542
|
+
projectPath,
|
|
176
543
|
repoRoot,
|
|
177
544
|
overrides,
|
|
178
545
|
};
|
|
179
546
|
}
|
|
180
|
-
/**
|
|
547
|
+
/**
|
|
548
|
+
* Whether a project config file is about the checkout we are asking about.
|
|
549
|
+
*
|
|
550
|
+
* `projectSlug` folds `/` and `-` together, so `/a/b-c` and `/a-b/c` land in
|
|
551
|
+
* one directory. The slug stays readable -- that is what it is for -- and this
|
|
552
|
+
* catches the collision instead: a file that names a different checkout is not
|
|
553
|
+
* this project's configuration, so it is ignored rather than applied to the
|
|
554
|
+
* wrong repository. A file written before `project` was recorded has nothing to
|
|
555
|
+
* disagree with and is trusted, which is what makes the field safe to add.
|
|
556
|
+
*/
|
|
557
|
+
function belongsTo(raw, repoRoot) {
|
|
558
|
+
return typeof raw.project !== 'string' || raw.project === repoRoot;
|
|
559
|
+
}
|
|
560
|
+
/** `project` is bookkeeping for `belongsTo`, never a setting. */
|
|
561
|
+
function withoutBookkeeping(raw) {
|
|
562
|
+
if (!('project' in raw))
|
|
563
|
+
return raw;
|
|
564
|
+
const { project: _project, ...rest } = raw;
|
|
565
|
+
return rest;
|
|
566
|
+
}
|
|
567
|
+
/** One config file's raw contents, or `{}`. Exported so a caller building a
|
|
568
|
+
* patch can merge against what is actually in the file it is about to write. */
|
|
569
|
+
export function readConfigFile(file) {
|
|
570
|
+
return readJson(file) ?? {};
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Writes via temp file + rename: the git hook may be reading mid-write.
|
|
574
|
+
*
|
|
575
|
+
* Refuses a patch stamped for one checkout onto a file stamped for another.
|
|
576
|
+
* That is a slug collision (see `belongsTo`), and merging would hand the other
|
|
577
|
+
* checkout's settings to this one while that checkout silently stopped reading
|
|
578
|
+
* its own file. Every project write routes through here, so this is the one
|
|
579
|
+
* place the collision is caught on the way in.
|
|
580
|
+
*/
|
|
181
581
|
export function writeConfigFile(file, patch) {
|
|
182
582
|
const existing = readJson(file) ?? {};
|
|
183
|
-
|
|
583
|
+
if (typeof patch.project === 'string' && !belongsTo(existing, patch.project)) {
|
|
584
|
+
throw new Error(`${file} already holds the settings for ${String(existing.project)}, a different checkout whose ` +
|
|
585
|
+
`path folds to the same directory name. Not overwriting it.`);
|
|
586
|
+
}
|
|
587
|
+
let merged = { ...existing, ...patch };
|
|
588
|
+
// A `quiz` written today retires a `mode` left beside it, folded in rather
|
|
589
|
+
// than dropped. Left in place, `mode: enforced` under a new `quiz.enabled:
|
|
590
|
+
// false` resolves to enforced-and-silent, which `doctor` then reports as a
|
|
591
|
+
// contradiction the developer never wrote. An explicit "off" also switches
|
|
592
|
+
// off the enforcement that only the retired dial implied.
|
|
593
|
+
if ('quiz' in patch && 'mode' in merged) {
|
|
594
|
+
const explicit = (merged.quiz ?? {});
|
|
595
|
+
merged = normalizeLegacyKeys(merged);
|
|
596
|
+
if (explicit.enabled === false && explicit.enforced === undefined) {
|
|
597
|
+
merged.quiz = { ...merged.quiz, enforced: false };
|
|
598
|
+
}
|
|
599
|
+
delete merged.mode;
|
|
600
|
+
}
|
|
184
601
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
185
602
|
const tmp = `${file}.tmp-${process.pid}`;
|
|
186
603
|
fs.writeFileSync(tmp, `${JSON.stringify(merged, null, 2)}\n`, 'utf8');
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgSjE,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxC,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,aAAa;IACtB,UAAU,EAAE,MAAM;IAClB,cAAc,EAAE,GAAG;IACnB,iBAAiB,EAAE,GAAG;IACtB,cAAc,EAAE,GAAG;IACnB,sBAAsB,EAAE,CAAC;IACzB,2BAA2B,EAAE,EAAE;IAC/B,+BAA+B,EAAE,CAAC;IAClC,eAAe,EAAE,CAAC,GAAG,CAAC;IACtB,KAAK,EAAE,KAAK;IACZ,4BAA4B,EAAE,CAAC;IAC/B,2BAA2B,EAAE,CAAC;IAC9B,MAAM,EAAE;QACN,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,MAAM;QACf,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,IAAI;KACrB;IACD,OAAO,EAAE;QACP,aAAa,EAAE,EAAE;QACjB,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,EAAE;KACpB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,KAAK;KACrB;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KACjB;IACD,aAAa,EAAE;QACb,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,EAAE;KACV;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC;AAsBvD,SAAS,QAAQ,CAAC,CAAS;IACzB,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC3C,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAGxD,+EAA+E;IAC/E,8EAA8E;IAC9E,uEAAuE;IACvE,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtC,SAAS,CAAC;QACR,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACtE,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,QAAQ,CAAC;QACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC7B,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,4EAA4E;QAC5E,sEAAsE;QACtE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,GAA4B,EAAE,IAAmB;IAC/D,MAAM,GAAG,GAAkB,EAAE,GAAG,IAAI,EAAE,CAAC;IAEvC,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO;QAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACvG,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;QAAE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACtF,IACE,GAAG,CAAC,UAAU,KAAK,MAAM;QACzB,GAAG,CAAC,UAAU,KAAK,MAAM;QACzB,GAAG,CAAC,UAAU,KAAK,QAAQ;QAC3B,GAAG,CAAC,UAAU,KAAK,MAAM,EACzB,CAAC;QACD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IACD,IACE,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ;QACzC,GAAG,CAAC,iBAAiB,IAAI,CAAC;QAC1B,GAAG,CAAC,iBAAiB,IAAI,CAAC,EAC1B,CAAC;QACD,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QAClE,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;SAAM,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QACpC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;QACjG,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,sBAAsB,KAAK,QAAQ,IAAI,GAAG,CAAC,sBAAsB,GAAG,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,2BAA2B,KAAK,QAAQ,IAAI,GAAG,CAAC,2BAA2B,IAAI,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAChF,CAAC;IACD,IACE,OAAO,GAAG,CAAC,+BAA+B,KAAK,QAAQ;QACvD,GAAG,CAAC,+BAA+B,IAAI,CAAC,EACxC,CAAC;QACD,GAAG,CAAC,+BAA+B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QAClG,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,eAA2B,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAC1D,IACE,OAAO,GAAG,CAAC,4BAA4B,KAAK,QAAQ;QACpD,GAAG,CAAC,4BAA4B,IAAI,CAAC,EACrC,CAAC;QACD,GAAG,CAAC,4BAA4B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAClF,CAAC;IACD,IACE,OAAO,GAAG,CAAC,2BAA2B,KAAK,QAAQ;QACnD,GAAG,CAAC,2BAA2B,IAAI,CAAC,EACpC,CAAC;QACD,GAAG,CAAC,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAChF,CAAC;IAED,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAE,KAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;AACxG,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACnF,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;QACvB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS;QACtC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAChE,2EAA2E;IAC3E,4EAA4E;IAC5E,kCAAkC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACtH,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,GAA4B,EAAE,GAAkB;IACxE,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2C,CAAC;IAC7D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACvE,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC5E,CAAC;IACD,4EAA4E;IAC5E,wEAAwE;IACxE,4EAA4E;IAC5E,6EAA6E;IAC7E,8CAA8C;IAC9C,EAAE;IACF,qEAAqE;IACrE,6EAA6E;IAC7E,0EAA0E;IAC1E,+EAA+E;IAC/E,2EAA2E;IAC3E,wBAAwB;IACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAEjD,MAAM,MAAM,GAAG,GAAG,CAAC,MAA6C,CAAC;IACjE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC7E,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC1F,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAC/E,GAAG,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YAC1C,GAAG,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAA8C,CAAC;IACnE,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,KAAK;YAAE,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,KAAK;YAAE,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,QAAQ;YAAE,GAAG,CAAC,OAAO,CAAC,eAAe,GAAG,QAAQ,CAAC;IACvD,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,SAAgD,CAAC;IACvE,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjG,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,OAAO,SAAS,CAAC,aAAa,KAAK,SAAS;YAAE,GAAG,CAAC,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;IAC1G,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,aAAoD,CAAC;IAC/E,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACvD,GAAG,CAAC,aAAa,GAAG,EAAE,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,OAAO,aAAa,CAAC,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;QAClG,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,SAAgD,CAAC;IACvE,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,SAAS,GAAG;YACd,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;YACtC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2C,CAAC;IAC7D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACvE,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,gBAAgB,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;AAEzE;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,GAA4B;IACxD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAK,gBAAsC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACpE,IAAI,GAAG,KAAK,WAAW,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvF,uEAAuE;YACvE,wEAAwE;YACxE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,KAAgC,CAAC;YACnF,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,cAAsB,YAAY;IAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxC,mEAAmE;QACnE,uEAAuE;QACvE,yEAAyE;QACzE,0EAA0E;QAC1E,4EAA4E;QAC5E,eAAe,CAAC,MAAM,EAAE;YACtB,GAAG,oBAAoB,CAAC,MAAM,CAAC;YAC/B,GAAG,QAAQ;YACX,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,mBAAmB,CAAC,GAA4B;IACvD,MAAM,QAAQ,GACZ,GAAG,CAAC,IAAI,KAAK,SAAS;QACpB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;QACpC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU;YACvB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK;gBAClB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;gBACrC,CAAC,CAAC,IAAI,CAAC;IACf,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAE1B,+EAA+E;IAC/E,0EAA0E;IAC1E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACnF,CAAC,CAAE,GAAG,CAAC,IAAgC;QACvC,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC;AACzD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CACnB,IAA6B,EAC7B,IAA6B;IAE7B,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,WAAW,GACf,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpE,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW;YACvB,CAAC,CAAC,EAAE,GAAI,QAAoC,EAAE,GAAI,KAAiC,EAAE;YACrF,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpD,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEzC,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,0EAA0E;IAC1E,IAAI,UAAU,GAA4B,EAAE,CAAC;IAC7C,IAAI,QAAQ,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;YAC7C,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACnB,uEAAuE;YACvE,uEAAuE;YACvE,qEAAqE;YACrE,yEAAyE;YACzE,yEAAyE;YACzE,yEAAyE;YACzE,yEAAyE;YACzE,EAAE;YACF,0EAA0E;YAC1E,0EAA0E;YAC1E,sEAAsE;YACtE,qBAAqB;YACrB,UAAU,GAAG,oBAAoB,CAC/B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC,IAAI,EAAE,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CACrD,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,IAAI,SAAS;QAChB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAC5E,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC;QACnC,GAAG;QACH,UAAU;QACV,WAAW;QACX,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,SAAS,CAAC,GAA4B,EAAE,QAAgB;IAC/D,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC;AACrE,CAAC;AAED,iEAAiE;AACjE,SAAS,kBAAkB,CAAC,GAA4B;IACtD,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;iFACiF;AACjF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAA8B;IAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,mCAAmC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,+BAA+B;YAC/F,4DAA4D,CAC/D,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,GAA4B,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAEhE,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QAChE,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,GAAG,EAAE,GAAI,MAAM,CAAC,IAAgC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAqB,EAAE,MAAc;IACnE,OAAO,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzF,CAAC"}
|