@masons/agent-network 0.4.25 → 0.5.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.
@@ -12,6 +12,13 @@ const BACKOFF_INITIAL_MS = 1_000;
12
12
  const BACKOFF_MAX_MS = 30_000;
13
13
  const ALREADY_CONNECTED_RETRY_MS = 2_000;
14
14
  const ALREADY_CONNECTED_MAX_RETRIES = 30;
15
+ // --- Single-driver Node semantic (#1264) ---
16
+ // The connector closes with WS code 4001 + this reason when a new Runtime
17
+ // REGISTERs for the same agentId. The current api_key may have been rotated
18
+ // by /runtime/v1/onboard select mode, so reconnecting with the cached token
19
+ // is futile (would 401 forever).
20
+ const REPLACED_BY_NEW_RUNTIME_REASON = "Replaced by new Runtime";
21
+ const REPLACED_BY_NEW_RUNTIME_CODE = 4001;
15
22
  // --- Error class for structured errors ---
16
23
  /**
17
24
  * Error with machine-readable `code` from Connector structured errors.
@@ -146,6 +153,8 @@ export class ConnectorClient extends EventEmitter {
146
153
  this.startRegisterTimeout();
147
154
  });
148
155
  ws.on("message", this.handleMessage);
156
+ // ws's "close" event passes (code, reason) — handleClose accepts both.
157
+ // Pass the bound arrow reference so cleanupConnection can `off()` it.
149
158
  ws.on("close", this.handleClose);
150
159
  ws.on("error", this.handleError);
151
160
  });
@@ -277,7 +286,13 @@ export class ConnectorClient extends EventEmitter {
277
286
  this.ws?.close(4001, reason);
278
287
  return;
279
288
  }
280
- // "Already connected" — track retries for short backoff
289
+ // "Already connected" — track retries for short backoff.
290
+ // As of connector #1264 the server flips this to single-driver
291
+ // eviction (close code 4001 + reason "Replaced by new Runtime",
292
+ // handled in handleClose). The REGISTER_ACK error path with this
293
+ // reason is now only reachable against pre-#1264 connector
294
+ // deployments during a rollout window — kept for that compat,
295
+ // safe to remove in 0.7.0 once preview/production are upgraded.
281
296
  if (reason === "Already connected") {
282
297
  this.alreadyConnectedRetries++;
283
298
  }
@@ -319,10 +334,36 @@ export class ConnectorClient extends EventEmitter {
319
334
  this.emit("error", new Error(`[${event.code}] ${event.message}`));
320
335
  }
321
336
  // --- Connection close ---
322
- handleClose = () => {
323
- dbg("connection closed intentional=%s", this.intentionalClose);
337
+ handleClose = (code, reason) => {
338
+ const reasonStr = reason
339
+ ? typeof reason === "string"
340
+ ? reason
341
+ : reason.toString()
342
+ : "";
343
+ dbg("connection closed code=%s reason=%s intentional=%s", code ?? "?", reasonStr, this.intentionalClose);
324
344
  const wasRegistering = this.registerReject !== null;
325
345
  this.cleanupConnection();
346
+ // Single-driver eviction (#1264) — connector closes us with code 4001
347
+ // and reason "Replaced by new Runtime" when a new REGISTER claims our
348
+ // agentId. The api_key we hold may have been rotated by the new
349
+ // Runtime's /runtime/v1/onboard call; reconnecting would 401 forever.
350
+ // Treat as terminal: stop reconnects, surface an actionable message,
351
+ // emit a distinct event so consumers (channel.ts, etc.) can react.
352
+ const replacedByNewRuntime = code === REPLACED_BY_NEW_RUNTIME_CODE &&
353
+ reasonStr === REPLACED_BY_NEW_RUNTIME_REASON;
354
+ if (replacedByNewRuntime) {
355
+ this.intentionalClose = true;
356
+ const msg = "This agent was claimed by another Runtime " +
357
+ "(api_key rotated, this Runtime disconnected). " +
358
+ "Re-run `openclaw channels login --channel agent-network` " +
359
+ "to drive this agent from here again.";
360
+ this.emit("error", new Error(msg));
361
+ if (wasRegistering) {
362
+ this.rejectRegister(new Error(msg));
363
+ }
364
+ this.emit("disconnected");
365
+ return;
366
+ }
326
367
  if (wasRegistering) {
327
368
  // Connection closed during REGISTER — check for special retry logic
328
369
  // (handled by rejectRegister which was already called if ACK error came first)
@@ -1,15 +1,18 @@
1
1
  /**
2
- * MASONS Platform API client.
2
+ * MASONS runtime API client.
3
3
  *
4
- * Pure HTTP functions wrapping the setup and connection API endpoints.
4
+ * Pure HTTP functions wrapping `/runtime/v1/*` endpoints on the connector.
5
5
  * Zero platform dependencies — only global fetch.
6
6
  *
7
- * Used by:
8
- * - cli-setup.ts (CLI path: configureInteractive)
9
- * - tools.ts (LLM path: tool execute functions)
7
+ * Used by `tools.ts` (LLM path: tool execute functions).
8
+ *
9
+ * The pre-0.5.0 setup-flow functions (`initSetup`, `pollSetup`, `listAgents`,
10
+ * `onboard`, `reconnect`) were deleted in this version: onboarding moves to
11
+ * the OAuth Device Authorization Grant flow served by Better Auth at the IdP
12
+ * (#1253), not via bespoke MASONS endpoints on the runtime API.
10
13
  */
