managed-deepagents 0.10.0-dev.18 → 0.10.0-dev.19

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.
Files changed (144) hide show
  1. package/README.md +23 -4
  2. package/dist/browser.d.ts +37 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +31 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/channels/assistant-text.d.ts +1 -1
  7. package/dist/channels/assistant-text.js +1 -1
  8. package/dist/channels/binding.d.ts.map +1 -1
  9. package/dist/channels/binding.js +6 -2
  10. package/dist/channels/binding.js.map +1 -1
  11. package/dist/channels/delivery.d.ts +23 -8
  12. package/dist/channels/delivery.d.ts.map +1 -1
  13. package/dist/channels/delivery.js +181 -18
  14. package/dist/channels/delivery.js.map +1 -1
  15. package/dist/channels/github/app-setup.d.ts +32 -0
  16. package/dist/channels/github/app-setup.d.ts.map +1 -0
  17. package/dist/channels/github/app-setup.js +146 -0
  18. package/dist/channels/github/app-setup.js.map +1 -0
  19. package/dist/channels/github/index.d.ts.map +1 -1
  20. package/dist/channels/github/index.js +9 -23
  21. package/dist/channels/github/index.js.map +1 -1
  22. package/dist/channels/http/index.d.ts +6 -0
  23. package/dist/channels/http/index.d.ts.map +1 -1
  24. package/dist/channels/http/index.js +24 -9
  25. package/dist/channels/http/index.js.map +1 -1
  26. package/dist/channels/linear/app-setup.d.ts +29 -0
  27. package/dist/channels/linear/app-setup.d.ts.map +1 -0
  28. package/dist/channels/linear/app-setup.js +102 -0
  29. package/dist/channels/linear/app-setup.js.map +1 -0
  30. package/dist/channels/linear/index.d.ts.map +1 -1
  31. package/dist/channels/linear/index.js +11 -55
  32. package/dist/channels/linear/index.js.map +1 -1
  33. package/dist/channels/runtime.d.ts +4 -1
  34. package/dist/channels/runtime.d.ts.map +1 -1
  35. package/dist/channels/runtime.js +19 -10
  36. package/dist/channels/runtime.js.map +1 -1
  37. package/dist/channels/schedule-delivery.d.ts +1 -12
  38. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  39. package/dist/channels/schedule-delivery.js +5 -61
  40. package/dist/channels/schedule-delivery.js.map +1 -1
  41. package/dist/channels/slack/index.d.ts.map +1 -1
  42. package/dist/channels/slack/index.js +3 -0
  43. package/dist/channels/slack/index.js.map +1 -1
  44. package/dist/channels/trigger/client.d.ts.map +1 -1
  45. package/dist/channels/trigger/client.js +3 -1
  46. package/dist/channels/trigger/client.js.map +1 -1
  47. package/dist/channels/trigger/conversation.d.ts +11 -0
  48. package/dist/channels/trigger/conversation.d.ts.map +1 -0
  49. package/dist/channels/trigger/conversation.js +72 -0
  50. package/dist/channels/trigger/conversation.js.map +1 -0
  51. package/dist/channels/trigger/http.d.ts +9 -1
  52. package/dist/channels/trigger/http.d.ts.map +1 -1
  53. package/dist/channels/trigger/http.js +28 -12
  54. package/dist/channels/trigger/http.js.map +1 -1
  55. package/dist/channels/trigger/ingress.d.ts +32 -0
  56. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  57. package/dist/channels/trigger/ingress.js +89 -6
  58. package/dist/channels/trigger/ingress.js.map +1 -1
  59. package/dist/channels/trigger/transport.d.ts +10 -0
  60. package/dist/channels/trigger/transport.d.ts.map +1 -1
  61. package/dist/channels/trigger/transport.js +25 -9
  62. package/dist/channels/trigger/transport.js.map +1 -1
  63. package/dist/channels/trigger/types.d.ts +10 -0
  64. package/dist/channels/trigger/types.d.ts.map +1 -1
  65. package/dist/channels/trigger/types.js.map +1 -1
  66. package/dist/channels/types.d.ts +24 -1
  67. package/dist/channels/types.d.ts.map +1 -1
  68. package/dist/channels/types.js.map +1 -1
  69. package/dist/define-deep-agent.d.ts +2 -2
  70. package/dist/define-deep-agent.d.ts.map +1 -1
  71. package/dist/define-deep-agent.js +53 -8
  72. package/dist/define-deep-agent.js.map +1 -1
  73. package/dist/index.d.ts +3 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +1 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/managed-composition.d.ts +3 -0
  78. package/dist/managed-composition.d.ts.map +1 -1
  79. package/dist/managed-composition.js +21 -0
  80. package/dist/managed-composition.js.map +1 -1
  81. package/dist/runtime/async-subagents.d.ts +27 -0
  82. package/dist/runtime/async-subagents.d.ts.map +1 -0
  83. package/dist/runtime/async-subagents.js +139 -0
  84. package/dist/runtime/async-subagents.js.map +1 -0
  85. package/dist/runtime/auth.d.ts.map +1 -1
  86. package/dist/runtime/auth.js +37 -2
  87. package/dist/runtime/auth.js.map +1 -1
  88. package/dist/runtime/backend.d.ts +7 -0
  89. package/dist/runtime/backend.d.ts.map +1 -1
  90. package/dist/runtime/backend.js +32 -7
  91. package/dist/runtime/backend.js.map +1 -1
  92. package/dist/runtime/browser-facade.d.ts +10 -0
  93. package/dist/runtime/browser-facade.d.ts.map +1 -0
  94. package/dist/runtime/browser-facade.js +23 -0
  95. package/dist/runtime/browser-facade.js.map +1 -0
  96. package/dist/runtime/browser-langsmith.d.ts +108 -0
  97. package/dist/runtime/browser-langsmith.d.ts.map +1 -0
  98. package/dist/runtime/browser-langsmith.js +379 -0
  99. package/dist/runtime/browser-langsmith.js.map +1 -0
  100. package/dist/runtime/browser-selection.d.ts +10 -0
  101. package/dist/runtime/browser-selection.d.ts.map +1 -0
  102. package/dist/runtime/browser-selection.js +21 -0
  103. package/dist/runtime/browser-selection.js.map +1 -0
  104. package/dist/runtime/browser.d.ts +125 -0
  105. package/dist/runtime/browser.d.ts.map +1 -0
  106. package/dist/runtime/browser.js +606 -0
  107. package/dist/runtime/browser.js.map +1 -0
  108. package/dist/runtime/index.d.ts +38 -1
  109. package/dist/runtime/index.d.ts.map +1 -1
  110. package/dist/runtime/index.js +47 -16
  111. package/dist/runtime/index.js.map +1 -1
  112. package/dist/runtime/managed-thread.d.ts +1 -0
  113. package/dist/runtime/managed-thread.d.ts.map +1 -1
  114. package/dist/runtime/managed-thread.js +1 -1
  115. package/dist/runtime/managed-thread.js.map +1 -1
  116. package/dist/runtime/parent-run.d.ts +33 -0
  117. package/dist/runtime/parent-run.d.ts.map +1 -0
  118. package/dist/runtime/parent-run.js +114 -0
  119. package/dist/runtime/parent-run.js.map +1 -0
  120. package/dist/runtime/run-input.d.ts +4 -1
  121. package/dist/runtime/run-input.d.ts.map +1 -1
  122. package/dist/runtime/run-input.js +30 -7
  123. package/dist/runtime/run-input.js.map +1 -1
  124. package/dist/runtime/sandbox-manager.d.ts +14 -1
  125. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  126. package/dist/runtime/sandbox-manager.js +33 -8
  127. package/dist/runtime/sandbox-manager.js.map +1 -1
  128. package/dist/runtime/schedule-auth.d.ts +62 -0
  129. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  130. package/dist/runtime/schedule-auth.js +125 -6
  131. package/dist/runtime/schedule-auth.js.map +1 -1
  132. package/dist/runtime/static-entry.d.ts.map +1 -1
  133. package/dist/runtime/static-entry.js +1 -0
  134. package/dist/runtime/static-entry.js.map +1 -1
  135. package/dist/runtime/thread-record.d.ts +9 -2
  136. package/dist/runtime/thread-record.d.ts.map +1 -1
  137. package/dist/runtime/thread-record.js +13 -5
  138. package/dist/runtime/thread-record.js.map +1 -1
  139. package/dist/runtime/types.d.ts +7 -0
  140. package/dist/runtime/types.d.ts.map +1 -1
  141. package/dist/types.d.ts +19 -2
  142. package/dist/types.d.ts.map +1 -1
  143. package/dist/types.js.map +1 -1
  144. package/package.json +22 -8
