@agenthifive/openclaw-setup 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,515 @@
1
+ /**
2
+ * AgentHiFive standalone setup CLI.
3
+ *
4
+ * Orchestrates the full setup flow in one command:
5
+ * 1. Checks OpenClaw is installed
6
+ * 2. Runs `openclaw onboard` if needed
7
+ * 3. Installs the @agenthifive/openclaw plugin
8
+ * 4. Bootstraps agent auth (key pair + token exchange)
9
+ * 5. Fetches vault capabilities
10
+ * 6. Writes plugin config to openclaw.json
11
+ * 7. Patches OpenClaw for credential proxying
12
+ * 8. Launches `openclaw model` for default model selection
13
+ */
14
+ import { execSync } from "node:child_process";
15
+ import { mkdirSync, writeFileSync, existsSync, readdirSync } from "node:fs";
16
+ import os from "node:os";
17
+ import path from "node:path";
18
+ import { generateKeyPair, exportJWK } from "jose";
19
+ import { VaultTokenManager } from "./vault-token-manager.js";
20
+ import { resolveOpenClawConfigPath, defaultConfigPath, readExistingConfig, mergePluginConfig, } from "./config-discovery.js";
21
+ import { findOpenClawInstallDir, validateOpenClawDir, applyPatch, } from "./auto-patch.js";
22
+ // ---------------------------------------------------------------------------
23
+ // Readline helpers
24
+ // ---------------------------------------------------------------------------
25
+ async function prompt(question, defaultValue) {
26
+ const { createInterface } = await import("node:readline");
27
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
28
+ const suffix = defaultValue ? ` [${defaultValue}]` : "";
29
+ return new Promise((resolve) => {
30
+ rl.question(`${question}${suffix}: `, (answer) => {
31
+ rl.close();
32
+ resolve(answer.trim() || defaultValue || "");
33
+ });
34
+ });
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Shell helpers
38
+ // ---------------------------------------------------------------------------
39
+ function isOpenClawInstalled() {
40
+ try {
41
+ execSync("openclaw --version", { stdio: "pipe" });
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ function isOnboarded() {
49
+ // Check for existing config file
50
+ const configPath = resolveOpenClawConfigPath();
51
+ if (configPath)
52
+ return true;
53
+ // Check if state directory at least exists
54
+ const stateDir = path.join(os.homedir(), ".openclaw");
55
+ return existsSync(stateDir);
56
+ }
57
+ function isPluginInstalled() {
58
+ const extensionsDir = path.join(os.homedir(), ".openclaw", "extensions");
59
+ if (!existsSync(extensionsDir))
60
+ return false;
61
+ // Check for agenthifive directory in extensions
62
+ try {
63
+ const entries = readdirSync(extensionsDir);
64
+ return entries.some((e) => e === "agenthifive" || e === "@agenthifive");
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ function hasDefaultModel() {
71
+ const configPath = resolveOpenClawConfigPath();
72
+ if (!configPath)
73
+ return false;
74
+ try {
75
+ const config = readExistingConfig(configPath);
76
+ const agents = config.agents;
77
+ const defaults = agents?.defaults;
78
+ const model = defaults?.model;
79
+ if (!model)
80
+ return false;
81
+ if (typeof model === "string")
82
+ return true;
83
+ if (typeof model === "object" && model !== null) {
84
+ return !!model.primary;
85
+ }
86
+ return false;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Vault API helpers
94
+ // ---------------------------------------------------------------------------
95
+ async function bootstrapAgent(baseUrl, bootstrapSecret) {
96
+ const { publicKey, privateKey } = await generateKeyPair("ES256");
97
+ const publicJWK = await exportJWK(publicKey);
98
+ const privateJWK = await exportJWK(privateKey);
99
+ const response = await fetch(`${baseUrl}/v1/agents/bootstrap`, {
100
+ method: "POST",
101
+ headers: { "Content-Type": "application/json" },
102
+ body: JSON.stringify({
103
+ bootstrapSecret: bootstrapSecret.trim(),
104
+ publicKey: publicJWK,
105
+ }),
106
+ signal: AbortSignal.timeout(10_000),
107
+ });
108
+ if (!response.ok) {
109
+ const body = await response.text().catch(() => "");
110
+ throw new Error(`Bootstrap failed (${response.status}): ${body || "check that the secret is valid and not expired"}`);
111
+ }
112
+ const result = (await response.json());
113
+ return { ...result, privateKey: privateJWK };
114
+ }
115
+ async function fetchCapabilities(baseUrl, token) {
116
+ const response = await fetch(`${baseUrl}/v1/capabilities/me`, {
117
+ method: "GET",
118
+ headers: { Authorization: `Bearer ${token}` },
119
+ signal: AbortSignal.timeout(5_000),
120
+ });
121
+ if (!response.ok) {
122
+ throw new Error(`Capabilities fetch failed (${response.status})`);
123
+ }
124
+ const body = (await response.json());
125
+ return body.activeConnections ?? [];
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Service mapping
129
+ // ---------------------------------------------------------------------------
130
+ const SUPPORTED_SERVICES = {
131
+ telegram: "telegram",
132
+ slack: "slack",
133
+ "microsoft-teams": "msteams",
134
+ "anthropic-messages": "anthropic",
135
+ openai: "openai",
136
+ gemini: "gemini",
137
+ };
138
+ function integrationLabel(conn) {
139
+ if (conn.category === "llm")
140
+ return "LLM proxy";
141
+ if (conn.credentialType === "bot_token")
142
+ return "brokered API proxy";
143
+ if (conn.credentialType === "oauth")
144
+ return "brokered API proxy";
145
+ return "auth managed";
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // Config output builder
149
+ // ---------------------------------------------------------------------------
150
+ export function buildConfigOutput(params) {
151
+ return {
152
+ plugins: {
153
+ enabled: true,
154
+ allow: ["agenthifive"],
155
+ load: {
156
+ paths: ["@agenthifive/openclaw"],
157
+ },
158
+ entries: {
159
+ agenthifive: {
160
+ enabled: true,
161
+ hooks: { allowPromptInjection: true },
162
+ config: {
163
+ baseUrl: params.baseUrl,
164
+ auth: {
165
+ mode: "agent",
166
+ agentId: params.agentId,
167
+ privateKey: Buffer.from(JSON.stringify(params.privateKey)).toString("base64"),
168
+ },
169
+ connectedProviders: params.connectedProviders,
170
+ proxiedProviders: params.proxiedProviders,
171
+ },
172
+ },
173
+ },
174
+ },
175
+ };
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // Main setup flow
179
+ // ---------------------------------------------------------------------------
180
+ export async function runSetup(opts = {}) {
181
+ const log = (msg) => process.stdout.write(`${msg}\n`);
182
+ log("");
183
+ log(" AgentHiFive Setup");
184
+ log(" " + "=".repeat(40));
185
+ log("");
186
+ // -----------------------------------------------------------------------
187
+ // Step 0: Check OpenClaw is installed
188
+ // -----------------------------------------------------------------------
189
+ if (!isOpenClawInstalled()) {
190
+ throw new Error("OpenClaw is not installed. Install it first:\n\n" +
191
+ " npm install -g openclaw@latest\n");
192
+ }
193
+ log(" [1/7] OpenClaw installed");
194
+ // -----------------------------------------------------------------------
195
+ // Step 1: Auto-onboard if needed
196
+ // -----------------------------------------------------------------------
197
+ if (!opts.skipOnboard && !isOnboarded()) {
198
+ log(" [2/7] Running OpenClaw onboard...");
199
+ log("");
200
+ try {
201
+ execSync("openclaw onboard --non-interactive --accept-risk --auth-choice skip " +
202
+ "--install-daemon --skip-channels --skip-skills --skip-search --skip-health --skip-ui", { stdio: "inherit" });
203
+ }
204
+ catch {
205
+ throw new Error("OpenClaw onboard failed. Run it manually first:\n\n" +
206
+ " openclaw onboard --non-interactive --accept-risk --auth-choice skip " +
207
+ "--install-daemon --skip-channels --skip-skills --skip-search --skip-health --skip-ui\n");
208
+ }
209
+ log("");
210
+ }
211
+ else {
212
+ log(" [2/7] OpenClaw onboarded");
213
+ }
214
+ // -----------------------------------------------------------------------
215
+ // Step 2: Install plugin if needed
216
+ // -----------------------------------------------------------------------
217
+ if (!opts.skipPluginInstall && !isPluginInstalled()) {
218
+ log(" [3/7] Installing AgentHiFive plugin...");
219
+ log("");
220
+ try {
221
+ execSync("openclaw plugins install @agenthifive/openclaw", {
222
+ stdio: "inherit",
223
+ });
224
+ }
225
+ catch {
226
+ throw new Error("Plugin installation failed. Try manually:\n\n" +
227
+ " openclaw plugins install @agenthifive/openclaw\n");
228
+ }
229
+ log("");
230
+ }
231
+ else {
232
+ log(" [3/7] AgentHiFive plugin installed");
233
+ }
234
+ // -----------------------------------------------------------------------
235
+ // Step 3: Base URL
236
+ // -----------------------------------------------------------------------
237
+ let baseUrl = opts.baseUrl;
238
+ if (!baseUrl) {
239
+ if (opts.nonInteractive) {
240
+ throw new Error("--base-url is required in non-interactive mode");
241
+ }
242
+ baseUrl = await prompt(" AgentHiFive base URL", "https://app.agenthifive.com");
243
+ }
244
+ baseUrl = baseUrl.replace(/\/+$/, "");
245
+ // -----------------------------------------------------------------------
246
+ // Step 4: Bootstrap secret + agent auth
247
+ // -----------------------------------------------------------------------
248
+ let bootstrapSecret = opts.bootstrapSecret;
249
+ if (!bootstrapSecret) {
250
+ if (opts.nonInteractive) {
251
+ throw new Error("--bootstrap-secret is required in non-interactive mode");
252
+ }
253
+ log("");
254
+ log(" Generate a bootstrap secret from the AgentHiFive dashboard:");
255
+ log(" Dashboard -> Agents -> [your agent] -> Bootstrap Secret");
256
+ log(" The secret expires in 1 hour.");
257
+ log("");
258
+ bootstrapSecret = await prompt(" Bootstrap secret (ah5b_...)");
259
+ }
260
+ if (!bootstrapSecret.startsWith("ah5b_")) {
261
+ throw new Error("Bootstrap secrets must start with ah5b_");
262
+ }
263
+ log("");
264
+ log(" [4/7] Bootstrapping agent...");
265
+ const { agentId, name, status, privateKey } = await bootstrapAgent(baseUrl, bootstrapSecret);
266
+ log(` Agent "${name}" bootstrapped (${agentId.slice(0, 8)}..., status: ${status})`);
267
+ // Verify token exchange
268
+ log(" Verifying token exchange...");
269
+ const tokenManager = new VaultTokenManager({
270
+ baseUrl,
271
+ agentId,
272
+ privateKey,
273
+ tokenAudience: baseUrl,
274
+ });
275
+ try {
276
+ await tokenManager.init();
277
+ log(" Token exchange successful");
278
+ }
279
+ catch (err) {
280
+ log(` WARNING: Token exchange failed: ${err instanceof Error ? err.message : String(err)}`);
281
+ log(" Config will still be generated — you may need to fix auth settings.");
282
+ tokenManager.stop();
283
+ outputMinimalConfig(log, baseUrl, agentId, privateKey);
284
+ return;
285
+ }
286
+ // -----------------------------------------------------------------------
287
+ // Step 5: Fetch capabilities
288
+ // -----------------------------------------------------------------------
289
+ log(" [5/7] Fetching capabilities...");
290
+ let vaultConnections = [];
291
+ try {
292
+ vaultConnections = await fetchCapabilities(baseUrl, tokenManager.getToken());
293
+ }
294
+ catch (err) {
295
+ log(` WARNING: Could not fetch capabilities: ${err instanceof Error ? err.message : String(err)}`);
296
+ }
297
+ tokenManager.stop();
298
+ // Show connection status
299
+ const connections = {};
300
+ const connectedProviders = [];
301
+ const proxiedProviders = [];
302
+ const seenServices = new Set();
303
+ log("");
304
+ log(" Connected Services:");
305
+ log(" " + "-".repeat(50));
306
+ for (const conn of vaultConnections) {
307
+ const openclawName = SUPPORTED_SERVICES[conn.service] ?? conn.service;
308
+ connections[openclawName] = conn.connectionId ?? "vault-managed";
309
+ if (seenServices.has(conn.service))
310
+ continue;
311
+ seenServices.add(conn.service);
312
+ const displayLabel = conn.displayName || openclawName;
313
+ log(` + ${displayLabel.padEnd(20)} - connected (${integrationLabel(conn)})`);
314
+ connectedProviders.push(openclawName);
315
+ if (conn.category === "llm") {
316
+ proxiedProviders.push(openclawName);
317
+ }
318
+ }
319
+ for (const [serviceId, openclawName] of Object.entries(SUPPORTED_SERVICES)) {
320
+ if (!seenServices.has(serviceId)) {
321
+ log(` - ${openclawName.padEnd(20)} - not connected`);
322
+ }
323
+ }
324
+ if (vaultConnections.length === 0) {
325
+ log(" No connections found. Add connections in the AgentHiFive dashboard.");
326
+ }
327
+ // -----------------------------------------------------------------------
328
+ // Step 6: Build + write config
329
+ // -----------------------------------------------------------------------
330
+ log("");
331
+ log(" [6/7] Writing config...");
332
+ const configBlock = buildConfigOutput({
333
+ baseUrl,
334
+ agentId,
335
+ privateKey,
336
+ connections,
337
+ connectedProviders,
338
+ proxiedProviders,
339
+ });
340
+ let configPath = opts.configPath ?? resolveOpenClawConfigPath();
341
+ if (configPath) {
342
+ log(` Found config: ${configPath}`);
343
+ }
344
+ if (!configPath && !opts.nonInteractive) {
345
+ const suggested = defaultConfigPath();
346
+ configPath = await prompt(" OpenClaw config path", suggested);
347
+ if (!configPath)
348
+ configPath = null;
349
+ }
350
+ if (!configPath) {
351
+ configPath = defaultConfigPath();
352
+ }
353
+ try {
354
+ const existing = readExistingConfig(configPath);
355
+ const merged = mergePluginConfig(existing, configBlock);
356
+ mkdirSync(path.dirname(configPath), { recursive: true });
357
+ writeFileSync(configPath, JSON.stringify(merged, null, 2) + "\n", "utf-8");
358
+ log(` Config written to: ${configPath}`);
359
+ log("");
360
+ log(" Plugin config (agenthifive):");
361
+ log(" " + "-".repeat(40));
362
+ const ah5Entry = configBlock.plugins;
363
+ const entries = ah5Entry.entries;
364
+ const lines = JSON.stringify(entries.agenthifive, null, 2).split("\n");
365
+ for (const line of lines) {
366
+ log(` ${line}`);
367
+ }
368
+ }
369
+ catch (err) {
370
+ log(` WARNING: Could not write config: ${err instanceof Error ? err.message : String(err)}`);
371
+ log("");
372
+ log(" Add this to your openclaw.json manually:");
373
+ log(JSON.stringify(configBlock, null, 2));
374
+ }
375
+ // -----------------------------------------------------------------------
376
+ // Step 7: Auto-patch + model selection
377
+ // -----------------------------------------------------------------------
378
+ log("");
379
+ log(" [7/7] Applying credential proxying patch...");
380
+ let openclawInstall = opts.openclawDir
381
+ ? validateOpenClawDir(opts.openclawDir)
382
+ : findOpenClawInstallDir();
383
+ if (!openclawInstall && !opts.nonInteractive) {
384
+ const userPath = await prompt(" OpenClaw installation path (press Enter to skip)");
385
+ if (userPath) {
386
+ openclawInstall = validateOpenClawDir(userPath);
387
+ if (!openclawInstall) {
388
+ log(` WARNING: "${userPath}" does not appear to be an OpenClaw installation.`);
389
+ }
390
+ }
391
+ }
392
+ if (openclawInstall) {
393
+ try {
394
+ const result = applyPatch(openclawInstall);
395
+ if (result.applied) {
396
+ log(` ${result.message}`);
397
+ }
398
+ else {
399
+ log(` WARNING: ${result.message}`);
400
+ }
401
+ }
402
+ catch (err) {
403
+ const msg = err instanceof Error ? err.message : String(err);
404
+ if (msg.includes("EACCES") || msg.includes("permission denied")) {
405
+ log(" ERROR: Permission denied. Try running with sudo:");
406
+ log(" sudo ah5-setup ...");
407
+ }
408
+ else {
409
+ log(` WARNING: Auto-patch failed: ${msg}`);
410
+ }
411
+ }
412
+ }
413
+ else {
414
+ log(" WARNING: Could not find OpenClaw installation. Skipping auto-patch.");
415
+ log(" Run 'ah5-setup --openclaw-dir /path/to/openclaw' to patch manually.");
416
+ }
417
+ // -----------------------------------------------------------------------
418
+ // Model selection via openclaw model
419
+ // -----------------------------------------------------------------------
420
+ if (!opts.skipModel && !hasDefaultModel()) {
421
+ log("");
422
+ log(" " + "-".repeat(50));
423
+ log(" Select a default LLM model for the agent.");
424
+ log(" (The vault will provide the API key)");
425
+ log("");
426
+ if (opts.nonInteractive) {
427
+ log(" Skipping model selection in non-interactive mode.");
428
+ log(" Run 'openclaw model' to set a default model.");
429
+ }
430
+ else {
431
+ try {
432
+ execSync("openclaw model", { stdio: "inherit" });
433
+ }
434
+ catch {
435
+ log(" WARNING: Could not launch model picker.");
436
+ log(" Run 'openclaw model' manually to set a default model.");
437
+ }
438
+ }
439
+ }
440
+ log("");
441
+ log(" " + "=".repeat(50));
442
+ log(" Setup complete!");
443
+ log("");
444
+ log(" To change the default model: openclaw model");
445
+ log(" To manage connections: https://app.agenthifive.com");
446
+ log("");
447
+ }
448
+ // ---------------------------------------------------------------------------
449
+ // Fallback: minimal config when token exchange fails
450
+ // ---------------------------------------------------------------------------
451
+ function outputMinimalConfig(log, baseUrl, agentId, privateKey) {
452
+ const configBlock = buildConfigOutput({
453
+ baseUrl,
454
+ agentId,
455
+ privateKey,
456
+ connections: {},
457
+ connectedProviders: [],
458
+ proxiedProviders: [],
459
+ });
460
+ log("");
461
+ log(" " + "=".repeat(50));
462
+ log(" Add this to your openclaw.json manually:");
463
+ log(" (capabilities could not be fetched - update manually)");
464
+ log(" " + "=".repeat(50));
465
+ log("");
466
+ log(JSON.stringify(configBlock, null, 2));
467
+ log("");
468
+ }
469
+ // ---------------------------------------------------------------------------
470
+ // CLI argument parser
471
+ // ---------------------------------------------------------------------------
472
+ export function parseSetupArgs(args) {
473
+ const opts = {};
474
+ for (let i = 0; i < args.length; i++) {
475
+ const arg = args[i];
476
+ if (arg === "--base-url" && args[i + 1]) {
477
+ const val = args[++i];
478
+ if (val)
479
+ opts.baseUrl = val;
480
+ }
481
+ else if (arg === "--bootstrap-secret" && args[i + 1]) {
482
+ const val = args[++i];
483
+ if (val)
484
+ opts.bootstrapSecret = val;
485
+ }
486
+ else if (arg === "--config-path" && args[i + 1]) {
487
+ const val = args[++i];
488
+ if (val)
489
+ opts.configPath = val;
490
+ }
491
+ else if (arg === "--openclaw-dir" && args[i + 1]) {
492
+ const val = args[++i];
493
+ if (val)
494
+ opts.openclawDir = val;
495
+ }
496
+ else if (arg === "--non-interactive") {
497
+ opts.nonInteractive = true;
498
+ }
499
+ else if (arg === "--skip-onboard") {
500
+ opts.skipOnboard = true;
501
+ }
502
+ else if (arg === "--skip-plugin-install") {
503
+ opts.skipPluginInstall = true;
504
+ }
505
+ else if (arg === "--skip-model") {
506
+ opts.skipModel = true;
507
+ }
508
+ }
509
+ // Auto-enable non-interactive if both required args are provided
510
+ if (opts.baseUrl && opts.bootstrapSecret) {
511
+ opts.nonInteractive = true;
512
+ }
513
+ return opts;
514
+ }
515
+ //# sourceMappingURL=setup-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../src/setup-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export type VaultTokenManagerConfig = {
2
+ baseUrl: string;
3
+ agentId: string;
4
+ privateKey: JsonWebKey;
5
+ tokenAudience?: string;
6
+ };
7
+ export declare class VaultTokenManager {
8
+ private readonly baseUrl;
9
+ private readonly agentId;
10
+ private readonly privateKeyJWK;
11
+ private readonly tokenAudience;
12
+ private privateKeyObj;
13
+ private accessToken;
14
+ private tokenExpiresAt;
15
+ private refreshTimer;
16
+ private refreshInFlight;
17
+ /** Called after every successful token refresh with the new token. */
18
+ onRefresh: ((newToken: string) => void) | null;
19
+ /** Called when token refresh fails with 401 — indicates the agent's key is no longer valid. */
20
+ onAuthFailure: (() => void) | null;
21
+ constructor(config: VaultTokenManagerConfig);
22
+ /**
23
+ * Perform the initial token exchange and start the background refresh timer.
24
+ * Must be called (and awaited) before getToken().
25
+ */
26
+ init(): Promise<void>;
27
+ /**
28
+ * Get the current bearer token. Synchronous — relies on background refresh.
29
+ * Throws if init() hasn't been called.
30
+ */
31
+ getToken(): string;
32
+ /** Stop the background refresh timer. */
33
+ stop(): void;
34
+ /**
35
+ * Force an immediate token refresh. Called on-demand when a 401 is received.
36
+ * Coalesces concurrent requests — if a refresh is already in flight, callers
37
+ * wait for the same promise instead of hammering the token endpoint.
38
+ */
39
+ forceRefresh(): Promise<boolean>;
40
+ private refreshToken;
41
+ }
42
+ //# sourceMappingURL=vault-token-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-token-manager.d.ts","sourceRoot":"","sources":["../src/vault-token-manager.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,eAAe,CAA8B;IAErD,sEAAsE;IACtE,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEtD,+FAA+F;IAC/F,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAE9B,MAAM,EAAE,uBAAuB;IAO3C;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3B;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAOlB,yCAAyC;IACzC,IAAI,IAAI,IAAI;IAOZ;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;YAsBxB,YAAY;CAqC3B"}