11
14
  /** Default API host. */
12
- export declare const DEFAULT_API_HOST = "preview-platform.masons.ai";
15
+ export declare const DEFAULT_API_HOST = "preview-connectorapi.masons.ai";
13
16
  export interface PlatformClientConfig {
14
17
  apiHost: string;
15
18
  }
@@ -18,46 +21,6 @@ export declare class PlatformApiError extends Error {
18
21
  readonly code: string;
19
22
  constructor(status: number, code: string, message: string);
20
23
  }
21
- /** HTTP 428 — user hasn't authorized the setup code yet. Keep polling. */
22
- export declare class SetupPendingError extends PlatformApiError {
23
- constructor(message?: string);
24
- }
25
- /** HTTP 410 — setup token expired or not found. Must start over. */
26
- export declare class SetupExpiredError extends PlatformApiError {
27
- constructor(message?: string);
28
- }
29
- export interface InitSetupResponse {
30
- setup_code: string;
31
- setup_token: string;
32
- verification_uri: string;
33
- expires_in: number;
34
- interval: number;
35
- }
36
- export interface PollSetupResponse {
37
- status: "authorized";
38
- setup_token: string;
39
- expires_in: number;
40
- agent_id: string | null;
41
- }
42
- export interface AgentInfo {
43
- id: string;
44
- handle: string;
45
- address: string;
46
- deliveryMode: string;
47
- createdAt: string;
48
- }
49
- export interface ListAgentsResponse {
50
- agents: AgentInfo[];
51
- }
52
- export interface OnboardResponse {
53
- agentId: string;
54
- handle: string;
55
- address: string;
56
- connectorUrl: string;
57
- token: string;
58
- }
59
- /** Same shape as OnboardResponse. */
60
- export type ReconnectResponse = OnboardResponse;
61
24
  export interface RequestConnectionResponse {
62
25
  requestIds: string[];
63
26
  status: string;
@@ -124,45 +87,77 @@ export interface ConnectionStatusResponse {
124
87
  status: "connected" | "pending" | "not_connected";
125
88
  canCreateSession: boolean;
126
89
  }
90
+ /** Successful onboard — returned by all three branches. */
91
+ export interface OnboardSuccess {
92
+ apiKey: string;
93
+ connectorUrl: string;
94
+ agentId: string;
95
+ handle: string;
96
+ }
97
+ export interface OnboardAgentSummary {
98
+ id: string;
99
+ handle: string;
100
+ name: string;
101
+ }
127
102
  /**
128
- * `POST /setup/init`Start Device Code Flow.
129
- *
130
- * Public endpoint (no auth). Returns a setup code for the user to enter
131
- * in their browser, plus a setup token for subsequent API calls.
103
+ * 422 agent_requireduser owns multiple agents and didn't pick one.
104
+ * Plugin should prompter.select() from `agents` and re-call with `{agentId}`.
132
105
  */
133
- export declare function initSetup(cfg: PlatformClientConfig): Promise<InitSetupResponse>;
106
+ export interface OnboardAgentRequiredError {
107
+ status: 422;
108
+ code: "agent_required";
109
+ agents: OnboardAgentSummary[];
110
+ }
134
111
  /**
135
- * `POST /setup/poll`Poll for user authorization.
136
- *
137
- * Public endpoint. The setup token is sent in the request body (not header).
138
- *
139
- * @throws {SetupPendingError} 428 — user hasn't authorized yet
140
- * @throws {SetupExpiredError} 410 — token expired, start over
112
+ * 412 no_agentsuser owns zero agents. Plugin should prompt for handle
113
+ * and re-call with `{create: {handle}}`.
141
114
  */
142
- export declare function pollSetup(cfg: PlatformClientConfig, setupToken: string): Promise<PollSetupResponse>;
115
+ export interface OnboardNoAgentsError {
116
+ status: 412;
117
+ code: "no_agents";
118
+ message: string;
119
+ }
143
120
  /**
144
- * `GET /me/agents`List authenticated user's agents.
145
- *
146
- * Requires Setup Token in Authorization header.
121
+ * 409 handle_takenhandle conflict in create branch. Plugin should
122
+ * re-prompt for a different handle.
147
123
  */
148
- export declare function listAgents(cfg: PlatformClientConfig, setupToken: string): Promise<ListAgentsResponse>;
124
+ export interface OnboardHandleTakenError {
125
+ status: 409;
126
+ code: "handle_taken";
127
+ }
149
128
  /**
150
- * `POST /onboard`Create a new agent identity.
151
- *
152
- * Requires Setup Token in Authorization header.
153
- * Returns credentials for Gateway connection and API access.
129
+ * 422 invalid_handlehandle failed server-side validation. Plugin should
130
+ * surface the message and re-prompt.
154
131
  */
155
- export declare function onboard(cfg: PlatformClientConfig, setupToken: string, params: {
156
- handle: string;
157
- name?: string;
158
- }): Promise<OnboardResponse>;
132
+ export interface OnboardInvalidHandleError {
133
+ status: 422;
134
+ code: "invalid_handle";
135
+ message: string;
136
+ }
137
+ /** Body shape for the onboard endpoint. */
138
+ export type OnboardBody = Record<string, never> | {
139
+ agentId: string;
140
+ } | {
141
+ create: {
142
+ handle: string;
143
+ name?: string;
144
+ };
145
+ };
159
146
  /**
160
- * `POST /agents/{id}/reconnect` Rotate API key for an existing agent.
147
+ * Result discriminator. `kind: "ok"` carries the credentials; `kind: "error"`
148
+ * surfaces structured errors the plugin must handle in its CLI prompter loop
149
+ * (no-agents → prompt handle; agent-required → prompt picker; handle-taken
150
+ * → re-prompt; invalid-handle → re-prompt).
161
151
  *
162
- * Requires Setup Token in Authorization header.
163
- * Returns fresh credentials (same shape as onboard).
152
+ * Other failure shapes (401, 403, 404, 500) are thrown as `PlatformApiError`.
164
153
  */
165
- export declare function reconnect(cfg: PlatformClientConfig, setupToken: string, agentId: string): Promise<ReconnectResponse>;
154
+ export type OnboardResult = {
155
+ kind: "ok";
156
+ data: OnboardSuccess;
157
+ } | {
158
+ kind: "error";
159
+ data: OnboardAgentRequiredError | OnboardNoAgentsError | OnboardHandleTakenError | OnboardInvalidHandleError;
160
+ };
166
161
  /**
167
162
  * `POST /connections/requests` — Send a connection request.
168
163
  *
@@ -211,6 +206,21 @@ export declare function updateProfile(cfg: PlatformClientConfig, apiKey: string,
211
206
  * Returns name + MSTP address for each connected agent.
212
207
  */
213
208
  export declare function listConnections(cfg: PlatformClientConfig, apiKey: string): Promise<ListConnectionsResponse>;
209
+ /**
210
+ * `POST /onboard` — bind a device-class client to an agent.
211
+ *
212
+ * Three branches selected by body shape (#1264):
213
+ * - `{}` → list / auto-pick
214
+ * - `{agentId}` → select existing (rotates api_key)
215
+ * - `{create: {handle, name?}}` → mint new agent
216
+ *
217
+ * Auth: Bearer access_token from Better Auth's device-authorization plugin.
218
+ *
219
+ * Returns `{kind: "ok", data}` on 200. Returns `{kind: "error", data}` for
220
+ * the four structured errors the CLI prompter loop must handle. All other
221
+ * non-2xx responses throw `PlatformApiError`.
222
+ */
223
+ export declare function onboard(cfg: PlatformClientConfig, sessionToken: string, body: OnboardBody): Promise<OnboardResult>;
214
224
  /**
215
225
  * `GET /connections/status?target={handle}` — Check connection status.
216
226
  *
@@ -1 +1 @@
1
- {"version":3,"file":"platform-client.d.ts","sourceRoot":"","sources":["../src/platform-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-client.d.ts","sourceRoot":"","sources":["../src/platform-client.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,21 @@
1
1
  /**
2
- * MASONS Platform API client.
2
+ * MASONS runtime API client.
3
3
  *
4
- * Pure HTTP functions wrapping the setup and connection API endpoints.
4
+ * Pure HTTP functions wrapping `/runtime/v1/*` endpoints on the connector.
5
5
  * Zero platform dependencies — only global fetch.
6
6
  *
7
- * Used by:
8
- * - cli-setup.ts (CLI path: configureInteractive)
9
- * - tools.ts (LLM path: tool execute functions)
7
+ * Used by `tools.ts` (LLM path: tool execute functions).
8
+ *
9
+ * The pre-0.5.0 setup-flow functions (`initSetup`, `pollSetup`, `listAgents`,
10
+ * `onboard`, `reconnect`) were deleted in this version: onboarding moves to
11
+ * the OAuth Device Authorization Grant flow served by Better Auth at the IdP
12
+ * (#1253), not via bespoke MASONS endpoints on the runtime API.
10
13
  */
11
14
  // ---------------------------------------------------------------------------
12
15
  // Config
13
16
  // ---------------------------------------------------------------------------
14
17
  /** Default API host. */
15
- export const DEFAULT_API_HOST = "preview-platform.masons.ai";
18
+ export const DEFAULT_API_HOST = "preview-connectorapi.masons.ai";
16
19
  // ---------------------------------------------------------------------------
17
20
  // Error classes
18
21
  // ---------------------------------------------------------------------------
@@ -26,122 +29,24 @@ export class PlatformApiError extends Error {
26
29
  this.name = "PlatformApiError";
27
30
  }
28
31
  }
