codex-taskflow 0.1.4 → 0.1.6
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/LICENSE +21 -0
- package/README.md +120 -27
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/bin.d.ts +2 -1
- package/dist/mcp/bin.d.ts.map +1 -1
- package/dist/mcp/bin.js +3 -2
- package/dist/mcp/bin.js.map +1 -1
- package/dist/mcp/server.d.ts +8 -24
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +12 -392
- package/dist/mcp/server.js.map +1 -1
- package/package.json +22 -9
- package/dist/codex-runner.d.ts +0 -59
- package/dist/codex-runner.d.ts.map +0 -1
- package/dist/codex-runner.js +0 -332
- package/dist/codex-runner.js.map +0 -1
- package/dist/mcp/jsonrpc.d.ts +0 -54
- package/dist/mcp/jsonrpc.d.ts.map +0 -1
- package/dist/mcp/jsonrpc.js +0 -118
- package/dist/mcp/jsonrpc.js.map +0 -1
- package/dist/mcp/svg.d.ts +0 -50
- package/dist/mcp/svg.d.ts.map +0 -1
- package/dist/mcp/svg.js +0 -310
- package/dist/mcp/svg.js.map +0 -1
package/dist/mcp/svg.js
DELETED
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Render a taskflow DAG for the Codex hosts, in two forms:
|
|
3
|
-
*
|
|
4
|
-
* - `renderFlowSvg` — a self-contained SVG "card" for the Codex **desktop
|
|
5
|
-
* app**, which renders an MCP `image` content block
|
|
6
|
-
* as `<img src="data:…">` in Chromium (an inline SVG
|
|
7
|
-
* data URI shows as an actual diagram).
|
|
8
|
-
* - `renderFlowOutline` — a compact monospace ASCII outline for the Codex
|
|
9
|
-
* **CLI/TUI**, which cannot render images: the Rust
|
|
10
|
-
* binary substitutes a bare `<image content>`
|
|
11
|
-
* placeholder for image blocks, so a picture is
|
|
12
|
-
* useless there (and a vision-less model would see
|
|
13
|
-
* only that placeholder). The outline is plain text
|
|
14
|
-
* that reads in the terminal AND feeds the model.
|
|
15
|
-
*
|
|
16
|
-
* We can't tell the two hosts apart from inside the server (every Codex
|
|
17
|
-
* frontend connects with the same MCP client id, `codex-mcp-client`), so
|
|
18
|
-
* `taskflow_compile` returns BOTH blocks: the desktop app shows the image and
|
|
19
|
-
* ignores the trailing text, while the CLI/TUI shows the text and renders the
|
|
20
|
-
* image as a harmless placeholder. One payload, correct on every host.
|
|
21
|
-
*
|
|
22
|
-
* This is host presentation, so it lives in the codex adapter — core keeps its
|
|
23
|
-
* portable Mermaid/markdown artifact (`compileTaskflow`) and its zero-runtime
|
|
24
|
-
* -deps guarantee. Both renderers reuse core's exported `topoLayers` (layout)
|
|
25
|
-
* and `dependenciesOf` (edges) so they share the engine's exact DAG semantics.
|
|
26
|
-
* Pure functions, no I/O.
|
|
27
|
-
*/
|
|
28
|
-
import { dependenciesOf, topoLayers, LOOP_DEFAULT_MAX_ITERATIONS, TOURNAMENT_DEFAULT_VARIANTS, } from "taskflow-core";
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
// Layout constants (px). Tuned so a small flow (3–8 phases) is legible even
|
|
31
|
-
// after Codex scales the card down to its ~192px image height cap.
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
const FONT = 12;
|
|
34
|
-
const SUB_FONT = 10.5;
|
|
35
|
-
const CHAR_W = 6.6; // ~0.55em at 12px in the monospace stack below
|
|
36
|
-
const LINE_H = 15;
|
|
37
|
-
const PAD_X = 12;
|
|
38
|
-
const PAD_Y = 9;
|
|
39
|
-
const H_GAP = 26; // horizontal gap between sibling nodes in a layer
|
|
40
|
-
const V_GAP = 38; // vertical gap between layers
|
|
41
|
-
const MARGIN = 18;
|
|
42
|
-
const MIN_NODE_W = 96;
|
|
43
|
-
const MAX_LABEL = 26; // truncate long ids/agents so nodes stay compact
|
|
44
|
-
/** Above this phase count the card stops being legible once scaled — the caller
|
|
45
|
-
* should fall back to the text report instead of embedding a postage stamp. */
|
|
46
|
-
export const SVG_PHASE_LIMIT = 60;
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
// Palette — baked in (an <img> data URI is fully isolated from host CSS, so we
|
|
49
|
-
// can't read Codex theme tokens). A dark card reads well against Codex's dark
|
|
50
|
-
// chat surface; colors mirror the Mermaid overlay in core's compile.ts.
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
const C = {
|
|
53
|
-
panel: "#16181d",
|
|
54
|
-
panelStroke: "#2a2d34",
|
|
55
|
-
node: "#21242c",
|
|
56
|
-
nodeStroke: "#3a3f4b",
|
|
57
|
-
text: "#e6e8ec",
|
|
58
|
-
sub: "#9aa0ab",
|
|
59
|
-
edge: "#4b5563",
|
|
60
|
-
errFill: "#3b0d0d",
|
|
61
|
-
errStroke: "#ef4444",
|
|
62
|
-
errText: "#fecaca",
|
|
63
|
-
warnFill: "#3a2e05",
|
|
64
|
-
warnStroke: "#f59e0b",
|
|
65
|
-
warnText: "#fde68a",
|
|
66
|
-
finalStroke: "#43d9ad",
|
|
67
|
-
};
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// Helpers
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
function xml(text) {
|
|
72
|
-
return text
|
|
73
|
-
.replace(/&/g, "&")
|
|
74
|
-
.replace(/</g, "<")
|
|
75
|
-
.replace(/>/g, ">")
|
|
76
|
-
.replace(/"/g, """)
|
|
77
|
-
.replace(/'/g, "'");
|
|
78
|
-
}
|
|
79
|
-
function truncate(text, max = MAX_LABEL) {
|
|
80
|
-
// Defensive: callers may pass a non-string field (e.g. a malformed `over` /
|
|
81
|
-
// `use` that is an array or object). Coerce so the renderer can never throw
|
|
82
|
-
// — the MCP tools validate first, but this keeps the pure renderer total.
|
|
83
|
-
const s = typeof text === "string" ? text : text == null ? "" : String(text);
|
|
84
|
-
const t = s.replace(/\s+/g, " ").trim();
|
|
85
|
-
return t.length > max ? `${t.slice(0, max - 1)}…` : t;
|
|
86
|
-
}
|
|
87
|
-
/** Compact one-glyph-plus-count type tag (a small-render echo of compile.ts). */
|
|
88
|
-
function typeTag(p) {
|
|
89
|
-
switch (p.type) {
|
|
90
|
-
case "parallel":
|
|
91
|
-
return `▦ parallel ×${p.branches?.length ?? 0}`;
|
|
92
|
-
case "map":
|
|
93
|
-
return `⇉ map · ${truncate(p.over ?? "?", 14)}`;
|
|
94
|
-
case "gate":
|
|
95
|
-
return p.eval?.length ? `◇ gate +${p.eval.length}` : "◇ gate";
|
|
96
|
-
case "reduce":
|
|
97
|
-
return `▽ reduce ←${p.from?.length ?? 0}`;
|
|
98
|
-
case "approval":
|
|
99
|
-
return "⏸ approval";
|
|
100
|
-
case "flow":
|
|
101
|
-
return p.use ? `⊞ ${truncate(p.use, 16)}` : "⊞ flow";
|
|
102
|
-
case "loop":
|
|
103
|
-
return `↻ loop ≤${p.maxIterations ?? LOOP_DEFAULT_MAX_ITERATIONS}`;
|
|
104
|
-
case "tournament":
|
|
105
|
-
return `🏆 ×${p.variants ?? (p.branches?.length || TOURNAMENT_DEFAULT_VARIANTS)}`;
|
|
106
|
-
default:
|
|
107
|
-
return "▸ agent";
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
function nodeLines(p) {
|
|
111
|
-
return {
|
|
112
|
-
title: `${truncate(p.id)}${p.final ? " ★" : ""}`,
|
|
113
|
-
tag: typeTag(p),
|
|
114
|
-
agent: p.agent ? `@${truncate(p.agent, 20)}` : undefined,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
function nodeWidth(l) {
|
|
118
|
-
const longest = Math.max(l.title.length, l.tag.length, l.agent?.length ?? 0);
|
|
119
|
-
return Math.max(MIN_NODE_W, Math.round(longest * CHAR_W) + PAD_X * 2);
|
|
120
|
-
}
|
|
121
|
-
function nodeHeight(l) {
|
|
122
|
-
const rows = 2 + (l.agent ? 1 : 0);
|
|
123
|
-
return rows * LINE_H + PAD_Y * 2;
|
|
124
|
-
}
|
|
125
|
-
/** Worst severity per phase, so a node paints red (error) over amber (warning). */
|
|
126
|
-
function severityByPhase(issues) {
|
|
127
|
-
const m = new Map();
|
|
128
|
-
for (const i of issues) {
|
|
129
|
-
if (!i.phaseId)
|
|
130
|
-
continue;
|
|
131
|
-
if (i.severity === "error" || !m.has(i.phaseId))
|
|
132
|
-
m.set(i.phaseId, i.severity);
|
|
133
|
-
}
|
|
134
|
-
return m;
|
|
135
|
-
}
|
|
136
|
-
// ---------------------------------------------------------------------------
|
|
137
|
-
// Renderer
|
|
138
|
-
// ---------------------------------------------------------------------------
|
|
139
|
-
/**
|
|
140
|
-
* Render `flow` (annotated with `verification`) as an SVG string. Layered
|
|
141
|
-
* top-down using core's `topoLayers`; edges follow `dependenciesOf`. Returns a
|
|
142
|
-
* complete `<svg …>…</svg>` document (no XML prolog — it's inlined as a data
|
|
143
|
-
* URI). Returns `null` when the flow is too large to render legibly.
|
|
144
|
-
*/
|
|
145
|
-
export function renderFlowSvg(flow, verification) {
|
|
146
|
-
// Total renderer: tolerate a malformed non-array `phases` (raw JSON can bypass
|
|
147
|
-
// schema validation) by coercing to an empty list rather than throwing.
|
|
148
|
-
const phases = (Array.isArray(flow.phases) ? flow.phases : []).filter((p) => !!p && typeof p === "object");
|
|
149
|
-
if (phases.length === 0 || phases.length > SVG_PHASE_LIMIT)
|
|
150
|
-
return null;
|
|
151
|
-
const layers = topoLayers(phases);
|
|
152
|
-
// Any phase not placed by topoLayers (e.g. trapped in a cycle) gets its own
|
|
153
|
-
// trailing layer so the picture never silently drops a node.
|
|
154
|
-
const placed = new Set(layers.flat().map((p) => p.id));
|
|
155
|
-
const orphans = phases.filter((p) => !placed.has(p.id));
|
|
156
|
-
if (orphans.length)
|
|
157
|
-
layers.push(orphans);
|
|
158
|
-
const sev = severityByPhase(verification.issues);
|
|
159
|
-
const rects = new Map();
|
|
160
|
-
// First pass: size every node and measure each layer's total width.
|
|
161
|
-
const linesById = new Map();
|
|
162
|
-
const sizeById = new Map();
|
|
163
|
-
const layerWidths = [];
|
|
164
|
-
const layerHeights = [];
|
|
165
|
-
for (const layer of layers) {
|
|
166
|
-
let w = 0;
|
|
167
|
-
let h = 0;
|
|
168
|
-
layer.forEach((p, i) => {
|
|
169
|
-
const l = nodeLines(p);
|
|
170
|
-
linesById.set(p.id, l);
|
|
171
|
-
const nw = nodeWidth(l);
|
|
172
|
-
const nh = nodeHeight(l);
|
|
173
|
-
sizeById.set(p.id, { w: nw, h: nh });
|
|
174
|
-
w += nw + (i > 0 ? H_GAP : 0);
|
|
175
|
-
h = Math.max(h, nh);
|
|
176
|
-
});
|
|
177
|
-
layerWidths.push(w);
|
|
178
|
-
layerHeights.push(h);
|
|
179
|
-
}
|
|
180
|
-
const contentW = Math.max(...layerWidths, MIN_NODE_W);
|
|
181
|
-
const canvasW = contentW + MARGIN * 2;
|
|
182
|
-
// Second pass: assign positions (each layer centered within contentW).
|
|
183
|
-
let y = MARGIN;
|
|
184
|
-
layers.forEach((layer, li) => {
|
|
185
|
-
let x = MARGIN + (contentW - layerWidths[li]) / 2;
|
|
186
|
-
for (const p of layer) {
|
|
187
|
-
const s = sizeById.get(p.id);
|
|
188
|
-
rects.set(p.id, { x, y, w: s.w, h: s.h, cx: x + s.w / 2 });
|
|
189
|
-
x += s.w + H_GAP;
|
|
190
|
-
}
|
|
191
|
-
y += layerHeights[li] + V_GAP;
|
|
192
|
-
});
|
|
193
|
-
const canvasH = y - V_GAP + MARGIN;
|
|
194
|
-
// Edges — draw first so nodes paint on top.
|
|
195
|
-
const edgeSvg = [];
|
|
196
|
-
const known = new Set(phases.map((p) => p.id));
|
|
197
|
-
for (const p of phases) {
|
|
198
|
-
const to = rects.get(p.id);
|
|
199
|
-
if (!to)
|
|
200
|
-
continue;
|
|
201
|
-
for (const d of dependenciesOf(p)) {
|
|
202
|
-
if (!known.has(d))
|
|
203
|
-
continue;
|
|
204
|
-
const from = rects.get(d);
|
|
205
|
-
if (!from)
|
|
206
|
-
continue;
|
|
207
|
-
const x1 = from.cx;
|
|
208
|
-
const y1 = from.y + from.h;
|
|
209
|
-
const x2 = to.cx;
|
|
210
|
-
const y2 = to.y;
|
|
211
|
-
const my = (y1 + y2) / 2;
|
|
212
|
-
const dotted = p.join === "any" ? ' stroke-dasharray="4 3"' : "";
|
|
213
|
-
edgeSvg.push(`<path d="M${x1.toFixed(1)} ${y1.toFixed(1)} C ${x1.toFixed(1)} ${my.toFixed(1)}, ${x2.toFixed(1)} ${my.toFixed(1)}, ${x2.toFixed(1)} ${(y2 - 6).toFixed(1)}" fill="none" stroke="${C.edge}" stroke-width="1.4"${dotted} marker-end="url(#tf-arrow)"/>`);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// Nodes.
|
|
217
|
-
const nodeSvg = [];
|
|
218
|
-
for (const p of phases) {
|
|
219
|
-
const r = rects.get(p.id);
|
|
220
|
-
if (!r)
|
|
221
|
-
continue;
|
|
222
|
-
const l = linesById.get(p.id);
|
|
223
|
-
const s = sev.get(p.id);
|
|
224
|
-
let fill = C.node;
|
|
225
|
-
let stroke = C.nodeStroke;
|
|
226
|
-
let strokeW = 1.2;
|
|
227
|
-
let titleColor = C.text;
|
|
228
|
-
if (s === "error") {
|
|
229
|
-
fill = C.errFill;
|
|
230
|
-
stroke = C.errStroke;
|
|
231
|
-
strokeW = 2;
|
|
232
|
-
titleColor = C.errText;
|
|
233
|
-
}
|
|
234
|
-
else if (s === "warning") {
|
|
235
|
-
fill = C.warnFill;
|
|
236
|
-
stroke = C.warnStroke;
|
|
237
|
-
strokeW = 2;
|
|
238
|
-
titleColor = C.warnText;
|
|
239
|
-
}
|
|
240
|
-
else if (p.final) {
|
|
241
|
-
stroke = C.finalStroke;
|
|
242
|
-
strokeW = 2;
|
|
243
|
-
}
|
|
244
|
-
const tx = r.x + PAD_X;
|
|
245
|
-
let ty = r.y + PAD_Y + FONT;
|
|
246
|
-
const parts = [`<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="8" fill="${fill}" stroke="${stroke}" stroke-width="${strokeW}"/>`];
|
|
247
|
-
parts.push(`<text x="${tx}" y="${ty.toFixed(1)}" font-size="${FONT}" font-weight="600" fill="${titleColor}">${xml(l.title)}</text>`);
|
|
248
|
-
ty += LINE_H;
|
|
249
|
-
parts.push(`<text x="${tx}" y="${ty.toFixed(1)}" font-size="${SUB_FONT}" fill="${C.sub}">${xml(l.tag)}</text>`);
|
|
250
|
-
if (l.agent) {
|
|
251
|
-
ty += LINE_H;
|
|
252
|
-
parts.push(`<text x="${tx}" y="${ty.toFixed(1)}" font-size="${SUB_FONT}" fill="${C.sub}">${xml(l.agent)}</text>`);
|
|
253
|
-
}
|
|
254
|
-
nodeSvg.push(parts.join(""));
|
|
255
|
-
}
|
|
256
|
-
return [
|
|
257
|
-
`<svg xmlns="http://www.w3.org/2000/svg" width="${canvasW}" height="${canvasH}" viewBox="0 0 ${canvasW} ${canvasH}" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">`,
|
|
258
|
-
`<defs><marker id="tf-arrow" viewBox="0 0 8 8" refX="6" refY="4" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0 0 L8 4 L0 8 z" fill="${C.edge}"/></marker></defs>`,
|
|
259
|
-
`<rect x="0.5" y="0.5" width="${canvasW - 1}" height="${canvasH - 1}" rx="12" fill="${C.panel}" stroke="${C.panelStroke}"/>`,
|
|
260
|
-
...edgeSvg,
|
|
261
|
-
...nodeSvg,
|
|
262
|
-
`</svg>`,
|
|
263
|
-
].join("");
|
|
264
|
-
}
|
|
265
|
-
/** Base64 of an SVG string, for an MCP `image` content block (`image/svg+xml`). */
|
|
266
|
-
export function svgToBase64(svg) {
|
|
267
|
-
return Buffer.from(svg, "utf8").toString("base64");
|
|
268
|
-
}
|
|
269
|
-
// ---------------------------------------------------------------------------
|
|
270
|
-
// Text outline (Codex CLI/TUI + vision-less models)
|
|
271
|
-
// ---------------------------------------------------------------------------
|
|
272
|
-
/** Worst severity marker for a phase, as a leading glyph in the outline. */
|
|
273
|
-
function sevMark(sev, id) {
|
|
274
|
-
const s = sev.get(id);
|
|
275
|
-
return s === "error" ? "✗ " : s === "warning" ? "! " : "";
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Render the DAG as a compact monospace outline: one line per phase, grouped by
|
|
279
|
-
* topological layer (phases in the same layer run concurrently), each showing
|
|
280
|
-
* its id, type tag, agent, and upstream deps. This is the CLI/TUI counterpart
|
|
281
|
-
* to `renderFlowSvg` — it degrades to readable text where images can't render,
|
|
282
|
-
* and (unlike an image placeholder) still tells a vision-less model the shape
|
|
283
|
-
* of the graph. Deterministic; issue markers mirror the SVG overlay.
|
|
284
|
-
*/
|
|
285
|
-
export function renderFlowOutline(flow, verification) {
|
|
286
|
-
const phases = (Array.isArray(flow.phases) ? flow.phases : []).filter((p) => !!p && typeof p === "object");
|
|
287
|
-
if (phases.length === 0)
|
|
288
|
-
return "(empty flow — no phases)";
|
|
289
|
-
const sev = severityByPhase(verification.issues);
|
|
290
|
-
const layers = topoLayers(phases);
|
|
291
|
-
const placed = new Set(layers.flat().map((p) => p.id));
|
|
292
|
-
const orphans = phases.filter((p) => !placed.has(p.id));
|
|
293
|
-
if (orphans.length)
|
|
294
|
-
layers.push(orphans); // cycle-trapped nodes still listed
|
|
295
|
-
const lines = [];
|
|
296
|
-
layers.forEach((layer, i) => {
|
|
297
|
-
const tag = layer.length > 1 ? ` (${layer.length} in parallel)` : "";
|
|
298
|
-
lines.push(`Layer ${i + 1}${tag}:`);
|
|
299
|
-
for (const p of layer) {
|
|
300
|
-
const deps = dependenciesOf(p).filter((d) => d !== p.id);
|
|
301
|
-
const arrow = p.join === "any" ? " ↯ any of " : " ← ";
|
|
302
|
-
const depStr = deps.length ? `${arrow}${deps.join(", ")}` : "";
|
|
303
|
-
const agent = p.agent ? ` @${p.agent}` : "";
|
|
304
|
-
const star = p.final ? " ★" : "";
|
|
305
|
-
lines.push(` ${sevMark(sev, p.id)}${p.id}${star} [${typeTag(p)}]${agent}${depStr}`);
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
return lines.join("\n");
|
|
309
|
-
}
|
|
310
|
-
//# sourceMappingURL=svg.js.map
|
package/dist/mcp/svg.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/mcp/svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EACN,cAAc,EACd,UAAU,EACV,2BAA2B,EAC3B,2BAA2B,GAK3B,MAAM,eAAe,CAAC;AAEvB,8EAA8E;AAC9E,4EAA4E;AAC5E,mEAAmE;AACnE,8EAA8E;AAE9E,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,+CAA+C;AACnE,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,KAAK,GAAG,EAAE,CAAC;AACjB,MAAM,KAAK,GAAG,CAAC,CAAC;AAChB,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,kDAAkD;AACpE,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,8BAA8B;AAChD,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,iDAAiD;AAEvE;gFACgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAE9E,MAAM,CAAC,GAAG;IACT,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;IACtB,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,SAAS;IACrB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,SAAS;IACrB,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,SAAS;CACb,CAAC;AAEX,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,GAAG,CAAC,IAAY;IACxB,OAAO,IAAI;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa,EAAE,GAAG,GAAG,SAAS;IAC/C,4EAA4E;IAC5E,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,iFAAiF;AACjF,SAAS,OAAO,CAAC,CAAQ;IACxB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,UAAU;YACd,OAAO,eAAe,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACjD,KAAK,KAAK;YACT,OAAO,WAAW,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM;YACV,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,KAAK,QAAQ;YACZ,OAAO,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QAC3C,KAAK,UAAU;YACd,OAAO,YAAY,CAAC;QACrB,KAAK,MAAM;YACV,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtD,KAAK,MAAM;YACV,OAAO,WAAW,CAAC,CAAC,aAAa,IAAI,2BAA2B,EAAE,CAAC;QACpE,KAAK,YAAY;YAChB,OAAO,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,2BAA2B,CAAC,EAAE,CAAC;QACnF;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAgBD,SAAS,SAAS,CAAC,CAAQ;IAC1B,OAAO;QACN,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAChD,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAY;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,CAAY;IAC/B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,mFAAmF;AACnF,SAAS,eAAe,CAAC,MAA2B;IACnD,MAAM,CAAC,GAAG,IAAI,GAAG,EAA+B,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAS;QACzB,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,YAAgC;IAC7E,+EAA+E;IAC/E,wEAAwE;IACxE,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CACpE,CAAC,CAAC,EAAqC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CACtE,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,eAAe;QAAE,OAAO,IAAI,CAAC;IAExE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,4EAA4E;IAC5E,6DAA6D;IAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAEtC,oEAAoE;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC7D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACrC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;IAEtC,uEAAuE;IACvE,IAAI,CAAC,GAAG,MAAM,CAAC;IACf,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC;IAEnC,4CAA4C;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,IAAI,CACX,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,IAAI,uBAAuB,MAAM,gCAAgC,CACvP,CAAC;QACH,CAAC;IACF,CAAC;IAED,SAAS;IACT,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,GAAW,CAAC,CAAC,IAAI,CAAC;QAC1B,IAAI,MAAM,GAAW,CAAC,CAAC,UAAU,CAAC;QAClC,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,UAAU,GAAW,CAAC,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;YACnB,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC;YACjB,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC;YACrB,OAAO,GAAG,CAAC,CAAC;YACZ,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC;QACxB,CAAC;aAAM,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC;YAClB,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;YACtB,OAAO,GAAG,CAAC,CAAC;YACZ,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC;YACvB,OAAO,GAAG,CAAC,CAAC;QACb,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACvB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,IAAI,aAAa,MAAM,mBAAmB,OAAO,KAAK,CAAC,CAAC;QAClJ,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,IAAI,6BAA6B,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrI,EAAE,IAAI,MAAM,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,QAAQ,WAAW,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChH,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACb,EAAE,IAAI,MAAM,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,QAAQ,WAAW,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;QACN,kDAAkD,OAAO,aAAa,OAAO,kBAAkB,OAAO,IAAI,OAAO,iEAAiE;QAClL,iKAAiK,CAAC,CAAC,IAAI,qBAAqB;QAC5L,gCAAgC,OAAO,GAAG,CAAC,aAAa,OAAO,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,WAAW,KAAK;QAC5H,GAAG,OAAO;QACV,GAAG,OAAO;QACV,QAAQ;KACR,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,GAAW;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAE9E,4EAA4E;AAC5E,SAAS,OAAO,CAAC,GAAqC,EAAE,EAAU;IACjE,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtB,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAc,EAAE,YAAgC;IACjF,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CACpE,CAAC,CAAC,EAAqC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CACtE,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,0BAA0B,CAAC;IAE3D,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC;IAE7E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;IACF,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|