@@ -0,0 +1,606 @@
1
+ /**
2
+ * Browser use: Stagehand's TypeScript facade tools on a LangSmith browser.
3
+ *
4
+ * A browser per key (`thread:<id>`, or `user:<id>` under user scope). A
5
+ * thread's own browser has one window, `mda`; a user's has a window per
6
+ * thread, so their threads share logins but not tabs. Each browser has one
7
+ * Stagehand client in this process (the extension serves one at a time),
8
+ * released between runs and after a minute idle so the browser can idle out.
9
+ *
10
+ * `browser_handoff` hands the window to the user and returns at once. A run of
11
+ * the watcher graph, which `mda` builds beside the agent, waits on its own
12
+ * thread for the user to hand it back, then enqueues a run on the agent's
13
+ * thread with a notification, as an async subagent tells the agent that
14
+ * started it that it finished.
15
+ *
16
+ * The middleware half of Python's `browser.py`; `browser-langsmith.ts` holds
17
+ * the LangSmith half. Only projects that declare `browser.ts` import this
18
+ * module or install Stagehand.
19
+ */
20
+ import { createHash } from "node:crypto";
21
+ import { readdir, readFile, unlink } from "node:fs/promises";
22
+ import { join, posix, relative, sep } from "node:path";
23
+ import { SystemMessage, ToolMessage, } from "@langchain/core/messages";
24
+ import { tool } from "@langchain/core/tools";
25
+ import { Annotation, Command, END, START, StateGraph, } from "@langchain/langgraph";
26
+ import { Client } from "@langchain/langgraph-sdk";
27
+ import { isSandboxBackend, } from "deepagents";
28
+ import { createMiddleware } from "langchain";
29
+ import { z } from "zod";
30
+ import { CodeModeRunInputSchema, FACADE_AGENT_INSTRUCTIONS, FACADE_TOOLS, sanitizeErrorMessage, StagehandFacadeExecutionError, StagehandFacadeInputError, } from "./browser-facade.js";
31
+ import { closeSession, handOver, HANDOFF_LINK_TTL_S, handoffStatus, openSession, shareLocalhost, PendingBrowserHandoffSchema, } from "./browser-langsmith.js";
32
+ import { LazyManagedSandboxBackend } from "./backend.js";
33
+ import { logger } from "./log.js";
34
+ import { verifiedLeadThread } from "./parent-run.js";
35
+ import { MDA_NOTIFICATION_KEY } from "../channels/assistant-text.js";
36
+ const WORKSPACE = "/workspace"; // where run code's screenshots land in the sandbox
37
+ const INSTRUCTIONS =
38
+ // The facade's text and errors name its tools `run` and so on; ours gain `browser_`.
39
+ "These tools are named browser_run, browser_snapshot and browser_screenshot: " +
40
+ "call those wherever this text or an error names run, snapshot or screenshot.\n" +
41
+ "Screenshots that run code saves go to /workspace in your sandbox: " +
42
+ "`await page.screenshot({ path: 'shots/a.png' })` saves /workspace/shots/a.png.";
43
+ const SCREENSHOT_PATH = "Only if you have a sandbox: also save the image to this absolute path in it, " +
44
+ "creating its folder, e.g. to publish it.";
45
+ const LOCALHOST_NOTE = // a thread's browser shares its sandbox's localhost
46
+ "Servers running in your sandbox are reachable at http://localhost:<port> " +
47
+ "(any port but 80 and 443).";
48
+ const HANDOFF_DESCRIPTION = "Hand the browser to the user; you'll be notified when they hand it back.\n\n" +
49
+ "Use it for what only they should do: log in, solve a CAPTCHA, approve a " +
50
+ "2FA prompt. Never ask for passwords. `reason` is shown to them as is: a " +
51
+ 'few words on what to do, such as "Log in to LinkedIn".';
52
+ const HAND_BACK_POLL_MS = 2_000;
53
+ const WITH_USER = "The browser is with the user until they hand it back; wait for the notification " +
54
+ "that they did before using it.";
55
+ const HANDED_OVER = // what the model reads from browser_handoff
56
+ "The browser is with the user. You'll get a notification when they hand it back; " +
57
+ "until then, don't use the browser. Tell the user what to do in it.";
58
+ /** Clients such as Studio show a notification's first sentence, so it reads for both. */
59
+ const WAKE_TEXT = {
60
+ handed_back: "The browser was handed back. Take a snapshot of the page; if the user hasn't " +
61
+ "finished, call browser_handoff again.",
62
+ ended: "The browser handoff ended. Take a snapshot to see whether the user finished.",
63
+ };
64
+ /**
65
+ * The thread's handoff that waits on the user, as Python's `mda_browser_handoff`.
66
+ * A leading `_` keeps it out of run input, as Python's `OmitFromInput` does.
67
+ */
68
+ const HANDOFF_KEY = "_mda_browser_handoff";
69
+ /** The graph `mda` builds beside the agent, whose run waits out a handoff. */
70
+ export const HANDOFF_WATCHER_GRAPH = "mda-browser-handoff";
71
+ /** Where deepagents puts the reference to the agent that started a run, which isn't forwarded. */
72
+ const PARENT_REFERENCE_KEY = "deepagents_parent";
73
+ const RELEASE_AFTER_MS = 60_000; // a run that throws or interrupts never reaches afterAgent
74
+ const BrowserStateSchema = z.object({
75
+ [HANDOFF_KEY]: PendingBrowserHandoffSchema.nullable().optional(),
76
+ });
77
+ // Process-wide: a user's concurrent threads share their browser's one client.
78
+ const sessions = new Map();
79
+ const locks = new Map();
80
+ const releases = new Map();
81
+ async function release(key) {
82
+ const session = sessions.get(key);
83
+ sessions.delete(key);
84
+ if (session)
85
+ await closeSession(session);
86
+ }
87
+ /**
88
+ * Run code's `browser.close()`: release the client once the tool call is done.
89
+ *
90
+ * The facade asks before the run tool has moved the screenshots that code saved.
91
+ */
92
+ async function closeAfterCall(key) {
93
+ const session = sessions.get(key);
94
+ if (session)
95
+ session.closing = true;
96
+ }
97
+ /** Release `key`'s client a minute after its last call; each call restarts the wait. */
98
+ function releaseWhenIdle(key) {
99
+ clearTimeout(releases.get(key));
100
+ const timer = setTimeout(() => {
101
+ withLock(key, async () => {
102
+ if (releases.get(key) !== timer)
103
+ return; // a later call restarted the wait
104
+ releases.delete(key);
105
+ await release(key);
106
+ });
107
+ }, RELEASE_AFTER_MS).unref(); // never keeps the process alive
108
+ releases.set(key, timer);
109
+ }
110
+ /** Give the agent Stagehand's tools, named `browser_run`, `browser_snapshot` and so on. */
111
+ export function createBrowserMiddleware(options) {
112
+ const { scope } = options;
113
+ const tools = browserTools(options);
114
+ const accepted = new Map(tools.map((t) => [t.name, Object.keys(t.schema.properties)]));
115
+ let instructions = `${FACADE_AGENT_INSTRUCTIONS}\n\n${INSTRUCTIONS}`;
116
+ if (scope === "thread")
117
+ instructions += ` ${LOCALHOST_NOTE}`;
118
+ return createMiddleware({
119
+ name: "mda-browser",
120
+ stateSchema: BrowserStateSchema,
121
+ tools,
122
+ // JSON-schema tools turn away input their schema rejects, with a stack trace,
123
+ // before their function runs. Answer it as Python's tools and facade do: names
124
+ // a tool lacks, such as snake_case ones, and bad run input. Like them, take a
125
+ // null argument as left out; some models send every argument.
126
+ async wrapToolCall(request, handler) {
127
+ const { name, args, id } = request.toolCall;
128
+ const names = accepted.get(name);
129
+ if (names === undefined)
130
+ return handler(request); // not a browser tool
131
+ const extra = Object.keys(args).filter((arg) => !names.includes(arg));
132
+ const given = Object.fromEntries(Object.entries(args).filter(([, value]) => value !== null));
133
+ let error = extra.length > 0 ? unexpected(extra) : undefined;
134
+ if (name === "browser_run")
135
+ error ??= invalidRun(given);
136
+ if (error === undefined) {
137
+ return handler({
138
+ ...request,
139
+ toolCall: { ...request.toolCall, args: given },
140
+ });
141
+ }
142
+ return new ToolMessage({ content: error, tool_call_id: id ?? "", name });
143
+ },
144
+ // A run the handoff's notification starts ends the handoff.
145
+ async beforeAgent(state) {
146
+ const messages = state.messages ?? [];
147
+ const last = messages.at(-1);
148
+ if (pending(state) && last && isHandoffNotification(last)) {
149
+ return { [HANDOFF_KEY]: null };
150
+ }
151
+ return undefined;
152
+ },
153
+ // Release the client between runs; the browser and its windows stay.
154
+ async afterAgent(_state, runtime) {
155
+ const found = locate(runtime, scope);
156
+ if (typeof found === "string")
157
+ return; // no thread or user, so no session
158
+ await withLock(found.key, () => release(found.key));
159
+ },
160
+ // Append the facade's instructions to the system message, as their own block.
161
+ async wrapModelCall(request, handler) {
162
+ const content = request.systemMessage?.content ?? request.systemPrompt;
163
+ const blocks = typeof content === "string"
164
+ ? content
165
+ ? [{ type: "text", text: content }]
166
+ : []
167
+ : (content ?? []);
168
+ return handler({
169
+ ...request,
170
+ systemMessage: new SystemMessage({
171
+ content: [...blocks, { type: "text", text: instructions }],
172
+ }),
173
+ });
174
+ },
175
+ });
176
+ }
177
+ /**
178
+ * Run `fn` on the run's session. Errors go to the model; nothing is retried.
179
+ *
180
+ * While the user has the window, the agent waits.
181
+ */
182
+ async function call(options, runtime, fn) {
183
+ // The handoff is asked about here too: after a restart no watcher says it ended.
184
+ const handoff = pending(runtime.state);
185
+ if (handoff && (await handoffStatus(handoff)) === undefined) {
186
+ return `error: ${WITH_USER}`;
187
+ }
188
+ const found = locate(runtime, options.scope);
189
+ if (typeof found === "string")
190
+ return found;
191
+ const { thread, key } = found;
192
+ const window = windowName(key, thread);
193
+ return withLock(key, async () => {
194
+ try {
195
+ if (sessions.get(key)?.window !== window) {
196
+ await release(key); // another of the user's threads: move windows
197
+ const ttl = options.idleTtlSeconds;
198
+ const opened = openSession(key, window, ttl, () => closeAfterCall(key));
199
+ sessions.set(key, await opened);
200
+ }
201
+ const session = sessions.get(key);
202
+ await share(session, key, runtime);
203
+ return await fn(session);
204
+ }
205
+ catch (err) {
206
+ return await failed(key, err);
207
+ }
208
+ finally {
209
+ if (sessions.get(key)?.closing)
210
+ await release(key);
211
+ releaseWhenIdle(key);
212
+ }
213
+ });
214
+ }
215
+ /**
216
+ * Give the user the window and return at once, keeping the handoff in state.
217
+ *
218
+ * It needs no client, only the browsers API: a window a person controls turns
219
+ * a client away, so a second handoff could not connect. The agent's client
220
+ * lets go, and the next browser call connects afresh and takes the window back.
221
+ */
222
+ async function handToUser(options, runtime, reason) {
223
+ const found = locate(runtime, options.scope);
224
+ if (typeof found === "string")
225
+ return found;
226
+ const { thread, key } = found;
227
+ let handed;
228
+ try {
229
+ handed = await withLock(key, async () => {
230
+ await release(key);
231
+ const window = windowName(key, thread);
232
+ return handOver(key, window, options.idleTtlSeconds);
233
+ });
234
+ }
235
+ catch (err) {
236
+ return `error: ${sanitizeErrorMessage(errorText(err))}`;
237
+ }
238
+ const handoff = {
239
+ browser: handed.browser,
240
+ window_id: handed.windowId,
241
+ until: Date.now() / 1000 + HANDOFF_LINK_TTL_S,
242
+ };
243
+ try {
244
+ await startWatcher(loopback(), runtime, handoff);
245
+ }
246
+ catch (err) {
247
+ // The browser tools still work once it ended.
248
+ const label = logger.safeErrorLabel(err);
249
+ logger.warn(`could not watch the handoff on thread ${thread}: ${label}`);
250
+ }
251
+ // What clients such as Studio show the user: the ask, and a link that lets
252
+ // whoever holds it drive the window, for 15 minutes. The model never sees it.
253
+ const reply = new ToolMessage({
254
+ content: HANDED_OVER,
255
+ artifact: { type: "browser_handoff", message: reason, url: handed.url },
256
+ name: "browser_handoff",
257
+ tool_call_id: runtime.toolCallId ?? "",
258
+ });
259
+ return new Command({ update: { [HANDOFF_KEY]: handoff, messages: [reply] } });
260
+ }
261
+ /**
262
+ * Start a run of the watcher graph on a thread of its own, as deepagents starts
263
+ * an async subagent's task: the thread's metadata names this agent, which the
264
+ * Agent Server copies into the run, and the run gets this run's context.
265
+ *
266
+ * The wait is a run rather than a promise in this process, so the wake-up comes
267
+ * from a live run, the only caller a deployed graph's Agent Server takes.
268
+ */
269
+ export async function startWatcher(client, runtime, handoff) {
270
+ const thread = await client.threads.create({
271
+ metadata: {
272
+ parent_thread_id: runtime.configurable?.thread_id,
273
+ parent_assistant_id: runtime.serverInfo?.assistantId || runtime.serverInfo?.graphId,
274
+ },
275
+ });
276
+ const context = forwardedContext(runtime.context);
277
+ await client.runs.create(thread.thread_id, HANDOFF_WATCHER_GRAPH, {
278
+ input: { handoff },
279
+ ...(context && { context }),
280
+ });
281
+ }
282
+ const WatcherState = Annotation.Root({
283
+ handoff: Annotation(),
284
+ });
285
+ /**
286
+ * Once the handoff ends, notify the agent that started it, unless it has moved
287
+ * on: a newer handoff replaced this one, or the agent waits on a person, where
288
+ * a new run would drop what it waits for. Its browser tools work again either way.
289
+ */
290
+ export async function watch(state, config) {
291
+ const { handoff } = state;
292
+ let status;
293
+ while (status === undefined) {
294
+ await new Promise((resolve) => {
295
+ setTimeout(resolve, HAND_BACK_POLL_MS);
296
+ });
297
+ status = await handoffStatus(handoff);
298
+ }
299
+ const { threadId, assistantId } = await launchingAgent(config);
300
+ if (!threadId || !assistantId)
301
+ return {};
302
+ const client = loopback();
303
+ const thread = await client.threads.get(threadId);
304
+ if (thread.status === "interrupted" ||
305
+ !sameHandoff(pending(thread.values), handoff)) {
306
+ return {};
307
+ }
308
+ const context = forwardedContext(config.context);
309
+ await client.runs.create(threadId, assistantId, {
310
+ input: { messages: [wakeMessage(status)] },
311
+ multitaskStrategy: "enqueue", // after a run that is going on
312
+ ...(context && { context }),
313
+ });
314
+ return {};
315
+ }
316
+ /** The watcher graph: one run per handoff, from `browser_handoff` until it ends. */
317
+ export const handoffWatcher = new StateGraph(WatcherState)
318
+ .addNode("watch", watch)
319
+ .addEdge(START, "watch")
320
+ .addEdge("watch", END)
321
+ .compile();
322
+ /**
323
+ * The agent that started this run, as an async subagent's run finds its lead:
324
+ * its thread, once this run's caller is verified to own it, and its assistant,
325
+ * from the thread's metadata the Agent Server copies into every run on it.
326
+ */
327
+ async function launchingAgent(config) {
328
+ const lead = await verifiedLeadThread(config);
329
+ const assistantId = config.metadata?.parent_assistant_id;
330
+ return {
331
+ threadId: lead?.id,
332
+ assistantId: typeof assistantId === "string" ? assistantId : undefined,
333
+ };
334
+ }
335
+ /** A run's context for another run, without deepagents' parent reference, as deepagents forwards it. */
336
+ function forwardedContext(context) {
337
+ if (!context || typeof context !== "object")
338
+ return undefined;
339
+ const forwarded = Object.fromEntries(Object.entries(context).filter(([key]) => key !== PARENT_REFERENCE_KEY));
340
+ return Object.keys(forwarded).length > 0 ? forwarded : undefined;
341
+ }
342
+ /**
343
+ * This Agent Server, called as the user who started the run, as Python's
344
+ * in-process `get_client()` is. With no `apiUrl`, the client takes the Agent
345
+ * Server's loopback, which marks each call with the live run so the server
346
+ * restores that run's user; managed auth never sees the call. It answers only
347
+ * while the run is live.
348
+ */
349
+ function loopback() {
350
+ return new Client();
351
+ }
352
+ function pending(state) {
353
+ const value = state && typeof state === "object"
354
+ ? state[HANDOFF_KEY]
355
+ : undefined;
356
+ return (value ?? undefined);
357
+ }
358
+ function sameHandoff(a, b) {
359
+ return (a?.browser === b.browser &&
360
+ a.window_id === b.window_id &&
361
+ a.until === b.until);
362
+ }
363
+ /**
364
+ * A notification in deepagents' task notification's shape: a user-role message
365
+ * framed as a system notification. Its `mda_notification` tells clients how the
366
+ * handoff ended, so they can tell it from the user's message.
367
+ */
368
+ export function wakeMessage(status) {
369
+ return {
370
+ role: "user",
371
+ content: `[SYSTEM NOTIFICATION - NOT USER INPUT]\n${WAKE_TEXT[status]}`,
372
+ additional_kwargs: {
373
+ [MDA_NOTIFICATION_KEY]: { type: "browser_handoff", status },
374
+ },
375
+ };
376
+ }
377
+ function isHandoffNotification(message) {
378
+ const notification = message.additional_kwargs?.[MDA_NOTIFICATION_KEY];
379
+ return notification?.type === "browser_handoff";
380
+ }
381
+ /** What the model gets for `err`, releasing the session if its connection may be dead. */
382
+ async function failed(key, err) {
383
+ if (err instanceof StagehandFacadeInputError)
384
+ return `error: ${err.message}`;
385
+ if (err instanceof StagehandFacadeExecutionError) {
386
+ return `error: ${err.name}: ${err.message}`; // thrown by run code
387
+ }
388
+ // The connection may be dead, unless the browser answered or the facade turned
389
+ // away run code that does not parse, with a plain SyntaxError. Stagehand rejects
390
+ // a JSON-RPC error reply (Python's RPCError) with the reply, and its code, as cause.
391
+ const reply = err instanceof Error ? err.cause : null;
392
+ if (typeof reply?.code !== "number" && !(err instanceof SyntaxError)) {
393
+ await release(key);
394
+ }
395
+ return `error: ${sanitizeErrorMessage(errorText(err))}`;
396
+ }
397
+ /**
398
+ * Share the thread's sandbox's localhost with its browser, once that sandbox exists.
399
+ *
400
+ * Runs before every browser call. Only a thread's browser shares: a user's
401
+ * serves several threads, whose sandboxes cannot all be `localhost`.
402
+ */
403
+ async function share(session, key, runtime) {
404
+ const sandbox = key.startsWith("thread:")
405
+ ? threadSandbox(runtime.backend)
406
+ : undefined;
407
+ if (sandbox === undefined || session.shared === sandbox)
408
+ return;
409
+ try {
410
+ await shareLocalhost(session.browser, sandbox.id);
411
+ }
412
+ catch (err) {
413
+ // Browsing goes on; tried again next call.
414
+ const label = logger.safeErrorLabel(err);
415
+ logger.warn(`could not share sandbox ${sandbox.id}'s localhost with ${session.browser} (${label})`);
416
+ return;
417
+ }
418
+ session.shared = sandbox;
419
+ }
420
+ /** The facade's tools as its hosts advertise them, names prefixed `browser_`. */
421
+ function browserTools(options) {
422
+ const facade = (name) => {
423
+ const entry = FACADE_TOOLS.find((candidate) => candidate.name === name);
424
+ const { description, inputSchema: schema } = entry;
425
+ return { name: `browser_${name}`, description, schema };
426
+ };
427
+ const screenshot = facade("screenshot");
428
+ const path = { type: "string", description: SCREENSHOT_PATH };
429
+ const properties = { ...screenshot.schema.properties, path };
430
+ const run = tool(async (input, config) => {
431
+ const { code, actions } = input;
432
+ const runtime = config;
433
+ return call(options, runtime, async (session) => {
434
+ let value;
435
+ let saved;
436
+ try {
437
+ value =
438
+ code === undefined
439
+ ? await session.tools.runActions(actions)
440
+ : await session.tools.run(code);
441
+ }
442
+ finally {
443
+ // Code that threw may have saved some first.
444
+ saved = await saveArtifacts(runtime.backend, session.artifacts);
445
+ }
446
+ return [JSON.stringify(value ?? null), ...saved].join("\n");
447
+ });
448
+ }, facade("run"));
449
+ const snapshot = tool(async (input, config) => {
450
+ const includeIframes = input.includeIframes ?? true;
451
+ return call(options, config, (session) => session.tools.snapshot({ includeIframes }));
452
+ }, facade("snapshot"));
453
+ const shoot = tool(async (input, config) => {
454
+ const { fullPage, type = "png", quality, path } = input;
455
+ const runtime = config;
456
+ const shot = await call(options, runtime, (session) => session.tools.screenshot({ fullPage, type, quality }));
457
+ if (typeof shot === "string")
458
+ return shot;
459
+ let text = "Screenshot of the current page.";
460
+ if (path) {
461
+ const data = Buffer.from(shot.data, "base64");
462
+ text += ` ${await save(runtime.backend, path, data)}`;
463
+ }
464
+ const url = `data:${shot.mimeType};base64,${shot.data}`;
465
+ return [
466
+ { type: "text", text },
467
+ { type: "image", url },
468
+ ];
469
+ }, { ...screenshot, schema: { ...screenshot.schema, properties } });
470
+ const handoff = tool(async (input, config) => handToUser(options, config, input.reason), {
471
+ name: "browser_handoff",
472
+ description: HANDOFF_DESCRIPTION,
473
+ schema: {
474
+ type: "object",
475
+ properties: {
476
+ reason: { type: "string" },
477
+ },
478
+ required: ["reason"],
479
+ },
480
+ });
481
+ return [run, snapshot, shoot, handoff];
482
+ }
483
+ function errorText(err) {
484
+ return err instanceof Error ? `${err.name}: ${err.message}` : String(err);
485
+ }
486
+ /** The facade's answer to run input it turns away; the page never sees it. */
487
+ function invalidRun(args) {
488
+ if ((args.code === undefined) === (args.actions === undefined)) {
489
+ return "error: run requires exactly one of code or actions";
490
+ }
491
+ const { error } = CodeModeRunInputSchema.safeParse(args);
492
+ return error && `error: Invalid run input: ${error.issues[0]?.message}`;
493
+ }
494
+ function unexpected(names) {
495
+ const quoted = names.map((name) => `'${name}'`).join(", ");
496
+ return `error: unexpected argument${names.length > 1 ? "s" : ""} ${quoted}.`;
497
+ }
498
+ /** Move what the facade saved under `root` to the same relative path in /workspace. */
499
+ async function saveArtifacts(backend, root) {
500
+ const entries = await readdir(root, { recursive: true, withFileTypes: true });
501
+ const files = entries.filter((entry) => entry.isFile());
502
+ const saved = [];
503
+ for (const path of files.map((f) => join(f.parentPath, f.name)).sort()) {
504
+ const data = await readFile(path);
505
+ await unlink(path);
506
+ const rel = relative(root, path).split(sep).join("/");
507
+ saved.push(await save(backend, `${WORKSPACE}/${rel}`, data));
508
+ }
509
+ return saved;
510
+ }
511
+ /** Write `data` to absolute `path` in the agent's sandbox, creating its folder. */
512
+ export async function save(backend, path, data) {
513
+ if (backend == null) {
514
+ return `error: ${path} not saved: this agent has no sandbox.`;
515
+ }
516
+ if (!posix.isAbsolute(path)) {
517
+ return `error: ${path} not saved: give an absolute path.`;
518
+ }
519
+ const target = posix.normalize(path).replace(/(.)\/$/, "$1"); // as normpath
520
+ let result;
521
+ try {
522
+ if (isSandboxBackend(backend)) {
523
+ await backend.execute(`mkdir -p -- ${shellQuote(posix.dirname(target))}`);
524
+ }
525
+ [result] = await backend.uploadFiles([[target, data]]);
526
+ }
527
+ catch (err) {
528
+ return `error: ${target} not saved: ${errorText(err)}`;
529
+ }
530
+ return result?.error
531
+ ? `error: ${target} not saved: ${result.error}`
532
+ : `Saved ${target}.`;
533
+ }
534
+ /** `text` quoted for a POSIX shell, as Python's `shlex.quote` does. */
535
+ function shellQuote(text) {
536
+ if (text === "")
537
+ return "''";
538
+ if (/^[\w@%+=:,./-]+$/.test(text))
539
+ return text;
540
+ return `'${text.replaceAll("'", `'"'"'`)}'`;
541
+ }
542
+ /** Under user scope, a person's browser; service principals stand for many people. */
543
+ export function browserKey(serverInfo, thread, scope) {
544
+ if (scope === "user") {
545
+ const principal = serverInfo?.principal;
546
+ if (principal === undefined) {
547
+ throw new Error('browser scope "user" needs a signed-in user');
548
+ }
549
+ if (principal.kind === "person")
550
+ return `user:${principal.id}`;
551
+ }
552
+ return `thread:${thread}`;
553
+ }
554
+ /** The run's thread and browser key, or the error that leaves it without one. */
555
+ function locate(runtime, scope) {
556
+ const id = runtime.configurable?.thread_id;
557
+ if (!id)
558
+ return "error: browser use needs a thread_id";
559
+ const thread = String(id);
560
+ try {
561
+ return { thread, key: browserKey(runtime.serverInfo, thread, scope) };
562
+ }
563
+ catch (err) {
564
+ return `error: ${err.message}`;
565
+ }
566
+ }
567
+ /**
568
+ * The run's sandbox once MDA has opened it; the browser never opens one.
569
+ *
570
+ * Tools see it through a lazy handle made fresh for each run, so the handle
571
+ * asks the process whether the box is open.
572
+ */
573
+ export function threadSandbox(backend) {
574
+ const box = backend instanceof LazyManagedSandboxBackend ? backend.opened() : backend;
575
+ if (!isSandboxBackend(box) || box.id.startsWith("pending:"))
576
+ return undefined;
577
+ return box;
578
+ }
579
+ /** A thread's own browser has the one window `mda`; a user's, one per thread. */
580
+ function windowName(key, thread) {
581
+ if (key.startsWith("thread:"))
582
+ return "mda";
583
+ return `mda-${createHash("sha256").update(thread).digest("hex").slice(0, 16)}`;
584
+ }
585
+ /** Run `fn` after `key`'s earlier calls, so calls on one browser take turns. */
586
+ function withLock(key, fn) {
587
+ const result = (locks.get(key) ?? Promise.resolve()).then(fn);
588
+ const tail = result.then(() => { }).catch(() => { }); // settles once `fn` has
589
+ locks.set(key, tail);
590
+ tail.then(() => {
591
+ if (locks.get(key) === tail)
592
+ locks.delete(key); // no one is waiting
593
+ });
594
+ return result;
595
+ }
596
+ /** Close every session and stop its timer, for tests. */
597
+ export async function clearBrowserSessionsForTests() {
598
+ for (const timer of releases.values())
599
+ clearTimeout(timer);
600
+ releases.clear();
601
+ locks.clear();
602
+ const open = [...sessions.values()];
603
+ sessions.clear();
604
+ await Promise.all(open.map(closeSession));
605
+ }
606
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/runtime/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEvD,OAAO,EACL,aAAa,EACb,WAAW,GAEZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,OAAO,EACP,GAAG,EACH,KAAK,EACL,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EACL,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAwB,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,YAAY,EACZ,oBAAoB,EACpB,6BAA6B,EAC7B,yBAAyB,GAE1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,cAAc,EACd,2BAA2B,GAI5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,mDAAmD;AACnF,MAAM,YAAY;AAChB,qFAAqF;AACrF,8EAA8E;IAC9E,gFAAgF;IAChF,oEAAoE;IACpE,gFAAgF,CAAC;AACnF,MAAM,eAAe,GACnB,+EAA+E;IAC/E,0CAA0C,CAAC;AAC7C,MAAM,cAAc,GAAG,oDAAoD;CACzE,2EAA2E;IAC3E,4BAA4B,CAAC;AAC/B,MAAM,mBAAmB,GACvB,8EAA8E;IAC9E,0EAA0E;IAC1E,0EAA0E;IAC1E,wDAAwD,CAAC;AAC3D,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,SAAS,GACb,kFAAkF;IAClF,gCAAgC,CAAC;AACnC,MAAM,WAAW,GAAG,4CAA4C;CAC9D,kFAAkF;IAClF,oEAAoE,CAAC;AACvE,yFAAyF;AACzF,MAAM,SAAS,GAAyC;IACtD,WAAW,EACT,+EAA+E;QAC/E,uCAAuC;IACzC,KAAK,EACH,8EAA8E;CACjF,CAAC;AACF;;;GAGG;AACH,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAC3C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAC3D,kGAAkG;AAClG,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AACjD,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,2DAA2D;AAE5F,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACjE,CAAC,CAAC;AAcH,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;AAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;AAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEnD,KAAK,UAAU,OAAO,CAAC,GAAW;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO;QAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;AACtC,CAAC;AAED,wFAAwF;AACxF,SAAS,eAAe,CAAC,GAAW;IAClC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;gBAAE,OAAO,CAAC,kCAAkC;YAC3E,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,gCAAgC;IAC9D,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,uBAAuB,CACrC,OAAwC;IAExC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,MAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CACzE,CAAC;IACF,IAAI,YAAY,GAAG,GAAG,yBAAyB,OAAO,YAAY,EAAE,CAAC;IACrE,IAAI,KAAK,KAAK,QAAQ;QAAE,YAAY,IAAI,IAAI,cAAc,EAAE,CAAC;IAC7D,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,kBAAkB;QAC/B,KAAK;QACL,8EAA8E;QAC9E,+EAA+E;QAC/E,8EAA8E;QAC9E,8DAA8D;QAC9D,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO;YACjC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAC3D,CAAC;YACF,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,IAAI,IAAI,KAAK,aAAa;gBAAE,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC;YACxD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,OAAO,CAAC;oBACb,GAAG,OAAO;oBACV,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;iBAC/C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,4DAA4D;QAC5D,KAAK,CAAC,WAAW,CAAC,KAAK;YACrB,MAAM,QAAQ,GAAI,KAAsC,CAAC,QAAQ,IAAI,EAAE,CAAC;YACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1D,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;YACjC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,qEAAqE;QACrE,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO;YAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAyB,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,CAAC,mCAAmC;YAC1E,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,8EAA8E;QAC9E,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO;YAClC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;YACvE,MAAM,MAAM,GACV,OAAO,OAAO,KAAK,QAAQ;gBACzB,CAAC,CAAC,OAAO;oBACP,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBAC5C,CAAC,CAAC,EAAE;gBACN,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACtB,OAAO,OAAO,CAAC;gBACb,GAAG,OAAO;gBACV,aAAa,EAAE,IAAI,aAAa,CAAC;oBAC/B,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;iBAC3D,CAAC;aACH,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,IAAI,CACjB,OAAwC,EACxC,OAAuB,EACvB,EAAoC;IAEpC,iFAAiF;IACjF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,OAAO,IAAI,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,UAAU,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,QAAQ,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;QAC9B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;gBACzC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,8CAA8C;gBAClE,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;gBACnC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,CAAC;YAClC,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACnC,MAAM,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;gBAAS,CAAC;YACT,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO;gBAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnD,eAAe,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,UAAU,CACvB,OAAwC,EACxC,OAAuB,EACvB,MAAc;IAEd,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC9B,IAAI,MAA4C,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,UAAU,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,OAAO,GAA0B;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,kBAAkB;KAC9C,CAAC;IACF,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8CAA8C;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,yCAAyC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,2EAA2E;IAC3E,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC;QAC5B,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;QACvE,IAAI,EAAE,iBAAiB;QACvB,YAAY,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;KACvC,CAAC,CAAC;IACH,OAAO,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,OAAuB,EACvB,OAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,QAAQ,EAAE;YACR,gBAAgB,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS;YACjD,mBAAmB,EACjB,OAAO,CAAC,UAAU,EAAE,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,OAAO;SACjE;KACF,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,qBAAqB,EAAE;QAChE,KAAK,EAAE,EAAE,OAAO,EAAE;QAClB,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC;IACnC,OAAO,EAAE,UAAU,EAAyB;CAC7C,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,KAAgC,EAChC,MAA+B;IAE/B,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,IAAI,MAAwC,CAAC;IAC7C,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClD,IACE,MAAM,CAAC,MAAM,KAAK,aAAa;QAC/B,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAC7C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE;QAC9C,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE;QAC1C,iBAAiB,EAAE,SAAS,EAAE,+BAA+B;QAC7D,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC;KACvD,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;KACvB,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;KACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;KACrB,OAAO,EAAE,CAAC;AAEb;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAC3B,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,MAA0B,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACzD,OAAO;QACL,QAAQ,EAAE,IAAI,EAAE,EAAE;QAClB,WAAW,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KACvE,CAAC;AACJ,CAAC;AAED,wGAAwG;AACxG,SAAS,gBAAgB,CACvB,OAAgB;IAEhB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAClC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,oBAAoB,CAAC,CACxE,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ;IACf,OAAO,IAAI,MAAM,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,MAAM,KAAK,GACT,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAChC,CAAC,CAAE,KAAiC,CAAC,WAAW,CAAC;QACjD,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO,CAAC,KAAK,IAAI,SAAS,CAAsC,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAClB,CAAoC,EACpC,CAAwB;IAExB,OAAO,CACL,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,OAAO;QACxB,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAC3B,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CACpB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAA4B;IACtD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,2CAA2C,SAAS,CAAC,MAAM,CAAC,EAAE;QACvE,iBAAiB,EAAE;YACjB,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE;SAC5D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAoB;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,oBAAoB,CAExD,CAAC;IACd,OAAO,YAAY,EAAE,IAAI,KAAK,iBAAiB,CAAC;AAClD,CAAC;AAED,0FAA0F;AAC1F,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,GAAY;IAC7C,IAAI,GAAG,YAAY,yBAAyB;QAAE,OAAO,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7E,IAAI,GAAG,YAAY,6BAA6B,EAAE,CAAC;QACjD,OAAO,UAAU,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,qBAAqB;IACpE,CAAC;IACD,+EAA+E;IAC/E,iFAAiF;IACjF,qFAAqF;IACrF,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAE,GAAG,CAAC,KAA4B,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,IAAI,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,YAAY,WAAW,CAAC,EAAE,CAAC;QACrE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,UAAU,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,KAAK,CAClB,OAAgB,EAChB,GAAW,EACX,OAAuB;IAEvB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QACvC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC;QAChC,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO;IAChE,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2CAA2C;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CACT,2BAA2B,OAAO,CAAC,EAAE,qBAAqB,OAAO,CAAC,OAAO,KAAK,KAAK,GAAG,CACvF,CAAC;QACF,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC;AAC3B,CAAC;AAED,iFAAiF;AACjF,SAAS,YAAY,CAAC,OAAwC;IAC5D,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAE,CAAC;QACzE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,WAAW,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAC1D,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CACd,KAAK,EAAE,KAA+C,EAAE,MAAM,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QAChC,MAAM,OAAO,GAAG,MAAwB,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9C,IAAI,KAAc,CAAC;YACnB,IAAI,KAAe,CAAC;YACpB,IAAI,CAAC;gBACH,KAAK;oBACH,IAAI,KAAK,SAAS;wBAChB,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAQ,CAAC;wBAC1C,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;oBAAS,CAAC;gBACT,6CAA6C;gBAC7C,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,EACD,MAAM,CAAC,KAAK,CAAC,CACd,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,KAAmC,EAAE,MAAM,EAAE,EAAE;QAC1E,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,EAAE,MAAwB,EAAE,CAAC,OAAO,EAAE,EAAE,CACzD,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC,CAC3C,CAAC;IACJ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAChB,KAAK,EACH,KAAwE,EACxE,MAAM,EACN,EAAE;QACF,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QACxD,MAAM,OAAO,GAAG,MAAwB,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CACtD,CAAC;QACF,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,IAAI,GAAG,iCAAiC,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC9C,IAAI,IAAI,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;QACxD,OAAO;YACL,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YACtB,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;SACvB,CAAC;IACJ,CAAC,EACD,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAChE,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAClB,KAAK,EAAE,KAAyB,EAAE,MAAM,EAAE,EAAE,CAC1C,UAAU,CAAC,OAAO,EAAE,MAAwB,EAAE,KAAK,CAAC,MAAM,CAAC,EAC7D;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,mBAAmB;QAChC,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC3B;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF,CACF,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,8EAA8E;AAC9E,SAAS,UAAU,CAAC,IAA6B;IAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,EAAE,CAAC;QAC/D,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,KAAK,IAAI,6BAA6B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,6BAA6B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,GAAG,CAAC;AAC/E,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,aAAa,CAC1B,OAAsC,EACtC,IAAY;IAEZ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAsC,EACtC,IAAY,EACZ,IAAgB;IAEhB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,UAAU,IAAI,wCAAwC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,UAAU,IAAI,oCAAoC,CAAC;IAC5D,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc;IAC5E,IAAI,MAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,CAAC,OAAO,CAAC,eAAe,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,WAAY,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,UAAU,MAAM,eAAe,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,MAAM,EAAE,KAAK;QAClB,CAAC,CAAC,UAAU,MAAM,eAAe,MAAM,CAAC,KAAK,EAAE;QAC/C,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC;AACzB,CAAC;AAED,uEAAuE;AACvE,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC9C,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,UAAU,CACxB,UAAyC,EACzC,MAAc,EACd,KAAmB;IAEnB,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,UAAU,EAAE,SAAS,CAAC;QACxC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,SAAS,CAAC,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,UAAU,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,iFAAiF;AACjF,SAAS,MAAM,CACb,OAAuB,EACvB,KAAmB;IAEnB,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC;IAC3C,IAAI,CAAC,EAAE;QAAE,OAAO,sCAAsC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAsC;IAEtC,MAAM,GAAG,GACP,OAAO,YAAY,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5E,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AACjF,SAAS,UAAU,CAAC,GAAW,EAAE,MAAc;IAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAI,GAAW,EAAE,EAAoB;IACpD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,wBAAwB;IAC5E,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB;IACtE,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yDAAyD;AACzD,MAAM,CAAC,KAAK,UAAU,4BAA4B;IAChD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;QAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5C,CAAC"}