@nodetool-ai/dsl 0.8.2 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/flow/generated/nodetool.image.d.ts +1 -1
- package/dist/flow/generated/nodetool.image.d.ts.map +1 -1
- package/dist/flow/generated/nodetool.manimgx.d.ts +52 -0
- package/dist/flow/generated/nodetool.manimgx.d.ts.map +1 -0
- package/dist/flow/generated/nodetool.manimgx.js +14 -0
- package/dist/flow/generated/nodetool.manimgx.js.map +1 -0
- package/dist/flow/generated/nodetool.storyboard.d.ts +17 -0
- package/dist/flow/generated/nodetool.storyboard.d.ts.map +1 -1
- package/dist/flow/generated/nodetool.storyboard.js +3 -0
- package/dist/flow/generated/nodetool.storyboard.js.map +1 -1
- package/dist/flow/generated/nodetool.video.d.ts +1 -0
- package/dist/flow/generated/nodetool.video.d.ts.map +1 -1
- package/dist/flow/generated/nodetool.video.js.map +1 -1
- package/dist/flow/generated/nodetool.workflows.app_node.d.ts +11 -0
- package/dist/flow/generated/nodetool.workflows.app_node.d.ts.map +1 -0
- package/dist/flow/generated/nodetool.workflows.app_node.js +11 -0
- package/dist/flow/generated/nodetool.workflows.app_node.js.map +1 -0
- package/dist/generated/index.d.ts +2 -0
- package/dist/generated/index.d.ts.map +1 -1
- package/dist/generated/index.js +2 -0
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/nodetool.image.d.ts +1 -1
- package/dist/generated/nodetool.image.d.ts.map +1 -1
- package/dist/generated/nodetool.manimgx.d.ts +56 -0
- package/dist/generated/nodetool.manimgx.d.ts.map +1 -0
- package/dist/generated/nodetool.manimgx.js +12 -0
- package/dist/generated/nodetool.manimgx.js.map +1 -0
- package/dist/generated/nodetool.storyboard.d.ts +17 -0
- package/dist/generated/nodetool.storyboard.d.ts.map +1 -1
- package/dist/generated/nodetool.storyboard.js +3 -0
- package/dist/generated/nodetool.storyboard.js.map +1 -1
- package/dist/generated/nodetool.video.d.ts +1 -0
- package/dist/generated/nodetool.video.d.ts.map +1 -1
- package/dist/generated/nodetool.video.js.map +1 -1
- package/dist/generated/nodetool.workflows.app_node.d.ts +10 -0
- package/dist/generated/nodetool.workflows.app_node.d.ts.map +1 -0
- package/dist/generated/nodetool.workflows.app_node.js +6 -0
- package/dist/generated/nodetool.workflows.app_node.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/script-export.d.ts +57 -0
- package/dist/script-export.d.ts.map +1 -0
- package/dist/script-export.js +611 -0
- package/dist/script-export.js.map +1 -0
- package/package.json +15 -15
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow → JavaScript script.
|
|
3
|
+
*
|
|
4
|
+
* Turns a saved workflow graph into a script that calls each node as an async
|
|
5
|
+
* function, in dependency order: `await` is the edge and a variable is the
|
|
6
|
+
* wire. Two targets share one body and differ only in how a node is called:
|
|
7
|
+
*
|
|
8
|
+
* sandbox — a body for a JS script document or a Code node. Each call
|
|
9
|
+
* goes through the `@nodetool-ai/sandbox-flow` pack's untyped
|
|
10
|
+
* bridge, which crosses to the host and runs on the invoking
|
|
11
|
+
* run's context.
|
|
12
|
+
* node — a standalone `.mjs` for plain Node.js. Each call runs in process
|
|
13
|
+
* through `@nodetool-ai/dsl/flow`, with secrets read from the
|
|
14
|
+
* environment.
|
|
15
|
+
*
|
|
16
|
+
* Both reach the same native-flow backend (docs/dsl-native-flow-design.md), so
|
|
17
|
+
* a node behaves the same in either. What a call cannot express is refused in
|
|
18
|
+
* the generated script itself: a script with an unsupported node throws before
|
|
19
|
+
* it runs anything, naming every node and the reason.
|
|
20
|
+
*/
|
|
21
|
+
import { ALL_BASE_NODES } from "@nodetool-ai/base-nodes";
|
|
22
|
+
import { rewriteBypassedNodes } from "@nodetool-ai/kernel";
|
|
23
|
+
import { getNodeMetadata } from "@nodetool-ai/node-sdk";
|
|
24
|
+
const COMMENT_NODE_TYPE = "nodetool.workflows.base_node.Comment";
|
|
25
|
+
const GROUP_NODE_TYPE = "nodetool.workflows.base_node.Group";
|
|
26
|
+
const PREVIEW_NODE_TYPE = "nodetool.workflows.base_node.Preview";
|
|
27
|
+
const JS_RESERVED = new Set([
|
|
28
|
+
"arguments", "async", "await", "break", "case", "catch", "class", "const",
|
|
29
|
+
"continue", "debugger", "default", "delete", "do", "else", "enum", "eval",
|
|
30
|
+
"export", "extends", "false", "finally", "for", "function", "if",
|
|
31
|
+
"implements", "import", "in", "instanceof", "interface", "let", "new",
|
|
32
|
+
"null", "package", "private", "protected", "public", "return", "static",
|
|
33
|
+
"super", "switch", "this", "throw", "true", "try", "typeof", "undefined",
|
|
34
|
+
"var", "void", "while", "with", "yield"
|
|
35
|
+
]);
|
|
36
|
+
/** Names the generated helpers and the sandbox globals already use. */
|
|
37
|
+
const RESERVED_NAMES = [
|
|
38
|
+
"SKIPPED", "pick", "ready", "call", "callStreaming", "runNode",
|
|
39
|
+
"streamNode", "isEmission", "inputs", "output", "emit", "results", "main",
|
|
40
|
+
"flow", "stream", "state", "progress", "console", "media", "workspace",
|
|
41
|
+
"fetch", "sleep", "crypto", "format", "image", "audio", "video", "canvas",
|
|
42
|
+
"nodetool", "getSecret", "process", "invoke", "invokeStream", "startFlow",
|
|
43
|
+
"invoke_node", "open_node_stream", "take_node_stream", "close_node_stream",
|
|
44
|
+
"callNode", "bytesAsLength", "Symbol", "Object", "Array", "JSON", "Error", "Math",
|
|
45
|
+
"Number", "String", "Promise"
|
|
46
|
+
];
|
|
47
|
+
function asRecord(value) {
|
|
48
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
49
|
+
? value
|
|
50
|
+
: null;
|
|
51
|
+
}
|
|
52
|
+
function normalizeGraph(graph) {
|
|
53
|
+
if (!Array.isArray(graph.nodes) || !Array.isArray(graph.edges)) {
|
|
54
|
+
throw new Error("Workflow graph must contain node and edge arrays");
|
|
55
|
+
}
|
|
56
|
+
const descriptors = [];
|
|
57
|
+
const extras = new Map();
|
|
58
|
+
graph.nodes.forEach((raw, index) => {
|
|
59
|
+
const id = typeof raw.id === "string" ? raw.id : "";
|
|
60
|
+
const type = typeof raw.type === "string" ? raw.type : "";
|
|
61
|
+
if (!id)
|
|
62
|
+
throw new Error(`Workflow node at index ${index} is missing an id`);
|
|
63
|
+
if (!type)
|
|
64
|
+
throw new Error(`Workflow node '${id}' is missing a type`);
|
|
65
|
+
if (type === COMMENT_NODE_TYPE || type === GROUP_NODE_TYPE)
|
|
66
|
+
return;
|
|
67
|
+
const properties = {
|
|
68
|
+
...(asRecord(raw.properties) ?? asRecord(raw.data) ?? {}),
|
|
69
|
+
...(asRecord(raw.dynamic_properties) ?? {})
|
|
70
|
+
};
|
|
71
|
+
descriptors.push({
|
|
72
|
+
id,
|
|
73
|
+
type,
|
|
74
|
+
properties,
|
|
75
|
+
ui_properties: asRecord(raw.ui_properties) ?? undefined
|
|
76
|
+
});
|
|
77
|
+
extras.set(id, {
|
|
78
|
+
name: typeof raw.name === "string" ? raw.name : undefined,
|
|
79
|
+
outputCorrelation: asRecord(raw.output_correlation) ??
|
|
80
|
+
asRecord(raw.dynamic_output_correlation) ??
|
|
81
|
+
undefined,
|
|
82
|
+
isStreamingOutput: typeof raw.is_streaming_output === "boolean"
|
|
83
|
+
? raw.is_streaming_output
|
|
84
|
+
: undefined
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
const nodeIds = new Set(descriptors.map((node) => node.id));
|
|
88
|
+
const rawEdges = [];
|
|
89
|
+
graph.edges.forEach((raw, index) => {
|
|
90
|
+
const source = typeof raw.source === "string" ? raw.source : "";
|
|
91
|
+
const target = typeof raw.target === "string" ? raw.target : "";
|
|
92
|
+
const sourceHandle = typeof raw.sourceHandle === "string" ? raw.sourceHandle : "";
|
|
93
|
+
const targetHandle = typeof raw.targetHandle === "string" ? raw.targetHandle : "";
|
|
94
|
+
if (!source || !target || !sourceHandle || !targetHandle) {
|
|
95
|
+
throw new Error(`Workflow edge at index ${index} is missing required fields`);
|
|
96
|
+
}
|
|
97
|
+
// The runner drops edges whose ends do not exist; so does the script.
|
|
98
|
+
if (!nodeIds.has(source) || !nodeIds.has(target))
|
|
99
|
+
return;
|
|
100
|
+
rawEdges.push({
|
|
101
|
+
id: typeof raw.id === "string" ? raw.id : undefined,
|
|
102
|
+
source,
|
|
103
|
+
sourceHandle,
|
|
104
|
+
target,
|
|
105
|
+
targetHandle,
|
|
106
|
+
edge_type: raw.edge_type === "control" ? "control" : "data"
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
// Bypassed nodes are routed around exactly as the runner does it.
|
|
110
|
+
const rewritten = rewriteBypassedNodes({ nodes: descriptors, edges: rawEdges });
|
|
111
|
+
const nodes = rewritten.nodes.map((node) => ({
|
|
112
|
+
id: node.id,
|
|
113
|
+
type: node.type,
|
|
114
|
+
properties: (node.properties ?? {}),
|
|
115
|
+
...extras.get(node.id)
|
|
116
|
+
}));
|
|
117
|
+
return {
|
|
118
|
+
nodes,
|
|
119
|
+
edges: rewritten.edges.filter((edge) => edge.edge_type !== "control"),
|
|
120
|
+
controlEdges: rewritten.edges.filter((edge) => edge.edge_type === "control")
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function topologicalSort(nodes, edges) {
|
|
124
|
+
const index = new Map(nodes.map((node, i) => [node.id, i]));
|
|
125
|
+
const inDegree = new Map(nodes.map((node) => [node.id, 0]));
|
|
126
|
+
const outgoing = new Map(nodes.map((node) => [node.id, []]));
|
|
127
|
+
for (const edge of edges) {
|
|
128
|
+
outgoing.get(edge.source).push(edge.target);
|
|
129
|
+
inDegree.set(edge.target, inDegree.get(edge.target) + 1);
|
|
130
|
+
}
|
|
131
|
+
const byIndex = (a, b) => index.get(a.id) - index.get(b.id);
|
|
132
|
+
const queue = nodes.filter((node) => inDegree.get(node.id) === 0).sort(byIndex);
|
|
133
|
+
const ordered = [];
|
|
134
|
+
const byId = new Map(nodes.map((node) => [node.id, node]));
|
|
135
|
+
while (queue.length > 0) {
|
|
136
|
+
const current = queue.shift();
|
|
137
|
+
ordered.push(current);
|
|
138
|
+
for (const target of outgoing.get(current.id)) {
|
|
139
|
+
const left = inDegree.get(target) - 1;
|
|
140
|
+
inDegree.set(target, left);
|
|
141
|
+
if (left === 0) {
|
|
142
|
+
queue.push(byId.get(target));
|
|
143
|
+
queue.sort(byIndex);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (ordered.length !== nodes.length) {
|
|
148
|
+
throw new Error("Workflow contains a cycle (such as a Loop), which a script cannot express");
|
|
149
|
+
}
|
|
150
|
+
return ordered;
|
|
151
|
+
}
|
|
152
|
+
// ── Metadata ────────────────────────────────────────────────────────────────
|
|
153
|
+
let builtinMetadata = null;
|
|
154
|
+
function builtinMetadataFor(nodeType) {
|
|
155
|
+
if (!builtinMetadata) {
|
|
156
|
+
builtinMetadata = new Map();
|
|
157
|
+
for (const NodeClass of ALL_BASE_NODES) {
|
|
158
|
+
const metadata = getNodeMetadata(NodeClass);
|
|
159
|
+
builtinMetadata.set(metadata.node_type, metadata);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return builtinMetadata.get(nodeType);
|
|
163
|
+
}
|
|
164
|
+
function typeToString(type) {
|
|
165
|
+
if (!type?.type)
|
|
166
|
+
return "any";
|
|
167
|
+
const args = (type.type_args ?? []).map(typeToString);
|
|
168
|
+
return args.length > 0 ? `${type.type}[${args.join(", ")}]` : type.type;
|
|
169
|
+
}
|
|
170
|
+
function correlationKind(value) {
|
|
171
|
+
const record = asRecord(value);
|
|
172
|
+
return typeof record?.kind === "string" ? record.kind : undefined;
|
|
173
|
+
}
|
|
174
|
+
function correlationOf(node, metadata, slot) {
|
|
175
|
+
return (asRecord(node.outputCorrelation?.[slot]) ??
|
|
176
|
+
asRecord(metadata?.output_correlation?.[slot]));
|
|
177
|
+
}
|
|
178
|
+
function consumesStreams(metadata) {
|
|
179
|
+
return metadata?.is_streaming_input === true || metadata?.input_mode === "stream";
|
|
180
|
+
}
|
|
181
|
+
// ── Code formatting ─────────────────────────────────────────────────────────
|
|
182
|
+
function isIdentifier(name) {
|
|
183
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name);
|
|
184
|
+
}
|
|
185
|
+
function formatKey(name) {
|
|
186
|
+
return isIdentifier(name) && !JS_RESERVED.has(name) ? name : JSON.stringify(name);
|
|
187
|
+
}
|
|
188
|
+
function formatLiteral(value, indent) {
|
|
189
|
+
if (value === undefined)
|
|
190
|
+
return "undefined";
|
|
191
|
+
const json = JSON.stringify(value, null, 2);
|
|
192
|
+
if (json === undefined)
|
|
193
|
+
return "undefined";
|
|
194
|
+
return json.split("\n").join(`\n${indent}`);
|
|
195
|
+
}
|
|
196
|
+
function toCamelWords(raw) {
|
|
197
|
+
return raw
|
|
198
|
+
.split(/[^A-Za-z0-9_$]+/)
|
|
199
|
+
.filter(Boolean)
|
|
200
|
+
.map((part, index) => {
|
|
201
|
+
const lower = /^[A-Z0-9_]+$/.test(part) ? part.toLowerCase() : part;
|
|
202
|
+
return index === 0
|
|
203
|
+
? lower[0].toLowerCase() + lower.slice(1)
|
|
204
|
+
: lower[0].toUpperCase() + lower.slice(1);
|
|
205
|
+
})
|
|
206
|
+
.join("");
|
|
207
|
+
}
|
|
208
|
+
function makeIdentifier(raw, fallback, used) {
|
|
209
|
+
let base = toCamelWords(raw) || fallback;
|
|
210
|
+
if (!/^[A-Za-z_$]/.test(base))
|
|
211
|
+
base = `n${base}`;
|
|
212
|
+
if (JS_RESERVED.has(base))
|
|
213
|
+
base = `${base}Node`;
|
|
214
|
+
let name = base;
|
|
215
|
+
for (let suffix = 2; used.has(name); suffix++)
|
|
216
|
+
name = `${base}${suffix}`;
|
|
217
|
+
used.add(name);
|
|
218
|
+
return name;
|
|
219
|
+
}
|
|
220
|
+
function className(nodeType) {
|
|
221
|
+
return nodeType.split(".").pop() ?? nodeType;
|
|
222
|
+
}
|
|
223
|
+
function isInputNode(node) {
|
|
224
|
+
return node.type.startsWith("nodetool.input.");
|
|
225
|
+
}
|
|
226
|
+
function isSinkNode(node) {
|
|
227
|
+
return node.type.startsWith("nodetool.output.") || node.type === PREVIEW_NODE_TYPE;
|
|
228
|
+
}
|
|
229
|
+
function nameProperty(node) {
|
|
230
|
+
const name = node.properties.name;
|
|
231
|
+
return typeof name === "string" ? name.trim() : "";
|
|
232
|
+
}
|
|
233
|
+
// ── Generated runtime ───────────────────────────────────────────────────────
|
|
234
|
+
const SHARED_HELPERS = `const SKIPPED = Symbol("skipped");
|
|
235
|
+
|
|
236
|
+
// The value on one output slot, or SKIPPED when the node did not run or left
|
|
237
|
+
// the slot empty, such as the branch an If node did not take.
|
|
238
|
+
function pick(result, slot) {
|
|
239
|
+
return result === SKIPPED || !(slot in result) ? SKIPPED : result[slot];
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// A node runs only when every connected input arrived. In a list input fed by
|
|
243
|
+
// several edges, the edges that delivered nothing are left out.
|
|
244
|
+
function ready(props) {
|
|
245
|
+
const out = {};
|
|
246
|
+
for (const [key, value] of Object.entries(props)) {
|
|
247
|
+
if (value === SKIPPED) return null;
|
|
248
|
+
out[key] = Array.isArray(value) ? value.filter((item) => item !== SKIPPED) : value;
|
|
249
|
+
}
|
|
250
|
+
return out;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Run a node and return its outputs, the last value per slot.
|
|
254
|
+
async function call(type, props) {
|
|
255
|
+
const args = ready(props);
|
|
256
|
+
return args === null ? SKIPPED : await runNode(type, args);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function isEmission(item) {
|
|
260
|
+
return typeof item.slot === "string" && "value" in item && Object.keys(item).length === 2;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Run a node item by item: onItem sees each item, the result is the last value
|
|
264
|
+
// per slot.
|
|
265
|
+
async function callStreaming(type, props, onItem) {
|
|
266
|
+
const args = ready(props);
|
|
267
|
+
if (args === null) return SKIPPED;
|
|
268
|
+
const last = {};
|
|
269
|
+
for await (const item of streamNode(type, args)) {
|
|
270
|
+
const record = isEmission(item) ? { [item.slot]: item.value } : item;
|
|
271
|
+
Object.assign(last, record);
|
|
272
|
+
await onItem(record);
|
|
273
|
+
}
|
|
274
|
+
return last;
|
|
275
|
+
}`;
|
|
276
|
+
const NODE_RUNTIME = `const inputs = JSON.parse(process.argv[2] ?? "{}");
|
|
277
|
+
const results = {};
|
|
278
|
+
|
|
279
|
+
async function output(name, value) {
|
|
280
|
+
results[name] = value;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
async function emit(name, value) {
|
|
284
|
+
(results[name] ??= []).push(value);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function runNode(type, args) {
|
|
288
|
+
return invoke(type, args);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function streamNode(type, args) {
|
|
292
|
+
return invokeStream(type, args);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Print raw media bytes as their length instead of one key per byte.
|
|
296
|
+
function bytesAsLength(key, value) {
|
|
297
|
+
return value instanceof Uint8Array ? \`<\${value.length} bytes>\` : value;
|
|
298
|
+
}`;
|
|
299
|
+
export function workflowToScript(graph, options) {
|
|
300
|
+
const getMetadata = options.getMetadata ?? builtinMetadataFor;
|
|
301
|
+
const { nodes, edges, controlEdges } = normalizeGraph(graph);
|
|
302
|
+
const ordered = topologicalSort(nodes, edges);
|
|
303
|
+
const byId = new Map(nodes.map((node) => [node.id, node]));
|
|
304
|
+
const metadataOf = (node) => getMetadata(node.type);
|
|
305
|
+
const incoming = new Map();
|
|
306
|
+
const outgoing = new Map();
|
|
307
|
+
for (const edge of edges) {
|
|
308
|
+
(incoming.get(edge.target) ?? incoming.set(edge.target, []).get(edge.target)).push(edge);
|
|
309
|
+
(outgoing.get(edge.source) ?? outgoing.set(edge.source, []).get(edge.source)).push(edge);
|
|
310
|
+
}
|
|
311
|
+
const unsupported = [];
|
|
312
|
+
const refuse = (node, message) => {
|
|
313
|
+
if (!unsupported.some((issue) => issue.node_id === node.id && issue.message === message)) {
|
|
314
|
+
unsupported.push({ node_id: node.id, node_type: node.type, message });
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
for (const edge of controlEdges) {
|
|
318
|
+
refuse(byId.get(edge.target), "is driven by a control edge from an agent, which a script cannot express");
|
|
319
|
+
}
|
|
320
|
+
const used = new Set([...JS_RESERVED, ...RESERVED_NAMES]);
|
|
321
|
+
const variables = new Map();
|
|
322
|
+
for (const node of ordered) {
|
|
323
|
+
const label = node.name ?? (nameProperty(node) || className(node.type));
|
|
324
|
+
variables.set(node.id, makeIdentifier(label, "node", used));
|
|
325
|
+
}
|
|
326
|
+
// Ports. Input names become `inputs.<name>`, so they must be identifiers.
|
|
327
|
+
const inputPorts = [];
|
|
328
|
+
const inputPortOf = new Map();
|
|
329
|
+
const usedInputs = new Set();
|
|
330
|
+
const outputPorts = [];
|
|
331
|
+
const outputPortOf = new Map();
|
|
332
|
+
const usedOutputs = new Set();
|
|
333
|
+
const sourceSlotType = (edge) => {
|
|
334
|
+
const metadata = metadataOf(byId.get(edge.source));
|
|
335
|
+
return typeToString(metadata?.outputs.find((o) => o.name === edge.sourceHandle)?.type);
|
|
336
|
+
};
|
|
337
|
+
const isExternalInput = (node) => isInputNode(node) && (incoming.get(node.id)?.length ?? 0) === 0;
|
|
338
|
+
for (const node of ordered) {
|
|
339
|
+
if (isExternalInput(node)) {
|
|
340
|
+
const metadata = metadataOf(node);
|
|
341
|
+
if (node.isStreamingOutput ?? metadata?.is_streaming_output) {
|
|
342
|
+
refuse(node, "is a live input stream, which a script cannot receive");
|
|
343
|
+
}
|
|
344
|
+
const raw = nameProperty(node) || node.name || node.id;
|
|
345
|
+
const port = makeIdentifier(raw, "input", usedInputs);
|
|
346
|
+
inputPortOf.set(node.id, port);
|
|
347
|
+
inputPorts.push({
|
|
348
|
+
name: port,
|
|
349
|
+
type: typeToString(metadata?.outputs.find((o) => o.name === "output")?.type)
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
else if (isSinkNode(node)) {
|
|
353
|
+
const raw = nameProperty(node) ||
|
|
354
|
+
node.name ||
|
|
355
|
+
(node.type === PREVIEW_NODE_TYPE ? "preview" : "output");
|
|
356
|
+
const port = makeIdentifier(raw, "output", usedOutputs);
|
|
357
|
+
outputPortOf.set(node.id, port);
|
|
358
|
+
const valueEdge = (incoming.get(node.id) ?? []).find((e) => e.targetHandle === "value");
|
|
359
|
+
outputPorts.push({ name: port, type: valueEdge ? sourceSlotType(valueEdge) : "any" });
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// Per-item edges. A stream may feed a workflow output (emitted item by
|
|
363
|
+
// item) or a node that consumes streams (handed the collected items).
|
|
364
|
+
// Anything else would run once per item in the graph and is refused.
|
|
365
|
+
const streamConsumers = new Map();
|
|
366
|
+
const collectedInput = new Map();
|
|
367
|
+
const perItemSinkEdges = new Set();
|
|
368
|
+
// A slot delivers one value per item rather than one per run when it
|
|
369
|
+
// iterates or streams chunks, or forwards an input that arrived per item.
|
|
370
|
+
const perItemMemo = new Map();
|
|
371
|
+
const isPerItemSlot = (node, slot) => {
|
|
372
|
+
const key = `${node.id}\u0000${slot}`;
|
|
373
|
+
const known = perItemMemo.get(key);
|
|
374
|
+
if (known !== undefined)
|
|
375
|
+
return known;
|
|
376
|
+
const metadata = metadataOf(node);
|
|
377
|
+
const correlation = correlationOf(node, metadata, slot);
|
|
378
|
+
const kind = correlationKind(correlation);
|
|
379
|
+
let perItem;
|
|
380
|
+
if (kind === "iteration" || kind === "chunk") {
|
|
381
|
+
perItem = true;
|
|
382
|
+
}
|
|
383
|
+
else if (kind === "forward") {
|
|
384
|
+
perItem = (incoming.get(node.id) ?? []).some((edge) => edge.targetHandle === correlation?.source &&
|
|
385
|
+
isPerItemSlot(byId.get(edge.source), edge.sourceHandle));
|
|
386
|
+
}
|
|
387
|
+
else if (kind) {
|
|
388
|
+
perItem = false;
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
perItem =
|
|
392
|
+
metadata?.outputs.find((output) => output.name === slot)?.stream ===
|
|
393
|
+
true ||
|
|
394
|
+
(node.isStreamingOutput ?? metadata?.is_streaming_output === true);
|
|
395
|
+
}
|
|
396
|
+
perItemMemo.set(key, perItem);
|
|
397
|
+
return perItem;
|
|
398
|
+
};
|
|
399
|
+
for (const node of ordered) {
|
|
400
|
+
for (const edge of outgoing.get(node.id) ?? []) {
|
|
401
|
+
if (!isPerItemSlot(node, edge.sourceHandle))
|
|
402
|
+
continue;
|
|
403
|
+
const target = byId.get(edge.target);
|
|
404
|
+
const consumers = streamConsumers.get(node.id) ?? [];
|
|
405
|
+
if (isSinkNode(target) && edge.targetHandle === "value") {
|
|
406
|
+
consumers.push({ slot: edge.sourceHandle, emitPort: outputPortOf.get(target.id) });
|
|
407
|
+
perItemSinkEdges.add(edge);
|
|
408
|
+
}
|
|
409
|
+
else if (consumesStreams(metadataOf(target))) {
|
|
410
|
+
const collectVar = makeIdentifier(`${variables.get(node.id)} ${edge.sourceHandle} items`, "items", used);
|
|
411
|
+
consumers.push({ slot: edge.sourceHandle, collectVar });
|
|
412
|
+
collectedInput.set(edge, collectVar);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
refuse(target, `receives "${edge.sourceHandle}" from ${className(node.type)} one item at a time; ` +
|
|
416
|
+
"in the graph it runs once per item, which one script call cannot reproduce");
|
|
417
|
+
}
|
|
418
|
+
streamConsumers.set(node.id, consumers);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// Several edges into one list input arrive as one list. Into any other
|
|
422
|
+
// input each value is its own run of the node, which one call is not.
|
|
423
|
+
for (const node of ordered) {
|
|
424
|
+
const counts = new Map();
|
|
425
|
+
for (const edge of incoming.get(node.id) ?? []) {
|
|
426
|
+
counts.set(edge.targetHandle, (counts.get(edge.targetHandle) ?? 0) + 1);
|
|
427
|
+
}
|
|
428
|
+
for (const [handle, count] of counts) {
|
|
429
|
+
if (count < 2)
|
|
430
|
+
continue;
|
|
431
|
+
const type = metadataOf(node)?.properties.find((p) => p.name === handle)?.type;
|
|
432
|
+
if (type && type.type !== "list" && type.type !== "any") {
|
|
433
|
+
refuse(node, `receives ${count} values on "${handle}", and in the graph it runs once for each`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
const expressionFor = (edge) => {
|
|
438
|
+
const collected = collectedInput.get(edge);
|
|
439
|
+
if (collected)
|
|
440
|
+
return collected;
|
|
441
|
+
const source = byId.get(edge.source);
|
|
442
|
+
const variable = variables.get(source.id);
|
|
443
|
+
if (isExternalInput(source) && edge.sourceHandle === "output")
|
|
444
|
+
return variable;
|
|
445
|
+
return `pick(${variable}, ${JSON.stringify(edge.sourceHandle)})`;
|
|
446
|
+
};
|
|
447
|
+
const propsLiteral = (node, indent) => {
|
|
448
|
+
const props = [];
|
|
449
|
+
const edgesIn = (incoming.get(node.id) ?? []).filter((e) => !perItemSinkEdges.has(e));
|
|
450
|
+
const byHandle = new Map();
|
|
451
|
+
for (const edge of edgesIn) {
|
|
452
|
+
(byHandle.get(edge.targetHandle) ?? byHandle.set(edge.targetHandle, []).get(edge.targetHandle)).push(edge);
|
|
453
|
+
}
|
|
454
|
+
const inner = `${indent} `;
|
|
455
|
+
for (const [key, value] of Object.entries(node.properties)) {
|
|
456
|
+
if (byHandle.has(key))
|
|
457
|
+
continue;
|
|
458
|
+
props.push([key, formatLiteral(value, inner)]);
|
|
459
|
+
}
|
|
460
|
+
for (const [handle, handleEdges] of byHandle) {
|
|
461
|
+
const expressions = handleEdges.map(expressionFor);
|
|
462
|
+
props.push([
|
|
463
|
+
handle,
|
|
464
|
+
expressions.length === 1 ? expressions[0] : `[${expressions.join(", ")}]`
|
|
465
|
+
]);
|
|
466
|
+
}
|
|
467
|
+
if (props.length === 0)
|
|
468
|
+
return "{}";
|
|
469
|
+
return `{\n${props.map(([k, v]) => `${inner}${formatKey(k)}: ${v}`).join(",\n")}\n${indent}}`;
|
|
470
|
+
};
|
|
471
|
+
const body = [];
|
|
472
|
+
for (const node of ordered) {
|
|
473
|
+
const variable = variables.get(node.id);
|
|
474
|
+
const title = node.name ?? nameProperty(node);
|
|
475
|
+
body.push(`// ${title ? `${title} — ` : ""}${node.type} (${node.id})`);
|
|
476
|
+
if (unsupported.some((issue) => issue.node_id === node.id)) {
|
|
477
|
+
body.push(`const ${variable} = SKIPPED; // not supported, see the check above`);
|
|
478
|
+
body.push("");
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
if (isExternalInput(node)) {
|
|
482
|
+
const port = inputPortOf.get(node.id);
|
|
483
|
+
const fallback = node.properties.value;
|
|
484
|
+
body.push(fallback === undefined || fallback === null
|
|
485
|
+
? `const ${variable} = inputs.${port};`
|
|
486
|
+
: `const ${variable} = inputs.${port} ?? ${formatLiteral(fallback, "")};`);
|
|
487
|
+
body.push("");
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
if (isSinkNode(node)) {
|
|
491
|
+
const port = outputPortOf.get(node.id);
|
|
492
|
+
const valueEdges = (incoming.get(node.id) ?? []).filter((e) => e.targetHandle === "value");
|
|
493
|
+
if (valueEdges.length > 0 && valueEdges.every((e) => perItemSinkEdges.has(e))) {
|
|
494
|
+
body.push(`// "${port}" is emitted item by item where its source runs.`);
|
|
495
|
+
body.push("");
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
body.push(`const ${variable} = await call(${JSON.stringify(node.type)}, ${propsLiteral(node, "")});`);
|
|
499
|
+
body.push(`if (${variable} !== SKIPPED) await output(${JSON.stringify(port)}, ${variable}.output);`);
|
|
500
|
+
body.push("");
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
const consumers = streamConsumers.get(node.id) ?? [];
|
|
504
|
+
if (consumers.length === 0) {
|
|
505
|
+
body.push(`const ${variable} = await call(${JSON.stringify(node.type)}, ${propsLiteral(node, "")});`);
|
|
506
|
+
body.push("");
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
for (const consumer of consumers) {
|
|
510
|
+
if (consumer.collectVar)
|
|
511
|
+
body.push(`const ${consumer.collectVar} = [];`);
|
|
512
|
+
}
|
|
513
|
+
body.push(`const ${variable} = await callStreaming(${JSON.stringify(node.type)}, ${propsLiteral(node, "")}, async (item) => {`);
|
|
514
|
+
const bySlot = new Map();
|
|
515
|
+
for (const consumer of consumers) {
|
|
516
|
+
(bySlot.get(consumer.slot) ?? bySlot.set(consumer.slot, []).get(consumer.slot)).push(consumer);
|
|
517
|
+
}
|
|
518
|
+
for (const [slot, slotConsumers] of bySlot) {
|
|
519
|
+
const key = JSON.stringify(slot);
|
|
520
|
+
body.push(` if (${key} in item) {`);
|
|
521
|
+
for (const consumer of slotConsumers) {
|
|
522
|
+
if (consumer.emitPort) {
|
|
523
|
+
body.push(` await emit(${JSON.stringify(consumer.emitPort)}, item[${key}]);`);
|
|
524
|
+
}
|
|
525
|
+
else if (consumer.collectVar) {
|
|
526
|
+
body.push(` ${consumer.collectVar}.push(item[${key}]);`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
body.push(" }");
|
|
530
|
+
}
|
|
531
|
+
body.push("});");
|
|
532
|
+
body.push("");
|
|
533
|
+
}
|
|
534
|
+
const guard = [];
|
|
535
|
+
if (unsupported.length > 0) {
|
|
536
|
+
const lines = unsupported.map((issue) => `- ${issue.node_type} (${issue.node_id}) ${issue.message}`);
|
|
537
|
+
guard.push("// This workflow has nodes a script cannot run. It stops here, before any", "// node runs, so nothing is billed for a run that cannot finish.", `throwUnsupported(${JSON.stringify(lines, null, 2)});`, "", "function throwUnsupported(problems) {", ' throw new Error("This workflow cannot run as a script:\\n" + problems.join("\\n"));', "}", "");
|
|
538
|
+
}
|
|
539
|
+
const name = options.workflowName && options.workflowName.trim()
|
|
540
|
+
? options.workflowName.trim()
|
|
541
|
+
: "Untitled workflow";
|
|
542
|
+
const code = options.target === "sandbox"
|
|
543
|
+
? sandboxScript(name, inputPorts, outputPorts, guard, body)
|
|
544
|
+
: nodeScript(name, inputPorts, outputPorts, guard, body);
|
|
545
|
+
return { code, inputs: inputPorts, outputs: outputPorts, unsupported };
|
|
546
|
+
}
|
|
547
|
+
function portList(ports) {
|
|
548
|
+
return ports.length > 0
|
|
549
|
+
? ports.map((port) => `${port.name} (${port.type})`).join(", ")
|
|
550
|
+
: "none";
|
|
551
|
+
}
|
|
552
|
+
function commentLine(text) {
|
|
553
|
+
return `// ${text.replace(/\s+/g, " ")}`;
|
|
554
|
+
}
|
|
555
|
+
function sandboxScript(name, inputs, outputs, guard, body) {
|
|
556
|
+
return [
|
|
557
|
+
commentLine(`"${name}", exported from NodeTool as a sandbox script.`),
|
|
558
|
+
"// Run it as a JS script document or paste it into a Code node. Each node",
|
|
559
|
+
"// runs on the host and is billed to the run that calls it.",
|
|
560
|
+
commentLine(`Inputs: ${portList(inputs)}`),
|
|
561
|
+
commentLine(`Outputs: ${portList(outputs)}`),
|
|
562
|
+
'import "@nodetool-ai/sandbox-nodetool/flow";',
|
|
563
|
+
'import { callNode as runNode, streamNode } from "@nodetool-ai/sandbox-flow";',
|
|
564
|
+
"",
|
|
565
|
+
...guard,
|
|
566
|
+
SHARED_HELPERS,
|
|
567
|
+
"",
|
|
568
|
+
...body
|
|
569
|
+
].join("\n").trimEnd() + "\n";
|
|
570
|
+
}
|
|
571
|
+
function nodeScript(name, inputs, outputs, guard, body) {
|
|
572
|
+
const example = Object.fromEntries(inputs.map((port) => [port.name, "…"]));
|
|
573
|
+
const indented = body
|
|
574
|
+
.flatMap((entry) => entry.split("\n"))
|
|
575
|
+
.map((line) => (line ? ` ${line}` : line));
|
|
576
|
+
while (indented.length > 0 && indented[indented.length - 1] === "")
|
|
577
|
+
indented.pop();
|
|
578
|
+
return [
|
|
579
|
+
"#!/usr/bin/env node",
|
|
580
|
+
commentLine(`"${name}", exported from NodeTool as a Node.js script.`),
|
|
581
|
+
"//",
|
|
582
|
+
"// Needs Node.js 22 or newer and the NodeTool node runtime:",
|
|
583
|
+
"// npm install @nodetool-ai/dsl",
|
|
584
|
+
"// Run it with the workflow inputs as a JSON object:",
|
|
585
|
+
`// node script.mjs '${JSON.stringify(example)}'`,
|
|
586
|
+
"// Provider keys are read from environment variables such as OPENAI_API_KEY.",
|
|
587
|
+
"// The outputs are printed as JSON when the run finishes.",
|
|
588
|
+
commentLine(`Inputs: ${portList(inputs)}`),
|
|
589
|
+
commentLine(`Outputs: ${portList(outputs)}`),
|
|
590
|
+
'import { startFlow, invoke, invokeStream } from "@nodetool-ai/dsl/flow";',
|
|
591
|
+
"",
|
|
592
|
+
...guard,
|
|
593
|
+
NODE_RUNTIME,
|
|
594
|
+
"",
|
|
595
|
+
SHARED_HELPERS,
|
|
596
|
+
"",
|
|
597
|
+
"async function main() {",
|
|
598
|
+
...indented,
|
|
599
|
+
"}",
|
|
600
|
+
"",
|
|
601
|
+
"const flow = await startFlow();",
|
|
602
|
+
"try {",
|
|
603
|
+
" await flow.run(main);",
|
|
604
|
+
"} finally {",
|
|
605
|
+
" await flow.close();",
|
|
606
|
+
"}",
|
|
607
|
+
"console.log(JSON.stringify(results, bytesAsLength, 2));",
|
|
608
|
+
""
|
|
609
|
+
].join("\n");
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=script-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-export.js","sourceRoot":"","sources":["../src/script-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,eAAe,EAGhB,MAAM,uBAAuB,CAAC;AA0C/B,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AACjE,MAAM,eAAe,GAAG,oCAAoC,CAAC;AAC7D,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AAEjE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;IACzE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACzE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI;IAChE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK;IACrE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW;IACxE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;CACxC,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,cAAc,GAAG;IACrB,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS;IAC9D,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IACzE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW;IACtE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;IACzE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW;IACzE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB;IAC1E,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IACjF,QAAQ,EAAE,QAAQ,EAAE,SAAS;CAC9B,CAAC;AAcF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAQD,SAAS,cAAc,CAAC,KAAmB;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgF,CAAC;IACvG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,mBAAmB,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;QACtE,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,eAAe;YAAE,OAAO;QACnE,MAAM,UAAU,GAAG;YACjB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACzD,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;SAC5C,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,EAAE;YACF,IAAI;YACJ,UAAU;YACV,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,SAAS;SACtC,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;YACb,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACzD,iBAAiB,EACf,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC;gBACxC,SAAS;YACX,iBAAiB,EACf,OAAO,GAAG,CAAC,mBAAmB,KAAK,SAAS;gBAC1C,CAAC,CAAC,GAAG,CAAC,mBAAmB;gBACzB,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,6BAA6B,CAAC,CAAC;QAChF,CAAC;QACD,sEAAsE;QACtE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QACzD,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACnD,MAAM;YACN,YAAY;YACZ,MAAM;YACN,YAAY;YACZ,SAAS,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;SACpD,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,MAAM,SAAS,GAAG,oBAAoB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAA4B;QAC9D,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;KACvB,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,KAAK;QACL,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;QACrE,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAmB,EAAE,KAAa;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,CAAa,EAAU,EAAE,CACvD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChF,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAE,GAAG,CAAC,CAAC;YACvC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAE/E,IAAI,eAAe,GAAqC,IAAI,CAAC;AAE7D,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YAC5C,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,IAA8B;IAClD,IAAI,CAAC,IAAI,EAAE,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,aAAa,CACpB,IAAgB,EAChB,QAAkC,EAClC,IAAY;IAEZ,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC;QACxC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAkC;IACzD,OAAO,QAAQ,EAAE,kBAAkB,KAAK,IAAI,IAAI,QAAQ,EAAE,UAAU,KAAK,QAAQ,CAAC;AACpF,CAAC;AAED,+EAA+E;AAE/E,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,MAAc;IACnD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,KAAK,CAAC,iBAAiB,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,OAAO,KAAK,KAAK,CAAC;YAChB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,IAAiB;IACtE,IAAI,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;IACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACjD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC;IAChD,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE;QAAE,IAAI,GAAG,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;IACzE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,IAAgB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC;AACrF,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAClC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,+EAA+E;AAE/E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCrB,CAAC;AAEH,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;EAsBnB,CAAC;AAYH,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,OAAgC;IAEhC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC9D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,CAAC,IAAgB,EAA4B,EAAE,CAChE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,WAAW,GAAkB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,CAAC,IAAgB,EAAE,OAAe,EAAQ,EAAE;QACzD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;YACzF,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,CACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,EACtB,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,WAAW,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,0EAA0E;IAC1E,MAAM,UAAU,GAAiB,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,cAAc,GAAG,CAAC,IAAU,EAAU,EAAE;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC;QACpD,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;IACzF,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,IAAgB,EAAW,EAAE,CACpD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAElE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,iBAAiB,IAAI,QAAQ,EAAE,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,EAAE,uDAAuD,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YACtD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC;aAC7E,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GACP,YAAY,CAAC,IAAI,CAAC;gBAClB,IAAI,CAAC,IAAI;gBACT,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YACxD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC;YACxF,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC5D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgB,CAAC;IAC/C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAQ,CAAC;IACzC,qEAAqE;IACrE,0EAA0E;IAC1E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC/C,MAAM,aAAa,GAAG,CAAC,IAAgB,EAAE,IAAY,EAAW,EAAE;QAChE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,OAAgB,CAAC;QACrB,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7C,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAC1C,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,YAAY,KAAK,WAAW,EAAE,MAAM;gBACzC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAC3D,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,MAAM;oBAC9D,IAAI;oBACN,CAAC,IAAI,CAAC,iBAAiB,IAAI,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC;gBAAE,SAAS;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC;YACtC,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACxD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnF,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAG,cAAc,CAC/B,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,QAAQ,EACtD,OAAO,EACP,IAAI,CACL,CAAC;gBACF,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;gBACxD,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,CACJ,MAAM,EACN,aAAa,IAAI,CAAC,YAAY,UAAU,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB;oBACjF,4EAA4E,CAC/E,CAAC;YACJ,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,sEAAsE;IACtE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACrC,IAAI,KAAK,GAAG,CAAC;gBAAE,SAAS;YACxB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC;YAC/E,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACxD,MAAM,CACJ,IAAI,EACJ,YAAY,KAAK,eAAe,MAAM,2CAA2C,CAClF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,IAAU,EAAU,EAAE;QAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC;QAC3C,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC/E,OAAO,QAAQ,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;IACnE,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAE,MAAc,EAAU,EAAE;QAChE,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9G,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,CAAC;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAChC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM;gBACN,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aAC3E,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,MAAM,GAAG,CAAC;IAChG,CAAC,CAAC;IAEF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAEvE,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,QAAQ,mDAAmD,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YACvC,IAAI,CAAC,IAAI,CACP,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;gBACzC,CAAC,CAAC,SAAS,QAAQ,aAAa,IAAI,GAAG;gBACvC,CAAC,CAAC,SAAS,QAAQ,aAAa,IAAI,OAAO,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAC5E,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC;YAC3F,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,kDAAkD,CAAC,CAAC;gBACzE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,QAAQ,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACtG,IAAI,CAAC,IAAI,CAAC,OAAO,QAAQ,8BAA8B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,QAAQ,WAAW,CAAC,CAAC;YACrG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,QAAQ,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACtG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,UAAU;gBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,UAAU,QAAQ,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,QAAQ,0BAA0B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC;QAChI,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;QACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClG,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,MAAM,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,CAAC;YACrC,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;gBACrC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;gBACnF,CAAC;qBAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,UAAU,cAAc,GAAG,KAAK,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CACtE,CAAC;QACF,KAAK,CAAC,IAAI,CACR,2EAA2E,EAC3E,kEAAkE,EAClE,oBAAoB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACtD,EAAE,EACF,uCAAuC,EACvC,uFAAuF,EACvF,GAAG,EACH,EAAE,CACH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GACR,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;QACjD,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;QAC7B,CAAC,CAAC,mBAAmB,CAAC;IAC1B,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,KAAK,SAAS;QAC1B,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC;QAC3D,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAmB;IACnC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/D,CAAC,CAAC,MAAM,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CACpB,IAAY,EACZ,MAAoB,EACpB,OAAqB,EACrB,KAAe,EACf,IAAc;IAEd,OAAO;QACL,WAAW,CAAC,IAAI,IAAI,gDAAgD,CAAC;QACrE,2EAA2E;QAC3E,6DAA6D;QAC7D,WAAW,CAAC,WAAW,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,WAAW,CAAC,YAAY,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,8CAA8C;QAC9C,8EAA8E;QAC9E,EAAE;QACF,GAAG,KAAK;QACR,cAAc;QACd,EAAE;QACF,GAAG,IAAI;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CACjB,IAAY,EACZ,MAAoB,EACpB,OAAqB,EACrB,KAAe,EACf,IAAc;IAEd,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,IAAI;SAClB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;IACnF,OAAO;QACL,qBAAqB;QACrB,WAAW,CAAC,IAAI,IAAI,gDAAgD,CAAC;QACrE,IAAI;QACJ,6DAA6D;QAC7D,mCAAmC;QACnC,sDAAsD;QACtD,yBAAyB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG;QACnD,8EAA8E;QAC9E,2DAA2D;QAC3D,WAAW,CAAC,WAAW,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,WAAW,CAAC,YAAY,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,0EAA0E;QAC1E,EAAE;QACF,GAAG,KAAK;QACR,YAAY;QACZ,EAAE;QACF,cAAc;QACd,EAAE;QACF,yBAAyB;QACzB,GAAG,QAAQ;QACX,GAAG;QACH,EAAE;QACF,iCAAiC;QACjC,OAAO;QACP,yBAAyB;QACzB,aAAa;QACb,uBAAuB;QACvB,GAAG;QACH,yDAAyD;QACzD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|