29
- /** HTTP 428 — user hasn't authorized the setup code yet. Keep polling. */
30
- export class SetupPendingError extends PlatformApiError {
31
- constructor(message = "Authorization pending") {
32
- super(428, "authorization_pending", message);
33
- this.name = "SetupPendingError";
34
- }
35
- }
36
- /** HTTP 410 — setup token expired or not found. Must start over. */
37
- export class SetupExpiredError extends PlatformApiError {
38
- constructor(message = "Setup token expired") {
39
- super(410, "expired_token", message);
40
- this.name = "SetupExpiredError";
41
- }
42
- }
43
32
  // ---------------------------------------------------------------------------
44
33
  // Internal helpers
45
34
  // ---------------------------------------------------------------------------
46
35
  function baseUrl(cfg) {
47
- return `https://${cfg.apiHost}/openclaw/v1`;
36
+ // `/runtime/v1/*` is the canonical prefix (renamed from legacy `/openclaw/v1/*`
37
+ // in connector PR #1248 — shared by OpenClaw plugin + Claude Code + any future
38
+ // device-class runtime). Atomic server-side change, no dual-serve.
39
+ return `https://${cfg.apiHost}/runtime/v1`;
48
40
  }
49
41
  async function handleError(res) {
50
42
  const body = (await res.json().catch(() => ({})));
51
43
  const code = typeof body.error === "string" ? body.error : "unknown";
52
44
  const message = typeof body.message === "string" ? body.message : res.statusText;
53
- if (res.status === 428)
54
- throw new SetupPendingError(message);
55
- if (res.status === 410)
56
- throw new SetupExpiredError(message);
57
45
  throw new PlatformApiError(res.status, code, message);
58
46
  }
