@nexus-cortex/core 4.129.1 → 4.131.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/.env.defaults +168 -2
- package/dist/adapters/ChatCompletionsAPIAdapter.d.ts.map +1 -1
- package/dist/adapters/ChatCompletionsAPIAdapter.js +5 -1
- package/dist/adapters/ChatCompletionsAPIAdapter.js.map +1 -1
- package/dist/commands/SlashCommandRegistry.d.ts.map +1 -1
- package/dist/commands/SlashCommandRegistry.js +7 -0
- package/dist/commands/SlashCommandRegistry.js.map +1 -1
- package/dist/config/AnthropicCredentialService.d.ts.map +1 -1
- package/dist/config/AnthropicCredentialService.js +2 -1
- package/dist/config/AnthropicCredentialService.js.map +1 -1
- package/dist/config/RuntimeConfigRegistry.d.ts.map +1 -1
- package/dist/config/RuntimeConfigRegistry.js +18 -0
- package/dist/config/RuntimeConfigRegistry.js.map +1 -1
- package/dist/config/SettingsLoader.d.ts +3 -0
- package/dist/config/SettingsLoader.d.ts.map +1 -1
- package/dist/config/SettingsLoader.js +42 -0
- package/dist/config/SettingsLoader.js.map +1 -1
- package/dist/config/SettingsSchema.d.ts +20 -1
- package/dist/config/SettingsSchema.d.ts.map +1 -1
- package/dist/config/SettingsSchema.js +173 -1
- package/dist/config/SettingsSchema.js.map +1 -1
- package/dist/config/effectiveConfig.d.ts.map +1 -1
- package/dist/config/effectiveConfig.js +20 -2
- package/dist/config/effectiveConfig.js.map +1 -1
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/localBrowser.d.ts +13 -0
- package/dist/config/localBrowser.d.ts.map +1 -0
- package/dist/config/localBrowser.js +53 -0
- package/dist/config/localBrowser.js.map +1 -0
- package/dist/config/logRedaction.d.ts +5 -0
- package/dist/config/logRedaction.d.ts.map +1 -0
- package/dist/config/logRedaction.js +68 -0
- package/dist/config/logRedaction.js.map +1 -0
- package/dist/config/secretProviders.d.ts +16 -0
- package/dist/config/secretProviders.d.ts.map +1 -0
- package/dist/config/secretProviders.js +26 -0
- package/dist/config/secretProviders.js.map +1 -0
- package/dist/config/secretsVault.d.ts +121 -0
- package/dist/config/secretsVault.d.ts.map +1 -0
- package/dist/config/secretsVault.js +320 -0
- package/dist/config/secretsVault.js.map +1 -0
- package/dist/config/spaSecretTypes.d.ts +329 -0
- package/dist/config/spaSecretTypes.d.ts.map +1 -0
- package/dist/config/spaSecretTypes.js +326 -0
- package/dist/config/spaSecretTypes.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/McpClient.d.ts +2 -0
- package/dist/mcp/McpClient.d.ts.map +1 -1
- package/dist/mcp/McpClient.js +9 -1
- package/dist/mcp/McpClient.js.map +1 -1
- package/dist/mcp/McpServerRegistry.d.ts +2 -13
- package/dist/mcp/McpServerRegistry.d.ts.map +1 -1
- package/dist/mcp/McpServerRegistry.js +17 -2
- package/dist/mcp/McpServerRegistry.js.map +1 -1
- package/dist/mcp/essentialMcpTools.d.ts +11 -0
- package/dist/mcp/essentialMcpTools.d.ts.map +1 -0
- package/dist/mcp/essentialMcpTools.js +22 -0
- package/dist/mcp/essentialMcpTools.js.map +1 -0
- package/dist/mcp/mcpSchemaCompat.d.ts +9 -0
- package/dist/mcp/mcpSchemaCompat.d.ts.map +1 -0
- package/dist/mcp/mcpSchemaCompat.js +32 -0
- package/dist/mcp/mcpSchemaCompat.js.map +1 -0
- package/dist/middleware/HelperModelMiddleware.d.ts +4 -0
- package/dist/middleware/HelperModelMiddleware.d.ts.map +1 -1
- package/dist/middleware/HelperModelMiddleware.js +2 -2
- package/dist/middleware/HelperModelMiddleware.js.map +1 -1
- package/dist/middleware/SystemMessageMiddleware.d.ts.map +1 -1
- package/dist/middleware/SystemMessageMiddleware.js +6 -0
- package/dist/middleware/SystemMessageMiddleware.js.map +1 -1
- package/dist/middleware/permissions/DefaultPolicies.d.ts.map +1 -1
- package/dist/middleware/permissions/DefaultPolicies.js +2 -0
- package/dist/middleware/permissions/DefaultPolicies.js.map +1 -1
- package/dist/orchestrator/APIClient.d.ts.map +1 -1
- package/dist/orchestrator/APIClient.js +46 -1
- package/dist/orchestrator/APIClient.js.map +1 -1
- package/dist/orchestrator/CortexOrchestrator.d.ts +43 -8
- package/dist/orchestrator/CortexOrchestrator.d.ts.map +1 -1
- package/dist/orchestrator/CortexOrchestrator.js +339 -38
- package/dist/orchestrator/CortexOrchestrator.js.map +1 -1
- package/dist/orchestrator/HerdrSubAgentRunner.d.ts.map +1 -1
- package/dist/orchestrator/HerdrSubAgentRunner.js +2 -1
- package/dist/orchestrator/HerdrSubAgentRunner.js.map +1 -1
- package/dist/orchestrator/SubAgentProcessManager.d.ts.map +1 -1
- package/dist/orchestrator/SubAgentProcessManager.js +2 -0
- package/dist/orchestrator/SubAgentProcessManager.js.map +1 -1
- package/dist/orchestrator/browserWallNudge.d.ts +93 -0
- package/dist/orchestrator/browserWallNudge.d.ts.map +1 -0
- package/dist/orchestrator/browserWallNudge.js +227 -0
- package/dist/orchestrator/browserWallNudge.js.map +1 -0
- package/dist/orchestrator/citationVerification.d.ts.map +1 -1
- package/dist/orchestrator/citationVerification.js +16 -0
- package/dist/orchestrator/citationVerification.js.map +1 -1
- package/dist/orchestrator/cortexProxyFetch.d.ts +8 -0
- package/dist/orchestrator/cortexProxyFetch.d.ts.map +1 -1
- package/dist/orchestrator/cortexProxyFetch.js +32 -0
- package/dist/orchestrator/cortexProxyFetch.js.map +1 -1
- package/dist/orchestrator/endTurnGates.d.ts +39 -0
- package/dist/orchestrator/endTurnGates.d.ts.map +1 -1
- package/dist/orchestrator/endTurnGates.js +159 -3
- package/dist/orchestrator/endTurnGates.js.map +1 -1
- package/dist/orchestrator/imageTtl.d.ts.map +1 -1
- package/dist/orchestrator/imageTtl.js +14 -5
- package/dist/orchestrator/imageTtl.js.map +1 -1
- package/dist/orchestrator/integrityVerification.d.ts +2 -0
- package/dist/orchestrator/integrityVerification.d.ts.map +1 -1
- package/dist/orchestrator/integrityVerification.js +2 -2
- package/dist/orchestrator/integrityVerification.js.map +1 -1
- package/dist/orchestrator/requestDebugLog.d.ts +4 -0
- package/dist/orchestrator/requestDebugLog.d.ts.map +1 -0
- package/dist/orchestrator/requestDebugLog.js +55 -0
- package/dist/orchestrator/requestDebugLog.js.map +1 -0
- package/dist/orchestrator/requirementsVerification.d.ts +4 -0
- package/dist/orchestrator/requirementsVerification.d.ts.map +1 -1
- package/dist/orchestrator/requirementsVerification.js +12 -6
- package/dist/orchestrator/requirementsVerification.js.map +1 -1
- package/dist/orchestrator/subAgentTimeout.d.ts +3 -0
- package/dist/orchestrator/subAgentTimeout.d.ts.map +1 -1
- package/dist/orchestrator/subAgentTimeout.js +6 -0
- package/dist/orchestrator/subAgentTimeout.js.map +1 -1
- package/dist/orchestrator/toolAllowlist.d.ts +29 -0
- package/dist/orchestrator/toolAllowlist.d.ts.map +1 -1
- package/dist/orchestrator/toolAllowlist.js +45 -0
- package/dist/orchestrator/toolAllowlist.js.map +1 -1
- package/dist/tools/ToolProfile.d.ts +5 -21
- package/dist/tools/ToolProfile.d.ts.map +1 -1
- package/dist/tools/ToolProfile.js +17 -2
- package/dist/tools/ToolProfile.js.map +1 -1
- package/dist/tools/registries/BaseToolRegistry.d.ts.map +1 -1
- package/dist/tools/registries/BaseToolRegistry.js +26 -6
- package/dist/tools/registries/BaseToolRegistry.js.map +1 -1
- package/dist/training/AutoResearchConfirm.d.ts +105 -0
- package/dist/training/AutoResearchConfirm.d.ts.map +1 -0
- package/dist/training/AutoResearchConfirm.js +111 -0
- package/dist/training/AutoResearchConfirm.js.map +1 -0
- package/dist/training/AutoResearchGate.d.ts +6 -0
- package/dist/training/AutoResearchGate.d.ts.map +1 -1
- package/dist/training/AutoResearchGate.js +8 -2
- package/dist/training/AutoResearchGate.js.map +1 -1
- package/dist/training/AutoResearchGuards.d.ts +86 -0
- package/dist/training/AutoResearchGuards.d.ts.map +1 -0
- package/dist/training/AutoResearchGuards.js +81 -0
- package/dist/training/AutoResearchGuards.js.map +1 -0
- package/dist/training/BenchRunner.d.ts +21 -5
- package/dist/training/BenchRunner.d.ts.map +1 -1
- package/dist/training/BenchRunner.js +126 -54
- package/dist/training/BenchRunner.js.map +1 -1
- package/dist/training/EvalGuard.d.ts +43 -0
- package/dist/training/EvalGuard.d.ts.map +1 -0
- package/dist/training/EvalGuard.js +131 -0
- package/dist/training/EvalGuard.js.map +1 -0
- package/dist/training/ExperimentRunner.d.ts +22 -0
- package/dist/training/ExperimentRunner.d.ts.map +1 -1
- package/dist/training/ExperimentRunner.js +45 -9
- package/dist/training/ExperimentRunner.js.map +1 -1
- package/dist/training/endTurnResolver.d.ts +23 -1
- package/dist/training/endTurnResolver.d.ts.map +1 -1
- package/dist/training/endTurnResolver.js +35 -3
- package/dist/training/endTurnResolver.js.map +1 -1
- package/dist/training/mentorRole.d.ts.map +1 -1
- package/dist/training/mentorRole.js +6 -1
- package/dist/training/mentorRole.js.map +1 -1
- package/dist/training/scopeCheck.d.ts +41 -0
- package/dist/training/scopeCheck.d.ts.map +1 -0
- package/dist/training/scopeCheck.js +119 -0
- package/dist/training/scopeCheck.js.map +1 -0
- package/dist/training/usageAccounting.d.ts +13 -0
- package/dist/training/usageAccounting.d.ts.map +1 -1
- package/dist/training/usageAccounting.js +11 -0
- package/dist/training/usageAccounting.js.map +1 -1
- package/dist/utils/repairToolJson.d.ts +19 -0
- package/dist/utils/repairToolJson.d.ts.map +1 -0
- package/dist/utils/repairToolJson.js +122 -0
- package/dist/utils/repairToolJson.js.map +1 -0
- package/package.json +6 -5
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* secretsVault — the encrypted secrets store for nexus-cortex (plan: docs/SECRETS_VAULT_PLAN.md, operator 2026-11-02).
|
|
3
|
+
*
|
|
4
|
+
* File `~/.cortex/secrets.enc` (owner-only). Each value is encrypted in the SAME format as the Nexus Terminal SPA's SECRETS store
|
|
5
|
+
* (nexus-terminal/services/secrets/crypto.ts): PBKDF2-SHA256 100k (salt `nexus-secrets-v1-<id>`) → AES-256-GCM, 12-byte IV,
|
|
6
|
+
* 16-byte tag, `{ iv, ciphertext, tag, version }` in base64 — so one format serves both surfaces. Node's synchronous crypto is used
|
|
7
|
+
* here (byte-compatible with the SPA's Web Crypto) because `bootstrapEnv` is synchronous.
|
|
8
|
+
*
|
|
9
|
+
* Unlock — NEVER blocks a headless run (nexus-cortex is mostly driven by other agents):
|
|
10
|
+
* 1. CORTEX_SECRETS_KEY (the master secret) or CORTEX_SECRETS_KEY_FILE (a file holding it) — how orchestrators pass it, like Replit
|
|
11
|
+
* 2. the OS keychain through each system's own CLI (no native add-ons): macOS `security`, Linux `secret-tool` (Secret Service)
|
|
12
|
+
* 3. ~/.cortex/vault.key — owner-only, written by `cortex secrets init` when the machine has no keychain (headless VM / container)
|
|
13
|
+
* 4. a passphrase — only when a person is at a terminal, asked by the interactive commands (never here)
|
|
14
|
+
* 5. otherwise: no vault this run (status reported once; nothing hangs, nothing exits)
|
|
15
|
+
*/
|
|
16
|
+
import crypto from 'crypto';
|
|
17
|
+
import fs from 'fs';
|
|
18
|
+
import path from 'path';
|
|
19
|
+
import { execFileSync } from 'child_process';
|
|
20
|
+
import os from 'os';
|
|
21
|
+
/** Same rule as SettingsLoader.getGlobalConfigDir (kept local: SettingsLoader imports this module). */
|
|
22
|
+
const getGlobalConfigDir = () => path.join(process.env.CORTEX_HOME || os.homedir() || process.cwd(), '.cortex');
|
|
23
|
+
export const VAULT_FILE = 'secrets.enc';
|
|
24
|
+
export const VAULT_ID = 'cortex-local'; // the SPA derives per user id; the harness vault is per machine user
|
|
25
|
+
// The SPA's own parameters (synced copy of nexus-terminal/services/secrets/types.ts) — one source for both surfaces.
|
|
26
|
+
import { PBKDF2_ITERATIONS, ENCRYPTION_VERSION } from './spaSecretTypes.js';
|
|
27
|
+
export { PBKDF2_ITERATIONS, ENCRYPTION_VERSION };
|
|
28
|
+
const KEYCHAIN_SERVICE = 'nexus-cortex-vault';
|
|
29
|
+
const KEYCHAIN_ACCOUNT = 'master';
|
|
30
|
+
const CHECK_PLAINTEXT = 'nexus-cortex-vault-ok';
|
|
31
|
+
export const vaultPath = () => path.join(getGlobalConfigDir(), VAULT_FILE);
|
|
32
|
+
/** Where `cortex secrets init` keeps the key when the machine has no keychain (headless VM / container): owner-only, beside the vault. */
|
|
33
|
+
export const vaultKeyFilePath = () => path.join(getGlobalConfigDir(), 'vault.key');
|
|
34
|
+
// ── crypto (SPA-compatible) ─────────────────────────────────────────────────
|
|
35
|
+
export function deriveKey(master, id = VAULT_ID) {
|
|
36
|
+
return crypto.pbkdf2Sync(Buffer.from(master, 'utf8'), Buffer.from(`nexus-secrets-v1-${id}`, 'utf8'), PBKDF2_ITERATIONS, 32, 'sha256');
|
|
37
|
+
}
|
|
38
|
+
export function encryptValue(key, plaintext) {
|
|
39
|
+
const iv = crypto.randomBytes(12);
|
|
40
|
+
const c = crypto.createCipheriv('aes-256-gcm', key, iv);
|
|
41
|
+
const ciphertext = Buffer.concat([c.update(plaintext, 'utf8'), c.final()]);
|
|
42
|
+
return { iv: iv.toString('base64'), ciphertext: ciphertext.toString('base64'), tag: c.getAuthTag().toString('base64'), version: ENCRYPTION_VERSION };
|
|
43
|
+
}
|
|
44
|
+
export function decryptValue(key, e) {
|
|
45
|
+
const d = crypto.createDecipheriv('aes-256-gcm', key, Buffer.from(e.iv, 'base64'));
|
|
46
|
+
d.setAuthTag(Buffer.from(e.tag, 'base64'));
|
|
47
|
+
return Buffer.concat([d.update(Buffer.from(e.ciphertext, 'base64')), d.final()]).toString('utf8');
|
|
48
|
+
}
|
|
49
|
+
// ── the master secret ───────────────────────────────────────────────────────
|
|
50
|
+
function keychainGet() {
|
|
51
|
+
try {
|
|
52
|
+
if (process.platform === 'darwin')
|
|
53
|
+
return execFileSync('security', ['find-generic-password', '-s', KEYCHAIN_SERVICE, '-a', KEYCHAIN_ACCOUNT, '-w'], { stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000 }).toString().trim() || null;
|
|
54
|
+
if (process.platform === 'linux')
|
|
55
|
+
return execFileSync('secret-tool', ['lookup', 'service', KEYCHAIN_SERVICE, 'account', KEYCHAIN_ACCOUNT], { stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000 }).toString().trim() || null;
|
|
56
|
+
}
|
|
57
|
+
catch { /* no keychain / no entry / locked — next source */ }
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/** Store the master secret in the OS keychain. Returns false when no usable keychain exists (headless VM, container). */
|
|
61
|
+
export function keychainSet(master) {
|
|
62
|
+
try {
|
|
63
|
+
if (process.platform === 'darwin') {
|
|
64
|
+
execFileSync('security', ['add-generic-password', '-U', '-s', KEYCHAIN_SERVICE, '-a', KEYCHAIN_ACCOUNT, '-w', master], { stdio: 'ignore', timeout: 5000 });
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (process.platform === 'linux') {
|
|
68
|
+
execFileSync('secret-tool', ['store', '--label=nexus-cortex secrets vault', 'service', KEYCHAIN_SERVICE, 'account', KEYCHAIN_ACCOUNT], { input: master, stdio: ['pipe', 'ignore', 'ignore'], timeout: 5000 });
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch { /* no keychain */ }
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
/** The master secret from the non-interactive sources, in order. Never prompts. */
|
|
76
|
+
export function resolveMasterSecret(env = process.env) {
|
|
77
|
+
if (env.CORTEX_SECRETS_KEY?.trim())
|
|
78
|
+
return { master: env.CORTEX_SECRETS_KEY.trim(), source: 'env' };
|
|
79
|
+
if (env.CORTEX_SECRETS_KEY_FILE?.trim()) {
|
|
80
|
+
try {
|
|
81
|
+
const v = fs.readFileSync(env.CORTEX_SECRETS_KEY_FILE.trim(), 'utf8').trim();
|
|
82
|
+
if (v)
|
|
83
|
+
return { master: v, source: 'env-file' };
|
|
84
|
+
}
|
|
85
|
+
catch { /* unreadable → next */ }
|
|
86
|
+
}
|
|
87
|
+
const k = keychainGet();
|
|
88
|
+
if (k)
|
|
89
|
+
return { master: k, source: 'keychain' };
|
|
90
|
+
// No keychain on this machine: the owner-only key file `init` wrote (zero-friction default for headless VMs).
|
|
91
|
+
try {
|
|
92
|
+
const v = fs.readFileSync(vaultKeyFilePath(), 'utf8').trim();
|
|
93
|
+
if (v)
|
|
94
|
+
return { master: v, source: 'key-file' };
|
|
95
|
+
}
|
|
96
|
+
catch { /* none */ }
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
export const newMasterSecret = () => crypto.randomBytes(32).toString('base64url');
|
|
100
|
+
// ── the vault file ──────────────────────────────────────────────────────────
|
|
101
|
+
export function readVaultFile(file = vaultPath()) {
|
|
102
|
+
try {
|
|
103
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function writeVaultFile(v, file = vaultPath()) {
|
|
110
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
111
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
112
|
+
fs.writeFileSync(tmp, JSON.stringify(v, null, 1), { mode: 0o600 });
|
|
113
|
+
fs.renameSync(tmp, file); // atomic replace — a crash never leaves a half-written vault
|
|
114
|
+
}
|
|
115
|
+
export function createVault(master, file = vaultPath()) {
|
|
116
|
+
const v = { version: 1, id: VAULT_ID, check: encryptValue(deriveKey(master), CHECK_PLAINTEXT), secrets: {}, bindings: [] };
|
|
117
|
+
writeVaultFile(v, file);
|
|
118
|
+
return v;
|
|
119
|
+
}
|
|
120
|
+
/** An open vault: values are decrypted only on request and never logged. */
|
|
121
|
+
export class Vault {
|
|
122
|
+
key;
|
|
123
|
+
data;
|
|
124
|
+
file;
|
|
125
|
+
source;
|
|
126
|
+
constructor(key, data, file, source) {
|
|
127
|
+
this.key = key;
|
|
128
|
+
this.data = data;
|
|
129
|
+
this.file = file;
|
|
130
|
+
this.source = source;
|
|
131
|
+
}
|
|
132
|
+
static open(master, source, file = vaultPath()) {
|
|
133
|
+
const data = readVaultFile(file);
|
|
134
|
+
if (!data)
|
|
135
|
+
throw new Error(`no vault at ${file}`);
|
|
136
|
+
const key = deriveKey(master, data.id);
|
|
137
|
+
try {
|
|
138
|
+
if (decryptValue(key, data.check) !== CHECK_PLAINTEXT)
|
|
139
|
+
throw new Error('bad check');
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
throw new Error('wrong vault key');
|
|
143
|
+
}
|
|
144
|
+
return new Vault(key, data, file, source);
|
|
145
|
+
}
|
|
146
|
+
names() { return Object.keys(this.data.secrets).sort(); }
|
|
147
|
+
meta(name) { const e = this.data.secrets[name]; if (!e)
|
|
148
|
+
return null; const { enc: _enc, ...m } = e; return m; }
|
|
149
|
+
get(name) { const e = this.data.secrets[name]; return e ? decryptValue(this.key, e.enc) : null; }
|
|
150
|
+
set(name, value, meta = {}) {
|
|
151
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
|
|
152
|
+
throw new Error('secret names are environment-variable style: letters, digits, _');
|
|
153
|
+
const prev = this.data.secrets[name];
|
|
154
|
+
this.data.secrets[name] = { ...(prev ? { provider: prev.provider, type: prev.type, category: prev.category, note: prev.note } : {}), ...meta, enc: encryptValue(this.key, value), updatedAt: Date.now() };
|
|
155
|
+
writeVaultFile(this.data, this.file);
|
|
156
|
+
}
|
|
157
|
+
delete(name) { if (!this.data.secrets[name])
|
|
158
|
+
return false; delete this.data.secrets[name]; this.data.bindings = this.data.bindings.filter((b) => b.secret !== name); writeVaultFile(this.data, this.file); return true; }
|
|
159
|
+
bindings() { return [...this.data.bindings]; }
|
|
160
|
+
bind(b) { if (!this.data.secrets[b.secret])
|
|
161
|
+
throw new Error(`no secret ${b.secret}`); this.data.bindings = [...this.data.bindings.filter((x) => !(x.envVar === b.envVar && x.tool === b.tool)), b]; writeVaultFile(this.data, this.file); }
|
|
162
|
+
unbind(envVar, tool) { this.data.bindings = this.data.bindings.filter((x) => !(x.envVar === envVar && x.tool === tool)); writeVaultFile(this.data, this.file); }
|
|
163
|
+
/** Every value, for output masking only (never for display). */
|
|
164
|
+
allValues() { return this.names().map((name) => ({ name, value: this.get(name) })).filter((x) => x.value.length >= 6); }
|
|
165
|
+
}
|
|
166
|
+
/** Open the vault from the non-interactive sources, or report why not. */
|
|
167
|
+
export function openVaultNonInteractive(env = process.env, file = vaultPath()) {
|
|
168
|
+
const exists = fs.existsSync(file);
|
|
169
|
+
if (!exists)
|
|
170
|
+
return { vault: null, status: { exists: false, unlocked: false, path: file } };
|
|
171
|
+
const m = resolveMasterSecret(env);
|
|
172
|
+
if (!m)
|
|
173
|
+
return { vault: null, status: { exists: true, unlocked: false, path: file, error: 'locked: set CORTEX_SECRETS_KEY (or CORTEX_SECRETS_KEY_FILE), or unlock with `cortex secrets unlock`' } };
|
|
174
|
+
try {
|
|
175
|
+
const vault = Vault.open(m.master, m.source, file);
|
|
176
|
+
return { vault, status: { exists: true, unlocked: true, source: m.source, count: vault.names().length, path: file } };
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
return { vault: null, status: { exists: true, unlocked: false, path: file, error: String(e.message) } };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** STARTUP: put the vault's secrets into `env` without overriding what is already set (real env > vault > .env files). Never throws. */
|
|
183
|
+
export function loadVaultIntoEnv(env = process.env) {
|
|
184
|
+
try {
|
|
185
|
+
const { vault, status } = openVaultNonInteractive(env);
|
|
186
|
+
if (!vault)
|
|
187
|
+
return status;
|
|
188
|
+
let loaded = 0;
|
|
189
|
+
const injected = [];
|
|
190
|
+
for (const name of vault.names())
|
|
191
|
+
if (env[name] === undefined || env[name] === '') {
|
|
192
|
+
env[name] = vault.get(name);
|
|
193
|
+
loaded++;
|
|
194
|
+
injected.push(name);
|
|
195
|
+
}
|
|
196
|
+
if (env === process.env)
|
|
197
|
+
recordVaultSession(vault, injected, env);
|
|
198
|
+
return { ...status, count: loaded };
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
return { exists: true, unlocked: false, path: vaultPath(), error: String(e.message) };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** Replace any stored secret value appearing in `text` with «secret:NAME» — applied to tool output before the model sees it. */
|
|
205
|
+
export function maskSecrets(text, values) {
|
|
206
|
+
let out = text;
|
|
207
|
+
for (const { name, value } of [...values].sort((a, b) => b.value.length - a.value.length)) {
|
|
208
|
+
if (!value || value.length < 6)
|
|
209
|
+
continue;
|
|
210
|
+
for (const form of [value, Buffer.from(value).toString('base64'), encodeURIComponent(value)])
|
|
211
|
+
if (form && out.includes(form))
|
|
212
|
+
out = out.split(form).join(`«secret:${name}»`);
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
/** Create the vault the zero-friction way (shared by `cortex secrets init` and the /secrets dialogs): the key already given
|
|
217
|
+
* (CORTEX_SECRETS_KEY / _FILE), else a new random key kept in the OS keychain, else in the owner-only key file beside the vault. */
|
|
218
|
+
export function initVaultDefault(env = process.env) {
|
|
219
|
+
if (fs.existsSync(vaultPath()))
|
|
220
|
+
throw new Error(`a vault already exists at ${vaultPath()}`);
|
|
221
|
+
const given = resolveMasterSecret(env);
|
|
222
|
+
let master;
|
|
223
|
+
let where;
|
|
224
|
+
if (given && (given.source === 'env' || given.source === 'env-file')) {
|
|
225
|
+
master = given.master;
|
|
226
|
+
where = given.source;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
master = newMasterSecret();
|
|
230
|
+
if (keychainSet(master))
|
|
231
|
+
where = 'keychain';
|
|
232
|
+
else {
|
|
233
|
+
fs.mkdirSync(path.dirname(vaultKeyFilePath()), { recursive: true, mode: 0o700 });
|
|
234
|
+
fs.writeFileSync(vaultKeyFilePath(), master + '\n', { mode: 0o600 });
|
|
235
|
+
where = 'key-file';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
createVault(master);
|
|
239
|
+
const hint = where === 'key-file' ? `key in ${vaultKeyFilePath()} (owner-only; no keychain on this machine) — for stronger separation move it and pass CORTEX_SECRETS_KEY_FILE`
|
|
240
|
+
: where === 'keychain' ? 'key in the OS keychain; unlocks automatically for this user' : `key from ${where === 'env' ? 'CORTEX_SECRETS_KEY' : 'CORTEX_SECRETS_KEY_FILE'}`;
|
|
241
|
+
return { where, path: vaultPath(), hint };
|
|
242
|
+
}
|
|
243
|
+
let session = null;
|
|
244
|
+
function recordVaultSession(vault, injected, env) {
|
|
245
|
+
const m = resolveMasterSecret(env);
|
|
246
|
+
const values = new Map(vault.names().map((n) => [n, vault.get(n)]));
|
|
247
|
+
// bootstrapEnv runs more than once per process (entry point + OrchestratorFactory, per request in stateless mode); a later run finds
|
|
248
|
+
// the vault keys already set and injects nothing — keep what earlier runs injected or the tool-env filter would forget them.
|
|
249
|
+
const names = new Set([...(session?.injected.keys() ?? []), ...injected].filter((n) => values.has(n)));
|
|
250
|
+
session = {
|
|
251
|
+
injected: new Map([...names].map((n) => [n, values.get(n)])),
|
|
252
|
+
mask: [...vault.allValues(), ...(m ? [{ name: 'CORTEX_SECRETS_KEY', value: m.master }] : [])],
|
|
253
|
+
bindings: vault.bindings().filter((b) => values.has(b.secret)).map((b) => ({ ...b, value: values.get(b.secret) })),
|
|
254
|
+
file: vault.file, mtimeMs: safeMtime(vault.file),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
const safeMtime = (f) => { try {
|
|
258
|
+
return fs.statSync(f).mtimeMs;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return 0;
|
|
262
|
+
} };
|
|
263
|
+
/** The session, re-read when the vault file changed (a /secrets edit or `cortex secrets set` during the session). */
|
|
264
|
+
function currentSession() {
|
|
265
|
+
if (!session || safeMtime(session.file) === session.mtimeMs)
|
|
266
|
+
return session;
|
|
267
|
+
try {
|
|
268
|
+
const m = resolveMasterSecret(process.env);
|
|
269
|
+
if (!m)
|
|
270
|
+
return session;
|
|
271
|
+
const vault = Vault.open(m.master, m.source, session.file);
|
|
272
|
+
// Names the startup injected stay "injected" (their process.env value may now be stale — still the vault's, never the user's).
|
|
273
|
+
recordVaultSession(vault, [...session.injected.keys()], process.env);
|
|
274
|
+
}
|
|
275
|
+
catch { /* keep the previous session */ }
|
|
276
|
+
return session;
|
|
277
|
+
}
|
|
278
|
+
/** Environment for a process that runs model-chosen code. `tool` selects tool-scoped bindings (e.g. 'Bash'). Always returns an object. */
|
|
279
|
+
export function toolChildEnv(base = process.env, tool) {
|
|
280
|
+
const out = { ...base };
|
|
281
|
+
const s = currentSession();
|
|
282
|
+
if (!s)
|
|
283
|
+
return out;
|
|
284
|
+
for (const [name, value] of s.injected)
|
|
285
|
+
if (out[name] === value)
|
|
286
|
+
delete out[name];
|
|
287
|
+
delete out.CORTEX_SECRETS_KEY;
|
|
288
|
+
delete out.CORTEX_SECRETS_KEY_FILE;
|
|
289
|
+
for (const b of s.bindings)
|
|
290
|
+
if (b.scope === 'global' || (tool && b.tool === tool))
|
|
291
|
+
out[b.envVar] = b.value;
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
/** Replace every vault value (and the vault key) in `text` with «secret:NAME». Identity when no vault is unlocked. */
|
|
295
|
+
export function maskSecretText(text) {
|
|
296
|
+
const s = currentSession();
|
|
297
|
+
return s && typeof text === 'string' && text ? maskSecrets(text, s.mask) : text;
|
|
298
|
+
}
|
|
299
|
+
/** maskSecretText over a batch of tool results (content strings only; everything else passes through). */
|
|
300
|
+
export function maskToolResults(results) {
|
|
301
|
+
if (!currentSession())
|
|
302
|
+
return results;
|
|
303
|
+
return results.map((r) => (typeof r.content === 'string' ? { ...r, content: maskSecretText(r.content) } : r));
|
|
304
|
+
}
|
|
305
|
+
/** What the secrets-list tool reports: names, providers, bindings, and how the vault unlocked. Never values. */
|
|
306
|
+
export function describeVaultForAgent() {
|
|
307
|
+
const r = openVaultNonInteractive();
|
|
308
|
+
if (!r.vault)
|
|
309
|
+
return { unlocked: false, secrets: [], note: r.status.exists ? `vault locked (${r.status.error ?? 'no key'})` : 'no vault on this machine' };
|
|
310
|
+
const v = r.vault;
|
|
311
|
+
return {
|
|
312
|
+
unlocked: true, source: r.status.source,
|
|
313
|
+
secrets: v.names().map((name) => ({ name, provider: v.meta(name)?.provider, type: v.meta(name)?.type,
|
|
314
|
+
boundAs: v.bindings().filter((b) => b.secret === name).map((b) => (b.tool ? `$${b.envVar} (tool ${b.tool})` : `$${b.envVar}`)) })),
|
|
315
|
+
note: 'Values are never shown. A secret reaches your shell/tool processes only through a binding (the user runs `cortex secrets bind NAME ENV_VAR`); the harness itself already uses provider keys from the vault. Tool output shows a stored value as «secret:NAME».',
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/** Test hook: forget the recorded session. */
|
|
319
|
+
export function _resetVaultSessionForTests() { session = null; }
|
|
320
|
+
//# sourceMappingURL=secretsVault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretsVault.js","sourceRoot":"","sources":["../../src/config/secretsVault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,uGAAuG;AACvG,MAAM,kBAAkB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AAExH,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAiB,qEAAqE;AAC7H,qHAAqH;AACrH,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AACjD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAC9C,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAClC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAShD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,UAAU,CAAC,CAAC;AACnF,0IAA0I;AAC1I,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,WAAW,CAAC,CAAC;AAE3F,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,EAAE,GAAG,QAAQ;IACrD,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;AACxI,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,SAAiB;IACzD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3E,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AACvJ,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,CAAkB;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpG,CAAC;AAED,+EAA+E;AAC/E,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,YAAY,CAAC,UAAU,EAAE,CAAC,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QACtO,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,YAAY,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/N,CAAC;IAAC,MAAM,CAAC,CAAC,mDAAmD,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AACD,yHAAyH;AACzH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAAC,YAAY,CAAC,UAAU,EAAE,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAC/M,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAAC,YAAY,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,oCAAoC,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACnQ,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AACD,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,IAAI,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACpG,IAAI,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,IAAI,CAAC;YAAC,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IAAC,CAAC;IACrN,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC;IAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACzE,8GAA8G;IAC9G,IAAI,CAAC;QAAC,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAAC,IAAI,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3I,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE1F,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,IAAI,GAAG,SAAS,EAAE;IAC9C,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAc,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC/F,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,CAAY,EAAE,IAAI,GAAG,SAAS,EAAE;IAC7D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAG,6DAA6D;AAC3F,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAI,GAAG,SAAS,EAAE;IAC5D,MAAM,CAAC,GAAc,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACtI,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,4EAA4E;AAC5E,MAAM,OAAO,KAAK;IACqB;IAAqB;IAA0B;IAAuB;IAA3G,YAAqC,GAAW,EAAU,IAAe,EAAW,IAAY,EAAW,MAAoB;QAA1F,QAAG,GAAH,GAAG,CAAQ;QAAU,SAAI,GAAJ,IAAI,CAAW;QAAW,SAAI,GAAJ,IAAI,CAAQ;QAAW,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IACnI,MAAM,CAAC,IAAI,CAAC,MAAc,EAAE,MAAoB,EAAE,IAAI,GAAG,SAAS,EAAE;QAClE,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QACpF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC;YAAC,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,eAAe;gBAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAAC,CAAC;QAC1I,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,KAAe,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,IAAY,IAAoC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvJ,GAAG,CAAC,IAAY,IAAmB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxH,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,OAA8C,EAAE;QAC/E,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAC/H,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1M,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,CAAC,IAAY,IAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAC1O,QAAQ,KAAqB,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAe,IAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/P,MAAM,CAAC,MAAc,EAAE,IAAa,IAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvL,gEAAgE;IAChE,SAAS,KAA6C,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;CAClK;AAED,0EAA0E;AAC1E,MAAM,UAAU,uBAAuB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,SAAS,EAAE;IAC9F,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5F,MAAM,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,qGAAqG,EAAE,EAAE,CAAC;IACpM,IAAI,CAAC;QAAC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IAAC,CAAC;IAClL,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAE,CAAW,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;IAAC,CAAC;AACnI,CAAC;AAED,wIAAwI;AACxI,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,OAAO,MAAM,CAAC;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;QAAC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;YAAE,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;gBAAC,MAAM,EAAE,CAAC;gBAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;QACnJ,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG;YAAE,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAClE,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAE,CAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IAAC,CAAC;AACnH,CAAC;AAED,gIAAgI;AAChI,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAA8C;IACtF,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1F,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACzC,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAAE,IAAI,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;IAC/K,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;qIACqI;AACrI,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,MAAc,CAAC;IAAC,IAAI,KAAmB,CAAC;IAC5C,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;QAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAAC,CAAC;SACjH,CAAC;QACJ,MAAM,GAAG,eAAe,EAAE,CAAC;QAC3B,IAAI,WAAW,CAAC,MAAM,CAAC;YAAE,KAAK,GAAG,UAAU,CAAC;aACvC,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,KAAK,GAAG,UAAU,CAAC;QAAC,CAAC;IACtL,CAAC;IACD,WAAW,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,gBAAgB,EAAE,+GAA+G;QAC7K,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;IAC5K,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC;AAC5C,CAAC;AAWD,IAAI,OAAO,GAAwB,IAAI,CAAC;AAExC,SAAS,kBAAkB,CAAC,KAAY,EAAE,QAAkB,EAAE,GAAsB;IAClF,MAAM,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAE,CAAU,CAAC,CAAC,CAAC;IAC9E,qIAAqI;IACrI,6HAA6H;IAC7H,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvG,OAAO,GAAG;QACR,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,CAAU,CAAC,CAAC;QACtE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7F,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,EAAE,CAAC,CAAC;QACnH,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,CAAC,CAAC;AAAC,CAAC,CAAC,CAAC,CAAC;AAExG,qHAAqH;AACrH,SAAS,cAAc;IACrB,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5E,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3D,+HAA+H;QAC/H,kBAAkB,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0IAA0I;AAC1I,MAAM,UAAU,YAAY,CAAC,OAA0B,OAAO,CAAC,GAAG,EAAE,IAAa;IAC/E,MAAM,GAAG,GAAsB,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3C,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ;QAAE,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO,GAAG,CAAC,kBAAkB,CAAC;IAAC,OAAO,GAAG,CAAC,uBAAuB,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;QAAE,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC3G,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;IAC3B,OAAO,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClF,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,eAAe,CAAiC,OAAY;IAC1E,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,OAAO,CAAC;IACtC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,qBAAqB;IACnC,MAAM,CAAC,GAAG,uBAAuB,EAAE,CAAC;IACpC,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAAC;IAC3J,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,OAAO;QACL,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;QACvC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI;YAClG,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACpI,IAAI,EAAE,gQAAgQ;KACvQ,CAAC;AACJ,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,0BAA0B,KAAW,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC"}
|