@gea-ai/agent-sdk 0.1.260910-alpha.0 → 0.1.260910-alpha.2
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 +3 -1253
- package/dist/agent-channel-author-runtime.d.ts +79 -0
- package/dist/agent-channel-author-runtime.d.ts.map +1 -0
- package/dist/agent-channel-author-runtime.js +511 -0
- package/dist/agent-channel-author-runtime.js.map +1 -0
- package/dist/agent-channel-receiver.d.ts +46 -0
- package/dist/agent-channel-receiver.d.ts.map +1 -0
- package/dist/agent-channel-receiver.js +356 -0
- package/dist/agent-channel-receiver.js.map +1 -0
- package/dist/agent-channel-runtime.d.ts +6 -0
- package/dist/agent-channel-runtime.d.ts.map +1 -0
- package/dist/agent-channel-runtime.js +623 -0
- package/dist/agent-channel-runtime.js.map +1 -0
- package/dist/agent-channel-worker.d.ts +22 -0
- package/dist/agent-channel-worker.d.ts.map +1 -0
- package/dist/agent-channel-worker.js +335 -0
- package/dist/agent-channel-worker.js.map +1 -0
- package/dist/agent-session.d.ts.map +1 -1
- package/dist/agent-session.js +177 -4
- package/dist/agent-session.js.map +1 -1
- package/dist/agent-worker.d.ts +27 -1
- package/dist/agent-worker.d.ts.map +1 -1
- package/dist/agent-worker.js +867 -27
- package/dist/agent-worker.js.map +1 -1
- package/dist/channels/feishu-codec.d.ts +18 -0
- package/dist/channels/feishu-codec.d.ts.map +1 -0
- package/dist/channels/feishu-codec.js +109 -0
- package/dist/channels/feishu-codec.js.map +1 -0
- package/dist/channels/feishu-inbound.d.ts +35 -0
- package/dist/channels/feishu-inbound.d.ts.map +1 -0
- package/dist/channels/feishu-inbound.js +136 -0
- package/dist/channels/feishu-inbound.js.map +1 -0
- package/dist/channels/feishu-websocket.d.ts +5 -0
- package/dist/channels/feishu-websocket.d.ts.map +1 -0
- package/dist/channels/feishu-websocket.js +424 -0
- package/dist/channels/feishu-websocket.js.map +1 -0
- package/dist/channels/feishu.d.ts +32 -0
- package/dist/channels/feishu.d.ts.map +1 -0
- package/dist/channels/feishu.js +233 -0
- package/dist/channels/feishu.js.map +1 -0
- package/dist/channels/index.d.ts +180 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +93 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -8
- package/dist/index.js.map +1 -1
- package/package.json +16 -3
- package/src/channels/README.md +298 -0
- package/src/channels/feishu.ts +295 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type AgentChannelInvocationContext } from "@gea-ai/contract/agent-channels";
|
|
2
|
+
import { type AgentChannelRuntimeCommand, type AgentChannelRuntimeStart, type AgentChannelJson } from "@gea-ai/contract/agent-channel-runtime";
|
|
3
|
+
import type { AgentChannelFetchEnvironment } from "./agent-worker";
|
|
4
|
+
import type { AnyDefinedChannel, ChannelCapabilities, ChannelInputContext, ChannelRouteContext, ChannelWebSocketRoute } from "./channels";
|
|
5
|
+
export declare function createChannelCapabilities(environment: AgentChannelFetchEnvironment, signal: AbortSignal): Promise<ChannelCapabilities>;
|
|
6
|
+
export declare function createChannelInputContext(input: {
|
|
7
|
+
definition: AnyDefinedChannel;
|
|
8
|
+
environment: AgentChannelFetchEnvironment;
|
|
9
|
+
identity: AgentChannelInvocationContext;
|
|
10
|
+
signal: AbortSignal;
|
|
11
|
+
}): Promise<ChannelInputContext>;
|
|
12
|
+
export declare function createChannelRouteContext(input: Parameters<typeof createChannelInputContext>[0] & {
|
|
13
|
+
request: Request;
|
|
14
|
+
}): Promise<ChannelRouteContext>;
|
|
15
|
+
/** Only the retained Worker definition interprets state and executes event/outbound code. */
|
|
16
|
+
export declare function executeChannelBehavior(input: {
|
|
17
|
+
definition: AnyDefinedChannel;
|
|
18
|
+
command: Exclude<AgentChannelRuntimeCommand, AgentChannelRuntimeStart>;
|
|
19
|
+
environment: AgentChannelFetchEnvironment;
|
|
20
|
+
signal: AbortSignal;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
sequence: number;
|
|
23
|
+
duplicate: boolean;
|
|
24
|
+
} | {
|
|
25
|
+
state: AgentChannelJson;
|
|
26
|
+
intents: {
|
|
27
|
+
key: string;
|
|
28
|
+
payload: AgentChannelJson;
|
|
29
|
+
eventId: string;
|
|
30
|
+
operationId: string;
|
|
31
|
+
}[];
|
|
32
|
+
cursor: number;
|
|
33
|
+
idempotencyWindowMs?: number | undefined;
|
|
34
|
+
} | {
|
|
35
|
+
status: "sent";
|
|
36
|
+
receipt?: AgentChannelJson | undefined;
|
|
37
|
+
} | {
|
|
38
|
+
status: "retryable";
|
|
39
|
+
error: {
|
|
40
|
+
code: string;
|
|
41
|
+
message: string;
|
|
42
|
+
retryable: boolean;
|
|
43
|
+
};
|
|
44
|
+
retryAfterMs?: number | undefined;
|
|
45
|
+
} | {
|
|
46
|
+
status: "failed";
|
|
47
|
+
error: {
|
|
48
|
+
code: string;
|
|
49
|
+
message: string;
|
|
50
|
+
retryable: boolean;
|
|
51
|
+
};
|
|
52
|
+
} | {
|
|
53
|
+
status: "unknown";
|
|
54
|
+
error: {
|
|
55
|
+
code: string;
|
|
56
|
+
message: string;
|
|
57
|
+
retryable: boolean;
|
|
58
|
+
};
|
|
59
|
+
} | {
|
|
60
|
+
events: {
|
|
61
|
+
id: string;
|
|
62
|
+
sequence: number;
|
|
63
|
+
operationId: string;
|
|
64
|
+
runId: string;
|
|
65
|
+
attempt: number;
|
|
66
|
+
type: string;
|
|
67
|
+
data: AgentChannelJson;
|
|
68
|
+
}[];
|
|
69
|
+
cursor: number;
|
|
70
|
+
} | {
|
|
71
|
+
messages: {
|
|
72
|
+
[x: string]: unknown;
|
|
73
|
+
id: string;
|
|
74
|
+
}[];
|
|
75
|
+
cursor: number;
|
|
76
|
+
}>;
|
|
77
|
+
/** Ordinary Worker sockets carry author protocol frames; Agent work lives in the address queue. */
|
|
78
|
+
export declare function openChannelWebSocket(route: ChannelWebSocketRoute, request: Request, context: ChannelRouteContext, controller: AbortController, environment: AgentChannelFetchEnvironment): Promise<Response>;
|
|
79
|
+
//# sourceMappingURL=agent-channel-author-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-channel-author-runtime.d.ts","sourceRoot":"","sources":["../src/agent-channel-author-runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,6BAA6B,EAGnC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAQL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EAInB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAoEpB,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,4BAA4B,EACzC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAkD9B;AAsDD,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW,EAAE,4BAA4B,CAAC;IAC1C,QAAQ,EAAE,6BAA6B,CAAC;IACxC,MAAM,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsO/B;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAC5E,OAAO,CAAC,mBAAmB,CAAC,CAK9B;AAED,6FAA6F;AAC7F,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC,0BAA0B,EAAE,wBAAwB,CAAC,CAAC;IACvE,WAAW,EAAE,4BAA4B,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkJA;AAGD,mGAAmG;AACnG,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,4BAA4B,qBA4G1C"}
|
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
import { studioExternalUserPrincipalSchema, } from "@gea-ai/contract";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { validateUIMessages } from "ai";
|
|
4
|
+
import { createAgentChannelStableId, agentChannelAddressSchema, agentChannelExecutionTargetSchema, } from "@gea-ai/contract/agent-channels";
|
|
5
|
+
import { agentChannelInputSchema, agentChannelEventSchema, agentChannelJournalPageSchema, agentChannelJsonSchema, agentChannelOutboundResultSchema, agentChannelRuntimeProjectionSchema, } from "@gea-ai/contract/agent-channel-runtime";
|
|
6
|
+
import { ChannelInputError } from "./channels/index.js";
|
|
7
|
+
const HOST = "/internal/agent-worker-host/v1/channel";
|
|
8
|
+
const initializationSchema = z.object({
|
|
9
|
+
environment: z.enum(["local", "preview", "production"]),
|
|
10
|
+
variables: z.record(z.string(), z.string()),
|
|
11
|
+
});
|
|
12
|
+
const fetchResponseSchema = z.object({
|
|
13
|
+
status: z.number().int(),
|
|
14
|
+
statusText: z.string(),
|
|
15
|
+
headers: z.array(z.tuple([z.string(), z.string()])),
|
|
16
|
+
bodyBase64: z.string(),
|
|
17
|
+
});
|
|
18
|
+
const sessionSchema = z
|
|
19
|
+
.object({
|
|
20
|
+
address: agentChannelAddressSchema,
|
|
21
|
+
sessionId: z.string().min(1),
|
|
22
|
+
})
|
|
23
|
+
.nullable();
|
|
24
|
+
const receiptSchema = z.object({
|
|
25
|
+
conversationId: z.string(),
|
|
26
|
+
duplicate: z.boolean(),
|
|
27
|
+
executionTarget: agentChannelExecutionTargetSchema,
|
|
28
|
+
operationId: z.string(),
|
|
29
|
+
status: z.literal("accepted"),
|
|
30
|
+
});
|
|
31
|
+
const historySchema = z.object({
|
|
32
|
+
messages: z.array(z.object({ id: z.string() }).passthrough()),
|
|
33
|
+
cursor: z.number().int().nonnegative(),
|
|
34
|
+
});
|
|
35
|
+
const assistantPlaceholderSchema = z.object({
|
|
36
|
+
id: z.string().min(1),
|
|
37
|
+
role: z.literal("assistant"),
|
|
38
|
+
parts: z.array(z.never()).length(0),
|
|
39
|
+
metadata: z.unknown().optional(),
|
|
40
|
+
});
|
|
41
|
+
const hostResponseSchema = z.object({
|
|
42
|
+
ok: z.boolean(),
|
|
43
|
+
result: z.unknown().optional(),
|
|
44
|
+
error: z.object({ message: z.string() }).optional(),
|
|
45
|
+
});
|
|
46
|
+
const LIMIT_SOCKET_BYTES = 1024 * 1024;
|
|
47
|
+
const rejectionSchema = z.object({
|
|
48
|
+
error: z.object({ code: z.string(), message: z.string().optional() }),
|
|
49
|
+
});
|
|
50
|
+
async function hostJson(environment, path, body, signal) {
|
|
51
|
+
const response = await environment.TOOLS.fetch(`${HOST}/${path}`, {
|
|
52
|
+
method: body === undefined ? "GET" : "POST",
|
|
53
|
+
...(body === undefined
|
|
54
|
+
? {}
|
|
55
|
+
: {
|
|
56
|
+
headers: { "content-type": "application/json" },
|
|
57
|
+
body: JSON.stringify(body),
|
|
58
|
+
}),
|
|
59
|
+
signal,
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok)
|
|
62
|
+
throw new Error(`Channel capability ${path} rejected (${response.status}).`);
|
|
63
|
+
return await response.json();
|
|
64
|
+
}
|
|
65
|
+
export async function createChannelCapabilities(environment, signal) {
|
|
66
|
+
const initialized = initializationSchema.parse(await hostJson(environment, "initialize", undefined, signal));
|
|
67
|
+
return {
|
|
68
|
+
env: Object.freeze(initialized.variables),
|
|
69
|
+
environment: initialized.environment,
|
|
70
|
+
signal,
|
|
71
|
+
async fetch(input, init) {
|
|
72
|
+
signal.throwIfAborted();
|
|
73
|
+
const request = new Request(input, init);
|
|
74
|
+
const bytes = request.body
|
|
75
|
+
? new Uint8Array(await request.arrayBuffer())
|
|
76
|
+
: undefined;
|
|
77
|
+
if (bytes && bytes.byteLength > 2 * 1024 * 1024)
|
|
78
|
+
throw new Error("Channel request body exceeds 2 MiB.");
|
|
79
|
+
let bodyBase64;
|
|
80
|
+
if (bytes) {
|
|
81
|
+
let binary = "";
|
|
82
|
+
for (const byte of bytes)
|
|
83
|
+
binary += String.fromCharCode(byte);
|
|
84
|
+
bodyBase64 = btoa(binary);
|
|
85
|
+
}
|
|
86
|
+
const value = fetchResponseSchema.parse(await hostJson(environment, "fetch", {
|
|
87
|
+
url: request.url,
|
|
88
|
+
method: request.method,
|
|
89
|
+
headers: [...request.headers],
|
|
90
|
+
...(bodyBase64 === undefined ? {} : { bodyBase64 }),
|
|
91
|
+
}, AbortSignal.any([signal, request.signal])));
|
|
92
|
+
const data = Uint8Array.from(atob(value.bodyBase64), (char) => char.charCodeAt(0));
|
|
93
|
+
return new Response([101, 204, 205, 304].includes(value.status) || request.method === "HEAD"
|
|
94
|
+
? null
|
|
95
|
+
: data, {
|
|
96
|
+
status: value.status,
|
|
97
|
+
statusText: value.statusText,
|
|
98
|
+
headers: value.headers,
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async function addressRequest(environment, address, path, body, signal) {
|
|
104
|
+
const id = await createAgentChannelStableId("address", address);
|
|
105
|
+
signal?.throwIfAborted();
|
|
106
|
+
const response = await environment.CHANNEL_ADDRESSES.get(environment.CHANNEL_ADDRESSES.idFromName(id)).fetch(new Request(`http://address${path}`, {
|
|
107
|
+
signal,
|
|
108
|
+
...(body === undefined
|
|
109
|
+
? {}
|
|
110
|
+
: {
|
|
111
|
+
method: "POST",
|
|
112
|
+
headers: { "content-type": "application/json" },
|
|
113
|
+
body: JSON.stringify(body),
|
|
114
|
+
}),
|
|
115
|
+
}));
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const parsed = rejectionSchema.safeParse(await response.json());
|
|
118
|
+
throw new ChannelInputError({
|
|
119
|
+
code: parsed.success
|
|
120
|
+
? parsed.data.error.code
|
|
121
|
+
: "channel_address_unavailable",
|
|
122
|
+
status: response.status,
|
|
123
|
+
message: parsed.success
|
|
124
|
+
? (parsed.data.error.message ?? parsed.data.error.code)
|
|
125
|
+
: "Channel address is unavailable.",
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return await response.json();
|
|
129
|
+
}
|
|
130
|
+
async function pause(signal) {
|
|
131
|
+
signal.throwIfAborted();
|
|
132
|
+
await new Promise((resolve, reject) => {
|
|
133
|
+
const onAbort = () => {
|
|
134
|
+
clearTimeout(timer);
|
|
135
|
+
reject(signal.reason);
|
|
136
|
+
};
|
|
137
|
+
const timer = setTimeout(() => {
|
|
138
|
+
signal.removeEventListener("abort", onAbort);
|
|
139
|
+
resolve();
|
|
140
|
+
}, 250);
|
|
141
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
export async function createChannelInputContext(input) {
|
|
145
|
+
const capabilities = await createChannelCapabilities(input.environment, input.signal);
|
|
146
|
+
const authorize = async (signal = input.signal) => {
|
|
147
|
+
signal.throwIfAborted();
|
|
148
|
+
await hostJson(input.environment, "authorize", undefined, signal);
|
|
149
|
+
};
|
|
150
|
+
const getAddress = async (raw, principal) => {
|
|
151
|
+
if (typeof raw !== "string" || !raw.length || raw.length > 4096)
|
|
152
|
+
throw new Error("Channel address must contain 1–4096 characters.");
|
|
153
|
+
return {
|
|
154
|
+
agentKey: input.identity.agentKey,
|
|
155
|
+
channelKey: input.definition.key,
|
|
156
|
+
environment: input.identity.environment,
|
|
157
|
+
installationId: input.identity.installationId,
|
|
158
|
+
principalId: principal.principalId,
|
|
159
|
+
providerLocalKey: await createAgentChannelStableId("external-address", input.identity.installationId, input.identity.agentKey, input.definition.key, raw),
|
|
160
|
+
schemaVersion: "gea.channel-address/v1",
|
|
161
|
+
studioAgentId: input.identity.studioAgentId,
|
|
162
|
+
workspaceId: input.identity.workspaceId,
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
const getExecutionTarget = async (address) => ({
|
|
166
|
+
channelDefinitionVersion: await createAgentChannelStableId("definition", input.definition.descriptor),
|
|
167
|
+
schemaVersion: "gea.channel-execution-target/v1",
|
|
168
|
+
sessionId: await createAgentChannelStableId("session", address),
|
|
169
|
+
stateVersion: input.definition.stateVersion,
|
|
170
|
+
studioAgentVersionId: input.identity.studioAgentVersionId,
|
|
171
|
+
workerDeploymentId: input.identity.workerDeploymentId,
|
|
172
|
+
workerId: input.identity.workerId,
|
|
173
|
+
});
|
|
174
|
+
const makeSession = (address, sessionId, principal) => {
|
|
175
|
+
const read = async (kind, after, limit, signal = input.signal) => {
|
|
176
|
+
await authorize(signal);
|
|
177
|
+
const addressId = await createAgentChannelStableId("address", address);
|
|
178
|
+
const response = hostResponseSchema.parse(await hostJson(input.environment, "session", {
|
|
179
|
+
protocolVersion: "gea.channel-command/v2",
|
|
180
|
+
kind,
|
|
181
|
+
address,
|
|
182
|
+
addressId,
|
|
183
|
+
executionTarget: await getExecutionTarget(address),
|
|
184
|
+
channelPath: input.definition.path,
|
|
185
|
+
operationId: "journal",
|
|
186
|
+
commandId: await createAgentChannelStableId(kind, addressId),
|
|
187
|
+
after,
|
|
188
|
+
limit,
|
|
189
|
+
}, signal));
|
|
190
|
+
if (!response.ok)
|
|
191
|
+
throw new Error(response.error?.message ?? "Channel session is unavailable.");
|
|
192
|
+
return response.result;
|
|
193
|
+
};
|
|
194
|
+
return Object.freeze({
|
|
195
|
+
sessionId,
|
|
196
|
+
send: (message, options) => send(address, principal, message, options, sessionId),
|
|
197
|
+
async history(options) {
|
|
198
|
+
const page = historySchema.parse(await read("session_history", options?.after ?? 0, options?.limit ?? 100));
|
|
199
|
+
return {
|
|
200
|
+
messages: await Promise.all(page.messages.map(async (message) => {
|
|
201
|
+
// AgentSession creates the assistant row before streaming its first part.
|
|
202
|
+
const placeholder = assistantPlaceholderSchema.safeParse(message);
|
|
203
|
+
if (placeholder.success)
|
|
204
|
+
return placeholder.data;
|
|
205
|
+
return (await validateUIMessages({ messages: [message] }))[0];
|
|
206
|
+
})),
|
|
207
|
+
cursor: page.cursor,
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
async *events(options) {
|
|
211
|
+
const signal = options?.signal
|
|
212
|
+
? AbortSignal.any([input.signal, options.signal])
|
|
213
|
+
: input.signal;
|
|
214
|
+
let after = options?.after ?? 0;
|
|
215
|
+
while (!signal.aborted) {
|
|
216
|
+
// Read the same durable journal for replay and follow. No handoff window exists.
|
|
217
|
+
const page = agentChannelJournalPageSchema.parse(await read("read_events", after, 64, signal));
|
|
218
|
+
for (const event of page.events) {
|
|
219
|
+
signal.throwIfAborted();
|
|
220
|
+
yield event;
|
|
221
|
+
}
|
|
222
|
+
after = page.cursor;
|
|
223
|
+
if (page.events.length < 64)
|
|
224
|
+
await pause(signal);
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
};
|
|
229
|
+
const send = async (address, principal, message, options, expectedSessionId) => {
|
|
230
|
+
await authorize();
|
|
231
|
+
if (!options ||
|
|
232
|
+
typeof options.operationId !== "string" ||
|
|
233
|
+
!options.operationId.length ||
|
|
234
|
+
options.operationId.length > 4096)
|
|
235
|
+
throw new Error("Channel operationId must contain 1–4096 characters.");
|
|
236
|
+
const normalized = agentChannelInputSchema.parse({
|
|
237
|
+
...options,
|
|
238
|
+
principal,
|
|
239
|
+
operationId: await createAgentChannelStableId("external-event", address.installationId, address.agentKey, address.channelKey, options.operationId),
|
|
240
|
+
message: typeof message === "string"
|
|
241
|
+
? { role: "user", parts: [{ type: "text", text: message }] }
|
|
242
|
+
: message,
|
|
243
|
+
});
|
|
244
|
+
const result = receiptSchema.parse(await addressRequest(input.environment, address, "/v2/ingress", {
|
|
245
|
+
address,
|
|
246
|
+
channelPath: input.definition.path,
|
|
247
|
+
executionTarget: await getExecutionTarget(address),
|
|
248
|
+
input: normalized,
|
|
249
|
+
...(input.identity.receiverRevision === undefined
|
|
250
|
+
? {}
|
|
251
|
+
: {
|
|
252
|
+
receiver: {
|
|
253
|
+
installationId: input.identity.installationId,
|
|
254
|
+
revision: input.identity.receiverRevision,
|
|
255
|
+
},
|
|
256
|
+
}),
|
|
257
|
+
...(expectedSessionId ? { expectedSessionId } : {}),
|
|
258
|
+
}, input.signal));
|
|
259
|
+
return {
|
|
260
|
+
...result,
|
|
261
|
+
session: makeSession(address, result.executionTarget.sessionId, principal),
|
|
262
|
+
};
|
|
263
|
+
};
|
|
264
|
+
return {
|
|
265
|
+
...capabilities,
|
|
266
|
+
from(raw, identity) {
|
|
267
|
+
const principal = studioExternalUserPrincipalSchema.parse(identity?.principal);
|
|
268
|
+
return {
|
|
269
|
+
async send(message, options) {
|
|
270
|
+
return await send(await getAddress(raw, principal), principal, message, options);
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
},
|
|
274
|
+
async resolveSession(raw, identity) {
|
|
275
|
+
const principal = studioExternalUserPrincipalSchema.parse(identity?.principal);
|
|
276
|
+
await authorize();
|
|
277
|
+
const address = await getAddress(raw, principal);
|
|
278
|
+
const stored = sessionSchema.parse(await addressRequest(input.environment, address, "/v2/session", undefined, input.signal));
|
|
279
|
+
return stored
|
|
280
|
+
? makeSession(stored.address, stored.sessionId, principal)
|
|
281
|
+
: null;
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
export async function createChannelRouteContext(input) {
|
|
286
|
+
return {
|
|
287
|
+
...(await createChannelInputContext(input)),
|
|
288
|
+
request: input.request,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/** Only the retained Worker definition interprets state and executes event/outbound code. */
|
|
292
|
+
export async function executeChannelBehavior(input) {
|
|
293
|
+
const { definition, command } = input;
|
|
294
|
+
if (command.kind === "record_delivery") {
|
|
295
|
+
if (command.operationId !== command.event.operationId)
|
|
296
|
+
throw new Error("Delivery event operation does not match its command.");
|
|
297
|
+
const namespace = input.environment.CHANNEL_SESSIONS;
|
|
298
|
+
const response = await namespace
|
|
299
|
+
.get(namespace.idFromName(`${command.address.agentKey}:${command.executionTarget.sessionId}`))
|
|
300
|
+
.fetch(new Request("http://session/v2/delivery-events", {
|
|
301
|
+
method: "POST",
|
|
302
|
+
headers: { "content-type": "application/json" },
|
|
303
|
+
body: JSON.stringify(command.event),
|
|
304
|
+
}));
|
|
305
|
+
if (!response.ok)
|
|
306
|
+
throw new Error("Channel delivery event could not be recorded.");
|
|
307
|
+
return z
|
|
308
|
+
.object({ sequence: z.number().int().positive(), duplicate: z.boolean() })
|
|
309
|
+
.parse(await response.json());
|
|
310
|
+
}
|
|
311
|
+
if (command.kind === "project_events") {
|
|
312
|
+
let state = definition.stateSchema.parse(structuredClone(command.state === undefined
|
|
313
|
+
? command.initialState === undefined
|
|
314
|
+
? definition.state
|
|
315
|
+
: command.initialState
|
|
316
|
+
: command.state));
|
|
317
|
+
const intents = [];
|
|
318
|
+
for (const entry of command.events) {
|
|
319
|
+
const event = agentChannelEventSchema.parse(entry.event);
|
|
320
|
+
const callback = definition.events[event.type] ?? definition.events["*"];
|
|
321
|
+
if (!callback)
|
|
322
|
+
continue;
|
|
323
|
+
const data = definition.dataSchema
|
|
324
|
+
? agentChannelJsonSchema.parse(definition.dataSchema.parse(entry.input.data))
|
|
325
|
+
: entry.input.data;
|
|
326
|
+
const context = definition.context
|
|
327
|
+
? await definition.context(state)
|
|
328
|
+
: undefined;
|
|
329
|
+
const callbackContext = {
|
|
330
|
+
state,
|
|
331
|
+
context,
|
|
332
|
+
input: {
|
|
333
|
+
data,
|
|
334
|
+
actor: entry.input.actor,
|
|
335
|
+
principal: entry.input.principal,
|
|
336
|
+
},
|
|
337
|
+
outbox: {
|
|
338
|
+
enqueue(key, payload) {
|
|
339
|
+
if (!definition.outbound)
|
|
340
|
+
throw new Error("Channel output requires an outbound handler.");
|
|
341
|
+
intents.push({
|
|
342
|
+
key,
|
|
343
|
+
payload: agentChannelJsonSchema.parse(definition.outboundSchema
|
|
344
|
+
? definition.outboundSchema.parse(payload)
|
|
345
|
+
: payload),
|
|
346
|
+
eventId: event.id,
|
|
347
|
+
operationId: event.operationId,
|
|
348
|
+
});
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
await callback(event, callbackContext);
|
|
353
|
+
state = definition.stateSchema.parse(callbackContext.state);
|
|
354
|
+
}
|
|
355
|
+
return agentChannelRuntimeProjectionSchema.parse({
|
|
356
|
+
state: definition.stateSchema.parse(state),
|
|
357
|
+
intents,
|
|
358
|
+
cursor: command.events.at(-1).event.sequence,
|
|
359
|
+
...(definition.idempotencyWindowMs
|
|
360
|
+
? { idempotencyWindowMs: definition.idempotencyWindowMs }
|
|
361
|
+
: {}),
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
if (command.kind === "outbound") {
|
|
365
|
+
if (!definition.outbound)
|
|
366
|
+
throw new Error("Channel outbound handler is unavailable.");
|
|
367
|
+
const delivery = {
|
|
368
|
+
...command.delivery,
|
|
369
|
+
payload: definition.outboundSchema
|
|
370
|
+
? definition.outboundSchema.parse(command.delivery.payload)
|
|
371
|
+
: command.delivery.payload,
|
|
372
|
+
};
|
|
373
|
+
const capabilities = await createChannelCapabilities(input.environment, input.signal);
|
|
374
|
+
try {
|
|
375
|
+
return agentChannelOutboundResultSchema.parse(await definition.outbound(Object.freeze(delivery), capabilities));
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
// Once author code has started, a thrown failure cannot prove no side effect occurred.
|
|
379
|
+
return {
|
|
380
|
+
status: "unknown",
|
|
381
|
+
error: {
|
|
382
|
+
code: "outbound_result_unknown",
|
|
383
|
+
message: "The outbound handler did not return a valid receipt.",
|
|
384
|
+
retryable: false,
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
const path = command.kind === "read_events"
|
|
390
|
+
? `/v2/events?after=${command.after}&limit=${command.limit}`
|
|
391
|
+
: `/v1/state?messageAfter=${command.after}&limit=${command.limit}`;
|
|
392
|
+
const namespace = input.environment.CHANNEL_SESSIONS;
|
|
393
|
+
const response = await namespace
|
|
394
|
+
.get(namespace.idFromName(`${command.address.agentKey}:${command.executionTarget.sessionId}`))
|
|
395
|
+
.fetch(new Request(`http://session${path}`));
|
|
396
|
+
if (!response.ok)
|
|
397
|
+
throw new Error("Channel session read failed.");
|
|
398
|
+
const value = await response.json();
|
|
399
|
+
if (command.kind === "read_events")
|
|
400
|
+
return agentChannelJournalPageSchema.parse(value);
|
|
401
|
+
const page = z
|
|
402
|
+
.object({
|
|
403
|
+
messages: z.array(z.object({
|
|
404
|
+
sequence: z.number(),
|
|
405
|
+
message: z.object({ id: z.string() }).passthrough(),
|
|
406
|
+
})),
|
|
407
|
+
})
|
|
408
|
+
.parse(value);
|
|
409
|
+
return {
|
|
410
|
+
messages: page.messages.map((entry) => entry.message),
|
|
411
|
+
cursor: page.messages.at(-1)?.sequence ?? command.after,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/** Ordinary Worker sockets carry author protocol frames; Agent work lives in the address queue. */
|
|
415
|
+
export async function openChannelWebSocket(route, request, context, controller, environment) {
|
|
416
|
+
const rejected = await route.authorize?.(request, context);
|
|
417
|
+
if (rejected)
|
|
418
|
+
return rejected;
|
|
419
|
+
const constructor = globalThis.WebSocketPair;
|
|
420
|
+
if (!constructor)
|
|
421
|
+
throw new Error("Worker WebSocket upgrade is unavailable.");
|
|
422
|
+
const offered = (request.headers.get("sec-websocket-protocol") ?? "")
|
|
423
|
+
.split(",")
|
|
424
|
+
.map((value) => value.trim())
|
|
425
|
+
.filter(Boolean);
|
|
426
|
+
const protocol = route.protocols?.find((value) => offered.includes(value));
|
|
427
|
+
if (route.protocols?.length && !protocol)
|
|
428
|
+
return new Response("Unsupported WebSocket protocol", { status: 426 });
|
|
429
|
+
const pair = new constructor();
|
|
430
|
+
const server = pair[1];
|
|
431
|
+
server.binaryType = "arraybuffer";
|
|
432
|
+
server.accept();
|
|
433
|
+
let queued = 0;
|
|
434
|
+
let bytes = 0;
|
|
435
|
+
let chain = Promise.resolve();
|
|
436
|
+
const socket = {
|
|
437
|
+
id: crypto.randomUUID(),
|
|
438
|
+
send(data) {
|
|
439
|
+
const size = typeof data === "string"
|
|
440
|
+
? new TextEncoder().encode(data).byteLength
|
|
441
|
+
: data.byteLength;
|
|
442
|
+
if (size > LIMIT_SOCKET_BYTES ||
|
|
443
|
+
(server.bufferedAmount ?? 0) + size > LIMIT_SOCKET_BYTES) {
|
|
444
|
+
server.close(1009, "Channel buffer limit exceeded");
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
server.send(data instanceof Uint8Array ? new Uint8Array(data) : data);
|
|
448
|
+
},
|
|
449
|
+
close(code, reason) {
|
|
450
|
+
server.close(code, reason);
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
const fail = () => {
|
|
454
|
+
controller.abort();
|
|
455
|
+
server.close(1011, "Channel callback failed");
|
|
456
|
+
};
|
|
457
|
+
server.addEventListener("message", (event) => {
|
|
458
|
+
const data = event.data;
|
|
459
|
+
const size = typeof data === "string"
|
|
460
|
+
? new TextEncoder().encode(data).byteLength
|
|
461
|
+
: data.byteLength;
|
|
462
|
+
if (++queued > 32 || (bytes += size) > LIMIT_SOCKET_BYTES) {
|
|
463
|
+
server.close(1009, "Channel buffer limit exceeded");
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
chain = chain
|
|
467
|
+
.then(async () => {
|
|
468
|
+
await route.handlers.message(socket, data, context);
|
|
469
|
+
})
|
|
470
|
+
.catch(fail)
|
|
471
|
+
.finally(() => {
|
|
472
|
+
queued--;
|
|
473
|
+
bytes -= size;
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
let checking = false;
|
|
477
|
+
const timer = setInterval(() => {
|
|
478
|
+
if (checking)
|
|
479
|
+
return;
|
|
480
|
+
checking = true;
|
|
481
|
+
void hostJson(environment, "authorize", undefined, context.signal)
|
|
482
|
+
.catch(() => {
|
|
483
|
+
controller.abort();
|
|
484
|
+
server.close(1008, "Channel authorization ended");
|
|
485
|
+
})
|
|
486
|
+
.finally(() => {
|
|
487
|
+
checking = false;
|
|
488
|
+
});
|
|
489
|
+
}, 15000);
|
|
490
|
+
server.addEventListener("close", (event) => {
|
|
491
|
+
clearInterval(timer);
|
|
492
|
+
controller.abort();
|
|
493
|
+
void route.handlers.close?.(socket, { code: event.code, reason: event.reason }, context);
|
|
494
|
+
});
|
|
495
|
+
server.addEventListener("error", fail);
|
|
496
|
+
context.signal.addEventListener("abort", () => server.close(1008, "Channel authorization ended"), { once: true });
|
|
497
|
+
try {
|
|
498
|
+
await route.handlers.open?.(socket, context);
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
clearInterval(timer);
|
|
502
|
+
fail();
|
|
503
|
+
throw new Error("Channel socket initialization failed.");
|
|
504
|
+
}
|
|
505
|
+
return new Response(null, {
|
|
506
|
+
status: 101,
|
|
507
|
+
headers: protocol ? { "sec-websocket-protocol": protocol } : undefined,
|
|
508
|
+
webSocket: pair[0],
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=agent-channel-author-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-channel-author-runtime.js","sourceRoot":"","sources":["../src/agent-channel-author-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,GAElC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,iCAAiC,GAIlC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,uBAAuB,EAEvB,uBAAuB,EACvB,6BAA6B,EAC7B,sBAAsB,EACtB,gCAAgC,EAChC,mCAAmC,GAIpC,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAY/C,MAAM,IAAI,GAAG,wCAAwC,CAAC;AACtD,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACvD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CAC5C,CAAC,CAAC;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AACH,MAAM,aAAa,GAAG,CAAC;KACpB,MAAM,CAAC;IACN,OAAO,EAAE,yBAAyB;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC;KACD,QAAQ,EAAE,CAAC;AACd,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,eAAe,EAAE,iCAAiC;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;CAC9B,CAAC,CAAC;AACH,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CACvC,CAAC,CAAC;AACH,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAC;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;CACtE,CAAC,CAAC;AAEH,KAAK,UAAU,QAAQ,CACrB,WAAyC,EACzC,IAAY,EACZ,IAAc,EACd,MAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QAC3C,GAAG,CAAC,IAAI,KAAK,SAAS;YACpB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC;QACN,MAAM;KACP,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QACd,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,cAAc,QAAQ,CAAC,MAAM,IAAI,CAC5D,CAAC;IACJ,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAyC,EACzC,MAAmB;IAEnB,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAC5C,MAAM,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAC7D,CAAC;IACF,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;QACzC,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,MAAM;QACN,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI;YACrB,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI;gBACxB,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7C,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;gBAC7C,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,IAAI,UAA8B,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,KAAK,MAAM,IAAI,IAAI,KAAK;oBAAE,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC9D,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CACrC,MAAM,QAAQ,CACZ,WAAW,EACX,OAAO,EACP;gBACE,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;gBAC7B,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;aACpD,EACD,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAC1C,CACF,CAAC;YACF,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAC5D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CACnB,CAAC;YACF,OAAO,IAAI,QAAQ,CACjB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;gBACtE,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,EACR;gBACE,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,WAAyC,EACzC,OAA4B,EAC5B,IAAY,EACZ,IAAc,EACd,MAAoB;IAEpB,MAAM,EAAE,GAAG,MAAM,0BAA0B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,GAAG,CACtD,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,CAC7C,CAAC,KAAK,CACL,IAAI,OAAO,CAAC,iBAAiB,IAAI,EAAE,EAAE;QACnC,MAAM;QACN,GAAG,CAAC,IAAI,KAAK,SAAS;YACpB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC;KACP,CAAC,CACH,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,iBAAiB,CAAC;YAC1B,IAAI,EAAE,MAAM,CAAC,OAAO;gBAClB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;gBACxB,CAAC,CAAC,6BAA6B;YACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACrB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACvD,CAAC,CAAC,iCAAiC;SACtC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AACD,KAAK,UAAU,KAAK,CAAC,MAAmB;IACtC,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAK/C;IACC,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAClD,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,MAAM,CACb,CAAC;IACF,MAAM,SAAS,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE;QAChD,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,EACtB,GAAW,EACX,SAAsC,EACR,EAAE;QAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI;YAC7D,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ;YACjC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG;YAChC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW;YACvC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,cAAc;YAC7C,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,gBAAgB,EAAE,MAAM,0BAA0B,CAChD,kBAAkB,EAClB,KAAK,CAAC,QAAQ,CAAC,cAAc,EAC7B,KAAK,CAAC,QAAQ,CAAC,QAAQ,EACvB,KAAK,CAAC,UAAU,CAAC,GAAG,EACpB,GAAG,CACJ;YACD,aAAa,EAAE,wBAAwB;YACvC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,aAAa;YAC3C,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW;SACxC,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAG,KAAK,EAC9B,OAA4B,EACU,EAAE,CAAC,CAAC;QAC1C,wBAAwB,EAAE,MAAM,0BAA0B,CACxD,YAAY,EACZ,KAAK,CAAC,UAAU,CAAC,UAAU,CAC5B;QACD,aAAa,EAAE,iCAAiC;QAChD,SAAS,EAAE,MAAM,0BAA0B,CAAC,SAAS,EAAE,OAAO,CAAC;QAC/D,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY;QAC3C,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,oBAAoB;QACzD,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB;QACrD,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ;KAClC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,CAClB,OAA4B,EAC5B,SAAiB,EACjB,SAAsC,EACtB,EAAE;QAClB,MAAM,IAAI,GAAG,KAAK,EAChB,IAAuC,EACvC,KAAa,EACb,KAAa,EACb,MAAM,GAAG,KAAK,CAAC,MAAM,EACrB,EAAE;YACF,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CACvC,MAAM,QAAQ,CACZ,KAAK,CAAC,WAAW,EACjB,SAAS,EACT;gBACE,eAAe,EAAE,wBAAwB;gBACzC,IAAI;gBACJ,OAAO;gBACP,SAAS;gBACT,eAAe,EAAE,MAAM,kBAAkB,CAAC,OAAO,CAAC;gBAClD,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI;gBAClC,WAAW,EAAE,SAAS;gBACtB,SAAS,EAAE,MAAM,0BAA0B,CAAC,IAAI,EAAE,SAAS,CAAC;gBAC5D,KAAK;gBACL,KAAK;aACN,EACD,MAAM,CACP,CACF,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACd,MAAM,IAAI,KAAK,CACb,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,iCAAiC,CAC7D,CAAC;YACJ,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,SAAS;YACT,IAAI,EAAE,CACJ,OAAgE,EAChE,OAA2B,EAC3B,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC;YAC1D,KAAK,CAAC,OAAO,CAAC,OAA4C;gBACxD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAC9B,MAAM,IAAI,CACR,iBAAiB,EACjB,OAAO,EAAE,KAAK,IAAI,CAAC,EACnB,OAAO,EAAE,KAAK,IAAI,GAAG,CACtB,CACF,CAAC;gBACF,OAAO;oBACL,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG,CACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;wBAClC,0EAA0E;wBAC1E,MAAM,WAAW,GAAG,0BAA0B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;wBAClE,IAAI,WAAW,CAAC,OAAO;4BAAE,OAAO,WAAW,CAAC,IAAI,CAAC;wBACjD,OAAO,CAAC,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;oBACjE,CAAC,CAAC,CACH;oBACD,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,CAAC,MAAM,CAAC,OAAkD;gBAC9D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM;oBAC5B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACjB,IAAI,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvB,iFAAiF;oBACjF,MAAM,IAAI,GAAG,6BAA6B,CAAC,KAAK,CAC9C,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAC7C,CAAC;oBACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChC,MAAM,CAAC,cAAc,EAAE,CAAC;wBACxB,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;oBACpB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE;wBAAE,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,EAChB,OAA4B,EAC5B,SAAsC,EACtC,OAAgE,EAChE,OAA2B,EAC3B,iBAA0B,EACG,EAAE;QAC/B,MAAM,SAAS,EAAE,CAAC;QAClB,IACE,CAAC,OAAO;YACR,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ;YACvC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM;YAC3B,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI;YAEjC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC;YAC/C,GAAG,OAAO;YACV,SAAS;YACT,WAAW,EAAE,MAAM,0BAA0B,CAC3C,gBAAgB,EAChB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,WAAW,CACpB;YACD,OAAO,EACL,OAAO,OAAO,KAAK,QAAQ;gBACzB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC5D,CAAC,CAAC,OAAO;SACd,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAChC,MAAM,cAAc,CAClB,KAAK,CAAC,WAAW,EACjB,OAAO,EACP,aAAa,EACb;YACE,OAAO;YACP,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI;YAClC,eAAe,EAAE,MAAM,kBAAkB,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE,UAAU;YACjB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,KAAK,SAAS;gBAC/C,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,QAAQ,EAAE;wBACR,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,cAAc;wBAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB;qBAC1C;iBACF,CAAC;YACN,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,EACD,KAAK,CAAC,MAAM,CACb,CACF,CAAC;QACF,OAAO;YACL,GAAG,MAAM;YACT,OAAO,EAAE,WAAW,CAClB,OAAO,EACP,MAAM,CAAC,eAAe,CAAC,SAAS,EAChC,SAAS,CACV;SACF,CAAC;IACJ,CAAC,CAAC;IACF,OAAO;QACL,GAAG,YAAY;QACf,IAAI,CAAC,GAAG,EAAE,QAAQ;YAChB,MAAM,SAAS,GAAG,iCAAiC,CAAC,KAAK,CACvD,QAAQ,EAAE,SAAS,CACpB,CAAC;YACF,OAAO;gBACL,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO;oBACzB,OAAO,MAAM,IAAI,CACf,MAAM,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAChC,SAAS,EACT,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC;aACF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ;YAChC,MAAM,SAAS,GAAG,iCAAiC,CAAC,KAAK,CACvD,QAAQ,EAAE,SAAS,CACpB,CAAC;YACF,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAChC,MAAM,cAAc,CAClB,KAAK,CAAC,WAAW,EACjB,OAAO,EACP,aAAa,EACb,SAAS,EACT,KAAK,CAAC,MAAM,CACb,CACF,CAAC;YACF,OAAO,MAAM;gBACX,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC;gBAC1D,CAAC,CAAC,IAAI,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAA6E;IAE7E,OAAO;QACL,GAAG,CAAC,MAAM,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAK5C;IACC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACtC,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,KAAK,CAAC,WAAW;YACnD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,SAAS;aAC7B,GAAG,CACF,SAAS,CAAC,UAAU,CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,CACnE,CACF;aACA,KAAK,CACJ,IAAI,OAAO,CAAC,mCAAmC,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;SACpC,CAAC,CACH,CAAC;QACJ,IAAI,CAAC,QAAQ,CAAC,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,OAAO,CAAC;aACL,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;aACzE,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACtC,IAAI,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CACtC,eAAe,CACb,OAAO,CAAC,KAAK,KAAK,SAAS;YACzB,CAAC,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;gBAClC,CAAC,CAAC,UAAU,CAAC,KAAK;gBAClB,CAAC,CAAC,OAAO,CAAC,YAAY;YACxB,CAAC,CAAC,OAAO,CAAC,KAAK,CAClB,CACF,CAAC;QACF,MAAM,OAAO,GAEE,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzE,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU;gBAChC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAC1B,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAC9C;gBACH,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACrB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO;gBAChC,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjC,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,eAAe,GAAG;gBACtB,KAAK;gBACL,OAAO;gBACP,KAAK,EAAE;oBACL,IAAI;oBACJ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;oBACxB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS;iBACjC;gBACD,MAAM,EAAE;oBACN,OAAO,CAAC,GAAW,EAAE,OAAyB;wBAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ;4BACtB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;wBAClE,OAAO,CAAC,IAAI,CAAC;4BACX,GAAG;4BACH,OAAO,EAAE,sBAAsB,CAAC,KAAK,CACnC,UAAU,CAAC,cAAc;gCACvB,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;gCAC1C,CAAC,CAAC,OAAO,CACZ;4BACD,OAAO,EAAE,KAAK,CAAC,EAAE;4BACjB,WAAW,EAAE,KAAK,CAAC,WAAW;yBAC/B,CAAC,CAAC;oBACL,CAAC;iBACF;aACF,CAAC;YACF,MAAM,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YACvC,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,mCAAmC,CAAC,KAAK,CAAC;YAC/C,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1C,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,QAAQ;YAC7C,GAAG,CAAC,UAAU,CAAC,mBAAmB;gBAChC,CAAC,CAAC,EAAE,mBAAmB,EAAE,UAAU,CAAC,mBAAmB,EAAE;gBACzD,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,QAAQ;YACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG;YACf,GAAG,OAAO,CAAC,QAAQ;YACnB,OAAO,EAAE,UAAU,CAAC,cAAc;gBAChC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC3D,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO;SAC7B,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAClD,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,MAAM,CACb,CAAC;QACF,IAAI,CAAC;YACH,OAAO,gCAAgC,CAAC,KAAK,CAC3C,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CACjE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,uFAAuF;YACvF,OAAO;gBACL,MAAM,EAAE,SAAkB;gBAC1B,KAAK,EAAE;oBACL,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,sDAAsD;oBAC/D,SAAS,EAAE,KAAK;iBACjB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,KAAK,aAAa;QAC5B,CAAC,CAAC,oBAAoB,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,KAAK,EAAE;QAC5D,CAAC,CAAC,0BAA0B,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,SAAS;SAC7B,GAAG,CACF,SAAS,CAAC,UAAU,CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,CACnE,CACF;SACA,KAAK,CAAC,IAAI,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa;QAChC,OAAO,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC;SACX,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;YACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;SACpD,CAAC,CACH;KACF,CAAC;SACD,KAAK,CAAC,KAAK,CAAC,CAAC;IAChB,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;QACrD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,OAAO,CAAC,KAAK;KACxD,CAAC;AACJ,CAAC;AAGD,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA4B,EAC5B,OAAgB,EAChB,OAA4B,EAC5B,UAA2B,EAC3B,WAAyC;IAEzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,WAAW,GACf,UAGD,CAAC,aAAa,CAAC;IAChB,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC;SAClE,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,QAAQ;QACtC,OAAO,IAAI,QAAQ,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,UAAU,GAAG,aAAa,CAAC;IAClC,MAAM,CAAC,MAAM,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;QACvB,IAAI,CAAC,IAAuC;YAC1C,MAAM,IAAI,GACR,OAAO,IAAI,KAAK,QAAQ;gBACtB,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU;gBAC3C,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YACtB,IACE,IAAI,GAAG,kBAAkB;gBACzB,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,kBAAkB,EACxD,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;QACD,KAAK,CAAC,IAAa,EAAE,MAAe;YAClC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;IAChD,CAAC,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAA4B,CAAC;QAChD,MAAM,IAAI,GACR,OAAO,IAAI,KAAK,QAAQ;YACtB,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU;YAC3C,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QACtB,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,kBAAkB,EAAE,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,KAAK,GAAG,KAAK;aACV,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC,CAAC;aACD,KAAK,CAAC,IAAI,CAAC;aACX,OAAO,CAAC,GAAG,EAAE;YACZ,MAAM,EAAE,CAAC;YACT,KAAK,IAAI,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;aAC/D,KAAK,CAAC,GAAG,EAAE;YACV,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC;QACpD,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,KAAK,CAAC,CAAC;IACV,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACzC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CACzB,MAAM,EACN,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAC1C,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAC7B,OAAO,EACP,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,6BAA6B,CAAC,EACvD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QACtE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;KAC4B,CAAC,CAAC;AACpD,CAAC"}
|