59
47
  // ---------------------------------------------------------------------------
60
48
  // API functions
61
49
  // ---------------------------------------------------------------------------
62
- /**
63
- * `POST /setup/init` — Start Device Code Flow.
64
- *
65
- * Public endpoint (no auth). Returns a setup code for the user to enter
66
- * in their browser, plus a setup token for subsequent API calls.
67
- */
68
- export async function initSetup(cfg) {
69
- const res = await fetch(`${baseUrl(cfg)}/setup/init`, {
70
- method: "POST",
71
- headers: { "Content-Type": "application/json" },
72
- });
73
- if (!res.ok)
74
- return handleError(res);
75
- return (await res.json());
76
- }
77
- /**
78
- * `POST /setup/poll` — Poll for user authorization.
79
- *
80
- * Public endpoint. The setup token is sent in the request body (not header).
81
- *
82
- * @throws {SetupPendingError} 428 — user hasn't authorized yet
83
- * @throws {SetupExpiredError} 410 — token expired, start over
84
- */
85
- export async function pollSetup(cfg, setupToken) {
86
- const res = await fetch(`${baseUrl(cfg)}/setup/poll`, {
87
- method: "POST",
88
- headers: { "Content-Type": "application/json" },
89
- body: JSON.stringify({ setup_token: setupToken }),
90
- });
91
- if (!res.ok)
92
- return handleError(res);
93
- return (await res.json());
94
- }
95
- /**
96
- * `GET /me/agents` — List authenticated user's agents.
97
- *
98
- * Requires Setup Token in Authorization header.
99
- */
100
- export async function listAgents(cfg, setupToken) {
101
- const res = await fetch(`${baseUrl(cfg)}/me/agents`, {
102
- headers: { Authorization: `Bearer ${setupToken}` },
103
- });
104
- if (!res.ok)
105
- return handleError(res);
106
- return (await res.json());
107
- }
108
- /**
109
- * `POST /onboard` — Create a new agent identity.
110
- *
111
- * Requires Setup Token in Authorization header.
112
- * Returns credentials for Gateway connection and API access.
113
- */
114
- export async function onboard(cfg, setupToken, params) {
115
- const res = await fetch(`${baseUrl(cfg)}/onboard`, {
116
- method: "POST",
117
- headers: {
118
- "Content-Type": "application/json",
119
- Authorization: `Bearer ${setupToken}`,
120
- },
121
- body: JSON.stringify(params),
122
- });
123
- if (!res.ok)
124
- return handleError(res);
125
- return (await res.json());
126
- }
127
- /**
128
- * `POST /agents/{id}/reconnect` — Rotate API key for an existing agent.
129
- *
130
- * Requires Setup Token in Authorization header.
131
- * Returns fresh credentials (same shape as onboard).
132
- */
133
- export async function reconnect(cfg, setupToken, agentId) {
134
- const res = await fetch(`${baseUrl(cfg)}/agents/${encodeURIComponent(agentId)}/reconnect`, {
135
- method: "POST",
136
- headers: {
137
- "Content-Type": "application/json",
138
- Authorization: `Bearer ${setupToken}`,
139
- },
140
- });
141
- if (!res.ok)
142
- return handleError(res);
143
- return (await res.json());
144
- }
145
50
  /**
146
51
  * `POST /connections/requests` — Send a connection request.
147
52
  *
@@ -247,6 +152,70 @@ export async function listConnections(cfg, apiKey) {
247
152
  return handleError(res);
248
153
  return (await res.json());
249
154
  }
155
+ /**
156
+ * `POST /onboard` — bind a device-class client to an agent.
157
+ *
158
+ * Three branches selected by body shape (#1264):
159
+ * - `{}` → list / auto-pick
160
+ * - `{agentId}` → select existing (rotates api_key)
161
+ * - `{create: {handle, name?}}` → mint new agent
162
+ *
163
+ * Auth: Bearer access_token from Better Auth's device-authorization plugin.
164
+ *
165
+ * Returns `{kind: "ok", data}` on 200. Returns `{kind: "error", data}` for
166
+ * the four structured errors the CLI prompter loop must handle. All other
167
+ * non-2xx responses throw `PlatformApiError`.
168
+ */
169
+ export async function onboard(cfg, sessionToken, body) {
170
+ const res = await fetch(`${baseUrl(cfg)}/onboard`, {
171
+ method: "POST",
172
+ headers: {
173
+ "Content-Type": "application/json",
174
+ Authorization: `Bearer ${sessionToken}`,
175
+ },
176
+ body: JSON.stringify(body),
177
+ });
178
+ if (res.ok) {
179
+ const data = (await res.json());
180
+ return { kind: "ok", data };
181
+ }
182
+ // Branch on the structured-error codes the prompter loop knows how to
183
+ // recover from. Anything else → throw PlatformApiError.
184
+ const raw = (await res.json().catch(() => ({})));
185
+ const code = typeof raw.error === "string" ? raw.error : "unknown";
186
+ const message = typeof raw.message === "string" ? raw.message : res.statusText;
187
+ if (res.status === 412 && code === "no_agents") {
188
+ return {
189
+ kind: "error",
190
+ data: { status: 412, code: "no_agents", message },
191
+ };
192
+ }
193
+ if (res.status === 422 && code === "agent_required") {
194
+ const agents = Array.isArray(raw.agents)
195
+ ? raw.agents
196
+ : [];
197
+ return {
198
+ kind: "error",
199
+ data: { status: 422, code: "agent_required", agents },
200
+ };
201
+ }
202
+ if (res.status === 422 && code === "invalid_handle") {
203
+ return {
204
+ kind: "error",
205
+ data: { status: 422, code: "invalid_handle", message },
206
+ };
207
+ }
208
+ if (res.status === 409 && code === "handle_taken") {
209
+ return {
210
+ kind: "error",
211
+ data: { status: 409, code: "handle_taken" },
212
+ };
213
+ }
214
+ // 401 unauthorized, 403 forbidden, 404 agent_not_found, 500 internal —
215
+ // these are programming errors at this stage, propagate via the standard
216
+ // throw path so the CLI prompter loop sees them as fatal.
217
+ throw new PlatformApiError(res.status, code, message);
218
+ }
250
219
  /**
251
220
  * `GET /connections/status?target={handle}` — Check connection status.
252
221
  *
package/dist/plugin.d.ts CHANGED
@@ -22,6 +22,11 @@ declare const plugin: {
22
22
  description: string;
23
23
  default: string;
24
24
  };
25
+ idpBaseUrl: {
26
+ type: string;
27
+ description: string;
28
+ default: string;
29
+ };
25
30
  updateCheck: {
26
31
  type: string;
27
32
  description: string;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AA4HA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACjE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC;CACnE;AAED,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;kBAaI,iBAAiB;CAyVhC,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAiJA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACjE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC;CACnE;AAED,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;kBAaI,iBAAiB;CAoXhC,CAAC;AAEF,eAAe,MAAM,CAAC"}