@markusylisiurunen/tau 0.2.38 → 0.2.39

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.
@@ -0,0 +1,260 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { AsyncHttpBodyParseError, AsyncHttpBodyTooLargeError, isRecord, readJsonBody, readStringField, sendError, sendOk, } from "./http_protocol.js";
4
+ import { AsyncSessionManagerError, } from "./session_manager.js";
5
+ function isAuthorized(request, authToken) {
6
+ const header = request.headers.authorization;
7
+ if (typeof header !== "string") {
8
+ return false;
9
+ }
10
+ const expected = Buffer.from(`Bearer ${authToken}`);
11
+ const received = Buffer.from(header);
12
+ if (expected.length !== received.length) {
13
+ return false;
14
+ }
15
+ return timingSafeEqual(expected, received);
16
+ }
17
+ function decodePathSegment(value) {
18
+ try {
19
+ return decodeURIComponent(value);
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ function parseSessionPath(pathname) {
26
+ const sessionMatch = /^\/v1\/sessions\/([^/]+)$/.exec(pathname);
27
+ if (sessionMatch) {
28
+ const sessionId = decodePathSegment(sessionMatch[1] ?? "");
29
+ if (!sessionId) {
30
+ return "invalid";
31
+ }
32
+ return { route: "session", sessionId };
33
+ }
34
+ const logsMatch = /^\/v1\/sessions\/([^/]+)\/logs$/.exec(pathname);
35
+ if (logsMatch) {
36
+ const sessionId = decodePathSegment(logsMatch[1] ?? "");
37
+ if (!sessionId) {
38
+ return "invalid";
39
+ }
40
+ return { route: "logs", sessionId };
41
+ }
42
+ const messagesMatch = /^\/v1\/sessions\/([^/]+)\/messages$/.exec(pathname);
43
+ if (messagesMatch) {
44
+ const sessionId = decodePathSegment(messagesMatch[1] ?? "");
45
+ if (!sessionId) {
46
+ return "invalid";
47
+ }
48
+ return { route: "messages", sessionId };
49
+ }
50
+ const cancelMatch = /^\/v1\/sessions\/([^/]+)\/cancel$/.exec(pathname);
51
+ if (cancelMatch) {
52
+ const sessionId = decodePathSegment(cancelMatch[1] ?? "");
53
+ if (!sessionId) {
54
+ return "invalid";
55
+ }
56
+ return { route: "cancel", sessionId };
57
+ }
58
+ return undefined;
59
+ }
60
+ function mapSessionErrorStatus(error) {
61
+ switch (error.code) {
62
+ case "not_found":
63
+ return 404;
64
+ case "busy":
65
+ return 409;
66
+ case "invalid_project":
67
+ case "invalid_state":
68
+ case "not_ready":
69
+ case "max_sessions":
70
+ return 400;
71
+ }
72
+ }
73
+ function readCreateBody(raw) {
74
+ if (!isRecord(raw)) {
75
+ return undefined;
76
+ }
77
+ const projectId = readStringField(raw, "projectId");
78
+ if (!projectId) {
79
+ return undefined;
80
+ }
81
+ const promptValue = raw.prompt;
82
+ if (promptValue !== undefined && typeof promptValue !== "string") {
83
+ return undefined;
84
+ }
85
+ const prompt = typeof promptValue === "string" ? promptValue : undefined;
86
+ return { projectId, ...(prompt === undefined ? {} : { prompt }) };
87
+ }
88
+ function readSendBody(raw) {
89
+ if (!isRecord(raw)) {
90
+ return undefined;
91
+ }
92
+ const text = readStringField(raw, "text");
93
+ if (!text) {
94
+ return undefined;
95
+ }
96
+ return { text };
97
+ }
98
+ async function readRequestBody(request, response) {
99
+ try {
100
+ return await readJsonBody(request);
101
+ }
102
+ catch (error) {
103
+ if (error instanceof AsyncHttpBodyParseError) {
104
+ sendError(response, 400, "invalid request body");
105
+ return undefined;
106
+ }
107
+ if (error instanceof AsyncHttpBodyTooLargeError) {
108
+ sendError(response, 413, "request body too large");
109
+ return undefined;
110
+ }
111
+ throw error;
112
+ }
113
+ }
114
+ function handleManagerError(response, error, fallbackMessage) {
115
+ if (error instanceof AsyncSessionManagerError) {
116
+ sendError(response, mapSessionErrorStatus(error), error.message);
117
+ return;
118
+ }
119
+ sendError(response, 500, fallbackMessage);
120
+ }
121
+ function serializeSession(session) {
122
+ return { ...session };
123
+ }
124
+ export async function startAsyncHttpServer(options) {
125
+ const server = createServer((request, response) => {
126
+ void (async () => {
127
+ try {
128
+ const method = request.method ?? "GET";
129
+ const url = new URL(request.url ?? "/", `http://${options.host}:${options.port}`);
130
+ if (url.pathname === "/healthz") {
131
+ sendOk(response, 200, { status: "ok" });
132
+ return;
133
+ }
134
+ if (url.pathname.startsWith("/v1/") && !isAuthorized(request, options.authToken)) {
135
+ response.setHeader("www-authenticate", 'Bearer realm="tau-async"');
136
+ sendError(response, 401, "unauthorized");
137
+ return;
138
+ }
139
+ if (url.pathname === "/v1/sessions" && method === "POST") {
140
+ try {
141
+ const rawBody = await readRequestBody(request, response);
142
+ if (rawBody === undefined) {
143
+ return;
144
+ }
145
+ const parsed = readCreateBody(rawBody);
146
+ if (!parsed) {
147
+ sendError(response, 400, "invalid request body");
148
+ return;
149
+ }
150
+ const session = await options.sessionManager.createSession(parsed);
151
+ sendOk(response, 201, { session: serializeSession(session) });
152
+ }
153
+ catch (error) {
154
+ handleManagerError(response, error, "failed to create session");
155
+ }
156
+ return;
157
+ }
158
+ if (url.pathname === "/v1/sessions" && method === "GET") {
159
+ const sessions = options.sessionManager.listSessions().map(serializeSession);
160
+ sendOk(response, 200, { sessions });
161
+ return;
162
+ }
163
+ const route = parseSessionPath(url.pathname);
164
+ if (route === "invalid") {
165
+ sendError(response, 400, "invalid session id");
166
+ return;
167
+ }
168
+ if (!route) {
169
+ sendError(response, 404, "not found");
170
+ return;
171
+ }
172
+ if (route.route === "session" && method === "GET") {
173
+ const session = options.sessionManager.getSession(route.sessionId);
174
+ if (!session) {
175
+ sendError(response, 404, "session not found");
176
+ return;
177
+ }
178
+ sendOk(response, 200, { session: serializeSession(session) });
179
+ return;
180
+ }
181
+ if (route.route === "logs" && method === "GET") {
182
+ const logs = options.sessionManager.getLogs(route.sessionId);
183
+ if (!logs) {
184
+ sendError(response, 404, "session not found");
185
+ return;
186
+ }
187
+ sendOk(response, 200, { logs });
188
+ return;
189
+ }
190
+ if (route.route === "messages" && method === "POST") {
191
+ try {
192
+ const rawBody = await readRequestBody(request, response);
193
+ if (rawBody === undefined) {
194
+ return;
195
+ }
196
+ const parsed = readSendBody(rawBody);
197
+ if (!parsed) {
198
+ sendError(response, 400, "invalid request body");
199
+ return;
200
+ }
201
+ const session = await options.sessionManager.sendMessage(route.sessionId, parsed.text);
202
+ sendOk(response, 200, { session: serializeSession(session) });
203
+ }
204
+ catch (error) {
205
+ handleManagerError(response, error, "failed to send message");
206
+ }
207
+ return;
208
+ }
209
+ if (route.route === "cancel" && method === "POST") {
210
+ try {
211
+ const session = await options.sessionManager.cancelSession(route.sessionId);
212
+ sendOk(response, 200, { session: serializeSession(session) });
213
+ }
214
+ catch (error) {
215
+ handleManagerError(response, error, "failed to cancel session");
216
+ }
217
+ return;
218
+ }
219
+ sendError(response, 405, "method not allowed");
220
+ }
221
+ catch {
222
+ if (!response.headersSent) {
223
+ sendError(response, 500, "internal server error");
224
+ return;
225
+ }
226
+ if (!response.writableEnded) {
227
+ response.end();
228
+ }
229
+ }
230
+ })();
231
+ });
232
+ await new Promise((resolvePromise, rejectPromise) => {
233
+ server.once("error", rejectPromise);
234
+ server.listen(options.port, options.host, () => {
235
+ server.off("error", rejectPromise);
236
+ resolvePromise();
237
+ });
238
+ });
239
+ const address = server.address();
240
+ if (!address || typeof address === "string") {
241
+ throw new Error("failed to resolve async server address");
242
+ }
243
+ const host = address.address;
244
+ const port = address.port;
245
+ return {
246
+ host,
247
+ port,
248
+ baseUrl: `http://${host}:${port}`,
249
+ close: () => new Promise((resolvePromise, rejectPromise) => {
250
+ server.close((error) => {
251
+ if (error) {
252
+ rejectPromise(error);
253
+ return;
254
+ }
255
+ resolvePromise();
256
+ });
257
+ }),
258
+ };
259
+ }
260
+ //# sourceMappingURL=http_server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http_server.js","sourceRoot":"","sources":["../../../src/core/async/http_server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { AsyncCliError, printAsyncHelp, runAsyncCommand } from "./cli.js";
2
+ export { isRecord, readJsonBody, readStringField, sendError, sendJson, sendOk, } from "./http_protocol.js";
3
+ export { startAsyncHttpServer } from "./http_server.js";
4
+ export { AsyncDaemonConfigError, loadAsyncDaemonConfig } from "./server_config.js";
5
+ export { AsyncSessionManagerError, createAsyncSessionManager } from "./session_manager.js";
6
+ export { startAsyncTelegramAdapter } from "./telegram.js";
7
+ export { prepareWorkspace } from "./workspace.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/async/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAO1E,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,SAAS,EACT,QAAQ,EACR,MAAM,GACP,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAUnF,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAO3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAO1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,282 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ export class AsyncDaemonConfigError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "AsyncDaemonConfigError";
7
+ }
8
+ }
9
+ function isRecord(value) {
10
+ return typeof value === "object" && value !== null && !Array.isArray(value);
11
+ }
12
+ function isPositiveInteger(value) {
13
+ return (typeof value === "number" && Number.isInteger(value) && Number.isFinite(value) && value > 0);
14
+ }
15
+ function parseAsyncIdList(raw, fieldPath, sourceLabel) {
16
+ if (!Array.isArray(raw)) {
17
+ return { errors: [`${sourceLabel}: ${fieldPath} must be an array of integers.`] };
18
+ }
19
+ const values = [];
20
+ for (const entry of raw) {
21
+ if (typeof entry !== "number" || !Number.isFinite(entry) || !Number.isInteger(entry)) {
22
+ return { errors: [`${sourceLabel}: ${fieldPath} must be an array of integers.`] };
23
+ }
24
+ values.push(entry);
25
+ }
26
+ return { values, errors: [] };
27
+ }
28
+ function parseTelegramConfig(raw, sourceLabel) {
29
+ if (raw === undefined) {
30
+ return { errors: [] };
31
+ }
32
+ if (!isRecord(raw)) {
33
+ return { errors: [`${sourceLabel}: telegram must be an object.`] };
34
+ }
35
+ const data = raw;
36
+ const config = {};
37
+ const errors = [];
38
+ if (data.botToken !== undefined) {
39
+ if (typeof data.botToken === "string" && data.botToken.trim()) {
40
+ config.botToken = data.botToken.trim();
41
+ }
42
+ else {
43
+ errors.push(`${sourceLabel}: telegram.botToken must be a non-empty string.`);
44
+ }
45
+ }
46
+ if (data.allowedUserIds !== undefined) {
47
+ const parsed = parseAsyncIdList(data.allowedUserIds, "telegram.allowedUserIds", sourceLabel);
48
+ if (parsed.values) {
49
+ config.allowedUserIds = parsed.values;
50
+ }
51
+ errors.push(...parsed.errors);
52
+ }
53
+ if (data.allowedChatIds !== undefined) {
54
+ const parsed = parseAsyncIdList(data.allowedChatIds, "telegram.allowedChatIds", sourceLabel);
55
+ if (parsed.values) {
56
+ config.allowedChatIds = parsed.values;
57
+ }
58
+ errors.push(...parsed.errors);
59
+ }
60
+ if (data.defaultProjectId !== undefined) {
61
+ if (typeof data.defaultProjectId === "string" && data.defaultProjectId.trim()) {
62
+ config.defaultProjectId = data.defaultProjectId.trim();
63
+ }
64
+ else {
65
+ errors.push(`${sourceLabel}: telegram.defaultProjectId must be a non-empty string.`);
66
+ }
67
+ }
68
+ if (data.pollIntervalMs !== undefined) {
69
+ if (isPositiveInteger(data.pollIntervalMs)) {
70
+ config.pollIntervalMs = data.pollIntervalMs;
71
+ }
72
+ else {
73
+ errors.push(`${sourceLabel}: telegram.pollIntervalMs must be a positive integer.`);
74
+ }
75
+ }
76
+ if (data.requestTimeoutSeconds !== undefined) {
77
+ if (isPositiveInteger(data.requestTimeoutSeconds)) {
78
+ config.requestTimeoutSeconds = data.requestTimeoutSeconds;
79
+ }
80
+ else {
81
+ errors.push(`${sourceLabel}: telegram.requestTimeoutSeconds must be a positive integer.`);
82
+ }
83
+ }
84
+ if (Object.keys(config).length === 0) {
85
+ return { errors };
86
+ }
87
+ return { config, errors };
88
+ }
89
+ function parseRiskLevel(raw) {
90
+ if (raw === "read-only" || raw === "read-write") {
91
+ return raw;
92
+ }
93
+ return undefined;
94
+ }
95
+ function isGithubRepoRef(value) {
96
+ return /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(value);
97
+ }
98
+ function parseProject(raw, sourceLabel, projectId, configDir) {
99
+ if (!isRecord(raw)) {
100
+ return { errors: [`${sourceLabel}: projects.${projectId} must be an object.`] };
101
+ }
102
+ const data = raw;
103
+ const errors = [];
104
+ const repoRaw = data.repo;
105
+ if (typeof repoRaw !== "string" || !repoRaw.trim()) {
106
+ errors.push(`${sourceLabel}: projects.${projectId}.repo must be a non-empty string.`);
107
+ }
108
+ else if (!isGithubRepoRef(repoRaw.trim())) {
109
+ errors.push(`${sourceLabel}: projects.${projectId}.repo must be in owner/repo format (GitHub).`);
110
+ }
111
+ const config = {
112
+ repo: typeof repoRaw === "string" ? repoRaw.trim() : "",
113
+ };
114
+ if (data.ref !== undefined) {
115
+ if (typeof data.ref === "string" && data.ref.trim()) {
116
+ config.ref = data.ref.trim();
117
+ }
118
+ else {
119
+ errors.push(`${sourceLabel}: projects.${projectId}.ref must be a non-empty string.`);
120
+ }
121
+ }
122
+ if (data.workspaceRoot !== undefined) {
123
+ if (typeof data.workspaceRoot === "string" && data.workspaceRoot.trim()) {
124
+ config.workspaceRoot = resolve(configDir, data.workspaceRoot.trim());
125
+ }
126
+ else {
127
+ errors.push(`${sourceLabel}: projects.${projectId}.workspaceRoot must be a non-empty string.`);
128
+ }
129
+ }
130
+ if (data.bootstrapCommands !== undefined) {
131
+ if (!Array.isArray(data.bootstrapCommands) || data.bootstrapCommands.length === 0) {
132
+ errors.push(`${sourceLabel}: projects.${projectId}.bootstrapCommands must be a non-empty string array.`);
133
+ }
134
+ else {
135
+ const commands = [];
136
+ for (const command of data.bootstrapCommands) {
137
+ if (typeof command !== "string" || !command.trim()) {
138
+ errors.push(`${sourceLabel}: projects.${projectId}.bootstrapCommands must be a non-empty string array.`);
139
+ break;
140
+ }
141
+ commands.push(command);
142
+ }
143
+ if (commands.length > 0) {
144
+ config.bootstrapCommands = commands;
145
+ }
146
+ }
147
+ }
148
+ if (data.persona !== undefined) {
149
+ if (typeof data.persona === "string" && data.persona.trim()) {
150
+ config.persona = data.persona.trim();
151
+ }
152
+ else {
153
+ errors.push(`${sourceLabel}: projects.${projectId}.persona must be a non-empty string.`);
154
+ }
155
+ }
156
+ if (data.riskLevel !== undefined) {
157
+ const riskLevel = parseRiskLevel(data.riskLevel);
158
+ if (riskLevel) {
159
+ config.riskLevel = riskLevel;
160
+ }
161
+ else {
162
+ errors.push(`${sourceLabel}: projects.${projectId}.riskLevel must be read-only or read-write.`);
163
+ }
164
+ }
165
+ if (data.sandbox !== undefined) {
166
+ if (typeof data.sandbox === "boolean") {
167
+ config.sandbox = data.sandbox;
168
+ }
169
+ else {
170
+ errors.push(`${sourceLabel}: projects.${projectId}.sandbox must be a boolean.`);
171
+ }
172
+ }
173
+ if (data.noAgentContextFiles !== undefined) {
174
+ if (typeof data.noAgentContextFiles === "boolean") {
175
+ config.noAgentContextFiles = data.noAgentContextFiles;
176
+ }
177
+ else {
178
+ errors.push(`${sourceLabel}: projects.${projectId}.noAgentContextFiles must be a boolean.`);
179
+ }
180
+ }
181
+ if (errors.length > 0) {
182
+ return { errors };
183
+ }
184
+ return { config, errors: [] };
185
+ }
186
+ function parseProjects(raw, sourceLabel, configDir) {
187
+ if (!isRecord(raw)) {
188
+ return { projects: {}, errors: [`${sourceLabel}: projects must be an object.`] };
189
+ }
190
+ const errors = [];
191
+ const projects = {};
192
+ for (const [projectId, value] of Object.entries(raw)) {
193
+ if (!projectId.trim()) {
194
+ errors.push(`${sourceLabel}: projects keys must be non-empty.`);
195
+ continue;
196
+ }
197
+ const parsed = parseProject(value, sourceLabel, projectId, configDir);
198
+ if (parsed.config) {
199
+ projects[projectId] = parsed.config;
200
+ }
201
+ errors.push(...parsed.errors);
202
+ }
203
+ return { projects, errors };
204
+ }
205
+ export function loadAsyncDaemonConfig(configFilePath) {
206
+ const resolvedPath = resolve(configFilePath);
207
+ const sourceLabel = `async daemon config (${resolvedPath})`;
208
+ const configDir = dirname(resolvedPath);
209
+ let parsed;
210
+ try {
211
+ parsed = JSON.parse(readFileSync(resolvedPath, "utf8"));
212
+ }
213
+ catch (error) {
214
+ throw new AsyncDaemonConfigError(`${sourceLabel}: failed to read/parse json: ${error instanceof Error ? error.message : String(error)}`);
215
+ }
216
+ if (!isRecord(parsed)) {
217
+ throw new AsyncDaemonConfigError(`${sourceLabel}: config must be an object.`);
218
+ }
219
+ const data = parsed;
220
+ const errors = [];
221
+ let host = "127.0.0.1";
222
+ if (data.host !== undefined) {
223
+ if (typeof data.host === "string" && data.host.trim()) {
224
+ host = data.host.trim();
225
+ }
226
+ else {
227
+ errors.push(`${sourceLabel}: host must be a non-empty string.`);
228
+ }
229
+ }
230
+ let port = 7788;
231
+ if (data.port !== undefined) {
232
+ if (isPositiveInteger(data.port) && data.port <= 65535) {
233
+ port = data.port;
234
+ }
235
+ else {
236
+ errors.push(`${sourceLabel}: port must be a positive integer <= 65535.`);
237
+ }
238
+ }
239
+ let authToken;
240
+ if (data.authToken !== undefined) {
241
+ if (typeof data.authToken === "string" && data.authToken.trim()) {
242
+ authToken = data.authToken.trim();
243
+ }
244
+ else {
245
+ errors.push(`${sourceLabel}: authToken must be a non-empty string.`);
246
+ }
247
+ }
248
+ let maxSessions;
249
+ if (data.maxSessions !== undefined) {
250
+ if (isPositiveInteger(data.maxSessions)) {
251
+ maxSessions = data.maxSessions;
252
+ }
253
+ else {
254
+ errors.push(`${sourceLabel}: maxSessions must be a positive integer.`);
255
+ }
256
+ }
257
+ let workspaceRoot = resolve(configDir, ".tau", "async-workspaces");
258
+ if (data.workspaceRoot !== undefined) {
259
+ if (typeof data.workspaceRoot === "string" && data.workspaceRoot.trim()) {
260
+ workspaceRoot = resolve(configDir, data.workspaceRoot.trim());
261
+ }
262
+ else {
263
+ errors.push(`${sourceLabel}: workspaceRoot must be a non-empty string.`);
264
+ }
265
+ }
266
+ const projectsResult = parseProjects(data.projects, sourceLabel, configDir);
267
+ const telegramResult = parseTelegramConfig(data.telegram, sourceLabel);
268
+ errors.push(...projectsResult.errors, ...telegramResult.errors);
269
+ if (errors.length > 0) {
270
+ throw new AsyncDaemonConfigError(errors.join("\n"));
271
+ }
272
+ return {
273
+ host,
274
+ port,
275
+ authToken,
276
+ maxSessions,
277
+ workspaceRoot,
278
+ ...(telegramResult.config ? { telegram: telegramResult.config } : {}),
279
+ projects: projectsResult.projects,
280
+ };
281
+ }
282
+ //# sourceMappingURL=server_config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server_config.js","sourceRoot":"","sources":["../../../src/core/async/server_config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAe7C,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAC5F,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAY,EACZ,SAAiB,EACjB,WAAmB;IAEnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,WAAW,KAAK,SAAS,gCAAgC,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrF,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,WAAW,KAAK,SAAS,gCAAgC,CAAC,EAAE,CAAC;QACpF,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAC1B,GAAY,EACZ,WAAmB;IAEnB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,WAAW,+BAA+B,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,IAAI,GAAG,GAA8B,CAAC;IAC5C,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9D,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,iDAAiD,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,yBAAyB,EAAE,WAAW,CAAC,CAAC;QAC7F,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,yBAAyB,EAAE,WAAW,CAAC,CAAC;QAC7F,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACxC,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9E,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,yDAAyD,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,uDAAuD,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC7C,IAAI,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,8DAA8D,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CACnB,GAAY,EACZ,WAAmB,EACnB,SAAiB,EACjB,SAAiB;IAEjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,WAAW,cAAc,SAAS,qBAAqB,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,IAAI,GAAG,GAA8B,CAAC;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,cAAc,SAAS,mCAAmC,CAAC,CAAC;IACxF,CAAC;SAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CACT,GAAG,WAAW,cAAc,SAAS,8CAA8C,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAuB;QACjC,IAAI,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;KACxD,CAAC;IAEF,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,cAAc,SAAS,kCAAkC,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;YACxE,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CACT,GAAG,WAAW,cAAc,SAAS,4CAA4C,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,MAAM,CAAC,IAAI,CACT,GAAG,WAAW,cAAc,SAAS,sDAAsD,CAC5F,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnD,MAAM,CAAC,IAAI,CACT,GAAG,WAAW,cAAc,SAAS,sDAAsD,CAC5F,CAAC;oBACF,MAAM;gBACR,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,iBAAiB,GAAG,QAAQ,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5D,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,cAAc,SAAS,sCAAsC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CACT,GAAG,WAAW,cAAc,SAAS,6CAA6C,CACnF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,cAAc,SAAS,6BAA6B,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,OAAO,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,cAAc,SAAS,yCAAyC,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CACpB,GAAY,EACZ,WAAmB,EACnB,SAAiB;IAEjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,WAAW,+BAA+B,CAAC,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAuC,EAAE,CAAC;IAExD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,oCAAoC,CAAC,CAAC;YAChE,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,QAAQ,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACtC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,cAAsB;IAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,wBAAwB,YAAY,GAAG,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAExC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAY,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,sBAAsB,CAC9B,GAAG,WAAW,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,sBAAsB,CAAC,GAAG,WAAW,6BAA6B,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,IAAI,GAAG,MAAiC,CAAC;IAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,IAAI,GAAG,WAAW,CAAC;IACvB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACtD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,oCAAoC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;YACvD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,6CAA6C,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,IAAI,SAA6B,CAAC;IAClC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,yCAAyC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,IAAI,WAA+B,CAAC;IACpC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,2CAA2C,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,IAAI,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;YACxE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,6CAA6C,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACvE,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEhE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,SAAS;QACT,WAAW;QACX,aAAa;QACb,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,QAAQ,EAAE,cAAc,CAAC,QAAQ;KAClC,CAAC;AACJ,CAAC"}