@highstate/backend 0.7.4 → 0.7.8

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,11 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ export {
9
+ __require
10
+ };
11
+ //# sourceMappingURL=chunk-DGUM43GV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,290 @@
1
+ // src/common/utils.ts
2
+ import { z } from "zod";
3
+ async function runWithRetryOnError(runner, tryHandleError, maxRetries = 1) {
4
+ let lastError;
5
+ for (let i = 0; i < maxRetries + 1; i++) {
6
+ try {
7
+ return await runner();
8
+ } catch (e) {
9
+ lastError = e;
10
+ if (await tryHandleError(e)) {
11
+ continue;
12
+ }
13
+ throw e;
14
+ }
15
+ }
16
+ throw lastError;
17
+ }
18
+ var AbortError = class extends Error {
19
+ constructor(options) {
20
+ super("Operation aborted", options);
21
+ }
22
+ };
23
+ function isAbortError(error) {
24
+ return error instanceof Error && error.name === "AbortError";
25
+ }
26
+ var abortMessagePatterns = ["Operation aborted", "Command was killed with SIGINT"];
27
+ function isAbortErrorLike(error) {
28
+ if (error instanceof Error) {
29
+ return abortMessagePatterns.some((pattern) => error.message.includes(pattern));
30
+ }
31
+ return false;
32
+ }
33
+ function tryWrapAbortErrorLike(error) {
34
+ if (isAbortErrorLike(error)) {
35
+ return new AbortError({ cause: error });
36
+ }
37
+ return error;
38
+ }
39
+ var stringArrayType = z.string().transform((args) => args.split(",").map((arg) => arg.trim()));
40
+ function errorToString(error) {
41
+ if (error instanceof Error) {
42
+ return error.stack || error.message;
43
+ }
44
+ return JSON.stringify(error);
45
+ }
46
+ function createAsyncBatcher(fn, { waitMs = 100, maxWaitTimeMs = 1e3 } = {}) {
47
+ let batch = [];
48
+ let activeTimeout = null;
49
+ let maxWaitTimeout = null;
50
+ let firstCallTimestamp = null;
51
+ async function processBatch() {
52
+ if (batch.length === 0) return;
53
+ const currentBatch = batch;
54
+ batch = [];
55
+ await fn(currentBatch);
56
+ if (maxWaitTimeout) {
57
+ clearTimeout(maxWaitTimeout);
58
+ maxWaitTimeout = null;
59
+ }
60
+ firstCallTimestamp = null;
61
+ }
62
+ function schedule() {
63
+ if (activeTimeout) clearTimeout(activeTimeout);
64
+ activeTimeout = setTimeout(() => {
65
+ activeTimeout = null;
66
+ void processBatch();
67
+ }, waitMs);
68
+ if (!firstCallTimestamp) {
69
+ firstCallTimestamp = Date.now();
70
+ maxWaitTimeout = setTimeout(() => {
71
+ if (activeTimeout) clearTimeout(activeTimeout);
72
+ activeTimeout = null;
73
+ void processBatch();
74
+ }, maxWaitTimeMs);
75
+ }
76
+ }
77
+ return {
78
+ /**
79
+ * Add an item to the batch.
80
+ */
81
+ call(item) {
82
+ batch.push(item);
83
+ schedule();
84
+ },
85
+ /**
86
+ * Immediately flush the pending batch (if any).
87
+ */
88
+ async flush() {
89
+ if (activeTimeout) {
90
+ clearTimeout(activeTimeout);
91
+ activeTimeout = null;
92
+ }
93
+ if (maxWaitTimeout) {
94
+ clearTimeout(maxWaitTimeout);
95
+ maxWaitTimeout = null;
96
+ }
97
+ await processBatch();
98
+ }
99
+ };
100
+ }
101
+
102
+ // src/common/pulumi.ts
103
+ import { BetterLock } from "better-lock";
104
+ var LocalPulumiHost = class _LocalPulumiHost {
105
+ constructor(logger) {
106
+ this.logger = logger;
107
+ }
108
+ lock = new BetterLock();
109
+ async getCurrentUser() {
110
+ const { LocalWorkspace } = await import("@pulumi/pulumi/automation/index.js");
111
+ const workspace = await LocalWorkspace.create({});
112
+ try {
113
+ return await workspace.whoAmI();
114
+ } catch (error) {
115
+ this.logger.error({ msg: "failed to get current user", error });
116
+ return null;
117
+ }
118
+ }
119
+ async runEmpty(options, fn, signal) {
120
+ const { projectId, pulumiProjectName, pulumiStackName, envVars } = options;
121
+ return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {
122
+ const { LocalWorkspace } = await import("@pulumi/pulumi/automation/index.js");
123
+ const stack = await LocalWorkspace.createOrSelectStack(
124
+ {
125
+ projectName: pulumiProjectName,
126
+ stackName: pulumiStackName,
127
+ program: () => Promise.resolve()
128
+ },
129
+ {
130
+ projectSettings: {
131
+ name: pulumiProjectName,
132
+ runtime: "nodejs"
133
+ },
134
+ envVars: {
135
+ PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),
136
+ PULUMI_K8S_AWAIT_ALL: "true",
137
+ ...envVars
138
+ }
139
+ }
140
+ );
141
+ signal?.throwIfAborted();
142
+ try {
143
+ return await runWithRetryOnError(
144
+ () => fn(stack),
145
+ (error) => this.tryUnlockStack(stack, error)
146
+ );
147
+ } catch (e) {
148
+ if (e instanceof Error && e.message.includes("canceled")) {
149
+ throw new AbortError();
150
+ }
151
+ throw e;
152
+ }
153
+ });
154
+ }
155
+ async runLocal(options, fn, signal) {
156
+ const { projectId, pulumiProjectName, pulumiStackName, projectPath, stackConfig, envVars } = options;
157
+ return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {
158
+ const { LocalWorkspace } = await import("@pulumi/pulumi/automation/index.js");
159
+ const stack = await LocalWorkspace.createOrSelectStack(
160
+ {
161
+ stackName: pulumiStackName,
162
+ workDir: projectPath
163
+ },
164
+ {
165
+ projectSettings: {
166
+ name: pulumiProjectName,
167
+ runtime: "nodejs"
168
+ },
169
+ stackSettings: stackConfig ? {
170
+ [pulumiStackName]: {
171
+ config: stackConfig
172
+ }
173
+ } : void 0,
174
+ envVars: {
175
+ PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),
176
+ PULUMI_K8S_AWAIT_ALL: "true",
177
+ ...envVars
178
+ }
179
+ }
180
+ );
181
+ signal?.throwIfAborted();
182
+ try {
183
+ return await runWithRetryOnError(
184
+ () => fn(stack),
185
+ (error) => this.tryUnlockStack(stack, error)
186
+ );
187
+ } catch (e) {
188
+ if (e instanceof Error && e.message.includes("canceled")) {
189
+ throw new AbortError();
190
+ }
191
+ throw e;
192
+ }
193
+ });
194
+ }
195
+ sharedPassword = process.env.PULUMI_CONFIG_PASSPHRASE ?? "";
196
+ passwords = /* @__PURE__ */ new Map();
197
+ hasPassword(projectId) {
198
+ return !!this.sharedPassword || this.passwords.has(projectId);
199
+ }
200
+ setPassword(projectId, password) {
201
+ this.passwords.set(projectId, password);
202
+ }
203
+ removePassword(projectId) {
204
+ this.passwords.delete(projectId);
205
+ }
206
+ getPassword(projectId) {
207
+ return this.sharedPassword || this.passwords.get(projectId) || "";
208
+ }
209
+ async tryUnlockStack(stack, error) {
210
+ if (error instanceof Error && error.message.includes("the stack is currently locked")) {
211
+ this.logger.warn({ stackName: stack.name }, "inlocking stack");
212
+ await stack.cancel();
213
+ return true;
214
+ }
215
+ return false;
216
+ }
217
+ static create(logger) {
218
+ return new _LocalPulumiHost(logger.child({ service: "LocalPulumiHost" }));
219
+ }
220
+ };
221
+ function valueToString(value) {
222
+ if (typeof value === "string") {
223
+ return value;
224
+ }
225
+ return JSON.stringify(value);
226
+ }
227
+ function stringToValue(value) {
228
+ try {
229
+ return JSON.parse(value);
230
+ } catch {
231
+ return value;
232
+ }
233
+ }
234
+ function updateResourceCount(opType, currentCount) {
235
+ switch (opType) {
236
+ case "same":
237
+ case "create":
238
+ case "update":
239
+ case "replace":
240
+ case "create-replacement":
241
+ case "import":
242
+ case "import-replacement":
243
+ return currentCount + 1;
244
+ case "delete":
245
+ case "delete-replaced":
246
+ case "discard":
247
+ case "discard-replaced":
248
+ case "remove-pending-replace":
249
+ return currentCount - 1;
250
+ case "refresh":
251
+ case "read-replacement":
252
+ case "read":
253
+ return currentCount;
254
+ default:
255
+ throw new Error(`Unknown operation type: ${opType}`);
256
+ }
257
+ }
258
+
259
+ // src/common/local.ts
260
+ import { basename } from "node:path";
261
+ import { findWorkspaceDir, readPackageJSON } from "pkg-types";
262
+ async function resolveMainLocalProject(projectPath, projectName) {
263
+ if (!projectPath) {
264
+ projectPath = await findWorkspaceDir();
265
+ }
266
+ if (!projectName) {
267
+ const packageJson = await readPackageJSON(projectPath);
268
+ projectName = packageJson.name;
269
+ }
270
+ if (!projectName) {
271
+ projectName = basename(projectPath);
272
+ }
273
+ return [projectPath, projectName];
274
+ }
275
+
276
+ export {
277
+ runWithRetryOnError,
278
+ isAbortError,
279
+ isAbortErrorLike,
280
+ tryWrapAbortErrorLike,
281
+ stringArrayType,
282
+ errorToString,
283
+ createAsyncBatcher,
284
+ LocalPulumiHost,
285
+ valueToString,
286
+ stringToValue,
287
+ updateResourceCount,
288
+ resolveMainLocalProject
289
+ };
290
+ //# sourceMappingURL=chunk-EQ4LMS7B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/utils.ts","../src/common/pulumi.ts","../src/common/local.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport async function runWithRetryOnError<T>(\n runner: () => T | Promise<T>,\n tryHandleError: (error: unknown) => boolean | Promise<boolean>,\n maxRetries: number = 1,\n): Promise<T> {\n let lastError: unknown\n\n for (let i = 0; i < maxRetries + 1; i++) {\n try {\n return await runner()\n } catch (e) {\n lastError = e\n\n if (await tryHandleError(e)) {\n continue\n }\n\n throw e\n }\n }\n\n throw lastError\n}\n\nexport class AbortError extends Error {\n constructor(options?: ErrorOptions) {\n super(\"Operation aborted\", options)\n }\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\"\n}\n\nconst abortMessagePatterns = [\"Operation aborted\", \"Command was killed with SIGINT\"]\n\nexport function isAbortErrorLike(error: unknown): boolean {\n if (error instanceof Error) {\n return abortMessagePatterns.some(pattern => error.message.includes(pattern))\n }\n\n return false\n}\n\nexport function tryWrapAbortErrorLike(error: unknown): unknown {\n if (isAbortErrorLike(error)) {\n return new AbortError({ cause: error })\n }\n\n return error\n}\n\nexport const stringArrayType = z.string().transform(args => args.split(\",\").map(arg => arg.trim()))\n\nexport function errorToString(error: unknown): string {\n if (error instanceof Error) {\n return error.stack || error.message\n }\n\n return JSON.stringify(error)\n}\n\nexport type AsyncBatcherOptions = {\n waitMs?: number\n maxWaitTimeMs?: number\n}\n\nexport function createAsyncBatcher<T>(\n fn: (items: T[]) => Promise<void>,\n { waitMs = 100, maxWaitTimeMs = 1000 }: AsyncBatcherOptions = {},\n) {\n let batch: T[] = []\n let activeTimeout: NodeJS.Timeout | null = null\n let maxWaitTimeout: NodeJS.Timeout | null = null\n let firstCallTimestamp: number | null = null\n\n async function processBatch() {\n if (batch.length === 0) return\n\n const currentBatch = batch\n batch = [] // Reset batch before async call\n\n await fn(currentBatch)\n\n // Clear max wait timer since batch has been processed\n if (maxWaitTimeout) {\n clearTimeout(maxWaitTimeout)\n maxWaitTimeout = null\n }\n firstCallTimestamp = null\n }\n\n function schedule() {\n if (activeTimeout) clearTimeout(activeTimeout)\n activeTimeout = setTimeout(() => {\n activeTimeout = null\n void processBatch()\n }, waitMs)\n\n // Ensure batch is executed within maxWaitTimeMs\n if (!firstCallTimestamp) {\n firstCallTimestamp = Date.now()\n maxWaitTimeout = setTimeout(() => {\n if (activeTimeout) clearTimeout(activeTimeout)\n activeTimeout = null\n void processBatch()\n }, maxWaitTimeMs)\n }\n }\n\n return {\n /**\n * Add an item to the batch.\n */\n call(item: T): void {\n batch.push(item)\n schedule()\n },\n\n /**\n * Immediately flush the pending batch (if any).\n */\n async flush(): Promise<void> {\n if (activeTimeout) {\n clearTimeout(activeTimeout)\n activeTimeout = null\n }\n if (maxWaitTimeout) {\n clearTimeout(maxWaitTimeout)\n maxWaitTimeout = null\n }\n await processBatch()\n },\n }\n}\n","import type { ConfigMap, OpMap, OpType, Stack, WhoAmIResult } from \"@pulumi/pulumi/automation\"\nimport type { Logger } from \"pino\"\nimport { BetterLock } from \"better-lock\"\nimport { AbortError, runWithRetryOnError } from \"./utils\"\n\nexport type RunOptions = {\n projectId: string\n pulumiProjectName: string\n pulumiStackName: string\n envVars?: Record<string, string>\n}\n\nexport type RunLocalOptions = RunOptions & {\n projectPath: string\n stackConfig?: ConfigMap\n}\n\nexport class LocalPulumiHost {\n private lock = new BetterLock()\n\n private constructor(private readonly logger: Logger) {}\n\n async getCurrentUser(): Promise<WhoAmIResult | null> {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n const workspace = await LocalWorkspace.create({})\n\n try {\n return await workspace.whoAmI()\n } catch (error) {\n this.logger.error({ msg: \"failed to get current user\", error })\n\n return null\n }\n }\n\n async runEmpty<T>(\n options: RunOptions,\n fn: (stack: Stack) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n const { projectId, pulumiProjectName, pulumiStackName, envVars } = options\n\n return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n const stack = await LocalWorkspace.createOrSelectStack(\n {\n projectName: pulumiProjectName,\n stackName: pulumiStackName,\n program: () => Promise.resolve(),\n },\n {\n projectSettings: {\n name: pulumiProjectName,\n runtime: \"nodejs\",\n },\n envVars: {\n PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),\n PULUMI_K8S_AWAIT_ALL: \"true\",\n ...envVars,\n },\n },\n )\n\n signal?.throwIfAborted()\n\n try {\n return await runWithRetryOnError(\n () => fn(stack),\n error => this.tryUnlockStack(stack, error),\n )\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"canceled\")) {\n throw new AbortError()\n }\n\n throw e\n }\n })\n }\n\n async runLocal<T>(\n options: RunLocalOptions,\n fn: (stack: Stack) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n const { projectId, pulumiProjectName, pulumiStackName, projectPath, stackConfig, envVars } =\n options\n\n return await this.lock.acquire(`${pulumiProjectName}.${pulumiStackName}`, async () => {\n const { LocalWorkspace } = await import(\"@pulumi/pulumi/automation/index.js\")\n\n const stack = await LocalWorkspace.createOrSelectStack(\n {\n stackName: pulumiStackName,\n workDir: projectPath,\n },\n {\n projectSettings: {\n name: pulumiProjectName,\n runtime: \"nodejs\",\n },\n stackSettings: stackConfig\n ? {\n [pulumiStackName]: {\n config: stackConfig,\n },\n }\n : undefined,\n envVars: {\n PULUMI_CONFIG_PASSPHRASE: this.getPassword(projectId),\n PULUMI_K8S_AWAIT_ALL: \"true\",\n ...envVars,\n },\n },\n )\n\n signal?.throwIfAborted()\n\n try {\n return await runWithRetryOnError(\n () => fn(stack),\n error => this.tryUnlockStack(stack, error),\n )\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"canceled\")) {\n throw new AbortError()\n }\n\n throw e\n }\n })\n }\n\n private sharedPassword: string = process.env.PULUMI_CONFIG_PASSPHRASE ?? \"\"\n private passwords = new Map<string, string>()\n\n hasPassword(projectId: string) {\n return !!this.sharedPassword || this.passwords.has(projectId)\n }\n\n setPassword(projectId: string, password: string) {\n this.passwords.set(projectId, password)\n }\n\n removePassword(projectId: string) {\n this.passwords.delete(projectId)\n }\n\n private getPassword(projectId: string) {\n return this.sharedPassword || this.passwords.get(projectId) || \"\"\n }\n\n async tryUnlockStack(stack: Stack, error: unknown) {\n if (error instanceof Error && error.message.includes(\"the stack is currently locked\")) {\n // TODO: kill the process if the hostname matches the current hostname\n\n this.logger.warn({ stackName: stack.name }, \"inlocking stack\")\n await stack.cancel()\n return true\n }\n\n return false\n }\n\n static create(logger: Logger) {\n return new LocalPulumiHost(logger.child({ service: \"LocalPulumiHost\" }))\n }\n}\n\nexport function valueToString(value: unknown): string {\n if (typeof value === \"string\") {\n return value\n }\n\n return JSON.stringify(value)\n}\n\nexport function stringToValue(value: string): unknown {\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport function updateResourceCount(opType: OpType, currentCount: number): number {\n switch (opType) {\n case \"same\":\n case \"create\":\n case \"update\":\n case \"replace\":\n case \"create-replacement\":\n case \"import\":\n case \"import-replacement\":\n return currentCount + 1\n\n case \"delete\":\n case \"delete-replaced\":\n case \"discard\":\n case \"discard-replaced\":\n case \"remove-pending-replace\":\n return currentCount - 1\n\n case \"refresh\":\n case \"read-replacement\":\n case \"read\":\n return currentCount\n\n default:\n throw new Error(`Unknown operation type: ${opType as string}`)\n }\n}\n\nexport function calculateTotalResources(opMap: OpMap | undefined): number {\n if (!opMap) {\n return 0 // No operations imply no resources\n }\n\n let total = 0\n\n for (const [op, count] of Object.entries(opMap)) {\n const opType = op as OpType\n const value = count ?? 0\n\n total = updateResourceCount(opType, value)\n }\n\n return total\n}\n","import { basename } from \"node:path\"\nimport { findWorkspaceDir, readPackageJSON } from \"pkg-types\"\n\nexport async function resolveMainLocalProject(\n projectPath?: string,\n projectName?: string,\n): Promise<[projecPath: string, projectName: string]> {\n if (!projectPath) {\n projectPath = await findWorkspaceDir()\n }\n\n if (!projectName) {\n const packageJson = await readPackageJSON(projectPath)\n projectName = packageJson.name\n }\n\n if (!projectName) {\n projectName = basename(projectPath)\n }\n\n return [projectPath, projectName]\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAElB,eAAsB,oBACpB,QACA,gBACA,aAAqB,GACT;AACZ,MAAI;AAEJ,WAAS,IAAI,GAAG,IAAI,aAAa,GAAG,KAAK;AACvC,QAAI;AACF,aAAO,MAAM,OAAO;AAAA,IACtB,SAAS,GAAG;AACV,kBAAY;AAEZ,UAAI,MAAM,eAAe,CAAC,GAAG;AAC3B;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM;AACR;AAEO,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAY,SAAwB;AAClC,UAAM,qBAAqB,OAAO;AAAA,EACpC;AACF;AAEO,SAAS,aAAa,OAAyB;AACpD,SAAO,iBAAiB,SAAS,MAAM,SAAS;AAClD;AAEA,IAAM,uBAAuB,CAAC,qBAAqB,gCAAgC;AAE5E,SAAS,iBAAiB,OAAyB;AACxD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,qBAAqB,KAAK,aAAW,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,EAC7E;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAyB;AAC7D,MAAI,iBAAiB,KAAK,GAAG;AAC3B,WAAO,IAAI,WAAW,EAAE,OAAO,MAAM,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAEO,IAAM,kBAAkB,EAAE,OAAO,EAAE,UAAU,UAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,SAAO,IAAI,KAAK,CAAC,CAAC;AAE3F,SAAS,cAAc,OAAwB;AACpD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM,SAAS,MAAM;AAAA,EAC9B;AAEA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAOO,SAAS,mBACd,IACA,EAAE,SAAS,KAAK,gBAAgB,IAAK,IAAyB,CAAC,GAC/D;AACA,MAAI,QAAa,CAAC;AAClB,MAAI,gBAAuC;AAC3C,MAAI,iBAAwC;AAC5C,MAAI,qBAAoC;AAExC,iBAAe,eAAe;AAC5B,QAAI,MAAM,WAAW,EAAG;AAExB,UAAM,eAAe;AACrB,YAAQ,CAAC;AAET,UAAM,GAAG,YAAY;AAGrB,QAAI,gBAAgB;AAClB,mBAAa,cAAc;AAC3B,uBAAiB;AAAA,IACnB;AACA,yBAAqB;AAAA,EACvB;AAEA,WAAS,WAAW;AAClB,QAAI,cAAe,cAAa,aAAa;AAC7C,oBAAgB,WAAW,MAAM;AAC/B,sBAAgB;AAChB,WAAK,aAAa;AAAA,IACpB,GAAG,MAAM;AAGT,QAAI,CAAC,oBAAoB;AACvB,2BAAqB,KAAK,IAAI;AAC9B,uBAAiB,WAAW,MAAM;AAChC,YAAI,cAAe,cAAa,aAAa;AAC7C,wBAAgB;AAChB,aAAK,aAAa;AAAA,MACpB,GAAG,aAAa;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,KAAK,MAAe;AAClB,YAAM,KAAK,IAAI;AACf,eAAS;AAAA,IACX;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,QAAuB;AAC3B,UAAI,eAAe;AACjB,qBAAa,aAAa;AAC1B,wBAAgB;AAAA,MAClB;AACA,UAAI,gBAAgB;AAClB,qBAAa,cAAc;AAC3B,yBAAiB;AAAA,MACnB;AACA,YAAM,aAAa;AAAA,IACrB;AAAA,EACF;AACF;;;ACtIA,SAAS,kBAAkB;AAepB,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAGnB,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAF9C,OAAO,IAAI,WAAW;AAAA,EAI9B,MAAM,iBAA+C;AACnD,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,oCAAoC;AAC5E,UAAM,YAAY,MAAM,eAAe,OAAO,CAAC,CAAC;AAEhD,QAAI;AACF,aAAO,MAAM,UAAU,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,EAAE,KAAK,8BAA8B,MAAM,CAAC;AAE9D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SACA,IACA,QACY;AACZ,UAAM,EAAE,WAAW,mBAAmB,iBAAiB,QAAQ,IAAI;AAEnE,WAAO,MAAM,KAAK,KAAK,QAAQ,GAAG,iBAAiB,IAAI,eAAe,IAAI,YAAY;AACpF,YAAM,EAAE,eAAe,IAAI,MAAM,OAAO,oCAAoC;AAE5E,YAAM,QAAQ,MAAM,eAAe;AAAA,QACjC;AAAA,UACE,aAAa;AAAA,UACb,WAAW;AAAA,UACX,SAAS,MAAM,QAAQ,QAAQ;AAAA,QACjC;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,YACf,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,UACA,SAAS;AAAA,YACP,0BAA0B,KAAK,YAAY,SAAS;AAAA,YACpD,sBAAsB;AAAA,YACtB,GAAG;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,eAAe;AAEvB,UAAI;AACF,eAAO,MAAM;AAAA,UACX,MAAM,GAAG,KAAK;AAAA,UACd,WAAS,KAAK,eAAe,OAAO,KAAK;AAAA,QAC3C;AAAA,MACF,SAAS,GAAG;AACV,YAAI,aAAa,SAAS,EAAE,QAAQ,SAAS,UAAU,GAAG;AACxD,gBAAM,IAAI,WAAW;AAAA,QACvB;AAEA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SACJ,SACA,IACA,QACY;AACZ,UAAM,EAAE,WAAW,mBAAmB,iBAAiB,aAAa,aAAa,QAAQ,IACvF;AAEF,WAAO,MAAM,KAAK,KAAK,QAAQ,GAAG,iBAAiB,IAAI,eAAe,IAAI,YAAY;AACpF,YAAM,EAAE,eAAe,IAAI,MAAM,OAAO,oCAAoC;AAE5E,YAAM,QAAQ,MAAM,eAAe;AAAA,QACjC;AAAA,UACE,WAAW;AAAA,UACX,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,iBAAiB;AAAA,YACf,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,UACA,eAAe,cACX;AAAA,YACE,CAAC,eAAe,GAAG;AAAA,cACjB,QAAQ;AAAA,YACV;AAAA,UACF,IACA;AAAA,UACJ,SAAS;AAAA,YACP,0BAA0B,KAAK,YAAY,SAAS;AAAA,YACpD,sBAAsB;AAAA,YACtB,GAAG;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,eAAe;AAEvB,UAAI;AACF,eAAO,MAAM;AAAA,UACX,MAAM,GAAG,KAAK;AAAA,UACd,WAAS,KAAK,eAAe,OAAO,KAAK;AAAA,QAC3C;AAAA,MACF,SAAS,GAAG;AACV,YAAI,aAAa,SAAS,EAAE,QAAQ,SAAS,UAAU,GAAG;AACxD,gBAAM,IAAI,WAAW;AAAA,QACvB;AAEA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAyB,QAAQ,IAAI,4BAA4B;AAAA,EACjE,YAAY,oBAAI,IAAoB;AAAA,EAE5C,YAAY,WAAmB;AAC7B,WAAO,CAAC,CAAC,KAAK,kBAAkB,KAAK,UAAU,IAAI,SAAS;AAAA,EAC9D;AAAA,EAEA,YAAY,WAAmB,UAAkB;AAC/C,SAAK,UAAU,IAAI,WAAW,QAAQ;AAAA,EACxC;AAAA,EAEA,eAAe,WAAmB;AAChC,SAAK,UAAU,OAAO,SAAS;AAAA,EACjC;AAAA,EAEQ,YAAY,WAAmB;AACrC,WAAO,KAAK,kBAAkB,KAAK,UAAU,IAAI,SAAS,KAAK;AAAA,EACjE;AAAA,EAEA,MAAM,eAAe,OAAc,OAAgB;AACjD,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,+BAA+B,GAAG;AAGrF,WAAK,OAAO,KAAK,EAAE,WAAW,MAAM,KAAK,GAAG,iBAAiB;AAC7D,YAAM,MAAM,OAAO;AACnB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAO,QAAgB;AAC5B,WAAO,IAAI,iBAAgB,OAAO,MAAM,EAAE,SAAS,kBAAkB,CAAC,CAAC;AAAA,EACzE;AACF;AAEO,SAAS,cAAc,OAAwB;AACpD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEO,SAAS,cAAc,OAAwB;AACpD,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,QAAgB,cAA8B;AAChF,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,eAAe;AAAA,IAExB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,eAAe;AAAA,IAExB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IAET;AACE,YAAM,IAAI,MAAM,2BAA2B,MAAgB,EAAE;AAAA,EACjE;AACF;;;ACpNA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB,uBAAuB;AAElD,eAAsB,wBACpB,aACA,aACoD;AACpD,MAAI,CAAC,aAAa;AAChB,kBAAc,MAAM,iBAAiB;AAAA,EACvC;AAEA,MAAI,CAAC,aAAa;AAChB,UAAM,cAAc,MAAM,gBAAgB,WAAW;AACrD,kBAAc,YAAY;AAAA,EAC5B;AAEA,MAAI,CAAC,aAAa;AAChB,kBAAc,SAAS,WAAW;AAAA,EACpC;AAEA,SAAO,CAAC,aAAa,WAAW;AAClC;","names":[]}