@usine/executor 0.3.0 → 0.4.1-next.240.g158c84b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -21
- package/README.md +116 -19
- package/dist/child-command.d.ts +1 -1
- package/dist/child-command.d.ts.map +1 -1
- package/dist/child-command.js +6 -4
- package/dist/child-command.js.map +1 -1
- package/dist/child-environment.d.ts +19 -0
- package/dist/child-environment.d.ts.map +1 -0
- package/dist/child-environment.js +18 -0
- package/dist/child-environment.js.map +1 -0
- package/dist/claude-login-lock.d.ts +3 -2
- package/dist/claude-login-lock.d.ts.map +1 -1
- package/dist/claude-login-lock.js +10 -4
- package/dist/claude-login-lock.js.map +1 -1
- package/dist/cloudflare/client.d.ts +50 -0
- package/dist/cloudflare/client.d.ts.map +1 -0
- package/dist/cloudflare/client.js +108 -0
- package/dist/cloudflare/client.js.map +1 -0
- package/dist/cloudflare/cloudflare.d.ts +17 -0
- package/dist/cloudflare/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare/cloudflare.js +704 -0
- package/dist/cloudflare/cloudflare.js.map +1 -0
- package/dist/cloudflare/model.d.ts +42 -0
- package/dist/cloudflare/model.d.ts.map +1 -0
- package/dist/cloudflare/model.js +2 -0
- package/dist/cloudflare/model.js.map +1 -0
- package/dist/cloudflare/shell/environment.d.ts +12 -0
- package/dist/cloudflare/shell/environment.d.ts.map +1 -0
- package/dist/cloudflare/shell/environment.js +12 -0
- package/dist/cloudflare/shell/environment.js.map +1 -0
- package/dist/cloudflare/shell/shell.d.ts +2 -0
- package/dist/cloudflare/shell/shell.d.ts.map +1 -0
- package/dist/cloudflare/shell/shell.js +155 -0
- package/dist/cloudflare/shell/shell.js.map +1 -0
- package/dist/durable-session.d.ts +21 -3
- package/dist/durable-session.d.ts.map +1 -1
- package/dist/durable-session.js +69 -10
- package/dist/durable-session.js.map +1 -1
- package/dist/exe-dev/commands.d.ts +1 -1
- package/dist/exe-dev/commands.d.ts.map +1 -1
- package/dist/exe-dev/exe-dev.d.ts +1 -1
- package/dist/exe-dev/exe-dev.d.ts.map +1 -1
- package/dist/exe-dev/exe-dev.js +9 -1
- package/dist/exe-dev/exe-dev.js.map +1 -1
- package/dist/exe-dev/preflight.d.ts +2 -2
- package/dist/exe-dev/preflight.d.ts.map +1 -1
- package/dist/exe-dev/preflight.js +5 -4
- package/dist/exe-dev/preflight.js.map +1 -1
- package/dist/executor.d.ts +164 -15
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +100 -3
- package/dist/executor.js.map +1 -1
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +1 -0
- package/dist/guard.js.map +1 -1
- package/dist/harness-preflight.d.ts +9 -8
- package/dist/harness-preflight.d.ts.map +1 -1
- package/dist/harness-preflight.js +15 -10
- package/dist/harness-preflight.js.map +1 -1
- package/dist/local/local.d.ts +1 -1
- package/dist/local/local.d.ts.map +1 -1
- package/dist/local/local.js +76 -37
- package/dist/local/local.js.map +1 -1
- package/dist/memory-preflight.d.ts +3 -1
- package/dist/memory-preflight.d.ts.map +1 -1
- package/dist/memory-preflight.js +1 -1
- package/dist/memory-preflight.js.map +1 -1
- package/dist/pre-push-hook.d.ts +1 -1
- package/dist/pre-push-hook.js +1 -1
- package/dist/prepared-attempt.d.ts +8 -0
- package/dist/prepared-attempt.d.ts.map +1 -1
- package/dist/prepared-attempt.js.map +1 -1
- package/dist/provision.d.ts +64 -13
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +99 -42
- package/dist/provision.js.map +1 -1
- package/dist/remote/commands.d.ts +1 -1
- package/dist/remote/commands.d.ts.map +1 -1
- package/dist/remote/commands.js +1 -1
- package/dist/remote/commands.js.map +1 -1
- package/dist/remote/container.d.ts +90 -0
- package/dist/remote/container.d.ts.map +1 -0
- package/dist/remote/container.js +480 -0
- package/dist/remote/container.js.map +1 -0
- package/dist/remote/liveness.d.ts +1 -1
- package/dist/remote/liveness.d.ts.map +1 -1
- package/dist/remote/liveness.js +6 -4
- package/dist/remote/liveness.js.map +1 -1
- package/dist/remote/machine.d.ts +52 -6
- package/dist/remote/machine.d.ts.map +1 -1
- package/dist/remote/remote.d.ts +11 -7
- package/dist/remote/remote.d.ts.map +1 -1
- package/dist/remote/remote.js +340 -92
- package/dist/remote/remote.js.map +1 -1
- package/dist/remote/sweep.d.ts +3 -1
- package/dist/remote/sweep.d.ts.map +1 -1
- package/dist/remote/sweep.js +2 -1
- package/dist/remote/sweep.js.map +1 -1
- package/dist/salvage.d.ts +18 -10
- package/dist/salvage.d.ts.map +1 -1
- package/dist/salvage.js +123 -29
- package/dist/salvage.js.map +1 -1
- package/dist/ssh/api-keys.d.ts +36 -0
- package/dist/ssh/api-keys.d.ts.map +1 -0
- package/dist/ssh/api-keys.js +72 -0
- package/dist/ssh/api-keys.js.map +1 -0
- package/dist/ssh/codex-homes.d.ts +21 -0
- package/dist/ssh/codex-homes.d.ts.map +1 -0
- package/dist/ssh/codex-homes.js +78 -0
- package/dist/ssh/codex-homes.js.map +1 -0
- package/dist/ssh/container.d.ts +32 -0
- package/dist/ssh/container.d.ts.map +1 -0
- package/dist/ssh/container.js +282 -0
- package/dist/ssh/container.js.map +1 -0
- package/dist/ssh/credentials.d.ts +3 -0
- package/dist/ssh/credentials.d.ts.map +1 -1
- package/dist/ssh/credentials.js +3 -0
- package/dist/ssh/credentials.js.map +1 -1
- package/dist/ssh/gateway/admin.d.ts +1 -1
- package/dist/ssh/gateway/admin.d.ts.map +1 -1
- package/dist/ssh/gateway/admin.js +2 -2
- package/dist/ssh/gateway/admin.js.map +1 -1
- package/dist/ssh/gateway/attachments.d.ts +15 -6
- package/dist/ssh/gateway/attachments.d.ts.map +1 -1
- package/dist/ssh/gateway/attachments.js +39 -25
- package/dist/ssh/gateway/attachments.js.map +1 -1
- package/dist/ssh/gateway/environment.d.ts +21 -2
- package/dist/ssh/gateway/environment.d.ts.map +1 -1
- package/dist/ssh/gateway/environment.js +76 -6
- package/dist/ssh/gateway/environment.js.map +1 -1
- package/dist/ssh/gateway/forward.d.ts +1 -1
- package/dist/ssh/gateway/forward.d.ts.map +1 -1
- package/dist/ssh/gateway/forward.js +1 -1
- package/dist/ssh/gateway/forward.js.map +1 -1
- package/dist/ssh/gateway/preflight.d.ts +51 -12
- package/dist/ssh/gateway/preflight.d.ts.map +1 -1
- package/dist/ssh/gateway/preflight.js +155 -69
- package/dist/ssh/gateway/preflight.js.map +1 -1
- package/dist/ssh/limits.d.ts +60 -0
- package/dist/ssh/limits.d.ts.map +1 -0
- package/dist/ssh/limits.js +84 -0
- package/dist/ssh/limits.js.map +1 -0
- package/dist/ssh/model.d.ts +97 -9
- package/dist/ssh/model.d.ts.map +1 -1
- package/dist/ssh/preflight.d.ts +26 -7
- package/dist/ssh/preflight.d.ts.map +1 -1
- package/dist/ssh/preflight.js +50 -10
- package/dist/ssh/preflight.js.map +1 -1
- package/dist/ssh/provisioner/boat.d.ts +33 -0
- package/dist/ssh/provisioner/boat.d.ts.map +1 -0
- package/dist/ssh/provisioner/boat.js +247 -0
- package/dist/ssh/provisioner/boat.js.map +1 -0
- package/dist/ssh/provisioner/hetzner.d.ts +32 -0
- package/dist/ssh/provisioner/hetzner.d.ts.map +1 -0
- package/dist/ssh/provisioner/hetzner.js +337 -0
- package/dist/ssh/provisioner/hetzner.js.map +1 -0
- package/dist/ssh/provisioner/host-key.d.ts +11 -0
- package/dist/ssh/provisioner/host-key.d.ts.map +1 -0
- package/dist/ssh/provisioner/host-key.js +57 -0
- package/dist/ssh/provisioner/host-key.js.map +1 -0
- package/dist/ssh/provisioner/http.d.ts +45 -0
- package/dist/ssh/provisioner/http.d.ts.map +1 -0
- package/dist/ssh/provisioner/http.js +72 -0
- package/dist/ssh/provisioner/http.js.map +1 -0
- package/dist/ssh/provisioner/machines.d.ts +48 -0
- package/dist/ssh/provisioner/machines.d.ts.map +1 -0
- package/dist/ssh/provisioner/machines.js +686 -0
- package/dist/ssh/provisioner/machines.js.map +1 -0
- package/dist/ssh/provisioner/model.d.ts +92 -0
- package/dist/ssh/provisioner/model.d.ts.map +1 -0
- package/dist/ssh/provisioner/model.js +37 -0
- package/dist/ssh/provisioner/model.js.map +1 -0
- package/dist/ssh/ssh.d.ts +14 -11
- package/dist/ssh/ssh.d.ts.map +1 -1
- package/dist/ssh/ssh.js +94 -27
- package/dist/ssh/ssh.js.map +1 -1
- package/dist/ssh/worker-records.d.ts +18 -0
- package/dist/ssh/worker-records.d.ts.map +1 -0
- package/dist/ssh/worker-records.js +100 -0
- package/dist/ssh/worker-records.js.map +1 -0
- package/dist/ssh/workers.d.ts +34 -7
- package/dist/ssh/workers.d.ts.map +1 -1
- package/dist/ssh/workers.js +92 -18
- package/dist/ssh/workers.js.map +1 -1
- package/package.json +19 -11
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Data, Effect, Option, Schema } from "effect";
|
|
2
|
+
import { HttpClient, HttpClientError, HttpClientRequest } from "effect/http";
|
|
3
|
+
/** The timeout for one provider API request. */
|
|
4
|
+
const REQUEST_TIMEOUT = "30 seconds";
|
|
5
|
+
/** A provider API request that got no response or an unreadable one. */
|
|
6
|
+
export class ProviderUnanswered extends Data.TaggedError("ProviderUnanswered") {
|
|
7
|
+
}
|
|
8
|
+
/** A provider API response with an error status, with the provider's error code and message. */
|
|
9
|
+
class ProviderRefused extends Data.TaggedError("ProviderRefused") {
|
|
10
|
+
}
|
|
11
|
+
const ErrorFields = Schema.Struct({
|
|
12
|
+
code: Schema.optionalKey(Schema.String),
|
|
13
|
+
message: Schema.optionalKey(Schema.String),
|
|
14
|
+
});
|
|
15
|
+
/** Hetzner's error body, `{ error: { code, message } }`. */
|
|
16
|
+
const NestedErrorBody = Schema.Struct({ error: ErrorFields });
|
|
17
|
+
const decodeNestedError = Schema.decodeUnknownOption(NestedErrorBody);
|
|
18
|
+
const decodeFlatError = Schema.decodeUnknownOption(ErrorFields);
|
|
19
|
+
const decodeJson = Schema.decodeEffect(Schema.fromJsonString(Schema.Json));
|
|
20
|
+
/** Returns the code and message of Hetzner's or Boat's error body (Boat's are top-level). */
|
|
21
|
+
const errorOf = (response) => {
|
|
22
|
+
const fields = Option.orElse(Option.map(decodeNestedError(response.body), ({ error }) => error), () => decodeFlatError(response.body));
|
|
23
|
+
return {
|
|
24
|
+
code: Option.flatMap(fields, ({ code }) => Option.fromNullishOr(code)),
|
|
25
|
+
message: Option.getOrElse(Option.flatMap(fields, ({ message }) => Option.fromNullishOr(message)), () => "no message"),
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Returns a client for a provider's JSON API at `base` with `token` as its bearer token. Each
|
|
30
|
+
* request has a timeout, and an error status fails with the provider's code and message. The
|
|
31
|
+
* token and request body never appear in a failure.
|
|
32
|
+
*/
|
|
33
|
+
export const providerApiFor = (provider, base, token) => Effect.gen(function* () {
|
|
34
|
+
const http = yield* HttpClient.HttpClient;
|
|
35
|
+
const send = Effect.fn("ProviderApi.send")(function* (method, path, options = {}) {
|
|
36
|
+
yield* Effect.annotateCurrentSpan({ provider, method, path });
|
|
37
|
+
const url = new URL(`${base}${path}`);
|
|
38
|
+
for (const [key, value] of Object.entries(options.query ?? {}))
|
|
39
|
+
url.searchParams.set(key, value);
|
|
40
|
+
const request = HttpClientRequest.make(method)(url).pipe(HttpClientRequest.bearerToken(token), HttpClientRequest.acceptJson, HttpClientRequest.setHeaders(options.headers ?? {}), options.body === undefined
|
|
41
|
+
? (unchanged) => unchanged
|
|
42
|
+
: HttpClientRequest.bodyJsonUnsafe(options.body));
|
|
43
|
+
const response = yield* http.execute(request).pipe(Effect.timeout(REQUEST_TIMEOUT), Effect.mapError((cause) => HttpClientError.isHttpClientError(cause)
|
|
44
|
+
? new ProviderUnanswered({ detail: `no response (${cause.reason._tag})` })
|
|
45
|
+
: new ProviderUnanswered({ detail: `no response within ${REQUEST_TIMEOUT}` })));
|
|
46
|
+
const text = yield* response.text.pipe(Effect.mapError(() => new ProviderUnanswered({ detail: "the response body can't be read" })));
|
|
47
|
+
const body = text === ""
|
|
48
|
+
? null
|
|
49
|
+
: yield* decodeJson(text).pipe(Effect.mapError(() => new ProviderUnanswered({
|
|
50
|
+
detail: `the response with status ${String(response.status)} isn't JSON`,
|
|
51
|
+
})));
|
|
52
|
+
const answer = { status: response.status, body };
|
|
53
|
+
if (response.status >= 400) {
|
|
54
|
+
const { code, message } = errorOf(answer);
|
|
55
|
+
return yield* new ProviderRefused({ status: response.status, code, message });
|
|
56
|
+
}
|
|
57
|
+
return answer;
|
|
58
|
+
});
|
|
59
|
+
/** Decodes a response body with `schema`; an unexpected shape counts as unanswered. */
|
|
60
|
+
const decode = (schema, operation) => (response) => Schema.decodeUnknownEffect(schema)(response.body).pipe(Effect.mapError(() => new ProviderUnanswered({
|
|
61
|
+
detail: `the response to ${operation} doesn't have the documented shape`,
|
|
62
|
+
})));
|
|
63
|
+
return { send, decode };
|
|
64
|
+
});
|
|
65
|
+
/** Returns a failure as an operator-facing clause. */
|
|
66
|
+
export const failureText = (failure) => failure._tag === "ProviderUnanswered"
|
|
67
|
+
? failure.detail
|
|
68
|
+
: `status ${String(failure.status)}${Option.match(failure.code, {
|
|
69
|
+
onNone: () => "",
|
|
70
|
+
onSome: (code) => ` ${code}`,
|
|
71
|
+
})}: ${failure.message}`;
|
|
72
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/ssh/provisioner/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { BrainSpec } from "@usine/core/agent/brain";
|
|
2
|
+
import type { AttemptId } from "@usine/core/attempt";
|
|
3
|
+
import type { RunId } from "@usine/core/run";
|
|
4
|
+
import type { MachineId, WorkerName } from "@usine/core/worker";
|
|
5
|
+
import { Effect, FileSystem, Option, Path } from "effect";
|
|
6
|
+
import { type ExecutorError, ExecutorOperationError, MachineGrant, MachineHold, MachineStatus, MachineUnavailableError, type PreflightReport, WorkerCapabilityError } from "../../executor.ts";
|
|
7
|
+
import type { RemoteCommands } from "../../remote/commands.ts";
|
|
8
|
+
import type { MachineGateway, SshExecutorOptions, SshMachine } from "../model.ts";
|
|
9
|
+
import { type PinnedHostKey, type SshWorkerEntry } from "../workers.ts";
|
|
10
|
+
import { type MachineEndpoint } from "./model.ts";
|
|
11
|
+
export interface ProvisionedMachinesOptions {
|
|
12
|
+
readonly instance: string;
|
|
13
|
+
readonly commands: RemoteCommands;
|
|
14
|
+
readonly workerFor: (worker: WorkerName) => Effect.Effect<SshWorkerEntry, ExecutorError>;
|
|
15
|
+
readonly entries: Effect.Effect<ReadonlyArray<SshWorkerEntry>>;
|
|
16
|
+
readonly machineAt: (entry: SshWorkerEntry, id: MachineId, endpoint: MachineEndpoint, hostKey: PinnedHostKey) => SshMachine;
|
|
17
|
+
/** The machine preflight of `sshMachinePreflightFor`. */
|
|
18
|
+
readonly verifyMachine: (machine: SshMachine, brains: ReadonlyArray<BrainSpec>, maxConcurrentAttempts: number) => Effect.Effect<PreflightReport, ExecutorError>;
|
|
19
|
+
readonly verifyGatewayAdmin: (worker: WorkerName, gateway: MachineGateway) => Effect.Effect<void, WorkerCapabilityError>;
|
|
20
|
+
readonly settings: Pick<SshExecutorOptions, "knownHostsDirectory" | "providerEndpoints" | "machineReadyTimeout" | "machinePollInterval">;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns the machines of the SSH executor's provisioned Workers: the `WorkerMachines` port for
|
|
24
|
+
* the scheduler, the machine of each Attempt for preparation and recovery, and the provisioned
|
|
25
|
+
* Workers' preflight. Requires Node for the key and host key files.
|
|
26
|
+
*/
|
|
27
|
+
export declare const provisionedMachinesFor: (options: ProvisionedMachinesOptions) => Effect.Effect<{
|
|
28
|
+
port: {
|
|
29
|
+
readonly provisions: (worker: WorkerName) => Effect.Effect<boolean>;
|
|
30
|
+
readonly create: (worker: WorkerName, runId: RunId, brains: ReadonlyArray<BrainSpec>) => Effect.Effect<MachineGrant, MachineUnavailableError | WorkerCapabilityError>;
|
|
31
|
+
readonly assign: (hold: MachineHold, attemptId: AttemptId) => Effect.Effect<void, ExecutorOperationError>;
|
|
32
|
+
readonly adopt: (worker: WorkerName, attemptId: AttemptId) => Effect.Effect<Option.Option<MachineHold>>;
|
|
33
|
+
readonly release: (hold: MachineHold) => Effect.Effect<void>;
|
|
34
|
+
readonly sweep: Effect.Effect<void>;
|
|
35
|
+
readonly machines: Effect.Effect<ReadonlyArray<MachineStatus>>;
|
|
36
|
+
};
|
|
37
|
+
attemptMachine: (worker: string & import("effect/Brand").Brand<"WorkerName">, attemptId: string & import("effect/Brand").Brand<"AttemptId">) => Effect.Effect<SshMachine, ExecutorOperationError, never>;
|
|
38
|
+
recoveryMachine: (worker: WorkerName, attemptId: AttemptId) => Effect.Effect<Option.Option<SshMachine>, ExecutorOperationError, never>;
|
|
39
|
+
recovered: (attemptId: string & import("effect/Brand").Brand<"AttemptId">, succeeded: boolean) => Effect.Effect<void, never, never>;
|
|
40
|
+
checkoutHeld: (attemptId: string & import("effect/Brand").Brand<"AttemptId">, held: boolean) => Effect.Effect<void, never, never>;
|
|
41
|
+
verifyProvisioned: (entry: SshWorkerEntry, brains: readonly BrainSpec[], maxConcurrentAttempts: number) => Effect.Effect<{
|
|
42
|
+
degraded: Option.Option<string>;
|
|
43
|
+
deferred: Option.Option<string>;
|
|
44
|
+
containerLimits: Option.Option<import("@usine/core/worker").ContainerLimits>;
|
|
45
|
+
}, import("../../executor.ts").CredentialUnavailableError | ExecutorOperationError | WorkerCapabilityError, never>;
|
|
46
|
+
provisions: (worker: WorkerName) => Effect.Effect<boolean, never, never>;
|
|
47
|
+
}, import("effect/PlatformError").PlatformError, FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | Path.Path | import("effect/Scope").Scope>;
|
|
48
|
+
//# sourceMappingURL=machines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machines.d.ts","sourceRoot":"","sources":["../../../src/ssh/provisioner/machines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAEV,SAAS,EAET,UAAU,EACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAKL,MAAM,EAEN,UAAU,EACV,MAAM,EACN,IAAI,EAIL,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,KAAK,aAAa,EAClB,sBAAsB,EAEtB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,KAAK,eAAe,EACpB,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AAClG,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,YAAY,CAAC;AA+FpB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACzF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,cAAc,EACrB,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,aAAa,KACnB,UAAU,CAAC;IAChB,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,CACtB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,qBAAqB,EAAE,MAAM,KAC1B,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACnD,QAAQ,CAAC,kBAAkB,EAAE,CAC3B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,IAAI,CACrB,kBAAkB,EAClB,qBAAqB,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,qBAAqB,CAC5F,CAAC;CACH;AAqBD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;8BA+vBA,UAAU,aAAa,SAAS;;;;;;;;yBAuErC,UAAU;gKAuBtC,CAAC"}
|