sandboxedjs 0.1.68 → 0.1.69

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.
Binary file
@@ -18,9 +18,9 @@
18
18
  "artifacts": {
19
19
  "moduleUrl": "./python.js",
20
20
  "hashes": {
21
- "python.js": "sha256-4ad801f2c7bcbcdf80ab64904807d7a5cb65354af31ed5f02b4f7ddfeae6b5e0",
22
- "python.wasm": "sha256-838a1408c6e59ec326844dff8fd008bec0e1f27d68a1dd1762a306ea96a27620",
23
- "python.data": "sha256-11c23db3bb15f50091df55ea658d80f93cccc6f94f18c2776ad712e17abda4a3",
21
+ "python.js": "sha256-3a6b27974ad6102edfe43dc56fc13003cfa6a57d0adbf62668ea14845651781b",
22
+ "python.wasm": "sha256-5819858e6d9114b297310641b66680aa3d7cfef34b39bcd90bba11004483a05c",
23
+ "python.data": "sha256-cc6790dab6abf55be3705fd64be3721000372eddac8968e7d0e9420602570a43",
24
24
  "python.worker.js": "sha256-63bb1df52c4e3a95eae7b2d77c98554188fcc5925e72628ea0c34d5c573977a5"
25
25
  }
26
26
  },
@@ -908,6 +908,14 @@ async function runPythonProcess(start, port) {
908
908
  }
909
909
  ];
910
910
  const module = await factory(config);
911
+ for (const fd of start.inheritFds ?? []) {
912
+ const register = module.sbxRegisterFd;
913
+ if (typeof register !== "function") {
914
+ port.postMessage({ type: "failed", message: "this Python build cannot receive inherited descriptors" });
915
+ return;
916
+ }
917
+ register(fd, fd);
918
+ }
911
919
  try {
912
920
  exitCode = module.callMain(start.argv) ?? exitCode;
913
921
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/python/host-abi.ts","../src/runtime/python/protocol.ts","../src/runtime/python/syscall-client.ts","../src/runtime/python/sync-transport.ts","../src/runtime/python/sbxfs.ts","../src/util/binary.ts","../src/runtime/python/worker-entry.ts","../src/runtime/python/worker.ts"],"names":[],"mappings":"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","file":"python-worker.js","sourcesContent":["/* Generated by python-runtime/scripts/generate_abi.py from abi/host-v1.json. Do not edit. */\n\n/** Protocol version carried in every frame. */\nexport const SBX_HOST_ABI_VERSION = 1;\n\nexport const SBX_REQUEST_HEADER_BYTES = 16;\nexport const SBX_RESPONSE_HEADER_BYTES = 20;\n\n/** Operation codes. Families are 256 apart so a family stays contiguous. */\nexport const Op = {\n handshake: 0,\n openat: 1,\n close: 2,\n read: 3,\n write: 4,\n pread: 5,\n pwrite: 6,\n lseek: 7,\n fstat: 8,\n statat: 9,\n ftruncate: 10,\n renameat: 11,\n unlinkat: 12,\n mkdirat: 13,\n readlinkat: 14,\n symlinkat: 15,\n getdents: 16,\n fsync: 17,\n dup: 256,\n dup2: 257,\n get_flags: 258,\n set_flags: 259,\n pipe: 512,\n poll: 768,\n clock_gettime: 1024,\n sleep: 1025,\n getpid: 1280,\n getcwd: 1281,\n chdir: 1282,\n environ: 1283,\n getrandom: 1536,\n socket: 1792,\n bind: 1793,\n listen: 1794,\n accept: 1795,\n connect: 1796,\n send: 1797,\n recv: 1798,\n shutdown: 1799,\n getsockname: 1800,\n getpeername: 1801,\n setsockopt: 1802,\n getsockopt: 1803,\n socket_close: 1804,\n spawn: 2048,\n waitpid: 2049,\n kill: 2050,\n} as const;\n\nexport type OpCode = (typeof Op)[keyof typeof Op];\n\n/** Canonical (Linux/musl) errno values. A negative status is `-Errno.X`. */\nexport const Errno = {\n EPERM: 1,\n ENOENT: 2,\n ESRCH: 3,\n EINTR: 4,\n EIO: 5,\n ENXIO: 6,\n E2BIG: 7,\n EBADF: 9,\n ECHILD: 10,\n EAGAIN: 11,\n ENOMEM: 12,\n EACCES: 13,\n EFAULT: 14,\n EBUSY: 16,\n EEXIST: 17,\n EXDEV: 18,\n ENODEV: 19,\n ENOTDIR: 20,\n EISDIR: 21,\n EINVAL: 22,\n ENFILE: 23,\n EMFILE: 24,\n ENOTTY: 25,\n EFBIG: 27,\n ENOSPC: 28,\n ESPIPE: 29,\n EROFS: 30,\n EMLINK: 31,\n EPIPE: 32,\n ERANGE: 34,\n ENAMETOOLONG: 36,\n ENOSYS: 38,\n ENOTEMPTY: 39,\n ELOOP: 40,\n ENODATA: 61,\n ENOTSOCK: 88,\n EPROTONOSUPPORT: 93,\n EAFNOSUPPORT: 97,\n EADDRINUSE: 98,\n EADDRNOTAVAIL: 99,\n ENETUNREACH: 101,\n ECONNRESET: 104,\n EISCONN: 106,\n ENOTCONN: 107,\n ECONNREFUSED: 111,\n EPROTO: 71,\n EOVERFLOW: 75,\n ETIMEDOUT: 110,\n ECANCELED: 125,\n EDQUOT: 122,\n} as const;\n\nexport type ErrnoName = keyof typeof Errno;\n\n/** Capability names a host may advertise in its handshake. */\nexport const CAPABILITIES = [\"files\", \"descriptors\", \"pipes\", \"readiness\", \"time\", \"identity\", \"entropy\", \"sockets\", \"processes\", \"signals\", \"storage\", \"services\", \"threads\"] as const;\n\nexport type Capability = (typeof CAPABILITIES)[number];\n\n/** Names by code, for diagnostics. Never used for dispatch. */\nexport const OP_NAMES: Record<number, string> = Object.fromEntries(\n Object.entries(Op).map(([name, code]) => [code, name]),\n);\n\nexport const ERRNO_NAMES: Record<number, string> = Object.fromEntries(\n Object.entries(Errno).map(([name, code]) => [code, name]),\n);\n","/**\n * Framing for the host ABI.\n *\n * Every field is fixed-width and little-endian, because the two sides are\n * compiled by different toolchains and a shared struct layout is the one thing\n * they cannot negotiate at runtime. Text is UTF-8; file content and network\n * traffic are raw bytes and are never decoded in transit.\n *\n * `request_id` and `process_generation` exist so a late answer can be\n * recognised as late. A worker that exits and is replaced must not have its\n * successor accept a completion addressed to the process before it, and the\n * failure mode for a mismatched frame is an error — never an empty success.\n */\n\nimport {\n Errno, OP_NAMES, SBX_HOST_ABI_VERSION, SBX_REQUEST_HEADER_BYTES, SBX_RESPONSE_HEADER_BYTES,\n} from \"./host-abi.js\";\n\nexport interface RequestHeader {\n version: number;\n op: number;\n requestId: number;\n generation: number;\n}\n\nexport interface ResponseFrame {\n header: RequestHeader;\n status: number;\n payload: Uint8Array;\n}\n\nexport class ProtocolError extends Error {\n readonly code = \"ERR_SBX_ABI_PROTOCOL\";\n}\n\nexport function encodeRequest(header: RequestHeader, payload: Uint8Array): Uint8Array {\n const frame = new Uint8Array(SBX_REQUEST_HEADER_BYTES + payload.length);\n const view = new DataView(frame.buffer);\n view.setUint16(0, header.version, true);\n view.setUint16(2, header.op, true);\n view.setUint32(4, header.requestId, true);\n view.setUint32(8, header.generation, true);\n view.setUint32(12, payload.length, true);\n frame.set(payload, SBX_REQUEST_HEADER_BYTES);\n return frame;\n}\n\nexport function decodeRequest(frame: Uint8Array): { header: RequestHeader; payload: Uint8Array } {\n if (frame.length < SBX_REQUEST_HEADER_BYTES) throw new ProtocolError(\"short request frame\");\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n const header: RequestHeader = {\n version: view.getUint16(0, true),\n op: view.getUint16(2, true),\n requestId: view.getUint32(4, true),\n generation: view.getUint32(8, true),\n };\n const length = view.getUint32(12, true);\n if (frame.length - SBX_REQUEST_HEADER_BYTES < length) {\n throw new ProtocolError(`truncated payload for ${OP_NAMES[header.op] ?? header.op}`);\n }\n return {\n header,\n payload: frame.subarray(SBX_REQUEST_HEADER_BYTES, SBX_REQUEST_HEADER_BYTES + length),\n };\n}\n\nexport function encodeResponse(header: RequestHeader, status: number, payload: Uint8Array): Uint8Array {\n const frame = new Uint8Array(SBX_RESPONSE_HEADER_BYTES + payload.length);\n const view = new DataView(frame.buffer);\n view.setUint16(0, header.version, true);\n view.setUint16(2, header.op, true);\n view.setUint32(4, header.requestId, true);\n view.setUint32(8, header.generation, true);\n view.setInt32(12, status, true);\n view.setUint32(16, payload.length, true);\n frame.set(payload, SBX_RESPONSE_HEADER_BYTES);\n return frame;\n}\n\nexport function decodeResponse(frame: Uint8Array, expected?: RequestHeader): ResponseFrame {\n if (frame.length < SBX_RESPONSE_HEADER_BYTES) {\n /* An empty or short frame means the transport failed. Reporting it as a\n * zero-byte success is how a dead host turns into silent data loss. */\n throw new ProtocolError(\"the host ABI transport returned an incomplete frame\");\n }\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n const header: RequestHeader = {\n version: view.getUint16(0, true),\n op: view.getUint16(2, true),\n requestId: view.getUint32(4, true),\n generation: view.getUint32(8, true),\n };\n const status = view.getInt32(12, true);\n const length = view.getUint32(16, true);\n if (frame.length - SBX_RESPONSE_HEADER_BYTES < length) throw new ProtocolError(\"truncated response payload\");\n if (expected) {\n if (header.requestId !== expected.requestId) throw new ProtocolError(\"stale response: request id mismatch\");\n if (header.generation !== expected.generation) throw new ProtocolError(\"stale response: process generation mismatch\");\n if (header.op !== expected.op) throw new ProtocolError(\"response answers a different operation\");\n }\n if (header.version !== SBX_HOST_ABI_VERSION) {\n throw new ProtocolError(`host ABI version ${header.version}, expected ${SBX_HOST_ABI_VERSION}`);\n }\n return {\n header,\n status,\n payload: frame.subarray(SBX_RESPONSE_HEADER_BYTES, SBX_RESPONSE_HEADER_BYTES + length),\n };\n}\n\n/** Little-endian reader over a payload. Bounds-checked: the guest owns this memory. */\nexport class Reader {\n private at = 0;\n private readonly view: DataView;\n private readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n\n private need(count: number): number {\n if (this.at + count > this.bytes.length) throw new ProtocolError(\"payload underrun\");\n const offset = this.at;\n this.at += count;\n return offset;\n }\n\n i32(): number { return this.view.getInt32(this.need(4), true); }\n u32(): number { return this.view.getUint32(this.need(4), true); }\n i64(): number { return Number(this.view.getBigInt64(this.need(8), true)); }\n u64(): number { return Number(this.view.getBigUint64(this.need(8), true)); }\n bytes32(): Uint8Array {\n const length = this.u32();\n const offset = this.need(length);\n return this.bytes.subarray(offset, offset + length);\n }\n string(): string { return new TextDecoder().decode(this.bytes32()); }\n get remaining(): number { return this.bytes.length - this.at; }\n}\n\n/** Little-endian writer. Grows as needed; payload sizes are bounded by the caller. */\nexport class Writer {\n private parts: Uint8Array[] = [];\n\n i32(value: number): this { const b = new Uint8Array(4); new DataView(b.buffer).setInt32(0, value, true); this.parts.push(b); return this; }\n u32(value: number): this { const b = new Uint8Array(4); new DataView(b.buffer).setUint32(0, value >>> 0, true); this.parts.push(b); return this; }\n i64(value: number): this { const b = new Uint8Array(8); new DataView(b.buffer).setBigInt64(0, BigInt(Math.trunc(value)), true); this.parts.push(b); return this; }\n u64(value: number): this { const b = new Uint8Array(8); new DataView(b.buffer).setBigUint64(0, BigInt(Math.trunc(value)), true); this.parts.push(b); return this; }\n bytes32(value: Uint8Array): this { this.u32(value.length); this.parts.push(value); return this; }\n string(value: string): this { return this.bytes32(new TextEncoder().encode(value)); }\n\n finish(): Uint8Array {\n const total = this.parts.reduce((sum, part) => sum + part.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const part of this.parts) { out.set(part, at); at += part.length; }\n return out;\n }\n}\n\n/** A status the guest reads as `-errno`. */\nexport function failure(errno: number): number {\n return -Math.abs(errno);\n}\n\nexport const EOK = 0;\nexport { Errno };\n","/**\n * The guest side of the host ABI, as the compiled code sees it.\n *\n * Compiled programs reach this through `sbx_host_call` in\n * `python-runtime/native/js/library_sbx.js`, which copies a frame out of the\n * module's memory, calls {@link HostAbiClient.callRaw}, and copies the answer\n * back. The typed methods below are for the JavaScript side of the worker —\n * loaders, the probe harness, and tests — which need the same operations\n * without going through Wasm memory.\n */\n\nimport { Errno, ERRNO_NAMES, OP_NAMES, Op, SBX_HOST_ABI_VERSION } from \"./host-abi.js\";\nimport { Reader, Writer, decodeResponse, encodeRequest, type RequestHeader } from \"./protocol.js\";\nimport type { HostCallClient } from \"./sync-transport.js\";\n\nexport class HostAbiError extends Error {\n errno: number;\n code: string;\n constructor(errno: number, op: number) {\n const name = ERRNO_NAMES[errno] ?? String(errno);\n super(`${OP_NAMES[op] ?? `op ${op}`} failed: ${name}`);\n this.errno = errno;\n this.code = name;\n }\n}\n\nexport interface HostAbiResult {\n status: number;\n payload: Uint8Array;\n}\n\n/**\n * One process's connection to the kernel.\n *\n * `generation` is stamped into every frame and checked on the way back, so a\n * completion belonging to a previous incarnation of this PID is rejected rather\n * than applied to the wrong descriptor table.\n */\nexport class HostAbiClient {\n private transport: HostCallClient;\n private generation: number;\n private nextRequestId = 1;\n\n constructor(transport: HostCallClient, generation: number) {\n this.transport = transport;\n this.generation = generation;\n }\n\n /** Send one frame, blocking. Returns the status and payload verbatim. */\n callRaw(op: number, payload: Uint8Array): HostAbiResult {\n const header: RequestHeader = {\n version: SBX_HOST_ABI_VERSION,\n op,\n requestId: this.nextRequestId++,\n generation: this.generation,\n };\n const frame = this.transport.call(encodeRequest(header, payload));\n const response = decodeResponse(frame, header);\n return { status: response.status, payload: response.payload };\n }\n\n /** As {@link callRaw}, but a negative status becomes an exception. */\n private call(op: number, payload: Uint8Array): HostAbiResult {\n const result = this.callRaw(op, payload);\n if (result.status < 0) throw new HostAbiError(-result.status, op);\n return result;\n }\n\n handshake(): { version: number; capabilities: Record<string, boolean> } {\n const { payload } = this.call(Op.handshake, new Uint8Array());\n const r = new Reader(payload);\n const version = r.u32();\n const count = r.u32();\n const capabilities: Record<string, boolean> = {};\n for (let i = 0; i < count; i += 1) capabilities[r.string()] = r.u32() === 1;\n return { version, capabilities };\n }\n\n open(path: string, flags: number, mode = 0o666): number {\n return this.call(Op.openat, new Writer().string(path).u32(flags).u32(mode).finish()).status;\n }\n\n close(fd: number): void {\n this.call(Op.close, new Writer().i32(fd).finish());\n }\n\n read(fd: number, length: number): Uint8Array {\n return this.call(Op.read, new Writer().i32(fd).u32(length).finish()).payload;\n }\n\n write(fd: number, data: Uint8Array): number {\n return this.call(Op.write, new Writer().i32(fd).bytes32(data).finish()).status;\n }\n\n /** Write every byte, looping over short writes the way a guest's libc must. */\n writeAll(fd: number, data: Uint8Array): void {\n let at = 0;\n while (at < data.length) at += this.write(fd, data.subarray(at));\n }\n\n pread(fd: number, length: number, offset: number): Uint8Array {\n return this.call(Op.pread, new Writer().i32(fd).u32(length).u64(offset).finish()).payload;\n }\n\n pwrite(fd: number, data: Uint8Array, offset: number): number {\n return this.call(Op.pwrite, new Writer().i32(fd).bytes32(data).u64(offset).finish()).status;\n }\n\n seek(fd: number, offset: number, whence: number): number {\n const { payload } = this.call(Op.lseek, new Writer().i32(fd).i64(offset).u32(whence).finish());\n return new Reader(payload).i64();\n }\n\n fstat(fd: number): HostStat {\n return decodeStat(this.call(Op.fstat, new Writer().i32(fd).finish()).payload);\n }\n\n stat(path: string, followLinks = true): HostStat {\n return decodeStat(\n this.call(Op.statat, new Writer().string(path).u32(followLinks ? 1 : 0).finish()).payload,\n );\n }\n\n ftruncate(fd: number, length: number): void {\n this.call(Op.ftruncate, new Writer().i32(fd).u64(length).finish());\n }\n\n rename(from: string, to: string): void {\n this.call(Op.renameat, new Writer().string(from).string(to).finish());\n }\n\n unlink(path: string, removeDirectory = false): void {\n this.call(Op.unlinkat, new Writer().string(path).u32(removeDirectory ? 1 : 0).finish());\n }\n\n mkdir(path: string, mode = 0o777): void {\n this.call(Op.mkdirat, new Writer().string(path).u32(mode).finish());\n }\n\n readlink(path: string): string {\n return new Reader(this.call(Op.readlinkat, new Writer().string(path).finish()).payload).string();\n }\n\n symlink(target: string, path: string): void {\n this.call(Op.symlinkat, new Writer().string(target).string(path).finish());\n }\n\n readdir(fd: number, bufferSize = 4096): string[] {\n const { payload } = this.call(Op.getdents, new Writer().i32(fd).u32(bufferSize).finish());\n const text = new TextDecoder().decode(payload);\n return text.split(\"\\0\").filter((name) => name.length > 0);\n }\n\n dup(fd: number, from = 0): number {\n return this.call(Op.dup, new Writer().i32(fd).u32(from).finish()).status;\n }\n\n dup2(fd: number, target: number): number {\n return this.call(Op.dup2, new Writer().i32(fd).i32(target).finish()).status;\n }\n\n getFlags(fd: number): { flags: number; cloexec: boolean } {\n const r = new Reader(this.call(Op.get_flags, new Writer().i32(fd).finish()).payload);\n return { flags: r.u32(), cloexec: r.u32() === 1 };\n }\n\n setFlags(fd: number, flags: number, cloexec: boolean): void {\n this.call(Op.set_flags, new Writer().i32(fd).u32(flags).u32(cloexec ? 1 : 0).finish());\n }\n\n pipe(flags = 0): [number, number] {\n const r = new Reader(this.call(Op.pipe, new Writer().u32(flags).finish()).payload);\n return [r.i32(), r.i32()];\n }\n\n poll(entries: { fd: number; events: number }[], timeoutMs: number): { fd: number; revents: number }[] {\n const w = new Writer().u32(entries.length);\n for (const entry of entries) w.i32(entry.fd).u32(entry.events);\n w.i64(timeoutMs);\n const r = new Reader(this.call(Op.poll, w.finish()).payload);\n const count = r.u32();\n const out: { fd: number; revents: number }[] = [];\n for (let i = 0; i < count; i += 1) out.push({ fd: r.i32(), revents: r.u32() });\n return out;\n }\n\n clockGettime(monotonic: boolean): { seconds: number; nanos: number } {\n const r = new Reader(this.call(Op.clock_gettime, new Writer().u32(monotonic ? 1 : 0).finish()).payload);\n return { seconds: r.i64(), nanos: r.u32() };\n }\n\n sleep(nanos: number): void {\n this.call(Op.sleep, new Writer().u64(nanos).finish());\n }\n\n identity(): { pid: number; ppid: number; uid: number; gid: number; umask: number } {\n const r = new Reader(this.call(Op.getpid, new Uint8Array()).payload);\n return { pid: r.i32(), ppid: r.i32(), uid: r.u32(), gid: r.u32(), umask: r.u32() };\n }\n\n getcwd(): string {\n return new Reader(this.call(Op.getcwd, new Uint8Array()).payload).string();\n }\n\n chdir(path: string): void {\n this.call(Op.chdir, new Writer().string(path).finish());\n }\n\n environ(): Record<string, string> {\n const joined = new Reader(this.call(Op.environ, new Uint8Array()).payload).string();\n const out: Record<string, string> = {};\n for (const entry of joined.split(\"\\0\")) {\n if (!entry) continue;\n const split = entry.indexOf(\"=\");\n out[entry.slice(0, split)] = entry.slice(split + 1);\n }\n return out;\n }\n\n getrandom(length: number): Uint8Array {\n return this.call(Op.getrandom, new Writer().u32(length).finish()).payload;\n }\n\n socket(family: number, type: number, protocol = 0): number {\n return this.call(Op.socket, new Writer().u32(family).u32(type).i32(protocol).finish()).status;\n }\n\n bind(fd: number, address: string, port: number): void {\n this.call(Op.bind, new Writer().i32(fd).string(address).u32(port).finish());\n }\n\n listen(fd: number, backlog = 128): void {\n this.call(Op.listen, new Writer().i32(fd).u32(backlog).finish());\n }\n\n accept(fd: number): { fd: number; address: string; port: number } {\n const result = this.call(Op.accept, new Writer().i32(fd).finish());\n const r = new Reader(result.payload);\n return { fd: result.status, address: r.string(), port: r.u32() };\n }\n\n connect(fd: number, address: string, port: number): void {\n this.call(Op.connect, new Writer().i32(fd).string(address).u32(port).finish());\n }\n\n send(fd: number, data: Uint8Array): number {\n return this.call(Op.send, new Writer().i32(fd).bytes32(data).finish()).status;\n }\n\n recv(fd: number, length: number): Uint8Array {\n return this.call(Op.recv, new Writer().i32(fd).u32(length).finish()).payload;\n }\n\n shutdown(fd: number, how: number): void {\n this.call(Op.shutdown, new Writer().i32(fd).u32(how).finish());\n }\n\n socketName(fd: number, peer = false): { address: string; port: number } {\n const payload = this.call(peer ? Op.getpeername : Op.getsockname, new Writer().i32(fd).finish()).payload;\n const r = new Reader(payload);\n return { address: r.string(), port: r.u32() };\n }\n}\n\nexport interface HostStat {\n ino: number;\n mode: number;\n size: number;\n uid: number;\n gid: number;\n nlink: number;\n atimeNs: number;\n mtimeNs: number;\n ctimeNs: number;\n}\n\nfunction decodeStat(payload: Uint8Array): HostStat {\n const r = new Reader(payload);\n return {\n ino: r.u64(), mode: r.u32(), size: r.u64(),\n uid: r.u32(), gid: r.u32(), nlink: r.u32(),\n atimeNs: r.i64(), mtimeNs: r.i64(), ctimeNs: r.i64(),\n };\n}\n\nexport { Errno, Op };\n","/**\n * The transport under the host ABI: one blocking client, one non-blocking host.\n *\n * This is deliberately not `runtime/sync-channel.ts`. That channel predates the\n * ABI and carries no request identity, so a late or duplicated answer is\n * indistinguishable from the right one; worse, its server answers a failed\n * handler with a zero-length frame, which a caller can only read as a\n * successful empty result. Both are acceptable for `spawnSync`, where the\n * payload is self-describing JSON, and neither is acceptable for `read()`,\n * where an empty result means end of input.\n *\n * So the framing here always carries a full response header, a transport\n * failure is always an error, and the client verifies that the answer it got\n * belongs to the question it asked.\n *\n * Only the client blocks, and the client never owns shared state. The host\n * services requests from its ordinary event loop and may take as long as it\n * likes — which is what lets a guest's synchronous `read()` wait for a\n * keystroke that has not been typed yet.\n */\n\n/* Control-word slots over shared memory. */\nconst STATE = 0;\nconst LENGTH = 1;\nconst MORE = 2;\nconst CONTROL_WORDS = 4;\n\nconst STATE_IDLE = 0;\nconst STATE_REQUEST = 1;\nconst STATE_RESPONSE = 2;\nconst STATE_CONTINUE = 3;\nconst STATE_CLOSED = 4;\n\n/** How long a blocked client sleeps before re-checking for a closed transport. */\nconst WAIT_SLICE_MS = 200;\n\nexport interface HostTransportBuffers {\n control: SharedArrayBuffer;\n data: SharedArrayBuffer;\n}\n\nexport function createHostTransportBuffers(windowBytes = 1 << 20): HostTransportBuffers {\n return {\n control: new SharedArrayBuffer(CONTROL_WORDS * Int32Array.BYTES_PER_ELEMENT),\n data: new SharedArrayBuffer(windowBytes),\n };\n}\n\n/**\n * Can this host support a blocking guest at all?\n *\n * `SharedArrayBuffer` needs cross-origin isolation in a browser, and\n * `Atomics.wait` is forbidden on a browser's main thread — which is why the\n * blocking side is always the worker. Reporting the cause matters: without it\n * the failure surfaces as an interpreter that will not start, with nothing\n * naming the header the host is missing.\n */\nexport function syncTransportUnavailableReason(): string | null {\n if (typeof globalThis.crossOriginIsolated === \"boolean\" && !globalThis.crossOriginIsolated) {\n return \"the page is not cross-origin isolated. Serve it with Cross-Origin-Opener-Policy: same-origin and \" +\n \"Cross-Origin-Embedder-Policy: require-corp.\";\n }\n if (typeof SharedArrayBuffer !== \"function\") return \"SharedArrayBuffer is unavailable in this host.\";\n if (typeof Atomics !== \"object\" || typeof Atomics.wait !== \"function\") return \"Atomics.wait is unavailable in this host.\";\n return null;\n}\n\nexport class HostTransportError extends Error {\n code = \"ERR_SBX_HOST_TRANSPORT\";\n}\n\n/**\n * The guest side. Lives in the worker with the compiled program and blocks.\n *\n * `wake` nudges the host's event loop: the host cannot poll shared memory\n * without spinning, so each window is announced with an ordinary message.\n */\nexport class HostCallClient {\n private control: Int32Array;\n private data: Uint8Array;\n private capacity: number;\n private wake: () => void;\n private closed = false;\n\n constructor(buffers: HostTransportBuffers, wake: () => void) {\n this.control = new Int32Array(buffers.control);\n this.data = new Uint8Array(buffers.data);\n this.capacity = this.data.length;\n this.wake = wake;\n }\n\n /** Send a frame and block until the whole answer is back. Never returns empty. */\n call(request: Uint8Array): Uint8Array {\n /* A transport that has already gone away stays gone. Without this the next\n * call republishes a request over the closed marker and waits for an answer\n * from a host that is no longer listening — a killed process would hang on\n * its way out instead of exiting. */\n if (this.closed || Atomics.load(this.control, STATE) === STATE_CLOSED) {\n this.closed = true;\n throw new HostTransportError(\"the host transport is closed\");\n }\n this.send(request);\n const response = this.receive();\n if (response.length === 0) {\n throw new HostTransportError(\"the host answered with no frame; the kernel side failed or went away\");\n }\n return response;\n }\n\n private send(request: Uint8Array): void {\n let offset = 0;\n for (;;) {\n const size = Math.min(this.capacity, request.length - offset);\n this.data.set(request.subarray(offset, offset + size), 0);\n offset += size;\n Atomics.store(this.control, LENGTH, size);\n Atomics.store(this.control, MORE, offset < request.length ? 1 : 0);\n this.publish(STATE_REQUEST);\n const next = this.waitWhile(STATE_REQUEST);\n if (next === STATE_RESPONSE) return;\n if (next !== STATE_CONTINUE) {\n this.closed = true;\n throw new HostTransportError(\"the host went away mid-request\");\n }\n }\n }\n\n private receive(): Uint8Array {\n const parts: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const size = Atomics.load(this.control, LENGTH);\n parts.push(this.data.slice(0, size));\n total += size;\n if (Atomics.load(this.control, MORE) === 0) break;\n this.publish(STATE_CONTINUE);\n if (this.waitWhile(STATE_CONTINUE) !== STATE_RESPONSE) {\n this.closed = true;\n throw new HostTransportError(\"the host went away mid-response\");\n }\n }\n Atomics.store(this.control, STATE, STATE_IDLE);\n if (parts.length === 1) return parts[0];\n const joined = new Uint8Array(total);\n let at = 0;\n for (const part of parts) { joined.set(part, at); at += part.length; }\n return joined;\n }\n\n private publish(state: number): void {\n Atomics.store(this.control, STATE, state);\n Atomics.notify(this.control, STATE);\n this.wake();\n }\n\n private waitWhile(state: number): number {\n for (;;) {\n Atomics.wait(this.control, STATE, state, WAIT_SLICE_MS);\n const current = Atomics.load(this.control, STATE);\n if (current !== state) return current;\n }\n }\n}\n\n/**\n * The host side. Lives wherever the volume and the process table do, and never\n * blocks; `handle` is free to be asynchronous.\n */\nexport class HostCallServer {\n private control: Int32Array;\n private data: Uint8Array;\n private capacity: number;\n private handle: (request: Uint8Array) => Promise<Uint8Array> | Uint8Array;\n private onFault: (error: unknown) => void;\n\n private incoming: Uint8Array[] = [];\n private outgoing: Uint8Array | null = null;\n private sent = 0;\n private closed = false;\n\n constructor(\n buffers: HostTransportBuffers,\n handle: (request: Uint8Array) => Promise<Uint8Array> | Uint8Array,\n onFault: (error: unknown) => void = () => {},\n ) {\n this.control = new Int32Array(buffers.control);\n this.data = new Uint8Array(buffers.data);\n this.capacity = this.data.length;\n this.handle = handle;\n this.onFault = onFault;\n }\n\n /** Call on each wake message from the client. */\n async pump(): Promise<void> {\n if (this.closed) return;\n const state = Atomics.load(this.control, STATE);\n if (state === STATE_REQUEST) {\n const size = Atomics.load(this.control, LENGTH);\n this.incoming.push(this.data.slice(0, size));\n if (Atomics.load(this.control, MORE) === 1) {\n this.publish(STATE_CONTINUE);\n return;\n }\n const request = concat(this.incoming);\n this.incoming = [];\n let response: Uint8Array;\n try {\n response = await this.handle(request);\n } catch (error) {\n /* Anything escaping the handler is a bug in the dispatcher. Closing the\n * transport is the honest answer: the client raises, rather than\n * reading a zero-length frame as a successful empty result. */\n this.onFault(error);\n this.close();\n return;\n }\n if (this.closed) return;\n this.outgoing = response;\n this.sent = 0;\n this.sendWindow();\n return;\n }\n if (state === STATE_CONTINUE) this.sendWindow();\n }\n\n /** Release a blocked client — container teardown, or the worker being killed. */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n Atomics.store(this.control, STATE, STATE_CLOSED);\n Atomics.notify(this.control, STATE);\n }\n\n private sendWindow(): void {\n const payload = this.outgoing ?? new Uint8Array();\n const size = Math.min(this.capacity, payload.length - this.sent);\n this.data.set(payload.subarray(this.sent, this.sent + size), 0);\n this.sent += size;\n Atomics.store(this.control, LENGTH, size);\n Atomics.store(this.control, MORE, this.sent < payload.length ? 1 : 0);\n this.publish(STATE_RESPONSE);\n }\n\n private publish(state: number): void {\n Atomics.store(this.control, STATE, state);\n Atomics.notify(this.control, STATE);\n }\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n if (parts.length === 1) return parts[0];\n const total = parts.reduce((sum, part) => sum + part.length, 0);\n const joined = new Uint8Array(total);\n let at = 0;\n for (const part of parts) { joined.set(part, at); at += part.length; }\n return joined;\n}\n","/**\n * An Emscripten filesystem backed by the SandboxedJs kernel.\n *\n * The interpreter is compiled expecting a POSIX filesystem, and Emscripten\n * supplies one — in the guest's own memory. That is exactly the arrangement\n * this whole design exists to avoid: a second copy of the container's state,\n * private to one process, diverging from the moment anything writes.\n *\n * So the container's directories are mounted on a filesystem whose every\n * operation is a blocking call to the kernel over `sbx_host_v1`. There is one\n * authority for files, and the interpreter is not it.\n *\n * The shape below is Emscripten's `FS` backend contract, the same one NODEFS\n * implements. It has to be synchronous, which is precisely what the host ABI's\n * blocking transport provides.\n */\n\nimport { ERRNO_NAMES, Errno } from \"./host-abi.js\";\nimport { HostAbiError, type HostAbiClient } from \"./syscall-client.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\n\n/**\n * Build the filesystem backend for one process.\n *\n * `FS` is the interpreter module's own filesystem object, `errnoCodes` is that\n * build's `ERRNO_CODES` table, and `client` is the process's connection to the\n * kernel — one per process, never shared, so a file opened here belongs to a\n * descriptor table the kernel can clean up when the process goes.\n */\nexport function createSbxFs(FS: any, client: HostAbiClient, errnoCodes: Record<string, number>): any {\n /**\n * Translate a kernel errno into the number *this libc* uses.\n *\n * Not a formality. Emscripten's musl numbering is not Linux's: `ENOENT` is\n * 44 there and 2 here, and 2 is `EACCES`. Passing our number through\n * unchanged turns \"no such file\" into \"permission denied\" — which is exactly\n * how a perfectly good `open(path, \"w\")` came back as a PermissionError\n * carrying the errno of a different failure. The ABI's canonical values are\n * Linux's; every adapter translates at its own edge.\n */\n const translate = (canonical: number): number => {\n const name = ERRNO_NAMES[canonical];\n const mapped = name ? errnoCodes[name] : undefined;\n return mapped ?? errnoCodes.EIO ?? canonical;\n };\n\n const raise = (canonical: number): never => {\n throw new FS.ErrnoError(translate(canonical));\n };\n\n const fail = (error: unknown): never => {\n if (error instanceof HostAbiError) return raise(error.errno);\n return raise(Errno.EIO);\n };\n\n const SBXFS = {\n /** Where this mount sits in the guest's namespace, and where in the container. */\n mount(mount: any): any {\n return SBXFS.createNode(null, \"/\", S_IFDIR | 0o777, 0);\n },\n\n createNode(parent: any, name: string, mode: number, dev: number): any {\n if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) raise(Errno.EINVAL);\n const node = FS.createNode(parent, name, mode, dev);\n node.node_ops = SBXFS.node_ops;\n node.stream_ops = SBXFS.stream_ops;\n return node;\n },\n\n /** The container path a guest node stands for. */\n realPath(node: any): string {\n const parts: string[] = [];\n let current = node;\n while (current.parent !== current) {\n parts.push(current.name);\n current = current.parent;\n }\n parts.push(current.mount.opts.root);\n parts.reverse();\n return parts.join(\"/\").replace(/\\/+/g, \"/\");\n },\n\n node_ops: {\n getattr(node: any): any {\n const path = SBXFS.realPath(node);\n let stat;\n try {\n stat = client.stat(path, false);\n } catch (error) {\n return fail(error);\n }\n return {\n dev: 1,\n ino: stat.ino,\n mode: stat.mode,\n nlink: stat.nlink,\n uid: stat.uid,\n gid: stat.gid,\n rdev: 0,\n size: stat.size,\n atime: new Date(stat.atimeNs / 1e6),\n mtime: new Date(stat.mtimeNs / 1e6),\n ctime: new Date(stat.ctimeNs / 1e6),\n /* Emscripten sizes its own reads from this; a wrong block size shows\n * up as short reads on large files rather than as an error. */\n blksize: 4096,\n blocks: Math.ceil(stat.size / 4096),\n };\n },\n\n setattr(node: any, attr: any): void {\n const path = SBXFS.realPath(node);\n try {\n if (attr.size !== undefined) {\n const fd = client.open(path, 1 /* O_WRONLY */);\n try {\n client.ftruncate(fd, attr.size);\n } finally {\n client.close(fd);\n }\n }\n /* Mode and times are accepted and dropped for now: the volume has no\n * per-descriptor chmod through the ABI yet, and refusing here would\n * break `pip`, which sets a mode on everything it installs. */\n } catch (error) {\n fail(error);\n }\n },\n\n lookup(parent: any, name: string): any {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n let stat;\n try {\n stat = client.stat(path, false);\n } catch (error) {\n /* A missing entry is not an error here — it is how `lookup` says\n * \"no\". Anything else is, and must not be flattened into ENOENT. */\n if (error instanceof HostAbiError && error.errno === Errno.ENOENT) raise(Errno.ENOENT);\n return fail(error);\n }\n const node = SBXFS.createNode(parent, name, stat.mode, 0);\n node.node_ops = SBXFS.node_ops;\n node.stream_ops = SBXFS.stream_ops;\n return node;\n },\n\n mknod(parent: any, name: string, mode: number, dev: number): any {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n if ((mode & S_IFDIR) === S_IFDIR) client.mkdir(path, mode & 0o777);\n else {\n const fd = client.open(path, 0o1 | 0o100 /* O_WRONLY|O_CREAT */, mode & 0o777);\n client.close(fd);\n }\n } catch (error) {\n fail(error);\n }\n return SBXFS.createNode(parent, name, mode, dev);\n },\n\n rename(node: any, newParent: any, newName: string): void {\n const from = SBXFS.realPath(node);\n const to = `${SBXFS.realPath(newParent)}/${newName}`.replace(/\\/+/g, \"/\");\n try {\n client.rename(from, to);\n } catch (error) {\n fail(error);\n }\n /* Emscripten keeps its own name tree, so it has to be told too, or the\n * next lookup finds the file under the name it no longer has. */\n node.name = newName;\n node.parent = newParent;\n },\n\n unlink(parent: any, name: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.unlink(path, false);\n } catch (error) {\n fail(error);\n }\n },\n\n rmdir(parent: any, name: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.unlink(path, true);\n } catch (error) {\n fail(error);\n }\n },\n\n readdir(node: any): string[] {\n const path = SBXFS.realPath(node);\n try {\n const fd = client.open(path, 0 /* O_RDONLY */);\n try {\n const names: string[] = [];\n for (;;) {\n const batch = client.readdir(fd, 8192);\n if (batch.length === 0) break;\n names.push(...batch);\n }\n return names;\n } finally {\n client.close(fd);\n }\n } catch (error) {\n return fail(error);\n }\n },\n\n symlink(parent: any, name: string, target: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.symlink(target, path);\n } catch (error) {\n fail(error);\n }\n },\n\n readlink(node: any): string {\n try {\n return client.readlink(SBXFS.realPath(node));\n } catch (error) {\n return fail(error);\n }\n },\n },\n\n stream_ops: {\n open(stream: any): void {\n const path = SBXFS.realPath(stream.node);\n if (FS.isDir(stream.node.mode)) return;\n try {\n /* The guest's flags are already POSIX numbers, and the kernel's ABI\n * uses the same ones — no translation, and none invented. */\n stream.sbxFd = client.open(path, stream.flags & ~0o2000000 /* drop O_CLOEXEC */);\n } catch (error) {\n fail(error);\n }\n },\n\n close(stream: any): void {\n if (stream.sbxFd === undefined) return;\n try {\n client.close(stream.sbxFd);\n } catch {\n /* A close that fails has still released the descriptor here; raising\n * would leak the guest's stream instead. */\n }\n stream.sbxFd = undefined;\n },\n\n read(stream: any, buffer: Uint8Array, offset: number, length: number, position: number): number {\n if (length === 0) return 0;\n try {\n const data = client.pread(stream.sbxFd, length, position);\n buffer.set(data, offset);\n return data.length;\n } catch (error) {\n return fail(error);\n }\n },\n\n write(stream: any, buffer: Uint8Array, offset: number, length: number, position: number): number {\n if (length === 0) return 0;\n try {\n return client.pwrite(stream.sbxFd, buffer.subarray(offset, offset + length), position);\n } catch (error) {\n return fail(error);\n }\n },\n\n llseek(stream: any, offset: number, whence: number): number {\n let position = offset;\n if (whence === 1) position += stream.position;\n else if (whence === 2 && FS.isFile(stream.node.mode)) {\n position += SBXFS.node_ops.getattr(stream.node).size;\n }\n if (position < 0) raise(Errno.EINVAL);\n return position;\n },\n },\n };\n\n return SBXFS;\n}\n","/**\n * Compression and hashing, resolved at runtime rather than at import time.\n *\n * On Node these delegate to `node:zlib` and `node:crypto`. In a browser they\n * fall back to `CompressionStream` and `crypto.subtle`, with a small MD5 in\n * JavaScript because Web Crypto does not offer it. Loading this module never\n * imports a `node:` builtin, so the package can be bundled for the browser;\n * the platform is only decided when a byte actually needs compressing.\n */\n\nexport type HashAlgorithm = \"md5\" | \"sha1\" | \"sha224\" | \"sha256\" | \"sha384\" | \"sha512\";\n\nconst isNode =\n typeof process !== \"undefined\" && process.versions != null && process.versions.node != null;\n\n/**\n * Import a Node builtin without a bundler noticing.\n *\n * The specifier is assembled at runtime so esbuild/Vite/webpack cannot analyse\n * it: a browser bundle then contains no reference to `zlib` or `crypto` to\n * resolve, while Node still loads them normally. (A literal `import(\"node:zlib\")`\n * gets rewritten to a bare `import(\"zlib\")` by esbuild's node platform, which a\n * browser bundler would then try — and fail — to resolve from node_modules.)\n */\nexport async function nodeBuiltin<T>(name: string): Promise<T> {\n const specifier = `node:${name}`;\n return (await import(/* @vite-ignore */ /* webpackIgnore: true */ specifier)) as T;\n}\n\n/**\n * Import a Node-only package the same way, and for the same reason.\n *\n * A dynamic `import()` of a *literal* specifier is still resolved and bundled\n * — it only becomes a separate chunk. So `import(\"esbuild-wasm\")`\n * still drags `node:worker_threads` into a browser build even though a browser\n * host never calls it. Assembling the specifier at runtime is what actually\n * keeps it out of the graph.\n */\nexport async function nodeOnlyModule<T>(specifier: string): Promise<T> {\n const parts = specifier.split(\"/\");\n const runtimeSpecifier = parts.join(\"/\");\n return (await import(/* @vite-ignore */ /* webpackIgnore: true */ runtimeSpecifier)) as T;\n}\n\n// ── zlib ────────────────────────────────────────────────────────────────────\n\ntype ZlibModule = typeof import(\"node:zlib\");\nlet zlibPromise: Promise<ZlibModule> | null = null;\n\nfunction nodeZlib(): Promise<ZlibModule> {\n zlibPromise ??= nodeBuiltin<ZlibModule>(\"zlib\");\n return zlibPromise;\n}\n\n/** Run bytes through a `CompressionStream`/`DecompressionStream`. */\nasync function throughStream(data: Uint8Array, stream: unknown): Promise<Uint8Array> {\n const source = new Blob([data as BlobPart]).stream();\n const piped = (source as unknown as { pipeThrough(s: unknown): ReadableStream }).pipeThrough(stream);\n return new Uint8Array(await new Response(piped).arrayBuffer());\n}\n\nexport async function gzip(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).gzipSync(data));\n return throughStream(data, new CompressionStream(\"gzip\"));\n}\n\nexport async function gunzip(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).gunzipSync(data));\n return throughStream(data, new DecompressionStream(\"gzip\"));\n}\n\nexport async function deflate(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).deflateSync(data));\n return throughStream(data, new CompressionStream(\"deflate\"));\n}\n\nexport async function inflate(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).inflateSync(data));\n return throughStream(data, new DecompressionStream(\"deflate\"));\n}\n\n/** Raw deflate, with no zlib header — what zip entries use. */\nexport async function inflateRaw(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).inflateRawSync(data));\n return throughStream(data, new DecompressionStream(\"deflate-raw\"));\n}\n\n// ── hashing ─────────────────────────────────────────────────────────────────\n\ntype CryptoModule = typeof import(\"node:crypto\");\nlet cryptoPromise: Promise<CryptoModule> | null = null;\n\nfunction nodeCrypto(): Promise<CryptoModule> {\n cryptoPromise ??= nodeBuiltin<CryptoModule>(\"crypto\");\n return cryptoPromise;\n}\n\nconst SUBTLE_NAMES: Partial<Record<HashAlgorithm, string>> = {\n sha1: \"SHA-1\",\n sha256: \"SHA-256\",\n sha384: \"SHA-384\",\n sha512: \"SHA-512\",\n};\n\nexport class UnsupportedAlgorithmError extends Error {\n constructor(algorithm: string) {\n super(`${algorithm} is not available in this environment`);\n this.name = \"UnsupportedAlgorithmError\";\n }\n}\n\n/** Hex digest of `data`. */\nexport async function digestHex(algorithm: HashAlgorithm, data: Uint8Array): Promise<string> {\n if (isNode) {\n const { createHash } = await nodeCrypto();\n return createHash(algorithm).update(data).digest(\"hex\");\n }\n if (algorithm === \"md5\") return md5Hex(data);\n const name = SUBTLE_NAMES[algorithm];\n if (!name) throw new UnsupportedAlgorithmError(algorithm);\n const buffer = await crypto.subtle.digest(name, data as BufferSource);\n return toHex(new Uint8Array(buffer));\n}\n\nexport async function randomUuid(): Promise<string> {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") return crypto.randomUUID();\n const { randomUUID } = await nodeCrypto();\n return randomUUID();\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = \"\";\n for (const byte of bytes) out += byte.toString(16).padStart(2, \"0\");\n return out;\n}\n\n// ── MD5 ─────────────────────────────────────────────────────────────────────\n\n/**\n * RFC 1321 MD5. Only reached in browsers, where Web Crypto deliberately omits\n * it; Node uses its own implementation above. Exported so the test suite can\n * exercise the browser path while running on Node.\n */\nexport function md5Hex(input: Uint8Array): string {\n const S = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n ];\n const K = new Uint32Array(64);\n for (let i = 0; i < 64; i++) K[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 2 ** 32);\n\n const bitLength = input.length * 8;\n const padded = new Uint8Array((((input.length + 8) >> 6) + 1) * 64);\n padded.set(input);\n padded[input.length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, bitLength >>> 0, true);\n view.setUint32(padded.length - 4, Math.floor(bitLength / 2 ** 32), true);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n for (let chunk = 0; chunk < padded.length; chunk += 64) {\n const M = new Uint32Array(16);\n for (let i = 0; i < 16; i++) M[i] = view.getUint32(chunk + i * 4, true);\n\n let [a, b, c, d] = [a0, b0, c0, d0];\n for (let i = 0; i < 64; i++) {\n let f: number;\n let g: number;\n if (i < 16) {\n f = (b & c) | (~b & d);\n g = i;\n } else if (i < 32) {\n f = (d & b) | (~d & c);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n f = b ^ c ^ d;\n g = (3 * i + 5) % 16;\n } else {\n f = c ^ (b | ~d);\n g = (7 * i) % 16;\n }\n const tmp = d;\n d = c;\n c = b;\n const sum = (a + f + K[i]! + M[g]!) >>> 0;\n b = (b + ((sum << S[i]!) | (sum >>> (32 - S[i]!)))) >>> 0;\n a = tmp;\n }\n a0 = (a0 + a) >>> 0;\n b0 = (b0 + b) >>> 0;\n c0 = (c0 + c) >>> 0;\n d0 = (d0 + d) >>> 0;\n }\n\n const out = new Uint8Array(16);\n new DataView(out.buffer).setUint32(0, a0, true);\n new DataView(out.buffer).setUint32(4, b0, true);\n new DataView(out.buffer).setUint32(8, c0, true);\n new DataView(out.buffer).setUint32(12, d0, true);\n return toHex(out);\n}\n","/**\n * One Python process, in its own worker.\n *\n * This is the rule the old integration could not keep: **one active Python\n * process owns one interpreter instance.** A worker starts, instantiates the\n * interpreter from the release artifact, runs one command line, and exits.\n * Nothing survives it — not `sys.modules`, not logging handlers, not a native\n * extension's static state — because there is nothing for it to survive in.\n *\n * Everything the interpreter would ask an operating system for goes to the\n * kernel over `sbx_host_v1`, synchronously, while this worker blocks. The\n * kernel is on another thread and stays awake, which is what makes a blocking\n * `read()` of a terminal nobody has typed into possible at all.\n */\n\nimport { HostAbiClient } from \"./syscall-client.js\";\nimport { HostCallClient, type HostTransportBuffers } from \"./sync-transport.js\";\nimport { createSbxFs } from \"./sbxfs.js\";\nimport { ERRNO_NAMES } from \"./host-abi.js\";\nimport { nodeBuiltin } from \"../../util/binary.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface PythonWorkerStart {\n buffers: HostTransportBuffers;\n generation: number;\n moduleUrl: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n /** The identity the kernel gave this process; libc's own is a constant. */\n pid: number;\n ppid: number;\n /** Container directories to mount, and where. */\n mounts: { guest: string; container: string }[];\n /** True when stdout is a terminal, which Python checks before buffering. */\n isTty: boolean;\n}\n\nexport interface PythonWorkerPort {\n postMessage(message: unknown): void;\n}\n\n/**\n * Directories the interpreter owns and the container must not cover.\n *\n * The standard library lives inside the module's own data image. Mounting the\n * container over it would replace Python with whatever the container happens\n * to have at that path — usually nothing.\n */\nconst INTERPRETER_OWNED = new Set([\"/lib\", \"/dev\", \"/proc\", \"/usr/local\"]);\n\nexport async function runPythonProcess(start: PythonWorkerStart, port: PythonWorkerPort): Promise<void> {\n const transport = new HostCallClient(start.buffers, () => port.postMessage({ type: \"wake\" }));\n\n /* The guest may not assert its own identity: the transport belongs to one\n * process, and the kernel stamps the generation it was created with. */\n const stampedCall = (request: Uint8Array): Uint8Array => {\n const stamped = request.slice();\n new DataView(stamped.buffer).setUint32(8, start.generation, true);\n return transport.call(stamped);\n };\n const client = new HostAbiClient(\n { call: stampedCall } as unknown as HostCallClient,\n start.generation,\n );\n\n const factory = (await import(/* @vite-ignore */ start.moduleUrl)).default;\n\n let exitCode = 0;\n\n /* The guest's linear memory, captured at instantiation.\n *\n * `_sbx_socket` is the one native module that reaches the host through the\n * raw Wasm `sbx_host_call` import rather than the JS filesystem bridge, so\n * this shim has to copy request and response bytes in and out of that\n * memory itself. The Emscripten loader does not put `HEAPU8` on the Module\n * object unless it is in `EXPORTED_RUNTIME_METHODS`, and this build's list\n * deliberately does not carry it — so the shim reads the buffer straight\n * from the imported `WebAssembly.Memory` instead, re-viewing it on every\n * call because memory growth detaches the old `ArrayBuffer`. */\n let guestMemory: WebAssembly.Memory | undefined;\n const guestHeap = (): Uint8Array | undefined => {\n const exported = config.HEAPU8 as Uint8Array | undefined;\n if (exported && exported.byteLength > 0) return exported;\n return guestMemory ? new Uint8Array(guestMemory.buffer) : undefined;\n };\n\n /**\n * Rewrite a failed response's errno into the number *this libc* uses.\n *\n * The ABI's errno values are Linux's; Emscripten's musl numbering is not.\n * `sbxfs.ts` translates at its own edge, and this is the other edge: native\n * modules that call `sbx_host_call` directly take the status straight into\n * `errno`, so an untranslated value does not merely mislabel the failure, it\n * *changes which failure it is*. `EAGAIN` (11 here) is `ECANCELED` there, so\n * \"this socket would block\" reached asyncio as a fatal error instead of the\n * BlockingIOError its accept and recv loops are built to expect — a server\n * that had already produced a correct response then hung, because the\n * event loop treated a routine retry as a broken connection.\n */\n const translateResponseErrno = (response: Uint8Array): void => {\n const view = new DataView(response.buffer, response.byteOffset, response.byteLength);\n const status = view.getInt32(12, true);\n if (status >= 0) return;\n const codes = (config.ERRNO_CODES ?? {}) as Record<string, number>;\n const name = ERRNO_NAMES[-status];\n const mapped = name ? codes[name] : undefined;\n view.setInt32(12, -(mapped ?? codes.EIO ?? -status), true);\n };\n\n /* Emscripten uses the object it is given *as* the module, so this one gains\n * `FS` and `ENV` before `preRun` fires. Reaching for them through `this`\n * instead depends on how the callback happens to be invoked, which has\n * changed between Emscripten releases and fails as \"cannot read FS of\n * undefined\" — a long way from the cause. */\n const config: any = {\n /* Emscripten resolves `python.wasm` and `python.data` beside its loader;\n * saying so explicitly survives a host that serves the loader from a\n * different path than it was built at.\n *\n * Under Node the loader reads them with `fs`, which wants a path and not a\n * `file://` URL — and reports the difference as a bare ENOENT naming the\n * URL, which reads like a missing file rather than a wrong kind of name. */\n locateFile: (file: string) => {\n const resolved = new URL(file, start.moduleUrl);\n if (resolved.protocol !== \"file:\") {\n const release = new URL(start.moduleUrl).searchParams.get(\"sbx-runtime\");\n if (release) resolved.searchParams.set(\"sbx-runtime\", release);\n return resolved.href;\n }\n return decodeURIComponent(resolved.pathname);\n },\n arguments: start.argv,\n /* Read by the `--wrap`ped `getpid`/`getppid` in library_sbx_posix.js. */\n sbxPid: start.pid,\n sbxPpid: start.ppid,\n /* Native CPython modules call the same ABI import as the filesystem\n * bridge. Stamp the process generation here so C callers cannot forge it.\n *\n * The JS library normally lowers this to `Module.sbxHostCall`; dynamic\n * Emscripten links may retain `env.sbx_host_call` as a direct Wasm import,\n * though. Supplying the exact import name keeps both link shapes working.\n */\n sbxHostCall: (request: Uint8Array) => stampedCall(request),\n sbx_host_call: (requestPtr: number, requestLength: number, responsePtr: number, responseCapacity: number) => {\n const heap = guestHeap();\n if (!heap) return -5; // EIO: the runtime called before memory was ready.\n try {\n const response = stampedCall(heap.slice(requestPtr, requestPtr + requestLength));\n if (response.length < 20 || response.length > responseCapacity) return -34; // ERANGE\n translateResponseErrno(response);\n guestHeap()!.set(response, responsePtr);\n return response.length;\n } catch (error) {\n config.sbxHostFault = error;\n return -5; // EIO\n }\n },\n /* `_sbx_socket` is a native module and therefore retains the ABI call as\n * an `env` import in dynamic builds. Emscripten's generated loader does\n * not copy arbitrary Module properties into that import object, so bind it\n * at the one supported extension point before instantiation. */\n instantiateWasm: (imports: { env: Record<string, unknown> }, receiveInstance: (instance: WebAssembly.Instance, module: WebAssembly.Module) => void) => {\n imports.env.sbx_host_call = config.sbx_host_call;\n if (imports.env.memory instanceof WebAssembly.Memory) guestMemory = imports.env.memory;\n void (async () => {\n try {\n const url = config.locateFile(\"python.wasm\");\n let bytes: Uint8Array;\n if (String(url).startsWith(\"file:\" ) || String(url).startsWith(\"/\")) {\n const [{ readFile }, { fileURLToPath }] = await Promise.all([\n nodeBuiltin<typeof import(\"node:fs/promises\")>(\"fs/promises\"),\n nodeBuiltin<typeof import(\"node:url\")>(\"url\"),\n ]);\n bytes = new Uint8Array(await readFile(String(url).startsWith(\"file:\") ? fileURLToPath(url) : url));\n } else {\n bytes = new Uint8Array(await (await fetch(url)).arrayBuffer());\n }\n const result = await WebAssembly.instantiate(\n bytes as BufferSource,\n imports as WebAssembly.Imports,\n ) as WebAssembly.WebAssemblyInstantiatedSource;\n if (!guestMemory && result.instance.exports.memory instanceof WebAssembly.Memory) {\n guestMemory = result.instance.exports.memory;\n }\n receiveInstance(result.instance, result.module);\n } catch (error) {\n config.onAbort?.(error);\n throw error;\n }\n })();\n return {};\n },\n quit: (status: number) => {\n exitCode = status;\n },\n };\n\n config.preRun = [\n () => {\n mountContainer(config.FS, client, start.mounts, config.ERRNO_CODES ?? {});\n bindStdio(config.FS, client, start.isTty);\n for (const [key, value] of Object.entries(start.env)) config.ENV[key] = value;\n try {\n config.FS.chdir(start.cwd);\n } catch {\n /* A cwd the container does not have is the caller's problem to report,\n * not a reason to fail before `main` runs. */\n }\n },\n ];\n\n const module = await factory(config);\n\n try {\n exitCode = module.callMain(start.argv) ?? exitCode;\n } catch (error) {\n const status = (error as { status?: number }).status;\n if (typeof status === \"number\") exitCode = status;\n else {\n port.postMessage({ type: \"failed\", message: String((error as Error)?.message ?? error) });\n return;\n }\n }\n port.postMessage({ type: \"exit\", code: exitCode });\n}\n\n/** Put the container's directories where a program expects to find them. */\nfunction mountContainer(\n FS: any,\n client: HostAbiClient,\n mounts: { guest: string; container: string }[],\n errnoCodes: Record<string, number>,\n): void {\n const SBXFS = createSbxFs(FS, client, errnoCodes);\n for (const mount of mounts) {\n if (INTERPRETER_OWNED.has(mount.guest)) continue;\n try {\n FS.mkdirTree(mount.guest);\n } catch {\n /* Already there. */\n }\n FS.mount(SBXFS, { root: mount.container }, mount.guest);\n }\n}\n\n/**\n * Wire the process's standard streams to the kernel's.\n *\n * Byte by byte, and never decoded: the terminal boundary is where a multi-byte\n * character gets cut in half, and a stream that decodes here turns that into a\n * replacement character the program can never recover.\n *\n * Whether these are *terminals* is the part that decides how the interpreter\n * behaves, not just how it looks. Handing Emscripten byte callbacks through\n * `FS.init(input, output, error)` makes plain character devices, so `isatty`\n * is false — and CPython with a non-terminal stdin does not start a REPL, it\n * reads stdin as a script file. `python` at an interactive prompt then sits\n * there forever with no banner, having decided it was given a program.\n *\n * So a terminal gets real TTY streams — `FS.init(null, null, null)` symlinks\n * `/dev/stdin` to `/dev/tty` — with this process's ops swapped in afterwards.\n * A pipe gets the character devices, which is what a pipe should be.\n */\nfunction bindStdio(FS: any, client: HostAbiClient, isTty: boolean): void {\n /** One byte from the kernel, or null at end of input. Blocks in between. */\n const readByte = (): number | null => {\n const data = client.read(0, 1);\n return data.length === 0 ? null : data[0]!;\n };\n\n if (!isTty) {\n FS.init(readByte, writeThrough(client, 1), writeThrough(client, 2));\n return;\n }\n\n FS.init(null, null, null);\n\n /* The stream's own ops are replaced rather than the TTY's.\n *\n * Emscripten's TTY writes a byte at a time and flushes on a newline, because\n * its sink is a `console.log`-shaped line printer. A prompt has no newline —\n * `>>> ` would sit in that buffer forever, and `fflush` does not reach it,\n * because C's `fflush` issues a `write`, not an `fsync`. Handling the whole\n * `write` here means one kernel write per guest write, which is both correct\n * and what a terminal actually looks like.\n *\n * `stream.tty` is left in place, so `isatty` still says yes.\n */\n for (const [fd, sink] of [[1, 1], [2, 2]] as [number, number][]) {\n const stream = FS.getStream(fd);\n if (!stream) continue;\n stream.stream_ops = {\n ...stream.stream_ops,\n write(_stream: any, buffer: Uint8Array, offset: number, length: number): number {\n if (length > 0) client.writeAll(sink, buffer.subarray(offset, offset + length));\n return length;\n },\n fsync(): number {\n return 0;\n },\n };\n }\n\n const stdin = FS.getStream(0);\n if (stdin) {\n stdin.stream_ops = {\n ...stdin.stream_ops,\n read(_stream: any, buffer: Uint8Array, offset: number, length: number): number {\n /* Blocks in the kernel until a key is pressed. Returning zero here\n * means end of input, so it must never be how \"nothing yet\" is\n * reported. */\n const data = client.read(0, length);\n buffer.set(data, offset);\n return data.length;\n },\n };\n }\n}\n\n/** A line-buffered writer for a non-terminal stream. */\nfunction writeThrough(client: HostAbiClient, fd: number): (charCode: number | null) => void {\n let pending: number[] = [];\n return (charCode) => {\n if (charCode === null) {\n if (pending.length > 0) {\n client.writeAll(fd, new Uint8Array(pending));\n pending = [];\n }\n return;\n }\n pending.push(charCode);\n /* Flush on a newline so output appears when it was written, and on size so\n * a long line is not held indefinitely. */\n if (charCode === 10 || pending.length >= 4096) {\n client.writeAll(fd, new Uint8Array(pending));\n pending = [];\n }\n };\n}\n","/**\n * The process worker's entry point.\n *\n * Built as its own bundle: a worker is fetched as its own module graph, so\n * anything left unresolved here has to resolve from wherever the loader\n * happens to be — the trap HANDOFF.md records for the guest worker.\n *\n * It waits for its buffers rather than reading them from `workerData`, so the\n * same file serves a browser `Worker` and a Node `worker_threads` one.\n */\n\nimport { runPythonProcess, type PythonWorkerStart } from \"./worker-entry.js\";\n\ninterface Port {\n postMessage(message: unknown): void;\n}\n\nasync function connect(): Promise<{ port: Port; onStart: (handler: (start: PythonWorkerStart) => void) => void }> {\n /* A browser worker posts and listens on its own global scope; Node's worker\n * has neither and reaches its parent through `worker_threads`. Feature\n * detection rather than a build flag, so one bundle serves both. */\n const scope = globalThis as unknown as {\n postMessage?: (message: unknown) => void;\n addEventListener?: (type: string, handler: (event: MessageEvent) => void) => void;\n };\n\n if (typeof scope.postMessage === \"function\" && typeof scope.addEventListener === \"function\") {\n const post = scope.postMessage.bind(globalThis);\n const listen = scope.addEventListener.bind(globalThis);\n return {\n port: { postMessage: post },\n onStart: (handler) =>\n listen(\"message\", (event: MessageEvent) => {\n const data = event.data as PythonWorkerStart & { type?: string };\n if (data?.type === \"start\") handler(data);\n }),\n };\n }\n\n const specifier = [\"node\", \"worker_threads\"].join(\":\");\n const { parentPort } = (await import(/* @vite-ignore */ /* webpackIgnore: true */ specifier)) as {\n parentPort: { postMessage(value: unknown): void; on(event: string, listener: (value: unknown) => void): void };\n };\n return {\n port: parentPort,\n onStart: (handler) =>\n parentPort.on(\"message\", (message) => {\n const data = message as PythonWorkerStart & { type?: string };\n if (data?.type === \"start\") handler(data);\n }),\n };\n}\n\nvoid connect().then(({ port, onStart }) => {\n onStart((start) => {\n void runPythonProcess(start, port).catch((error: Error) =>\n port.postMessage({ type: \"failed\", message: String(error?.message ?? error) }),\n );\n });\n /* The supervisor waits for this before sending the start message, so that a\n * worker whose script failed to load is reported rather than hung. */\n port.postMessage({ type: \"sandboxedjs:ready\" });\n});\n"]}
1
+ {"version":3,"sources":["../src/runtime/python/host-abi.ts","../src/runtime/python/protocol.ts","../src/runtime/python/syscall-client.ts","../src/runtime/python/sync-transport.ts","../src/runtime/python/sbxfs.ts","../src/util/binary.ts","../src/runtime/python/worker-entry.ts","../src/runtime/python/worker.ts"],"names":[],"mappings":";AAGO,IAAM,oBAAA,GAAuB,CAAA;AAE7B,IAAM,wBAAA,GAA2B,EAAA;AACjC,IAAM,yBAAA,GAA4B,EAAA;AAGlC,IAAM,EAAA,GAAK;AAAA,EAChB,SAAA,EAAW,CAAA;AAAA,EACX,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,SAAA,EAAW,EAAA;AAAA,EACX,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,EAAA;AAAA,EACT,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,EAAA;AAAA,EACX,QAAA,EAAU,EAAA;AAAA,EACV,KAAA,EAAO,EAAA;AAAA,EACP,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,GAAA;AAAA,EACN,SAAA,EAAW,GAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,GAAA;AAAA,EACN,aAAA,EAAe,IAAA;AAAA,EACf,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,MAAA,EAAQ,IAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS,IAAA;AAAA,EACT,SAAA,EAAW,IAAA;AAAA,EACX,MAAA,EAAQ,IAAA;AAAA,EACR,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,IAAA;AAAA,EACR,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EACV,WAAA,EAAa,IAAA;AAAA,EACb,WAAA,EAAa,IAAA;AAAA,EACb,UAAA,EAAY,IAAA;AAAA,EACZ,UAAA,EAAY,IAAA;AAAA,EACZ,YAAA,EAAc,IAAA;AAAA,EACd,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS,IAAA;AAAA,EACT,IAAA,EAAM;AACR,CAAA;AAKO,IAAM,KAAA,GAAQ;AAAA,EACnB,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,GAAA,EAAK,CAAA;AAAA,EACL,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,EAAA;AAAA,EACT,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,YAAA,EAAc,EAAA;AAAA,EACd,MAAA,EAAQ,EAAA;AAAA,EACR,SAAA,EAAW,EAAA;AAAA,EACX,KAAA,EAAO,EAAA;AAAA,EACP,OAAA,EAAS,EAAA;AAAA,EACT,QAAA,EAAU,EAAA;AAAA,EACV,eAAA,EAAiB,EAAA;AAAA,EACjB,YAAA,EAAc,EAAA;AAAA,EACd,UAAA,EAAY,EAAA;AAAA,EACZ,aAAA,EAAe,EAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,OAAA,EAAS,GAAA;AAAA,EACT,QAAA,EAAU,GAAA;AAAA,EACV,YAAA,EAAc,GAAA;AAAA,EACd,MAAA,EAAQ,EAAA;AAAA,EACR,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAA;AAUO,IAAM,WAAmC,MAAA,CAAO,WAAA;AAAA,EACrD,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,KAAM,CAAC,IAAA,EAAM,IAAI,CAAC;AACvD,CAAA;AAEO,IAAM,cAAsC,MAAA,CAAO,WAAA;AAAA,EACxD,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,KAAM,CAAC,IAAA,EAAM,IAAI,CAAC;AAC1D,CAAA;;;AClGO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,IAAA,GAAO,sBAAA;AAClB,CAAA;AAEO,SAAS,aAAA,CAAc,QAAuB,OAAA,EAAiC;AACpF,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,wBAAA,GAA2B,QAAQ,MAAM,CAAA;AACtE,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACtC,EAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,MAAA,CAAO,OAAA,EAAS,IAAI,CAAA;AACtC,EAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,MAAA,CAAO,EAAA,EAAI,IAAI,CAAA;AACjC,EAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,MAAA,CAAO,SAAA,EAAW,IAAI,CAAA;AACxC,EAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,MAAA,CAAO,UAAA,EAAY,IAAI,CAAA;AACzC,EAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AACvC,EAAA,KAAA,CAAM,GAAA,CAAI,SAAS,wBAAwB,CAAA;AAC3C,EAAA,OAAO,KAAA;AACT;AAkCO,SAAS,cAAA,CAAe,OAAmB,QAAA,EAAyC;AACzF,EAAA,IAAI,KAAA,CAAM,SAAS,yBAAA,EAA2B;AAG5C,IAAA,MAAM,IAAI,cAAc,qDAAqD,CAAA;AAAA,EAC/E;AACA,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,UAAA,EAAY,MAAM,UAAU,CAAA;AAC1E,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAAA,IAC/B,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAAA,IAC1B,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAAA,IACjC,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI;AAAA,GACpC;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,IAAI,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,IAAI,CAAA;AACtC,EAAA,IAAI,MAAM,MAAA,GAAS,yBAAA,GAA4B,QAAQ,MAAM,IAAI,cAAc,4BAA4B,CAAA;AAC3G,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,CAAS,WAAW,MAAM,IAAI,cAAc,qCAAqC,CAAA;AAC1G,IAAA,IAAI,OAAO,UAAA,KAAe,QAAA,CAAS,YAAY,MAAM,IAAI,cAAc,6CAA6C,CAAA;AACpH,IAAA,IAAI,OAAO,EAAA,KAAO,QAAA,CAAS,IAAI,MAAM,IAAI,cAAc,wCAAwC,CAAA;AAAA,EACjG;AACA,EAAA,IAAI,MAAA,CAAO,YAAY,oBAAA,EAAsB;AAC3C,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,iBAAA,EAAoB,OAAO,OAAO,CAAA,WAAA,EAAc,oBAAoB,CAAA,CAAE,CAAA;AAAA,EAChG;AACA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,yBAAA,EAA2B,4BAA4B,MAAM;AAAA,GACvF;AACF;AAGO,IAAM,SAAN,MAAa;AAAA,EACV,EAAA,GAAK,CAAA;AAAA,EACI,IAAA;AAAA,EACA,KAAA;AAAA,EAEjB,YAAY,KAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAA,CAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,UAAA,EAAY,MAAM,UAAU,CAAA;AAAA,EAC3E;AAAA,EAEQ,KAAK,KAAA,EAAuB;AAClC,IAAA,IAAI,IAAA,CAAK,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAQ,MAAM,IAAI,aAAA,CAAc,kBAAkB,CAAA;AACnF,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,IAAA,IAAA,CAAK,EAAA,IAAM,KAAA;AACX,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAc;AAAE,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,KAAK,IAAA,CAAK,CAAC,GAAG,IAAI,CAAA;AAAA,EAAG;AAAA,EAC/D,GAAA,GAAc;AAAE,IAAA,OAAO,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,CAAK,CAAC,GAAG,IAAI,CAAA;AAAA,EAAG;AAAA,EAChE,GAAA,GAAc;AAAE,IAAA,OAAO,MAAA,CAAO,KAAK,IAAA,CAAK,WAAA,CAAY,KAAK,IAAA,CAAK,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EAAG;AAAA,EAC1E,GAAA,GAAc;AAAE,IAAA,OAAO,MAAA,CAAO,KAAK,IAAA,CAAK,YAAA,CAAa,KAAK,IAAA,CAAK,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EAAG;AAAA,EAC3E,OAAA,GAAsB;AACpB,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,EAAI;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,EACpD;AAAA,EACA,MAAA,GAAiB;AAAE,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,EAAG;AAAA,EACpE,IAAI,SAAA,GAAoB;AAAE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,EAAA;AAAA,EAAI;AAChE,CAAA;AAGO,IAAM,SAAN,MAAa;AAAA,EACV,QAAsB,EAAC;AAAA,EAE/B,IAAI,KAAA,EAAqB;AAAE,IAAA,MAAM,CAAA,GAAI,IAAI,UAAA,CAAW,CAAC,CAAA;AAAG,IAAA,IAAI,SAAS,CAAA,CAAE,MAAM,EAAE,QAAA,CAAS,CAAA,EAAG,OAAO,IAAI,CAAA;AAAG,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAG,IAAA,OAAO,IAAA;AAAA,EAAM;AAAA,EAC1I,IAAI,KAAA,EAAqB;AAAE,IAAA,MAAM,CAAA,GAAI,IAAI,UAAA,CAAW,CAAC,CAAA;AAAG,IAAA,IAAI,QAAA,CAAS,EAAE,MAAM,CAAA,CAAE,UAAU,CAAA,EAAG,KAAA,KAAU,GAAG,IAAI,CAAA;AAAG,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAG,IAAA,OAAO,IAAA;AAAA,EAAM;AAAA,EACjJ,IAAI,KAAA,EAAqB;AAAE,IAAA,MAAM,CAAA,GAAI,IAAI,UAAA,CAAW,CAAC,CAAA;AAAG,IAAA,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,CAAE,WAAA,CAAY,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,IAAI,CAAA;AAAG,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAG,IAAA,OAAO,IAAA;AAAA,EAAM;AAAA,EACjK,IAAI,KAAA,EAAqB;AAAE,IAAA,MAAM,CAAA,GAAI,IAAI,UAAA,CAAW,CAAC,CAAA;AAAG,IAAA,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,CAAE,YAAA,CAAa,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,IAAI,CAAA;AAAG,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAG,IAAA,OAAO,IAAA;AAAA,EAAM;AAAA,EAClK,QAAQ,KAAA,EAAyB;AAAE,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,MAAM,CAAA;AAAG,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAAG,IAAA,OAAO,IAAA;AAAA,EAAM;AAAA,EAChG,OAAO,KAAA,EAAqB;AAAE,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAI,aAAY,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAAG;AAAA,EAEpF,MAAA,GAAqB;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,KAAK,CAAA;AAChC,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAAE,MAAA,GAAA,CAAI,GAAA,CAAI,MAAM,EAAE,CAAA;AAAG,MAAA,EAAA,IAAM,IAAA,CAAK,MAAA;AAAA,IAAQ;AACvE,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;;;AChJO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,KAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA,CAAY,OAAe,EAAA,EAAY;AACrC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAK,CAAA,IAAK,OAAO,KAAK,CAAA;AAC/C,IAAA,KAAA,CAAM,CAAA,EAAG,SAAS,EAAE,CAAA,IAAK,MAAM,EAAE,CAAA,CAAE,CAAA,SAAA,EAAY,IAAI,CAAA,CAAE,CAAA;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF,CAAA;AAcO,IAAM,gBAAN,MAAoB;AAAA,EACjB,SAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA,GAAgB,CAAA;AAAA,EAExB,WAAA,CAAY,WAA2B,UAAA,EAAoB;AACzD,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA,EAGA,OAAA,CAAQ,IAAY,OAAA,EAAoC;AACtD,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,OAAA,EAAS,oBAAA;AAAA,MACT,EAAA;AAAA,MACA,WAAW,IAAA,CAAK,aAAA,EAAA;AAAA,MAChB,YAAY,IAAA,CAAK;AAAA,KACnB;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,aAAA,CAAc,MAAA,EAAQ,OAAO,CAAC,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,KAAA,EAAO,MAAM,CAAA;AAC7C,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAA,EAAQ;AAAA,EAC9D;AAAA;AAAA,EAGQ,IAAA,CAAK,IAAY,OAAA,EAAoC;AAC3D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AACvC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG,MAAM,IAAI,YAAA,CAAa,CAAC,MAAA,CAAO,MAAA,EAAQ,EAAE,CAAA;AAChE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAwE;AACtE,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA,CAAK,KAAK,EAAA,CAAG,SAAA,EAAW,IAAI,UAAA,EAAY,CAAA;AAC5D,IAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,OAAO,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,EAAE,GAAA,EAAI;AACtB,IAAA,MAAM,KAAA,GAAQ,EAAE,GAAA,EAAI;AACpB,IAAA,MAAM,eAAwC,EAAC;AAC/C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,IAAK,CAAA,EAAG,YAAA,CAAa,CAAA,CAAE,MAAA,EAAQ,CAAA,GAAI,CAAA,CAAE,KAAI,KAAM,CAAA;AAC1E,IAAA,OAAO,EAAE,SAAS,YAAA,EAAa;AAAA,EACjC;AAAA,EAEA,IAAA,CAAK,IAAA,EAAc,KAAA,EAAe,IAAA,GAAO,GAAA,EAAe;AACtD,IAAA,OAAO,KAAK,IAAA,CAAK,EAAA,CAAG,QAAQ,IAAI,MAAA,GAAS,MAAA,CAAO,IAAI,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,EACvF;AAAA,EAEA,MAAM,EAAA,EAAkB;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,IAAI,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,EACnD;AAAA,EAEA,IAAA,CAAK,IAAY,MAAA,EAA4B;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,EAAE,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA;AAAA,EACvE;AAAA,EAEA,KAAA,CAAM,IAAY,IAAA,EAA0B;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,EAAE,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,EAC1E;AAAA;AAAA,EAGA,QAAA,CAAS,IAAY,IAAA,EAAwB;AAC3C,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,OAAO,EAAA,GAAK,IAAA,CAAK,MAAA,EAAQ,EAAA,IAAM,IAAA,CAAK,MAAM,EAAA,EAAI,IAAA,CAAK,QAAA,CAAS,EAAE,CAAC,CAAA;AAAA,EACjE;AAAA,EAEA,KAAA,CAAM,EAAA,EAAY,MAAA,EAAgB,MAAA,EAA4B;AAC5D,IAAA,OAAO,KAAK,IAAA,CAAK,EAAA,CAAG,OAAO,IAAI,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA;AAAA,EACpF;AAAA,EAEA,MAAA,CAAO,EAAA,EAAY,IAAA,EAAkB,MAAA,EAAwB;AAC3D,IAAA,OAAO,KAAK,IAAA,CAAK,EAAA,CAAG,QAAQ,IAAI,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,EACvF;AAAA,EAEA,IAAA,CAAK,EAAA,EAAY,MAAA,EAAgB,MAAA,EAAwB;AACvD,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA,CAAK,KAAK,EAAA,CAAG,KAAA,EAAO,IAAI,MAAA,EAAO,CAAE,IAAI,EAAE,CAAA,CAAE,IAAI,MAAM,CAAA,CAAE,IAAI,MAAM,CAAA,CAAE,QAAQ,CAAA;AAC7F,IAAA,OAAO,IAAI,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,EAAI;AAAA,EACjC;AAAA,EAEA,MAAM,EAAA,EAAsB;AAC1B,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,OAAO,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,EAAQ,EAAE,OAAO,CAAA;AAAA,EAC9E;AAAA,EAEA,IAAA,CAAK,IAAA,EAAc,WAAA,GAAc,IAAA,EAAgB;AAC/C,IAAA,OAAO,UAAA;AAAA,MACL,KAAK,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,IAAI,QAAO,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,WAAA,GAAc,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE;AAAA,KACpF;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,IAAY,MAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,SAAA,EAAW,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,EACnE;AAAA,EAEA,MAAA,CAAO,MAAc,EAAA,EAAkB;AACrC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,QAAA,EAAU,IAAI,MAAA,EAAO,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA,CAAE,QAAQ,CAAA;AAAA,EACtE;AAAA,EAEA,MAAA,CAAO,IAAA,EAAc,eAAA,GAAkB,KAAA,EAAa;AAClD,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,QAAA,EAAU,IAAI,QAAO,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,eAAA,GAAkB,CAAA,GAAI,CAAC,CAAA,CAAE,QAAQ,CAAA;AAAA,EACxF;AAAA,EAEA,KAAA,CAAM,IAAA,EAAc,IAAA,GAAO,GAAA,EAAa;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,IAAI,MAAA,EAAO,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,EACpE;AAAA,EAEA,SAAS,IAAA,EAAsB;AAC7B,IAAA,OAAO,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,YAAY,IAAI,MAAA,EAAO,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,EAAE,MAAA,EAAO;AAAA,EACjG;AAAA,EAEA,OAAA,CAAQ,QAAgB,IAAA,EAAoB;AAC1C,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,SAAA,EAAW,IAAI,MAAA,EAAO,CAAE,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC3E;AAAA,EAEA,OAAA,CAAQ,EAAA,EAAY,UAAA,GAAa,IAAA,EAAgB;AAC/C,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,IAAA,CAAK,GAAG,QAAA,EAAU,IAAI,MAAA,EAAO,CAAE,IAAI,EAAE,CAAA,CAAE,IAAI,UAAU,CAAA,CAAE,QAAQ,CAAA;AACxF,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,OAAO,OAAO,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,GAAA,CAAI,EAAA,EAAY,IAAA,GAAO,CAAA,EAAW;AAChC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,EAAE,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,EACpE;AAAA,EAEA,IAAA,CAAK,IAAY,MAAA,EAAwB;AACvC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,EAAE,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,EACvE;AAAA,EAEA,SAAS,EAAA,EAAiD;AACxD,IAAA,MAAM,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,GAAG,SAAA,EAAW,IAAI,MAAA,EAAO,CAAE,IAAI,EAAE,CAAA,CAAE,MAAA,EAAQ,EAAE,OAAO,CAAA;AACnF,IAAA,OAAO,EAAE,OAAO,CAAA,CAAE,GAAA,IAAO,OAAA,EAAS,CAAA,CAAE,GAAA,EAAI,KAAM,CAAA,EAAE;AAAA,EAClD;AAAA,EAEA,QAAA,CAAS,EAAA,EAAY,KAAA,EAAe,OAAA,EAAwB;AAC1D,IAAA,IAAA,CAAK,KAAK,EAAA,CAAG,SAAA,EAAW,IAAI,MAAA,EAAO,CAAE,IAAI,EAAE,CAAA,CAAE,GAAA,CAAI,KAAK,EAAE,GAAA,CAAI,OAAA,GAAU,IAAI,CAAC,CAAA,CAAE,QAAQ,CAAA;AAAA,EACvF;AAAA,EAEA,IAAA,CAAK,QAAQ,CAAA,EAAqB;AAChC,IAAA,MAAM,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,GAAG,IAAA,EAAM,IAAI,MAAA,EAAO,CAAE,IAAI,KAAK,CAAA,CAAE,MAAA,EAAQ,EAAE,OAAO,CAAA;AACjF,IAAA,OAAO,CAAC,CAAA,CAAE,GAAA,EAAI,EAAG,CAAA,CAAE,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEA,IAAA,CAAK,SAA2C,SAAA,EAAsD;AACpG,IAAA,MAAM,IAAI,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,QAAQ,MAAM,CAAA;AACzC,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,CAAA,CAAE,GAAA,CAAI,MAAM,EAAE,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAC7D,IAAA,CAAA,CAAE,IAAI,SAAS,CAAA;AACf,IAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,EAAE,GAAA,EAAI;AACpB,IAAA,MAAM,MAAyC,EAAC;AAChD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,IAAK,GAAG,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,EAAE,GAAA,EAAI,EAAG,SAAS,CAAA,CAAE,GAAA,IAAO,CAAA;AAC7E,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,aAAa,SAAA,EAAwD;AACnE,IAAA,MAAM,IAAI,IAAI,MAAA,CAAO,KAAK,IAAA,CAAK,EAAA,CAAG,eAAe,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,YAAY,CAAA,GAAI,CAAC,EAAE,MAAA,EAAQ,EAAE,OAAO,CAAA;AACtG,IAAA,OAAO,EAAE,SAAS,CAAA,CAAE,GAAA,IAAO,KAAA,EAAO,CAAA,CAAE,KAAI,EAAE;AAAA,EAC5C;AAAA,EAEA,MAAM,KAAA,EAAqB;AACzB,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,IAAI,MAAA,GAAS,GAAA,CAAI,KAAK,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,EACtD;AAAA,EAEA,QAAA,GAAmF;AACjF,IAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,IAAI,UAAA,EAAY,CAAA,CAAE,OAAO,CAAA;AACnE,IAAA,OAAO,EAAE,KAAK,CAAA,CAAE,GAAA,IAAO,IAAA,EAAM,CAAA,CAAE,KAAI,EAAG,GAAA,EAAK,EAAE,GAAA,EAAI,EAAG,KAAK,CAAA,CAAE,GAAA,IAAO,KAAA,EAAO,CAAA,CAAE,KAAI,EAAE;AAAA,EACnF;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,IAAI,UAAA,EAAY,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA,EAAO;AAAA,EAC3E;AAAA,EAEA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,IAAI,MAAA,GAAS,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,EACxD;AAAA,EAEA,OAAA,GAAkC;AAChC,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,IAAI,UAAA,EAAY,CAAA,CAAE,OAAO,EAAE,MAAA,EAAO;AAClF,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAA4B;AACpC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,SAAA,EAAW,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA;AAAA,EACpE;AAAA,EAEA,MAAA,CAAO,MAAA,EAAgB,IAAA,EAAc,QAAA,GAAW,CAAA,EAAW;AACzD,IAAA,OAAO,KAAK,IAAA,CAAK,EAAA,CAAG,QAAQ,IAAI,MAAA,GAAS,GAAA,CAAI,MAAM,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,EACzF;AAAA,EAEA,IAAA,CAAK,EAAA,EAAY,OAAA,EAAiB,IAAA,EAAoB;AACpD,IAAA,IAAA,CAAK,KAAK,EAAA,CAAG,IAAA,EAAM,IAAI,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAA,CAAO,EAAA,EAAY,OAAA,GAAU,GAAA,EAAW;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA,CAAE,QAAQ,CAAA;AAAA,EACjE;AAAA,EAEA,OAAO,EAAA,EAA2D;AAChE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,EAAQ,CAAA;AACjE,IAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AACnC,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,EAAG,IAAA,EAAM,CAAA,CAAE,GAAA,EAAI,EAAE;AAAA,EACjE;AAAA,EAEA,OAAA,CAAQ,EAAA,EAAY,OAAA,EAAiB,IAAA,EAAoB;AACvD,IAAA,IAAA,CAAK,KAAK,EAAA,CAAG,OAAA,EAAS,IAAI,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC/E;AAAA,EAEA,IAAA,CAAK,IAAY,IAAA,EAA0B;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,EAAE,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,EACzE;AAAA,EAEA,IAAA,CAAK,IAAY,MAAA,EAA4B;AAC3C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,EAAE,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA;AAAA,EACvE;AAAA,EAEA,QAAA,CAAS,IAAY,GAAA,EAAmB;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,QAAA,EAAU,IAAI,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC/D;AAAA,EAEA,UAAA,CAAW,EAAA,EAAY,IAAA,GAAO,KAAA,EAA0C;AACtE,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,EAAA,CAAG,cAAc,EAAA,CAAG,WAAA,EAAa,IAAI,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA;AACjG,IAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,OAAO,CAAA;AAC5B,IAAA,OAAO,EAAE,SAAS,CAAA,CAAE,MAAA,IAAU,IAAA,EAAM,CAAA,CAAE,KAAI,EAAE;AAAA,EAC9C;AACF,CAAA;AAcA,SAAS,WAAW,OAAA,EAA+B;AACjD,EAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,OAAO,CAAA;AAC5B,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,EAAE,GAAA,EAAI;AAAA,IAAG,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,IAAG,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,IACzC,GAAA,EAAK,EAAE,GAAA,EAAI;AAAA,IAAG,GAAA,EAAK,EAAE,GAAA,EAAI;AAAA,IAAG,KAAA,EAAO,EAAE,GAAA,EAAI;AAAA,IACzC,OAAA,EAAS,EAAE,GAAA,EAAI;AAAA,IAAG,OAAA,EAAS,EAAE,GAAA,EAAI;AAAA,IAAG,OAAA,EAAS,EAAE,GAAA;AAAI,GACrD;AACF;;;ACrQA,IAAM,KAAA,GAAQ,CAAA;AACd,IAAM,MAAA,GAAS,CAAA;AACf,IAAM,IAAA,GAAO,CAAA;AAGb,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,YAAA,GAAe,CAAA;AAGrB,IAAM,aAAA,GAAgB,GAAA;AAiCf,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,IAAA,GAAO,wBAAA;AACT,CAAA;AAQO,IAAM,iBAAN,MAAqB;AAAA,EAClB,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EAEjB,WAAA,CAAY,SAA+B,IAAA,EAAkB;AAC3D,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,IAAA,CAAK,MAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,KAAK,OAAA,EAAiC;AAKpC,IAAA,IAAI,IAAA,CAAK,UAAU,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAA,EAAS,KAAK,MAAM,YAAA,EAAc;AACrE,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,MAAM,IAAI,mBAAmB,8BAA8B,CAAA;AAAA,IAC7D;AACA,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AACjB,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAQ;AAC9B,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,mBAAmB,sEAAsE,CAAA;AAAA,IACrG;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,KAAK,OAAA,EAA2B;AACtC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,WAAS;AACP,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,KAAK,QAAA,EAAU,OAAA,CAAQ,SAAS,MAAM,CAAA;AAC5D,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,OAAA,CAAQ,QAAA,CAAS,QAAQ,MAAA,GAAS,IAAI,GAAG,CAAC,CAAA;AACxD,MAAA,MAAA,IAAU,IAAA;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AACxC,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,OAAA,EAAS,IAAA,EAAM,SAAS,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAC,CAAA;AACjE,MAAA,IAAA,CAAK,QAAQ,aAAa,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA;AACzC,MAAA,IAAI,SAAS,cAAA,EAAgB;AAC7B,MAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,QAAA,MAAM,IAAI,mBAAmB,gCAAgC,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,OAAA,GAAsB;AAC5B,IAAA,MAAM,QAAsB,EAAC;AAC7B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,WAAS;AACP,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AAC9C,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AACnC,MAAA,KAAA,IAAS,IAAA;AACT,MAAA,IAAI,QAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAI,MAAM,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,QAAQ,cAAc,CAAA;AAC3B,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,KAAM,cAAA,EAAgB;AACrD,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,QAAA,MAAM,IAAI,mBAAmB,iCAAiC,CAAA;AAAA,MAChE;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,UAAU,CAAA;AAC7C,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAK,CAAA;AACnC,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAAE,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,EAAE,CAAA;AAAG,MAAA,EAAA,IAAM,IAAA,CAAK,MAAA;AAAA,IAAQ;AACrE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,QAAQ,KAAA,EAAqB;AACnC,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AACxC,IAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAClC,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEQ,UAAU,KAAA,EAAuB;AACvC,IAAA,WAAS;AACP,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,OAAO,aAAa,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAChD,MAAA,IAAI,OAAA,KAAY,OAAO,OAAO,OAAA;AAAA,IAChC;AAAA,EACF;AACF,CAAA;;;AC5IA,IAAM,OAAA,GAAU,KAAA;AAYT,SAAS,WAAA,CAAY,EAAA,EAAS,MAAA,EAAuB,UAAA,EAAyC;AAWnG,EAAA,MAAM,SAAA,GAAY,CAAC,SAAA,KAA8B;AAC/C,IAAA,MAAM,IAAA,GAAO,YAAY,SAAS,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,GAAO,UAAA,CAAW,IAAI,CAAA,GAAI,MAAA;AACzC,IAAA,OAAO,MAAA,IAAU,WAAW,GAAA,IAAO,SAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,SAAA,KAA6B;AAC1C,IAAA,MAAM,IAAI,EAAA,CAAG,UAAA,CAAW,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAA0B;AACtC,IAAA,IAAI,KAAA,YAAiB,YAAA,EAAc,OAAO,KAAA,CAAM,MAAM,KAAK,CAAA;AAC3D,IAAA,OAAO,KAAA,CAAM,MAAM,GAAG,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA;AAAA,IAEZ,MAAM,KAAA,EAAiB;AACrB,MAAA,OAAO,MAAM,UAAA,CAAW,IAAA,EAAM,GAAA,EAAK,OAAA,GAAU,KAAO,CAAC,CAAA;AAAA,IACvD,CAAA;AAAA,IAEA,UAAA,CAAW,MAAA,EAAa,IAAA,EAAc,IAAA,EAAc,GAAA,EAAkB;AACpE,MAAA,IAAI,CAAC,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA,IAAK,CAAC,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,EAAG,KAAA,CAAM,MAAM,MAAM,CAAA;AAC/E,MAAA,MAAM,OAAO,EAAA,CAAG,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,MAAM,GAAG,CAAA;AAClD,MAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,MAAA,IAAA,CAAK,aAAa,KAAA,CAAM,UAAA;AACxB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA;AAAA,IAGA,SAAS,IAAA,EAAmB;AAC1B,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,OAAA,GAAU,IAAA;AACd,MAAA,OAAO,OAAA,CAAQ,WAAW,OAAA,EAAS;AACjC,QAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AACvB,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,MACpB;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,KAAA,CAAM,OAAA,EAAQ;AACd,MAAA,OAAO,MAAM,IAAA,CAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,QAAA,EAAU;AAAA,MACR,QAAQ,IAAA,EAAgB;AACtB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAChC,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,QAChC,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AACA,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,CAAA;AAAA,UACL,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,IAAA,EAAM,CAAA;AAAA,UACN,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,KAAA,EAAO,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,UAClC,KAAA,EAAO,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,UAClC,KAAA,EAAO,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA;AAAA;AAAA,UAGlC,OAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAO,IAAI;AAAA,SACpC;AAAA,MACF,CAAA;AAAA,MAEA,OAAA,CAAQ,MAAW,IAAA,EAAiB;AAClC,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAChC,QAAA,IAAI;AACF,UAAA,IAAI,IAAA,CAAK,SAAS,KAAA,CAAA,EAAW;AAC3B,YAAA,MAAM,KAAK,MAAA,CAAO,IAAA;AAAA,cAAK,IAAA;AAAA,cAAM;AAAA;AAAA,aAAgB;AAC7C,YAAA,IAAI;AACF,cAAA,MAAA,CAAO,SAAA,CAAU,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAAA,YAChC,CAAA,SAAE;AACA,cAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,YACjB;AAAA,UACF;AAAA,QAIF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACZ;AAAA,MACF,CAAA;AAAA,MAEA,MAAA,CAAO,QAAa,IAAA,EAAmB;AACrC,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACpE,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,QAChC,SAAS,KAAA,EAAO;AAGd,UAAA,IAAI,KAAA,YAAiB,gBAAgB,KAAA,CAAM,KAAA,KAAU,MAAM,MAAA,EAAQ,KAAA,CAAM,MAAM,MAAM,CAAA;AACrF,UAAA,OAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AACA,QAAA,MAAM,OAAO,KAAA,CAAM,UAAA,CAAW,QAAQ,IAAA,EAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AACxD,QAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,QAAA,IAAA,CAAK,aAAa,KAAA,CAAM,UAAA;AACxB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MAEA,KAAA,CAAM,MAAA,EAAa,IAAA,EAAc,IAAA,EAAc,GAAA,EAAkB;AAC/D,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACpE,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,OAAO,OAAA,MAAa,OAAA,SAAgB,KAAA,CAAM,IAAA,EAAM,OAAO,GAAK,CAAA;AAAA,eAC5D;AACH,YAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAM,EAAA,EAA8B,OAAO,GAAK,CAAA;AAC7E,YAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,UACjB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACZ;AACA,QAAA,OAAO,KAAA,CAAM,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,MACjD,CAAA;AAAA,MAEA,MAAA,CAAO,IAAA,EAAW,SAAA,EAAgB,OAAA,EAAuB;AACvD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAChC,QAAA,MAAM,EAAA,GAAK,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,SAAS,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACxE,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,QACxB,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACZ;AAGA,QAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AAAA,MAChB,CAAA;AAAA,MAEA,MAAA,CAAO,QAAa,IAAA,EAAoB;AACtC,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACpE,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,QAC3B,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACZ;AAAA,MACF,CAAA;AAAA,MAEA,KAAA,CAAM,QAAa,IAAA,EAAoB;AACrC,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACpE,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,QAC1B,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACZ;AAAA,MACF,CAAA;AAAA,MAEA,QAAQ,IAAA,EAAqB;AAC3B,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAChC,QAAA,IAAI;AACF,UAAA,MAAM,KAAK,MAAA,CAAO,IAAA;AAAA,YAAK,IAAA;AAAA,YAAM;AAAA;AAAA,WAAgB;AAC7C,UAAA,IAAI;AACF,YAAA,MAAM,QAAkB,EAAC;AACzB,YAAA,WAAS;AACP,cAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,EAAA,EAAI,IAAI,CAAA;AACrC,cAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,cAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,YACrB;AACA,YAAA,OAAO,KAAA;AAAA,UACT,CAAA,SAAE;AACA,YAAA,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,UACjB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MAEA,OAAA,CAAQ,MAAA,EAAa,IAAA,EAAc,MAAA,EAAsB;AACvD,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACpE,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,QAC7B,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACZ;AAAA,MACF,CAAA;AAAA,MAEA,SAAS,IAAA,EAAmB;AAC1B,QAAA,IAAI;AACF,UAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,QAC7C,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,KACF;AAAA,IAEA,UAAA,EAAY;AAAA,MACV,KAAK,MAAA,EAAmB;AACtB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACvC,QAAA,IAAI,EAAA,CAAG,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,QAAA,IAAI;AAGF,UAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,IAAA;AAAA,YAAK,IAAA;AAAA,YAAM,MAAA,CAAO,QAAQ,CAAC;AAAA;AAAA,WAA8B;AAAA,QACjF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACZ;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,MAAA,EAAmB;AACvB,QAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW;AAChC,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QAC3B,CAAA,CAAA,MAAQ;AAAA,QAGR;AACA,QAAA,MAAA,CAAO,KAAA,GAAQ,MAAA;AAAA,MACjB,CAAA;AAAA,MAEA,IAAA,CAAK,MAAA,EAAa,MAAA,EAAoB,MAAA,EAAgB,QAAgB,QAAA,EAA0B;AAC9F,QAAA,IAAI,MAAA,KAAW,GAAG,OAAO,CAAA;AACzB,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,QAAQ,QAAQ,CAAA;AACxD,UAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAM,CAAA;AACvB,UAAA,OAAO,IAAA,CAAK,MAAA;AAAA,QACd,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MAEA,KAAA,CAAM,MAAA,EAAa,MAAA,EAAoB,MAAA,EAAgB,QAAgB,QAAA,EAA0B;AAC/F,QAAA,IAAI,MAAA,KAAW,GAAG,OAAO,CAAA;AACzB,QAAA,IAAI;AACF,UAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,SAAS,MAAA,EAAQ,MAAA,GAAS,MAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,QACvF,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MAEA,MAAA,CAAO,MAAA,EAAa,MAAA,EAAgB,MAAA,EAAwB;AAC1D,QAAA,IAAI,QAAA,GAAW,MAAA;AACf,QAAA,IAAI,MAAA,KAAW,CAAA,EAAG,QAAA,IAAY,MAAA,CAAO,QAAA;AAAA,aAAA,IAC5B,WAAW,CAAA,IAAK,EAAA,CAAG,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACpD,UAAA,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA;AAAA,QAClD;AACA,QAAA,IAAI,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AACpC,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AACF,GACF;AAEA,EAAA,OAAO,KAAA;AACT;;;ACvRE,OAAO,OAAA,KAAY,WAAA,IAAe,QAAQ,QAAA,IAAY,IAAA,IAAQ,OAAA,CAAQ,QAAA,CAAS,IAAA,IAAQ;AAWzF,eAAsB,YAAe,IAAA,EAA0B;AAC7D,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA,CAAA;AAC9B,EAAA,OAAQ,MAAM;AAAA;AAAA;AAAA,IAAoD;AAAA,GAAA;AACpE;;;ACgCA,IAAM,iBAAA,uBAAwB,GAAA,CAAI,CAAC,QAAQ,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAC,CAAA;AAEzE,eAAsB,gBAAA,CAAiB,OAA0B,IAAA,EAAuC;AACtG,EAAA,MAAM,SAAA,GAAY,IAAI,cAAA,CAAe,KAAA,CAAM,OAAA,EAAS,MAAM,IAAA,CAAK,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAI5F,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAAoC;AACvD,IAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,EAAM;AAC9B,IAAA,IAAI,QAAA,CAAS,QAAQ,MAAM,CAAA,CAAE,UAAU,CAAA,EAAG,KAAA,CAAM,YAAY,IAAI,CAAA;AAChE,IAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EAC/B,CAAA;AACA,EAAA,MAAM,SAAS,IAAI,aAAA;AAAA,IACjB,EAAE,MAAM,WAAA,EAAY;AAAA,IACpB,KAAA,CAAM;AAAA,GACR;AAEA,EAAA,MAAM,WAAW,MAAM;AAAA;AAAA,IAA0B,KAAA,CAAM;AAAA,GAAA,EAAY,OAAA;AAEnE,EAAA,IAAI,QAAA,GAAW,CAAA;AAYf,EAAA,IAAI,WAAA;AACJ,EAAA,MAAM,YAAY,MAA8B;AAC9C,IAAA,MAAM,WAAW,MAAA,CAAO,MAAA;AACxB,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,UAAA,GAAa,CAAA,EAAG,OAAO,QAAA;AAChD,IAAA,OAAO,WAAA,GAAc,IAAI,UAAA,CAAW,WAAA,CAAY,MAAM,CAAA,GAAI,MAAA;AAAA,EAC5D,CAAA;AAeA,EAAA,MAAM,sBAAA,GAAyB,CAAC,QAAA,KAA+B;AAC7D,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,QAAA,CAAS,UAAA,EAAY,SAAS,UAAU,CAAA;AACnF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,IAAI,CAAA;AACrC,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,MAAM,KAAA,GAAS,MAAA,CAAO,WAAA,IAAe,EAAC;AACtC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAC,MAAM,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AACpC,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,EAAE,MAAA,IAAU,MAAM,GAAA,IAAO,CAAC,SAAS,IAAI,CAAA;AAAA,EAC3D,CAAA;AAOA,EAAA,MAAM,MAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQlB,UAAA,EAAY,CAAC,IAAA,KAAiB;AAC5B,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,IAAA,EAAM,MAAM,SAAS,CAAA;AAC9C,MAAA,IAAI,QAAA,CAAS,aAAa,OAAA,EAAS;AACjC,QAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,CAAE,YAAA,CAAa,IAAI,aAAa,CAAA;AACvE,QAAA,IAAI,OAAA,EAAS,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,eAAe,OAAO,CAAA;AAC7D,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MAClB;AACA,MAAA,OAAO,kBAAA,CAAmB,SAAS,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,WAAW,KAAA,CAAM,IAAA;AAAA;AAAA,IAEjB,QAAQ,KAAA,CAAM,GAAA;AAAA,IACd,SAAS,KAAA,CAAM,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQf,WAAA,EAAa,CAAC,OAAA,KAAwB,WAAA,CAAY,OAAO,CAAA;AAAA,IACzD,aAAA,EAAe,CAAC,UAAA,EAAoB,aAAA,EAAuB,aAAqB,gBAAA,KAA6B;AAC3G,MAAA,MAAM,OAAO,SAAA,EAAU;AACvB,MAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,WAAA,CAAY,IAAA,CAAK,MAAM,UAAA,EAAY,UAAA,GAAa,aAAa,CAAC,CAAA;AAC/E,QAAA,IAAI,SAAS,MAAA,GAAS,EAAA,IAAM,QAAA,CAAS,MAAA,GAAS,kBAAkB,OAAO,CAAA,EAAA;AACvE,QAAA,sBAAA,CAAuB,QAAQ,CAAA;AAC/B,QAAA,SAAA,EAAU,CAAG,GAAA,CAAI,QAAA,EAAU,WAAW,CAAA;AACtC,QAAA,OAAO,QAAA,CAAS,MAAA;AAAA,MAClB,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,YAAA,GAAe,KAAA;AACtB,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,eAAA,EAAiB,CAAC,OAAA,EAA2C,eAAA,KAA0F;AACrJ,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,MAAA,CAAO,aAAA;AACnC,MAAA,IAAI,QAAQ,GAAA,CAAI,MAAA,YAAkB,YAAY,MAAA,EAAQ,WAAA,GAAc,QAAQ,GAAA,CAAI,MAAA;AAChF,MAAA,KAAA,CAAM,YAAY;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA;AAC3C,UAAA,IAAI,KAAA;AACJ,UAAA,IAAI,MAAA,CAAO,GAAG,CAAA,CAAE,UAAA,CAAW,OAAQ,CAAA,IAAK,MAAA,CAAO,GAAG,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACnE,YAAA,MAAM,CAAC,EAAE,QAAA,EAAS,EAAG,EAAE,eAAe,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,cAC1D,YAA+C,aAAa,CAAA;AAAA,cAC5D,YAAuC,KAAK;AAAA,aAC7C,CAAA;AACD,YAAA,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,QAAA,CAAS,OAAO,GAAG,CAAA,CAAE,UAAA,CAAW,OAAO,CAAA,GAAI,aAAA,CAAc,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,UACnG,CAAA,MAAO;AACL,YAAA,KAAA,GAAQ,IAAI,WAAW,MAAA,CAAO,MAAM,MAAM,GAAG,CAAA,EAAG,aAAa,CAAA;AAAA,UAC/D;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,WAAA;AAAA,YAC/B,KAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,IAAI,CAAC,WAAA,IAAe,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA,YAAkB,YAAY,MAAA,EAAQ;AAChF,YAAA,WAAA,GAAc,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,UACxC;AACA,UAAA,eAAA,CAAgB,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,QAChD,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AACtB,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF,CAAA,GAAG;AACH,MAAA,OAAO,EAAC;AAAA,IACV,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,MAAA,KAAmB;AACxB,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA,GAAS;AAAA,IACd,MAAM;AACJ,MAAA,cAAA,CAAe,MAAA,CAAO,IAAI,MAAA,EAAQ,KAAA,CAAM,QAAQ,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA;AACxE,MAAA,SAAA,CAAU,MAAA,CAAO,EAAA,EAAI,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA;AACxC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AACxE,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAM,CAAA;AAInC,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG;AACvC,IAAA,MAAM,WAAY,MAAA,CAAwE,aAAA;AAC1F,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,MAAA,IAAA,CAAK,YAAY,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,0DAA0D,CAAA;AACtG,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,QAAA;AAAA,EAC5C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAU,KAAA,CAA8B,MAAA;AAC9C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,QAAA,GAAW,MAAA;AAAA,SACtC;AACH,MAAA,IAAA,CAAK,WAAA,CAAY,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,OAAQ,KAAA,EAAiB,OAAA,IAAW,KAAK,CAAA,EAAG,CAAA;AACxF,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAA,CAAK,YAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAA;AACnD;AAGA,SAAS,cAAA,CACP,EAAA,EACA,MAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,EAAA,EAAI,MAAA,EAAQ,UAAU,CAAA;AAChD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AACxC,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,SAAA,CAAU,MAAM,KAAK,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,EAAA,CAAG,KAAA,CAAM,OAAO,EAAE,IAAA,EAAM,MAAM,SAAA,EAAU,EAAG,MAAM,KAAK,CAAA;AAAA,EACxD;AACF;AAoBA,SAAS,SAAA,CAAU,EAAA,EAAS,MAAA,EAAuB,KAAA,EAAsB;AAEvE,EAAA,MAAM,WAAW,MAAqB;AACpC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,KAAK,CAAC,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,EAAA,CAAG,IAAA,CAAK,UAAU,YAAA,CAAa,MAAA,EAAQ,CAAC,CAAA,EAAG,YAAA,CAAa,MAAA,EAAQ,CAAC,CAAC,CAAA;AAClE,IAAA;AAAA,EACF;AAEA,EAAA,EAAA,CAAG,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAaxB,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAyB;AAC/D,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,SAAA,CAAU,EAAE,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,CAAO,UAAA,GAAa;AAAA,MAClB,GAAG,MAAA,CAAO,UAAA;AAAA,MACV,KAAA,CAAM,OAAA,EAAc,MAAA,EAAoB,MAAA,EAAgB,MAAA,EAAwB;AAC9E,QAAA,IAAI,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,OAAO,QAAA,CAAS,MAAA,EAAQ,MAAA,GAAS,MAAM,CAAC,CAAA;AAC9E,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MACA,KAAA,GAAgB;AACd,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,SAAA,CAAU,CAAC,CAAA;AAC5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,CAAM,UAAA,GAAa;AAAA,MACjB,GAAG,KAAA,CAAM,UAAA;AAAA,MACT,IAAA,CAAK,OAAA,EAAc,MAAA,EAAoB,MAAA,EAAgB,MAAA,EAAwB;AAI7E,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA;AAClC,QAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAM,CAAA;AACvB,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF;AACF;AAGA,SAAS,YAAA,CAAa,QAAuB,EAAA,EAA+C;AAC1F,EAAA,IAAI,UAAoB,EAAC;AACzB,EAAA,OAAO,CAAC,QAAA,KAAa;AACnB,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,QAAA,CAAS,EAAA,EAAI,IAAI,UAAA,CAAW,OAAO,CAAC,CAAA;AAC3C,QAAA,OAAA,GAAU,EAAC;AAAA,MACb;AACA,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAGrB,IAAA,IAAI,QAAA,KAAa,EAAA,IAAM,OAAA,CAAQ,MAAA,IAAU,IAAA,EAAM;AAC7C,MAAA,MAAA,CAAO,QAAA,CAAS,EAAA,EAAI,IAAI,UAAA,CAAW,OAAO,CAAC,CAAA;AAC3C,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AAAA,EACF,CAAA;AACF;;;ACvVA,eAAe,OAAA,GAAmG;AAIhH,EAAA,MAAM,KAAA,GAAQ,UAAA;AAKd,EAAA,IAAI,OAAO,KAAA,CAAM,WAAA,KAAgB,cAAc,OAAO,KAAA,CAAM,qBAAqB,UAAA,EAAY;AAC3F,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,EAAE,WAAA,EAAa,IAAA,EAAK;AAAA,MAC1B,SAAS,CAAC,OAAA,KACR,MAAA,CAAO,SAAA,EAAW,CAAC,KAAA,KAAwB;AACzC,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,QAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA;AAAA,MAC1C,CAAC;AAAA,KACL;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,CAAC,MAAA,EAAQ,gBAAgB,CAAA,CAAE,KAAK,GAAG,CAAA;AACrD,EAAA,MAAM,EAAE,UAAA,EAAW,GAAK,MAAM;AAAA;AAAA;AAAA,IAAoD;AAAA,GAAA;AAGlF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,SAAS,CAAC,OAAA,KACR,WAAW,EAAA,CAAG,SAAA,EAAW,CAAC,OAAA,KAAY;AACpC,MAAA,MAAM,IAAA,GAAO,OAAA;AACb,MAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC1C,CAAC;AAAA,GACL;AACF;AAEA,KAAK,SAAQ,CAAE,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAM;AACzC,EAAA,OAAA,CAAQ,CAAC,KAAA,KAAU;AACjB,IAAA,KAAK,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,CAAE,KAAA;AAAA,MAAM,CAAC,KAAA,KACxC,IAAA,CAAK,WAAA,CAAY,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,KAAK,GAAG;AAAA,KAC/E;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAA,CAAK,WAAA,CAAY,EAAE,IAAA,EAAM,mBAAA,EAAqB,CAAA;AAChD,CAAC,CAAA","file":"python-worker.js","sourcesContent":["/* Generated by python-runtime/scripts/generate_abi.py from abi/host-v1.json. Do not edit. */\n\n/** Protocol version carried in every frame. */\nexport const SBX_HOST_ABI_VERSION = 1;\n\nexport const SBX_REQUEST_HEADER_BYTES = 16;\nexport const SBX_RESPONSE_HEADER_BYTES = 20;\n\n/** Operation codes. Families are 256 apart so a family stays contiguous. */\nexport const Op = {\n handshake: 0,\n openat: 1,\n close: 2,\n read: 3,\n write: 4,\n pread: 5,\n pwrite: 6,\n lseek: 7,\n fstat: 8,\n statat: 9,\n ftruncate: 10,\n renameat: 11,\n unlinkat: 12,\n mkdirat: 13,\n readlinkat: 14,\n symlinkat: 15,\n getdents: 16,\n fsync: 17,\n dup: 256,\n dup2: 257,\n get_flags: 258,\n set_flags: 259,\n pipe: 512,\n poll: 768,\n clock_gettime: 1024,\n sleep: 1025,\n getpid: 1280,\n getcwd: 1281,\n chdir: 1282,\n environ: 1283,\n getrandom: 1536,\n socket: 1792,\n bind: 1793,\n listen: 1794,\n accept: 1795,\n connect: 1796,\n send: 1797,\n recv: 1798,\n shutdown: 1799,\n getsockname: 1800,\n getpeername: 1801,\n setsockopt: 1802,\n getsockopt: 1803,\n socket_close: 1804,\n spawn: 2048,\n waitpid: 2049,\n kill: 2050,\n} as const;\n\nexport type OpCode = (typeof Op)[keyof typeof Op];\n\n/** Canonical (Linux/musl) errno values. A negative status is `-Errno.X`. */\nexport const Errno = {\n EPERM: 1,\n ENOENT: 2,\n ESRCH: 3,\n EINTR: 4,\n EIO: 5,\n ENXIO: 6,\n E2BIG: 7,\n EBADF: 9,\n ECHILD: 10,\n EAGAIN: 11,\n ENOMEM: 12,\n EACCES: 13,\n EFAULT: 14,\n EBUSY: 16,\n EEXIST: 17,\n EXDEV: 18,\n ENODEV: 19,\n ENOTDIR: 20,\n EISDIR: 21,\n EINVAL: 22,\n ENFILE: 23,\n EMFILE: 24,\n ENOTTY: 25,\n EFBIG: 27,\n ENOSPC: 28,\n ESPIPE: 29,\n EROFS: 30,\n EMLINK: 31,\n EPIPE: 32,\n ERANGE: 34,\n ENAMETOOLONG: 36,\n ENOSYS: 38,\n ENOTEMPTY: 39,\n ELOOP: 40,\n ENODATA: 61,\n ENOTSOCK: 88,\n EPROTONOSUPPORT: 93,\n EAFNOSUPPORT: 97,\n EADDRINUSE: 98,\n EADDRNOTAVAIL: 99,\n ENETUNREACH: 101,\n ECONNRESET: 104,\n EISCONN: 106,\n ENOTCONN: 107,\n ECONNREFUSED: 111,\n EPROTO: 71,\n EOVERFLOW: 75,\n ETIMEDOUT: 110,\n ECANCELED: 125,\n EDQUOT: 122,\n} as const;\n\nexport type ErrnoName = keyof typeof Errno;\n\n/** Capability names a host may advertise in its handshake. */\nexport const CAPABILITIES = [\"files\", \"descriptors\", \"pipes\", \"readiness\", \"time\", \"identity\", \"entropy\", \"sockets\", \"processes\", \"signals\", \"storage\", \"services\", \"threads\"] as const;\n\nexport type Capability = (typeof CAPABILITIES)[number];\n\n/** Names by code, for diagnostics. Never used for dispatch. */\nexport const OP_NAMES: Record<number, string> = Object.fromEntries(\n Object.entries(Op).map(([name, code]) => [code, name]),\n);\n\nexport const ERRNO_NAMES: Record<number, string> = Object.fromEntries(\n Object.entries(Errno).map(([name, code]) => [code, name]),\n);\n","/**\n * Framing for the host ABI.\n *\n * Every field is fixed-width and little-endian, because the two sides are\n * compiled by different toolchains and a shared struct layout is the one thing\n * they cannot negotiate at runtime. Text is UTF-8; file content and network\n * traffic are raw bytes and are never decoded in transit.\n *\n * `request_id` and `process_generation` exist so a late answer can be\n * recognised as late. A worker that exits and is replaced must not have its\n * successor accept a completion addressed to the process before it, and the\n * failure mode for a mismatched frame is an error — never an empty success.\n */\n\nimport {\n Errno, OP_NAMES, SBX_HOST_ABI_VERSION, SBX_REQUEST_HEADER_BYTES, SBX_RESPONSE_HEADER_BYTES,\n} from \"./host-abi.js\";\n\nexport interface RequestHeader {\n version: number;\n op: number;\n requestId: number;\n generation: number;\n}\n\nexport interface ResponseFrame {\n header: RequestHeader;\n status: number;\n payload: Uint8Array;\n}\n\nexport class ProtocolError extends Error {\n readonly code = \"ERR_SBX_ABI_PROTOCOL\";\n}\n\nexport function encodeRequest(header: RequestHeader, payload: Uint8Array): Uint8Array {\n const frame = new Uint8Array(SBX_REQUEST_HEADER_BYTES + payload.length);\n const view = new DataView(frame.buffer);\n view.setUint16(0, header.version, true);\n view.setUint16(2, header.op, true);\n view.setUint32(4, header.requestId, true);\n view.setUint32(8, header.generation, true);\n view.setUint32(12, payload.length, true);\n frame.set(payload, SBX_REQUEST_HEADER_BYTES);\n return frame;\n}\n\nexport function decodeRequest(frame: Uint8Array): { header: RequestHeader; payload: Uint8Array } {\n if (frame.length < SBX_REQUEST_HEADER_BYTES) throw new ProtocolError(\"short request frame\");\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n const header: RequestHeader = {\n version: view.getUint16(0, true),\n op: view.getUint16(2, true),\n requestId: view.getUint32(4, true),\n generation: view.getUint32(8, true),\n };\n const length = view.getUint32(12, true);\n if (frame.length - SBX_REQUEST_HEADER_BYTES < length) {\n throw new ProtocolError(`truncated payload for ${OP_NAMES[header.op] ?? header.op}`);\n }\n return {\n header,\n payload: frame.subarray(SBX_REQUEST_HEADER_BYTES, SBX_REQUEST_HEADER_BYTES + length),\n };\n}\n\nexport function encodeResponse(header: RequestHeader, status: number, payload: Uint8Array): Uint8Array {\n const frame = new Uint8Array(SBX_RESPONSE_HEADER_BYTES + payload.length);\n const view = new DataView(frame.buffer);\n view.setUint16(0, header.version, true);\n view.setUint16(2, header.op, true);\n view.setUint32(4, header.requestId, true);\n view.setUint32(8, header.generation, true);\n view.setInt32(12, status, true);\n view.setUint32(16, payload.length, true);\n frame.set(payload, SBX_RESPONSE_HEADER_BYTES);\n return frame;\n}\n\nexport function decodeResponse(frame: Uint8Array, expected?: RequestHeader): ResponseFrame {\n if (frame.length < SBX_RESPONSE_HEADER_BYTES) {\n /* An empty or short frame means the transport failed. Reporting it as a\n * zero-byte success is how a dead host turns into silent data loss. */\n throw new ProtocolError(\"the host ABI transport returned an incomplete frame\");\n }\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n const header: RequestHeader = {\n version: view.getUint16(0, true),\n op: view.getUint16(2, true),\n requestId: view.getUint32(4, true),\n generation: view.getUint32(8, true),\n };\n const status = view.getInt32(12, true);\n const length = view.getUint32(16, true);\n if (frame.length - SBX_RESPONSE_HEADER_BYTES < length) throw new ProtocolError(\"truncated response payload\");\n if (expected) {\n if (header.requestId !== expected.requestId) throw new ProtocolError(\"stale response: request id mismatch\");\n if (header.generation !== expected.generation) throw new ProtocolError(\"stale response: process generation mismatch\");\n if (header.op !== expected.op) throw new ProtocolError(\"response answers a different operation\");\n }\n if (header.version !== SBX_HOST_ABI_VERSION) {\n throw new ProtocolError(`host ABI version ${header.version}, expected ${SBX_HOST_ABI_VERSION}`);\n }\n return {\n header,\n status,\n payload: frame.subarray(SBX_RESPONSE_HEADER_BYTES, SBX_RESPONSE_HEADER_BYTES + length),\n };\n}\n\n/** Little-endian reader over a payload. Bounds-checked: the guest owns this memory. */\nexport class Reader {\n private at = 0;\n private readonly view: DataView;\n private readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n\n private need(count: number): number {\n if (this.at + count > this.bytes.length) throw new ProtocolError(\"payload underrun\");\n const offset = this.at;\n this.at += count;\n return offset;\n }\n\n i32(): number { return this.view.getInt32(this.need(4), true); }\n u32(): number { return this.view.getUint32(this.need(4), true); }\n i64(): number { return Number(this.view.getBigInt64(this.need(8), true)); }\n u64(): number { return Number(this.view.getBigUint64(this.need(8), true)); }\n bytes32(): Uint8Array {\n const length = this.u32();\n const offset = this.need(length);\n return this.bytes.subarray(offset, offset + length);\n }\n string(): string { return new TextDecoder().decode(this.bytes32()); }\n get remaining(): number { return this.bytes.length - this.at; }\n}\n\n/** Little-endian writer. Grows as needed; payload sizes are bounded by the caller. */\nexport class Writer {\n private parts: Uint8Array[] = [];\n\n i32(value: number): this { const b = new Uint8Array(4); new DataView(b.buffer).setInt32(0, value, true); this.parts.push(b); return this; }\n u32(value: number): this { const b = new Uint8Array(4); new DataView(b.buffer).setUint32(0, value >>> 0, true); this.parts.push(b); return this; }\n i64(value: number): this { const b = new Uint8Array(8); new DataView(b.buffer).setBigInt64(0, BigInt(Math.trunc(value)), true); this.parts.push(b); return this; }\n u64(value: number): this { const b = new Uint8Array(8); new DataView(b.buffer).setBigUint64(0, BigInt(Math.trunc(value)), true); this.parts.push(b); return this; }\n bytes32(value: Uint8Array): this { this.u32(value.length); this.parts.push(value); return this; }\n string(value: string): this { return this.bytes32(new TextEncoder().encode(value)); }\n\n finish(): Uint8Array {\n const total = this.parts.reduce((sum, part) => sum + part.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const part of this.parts) { out.set(part, at); at += part.length; }\n return out;\n }\n}\n\n/** A status the guest reads as `-errno`. */\nexport function failure(errno: number): number {\n return -Math.abs(errno);\n}\n\nexport const EOK = 0;\nexport { Errno };\n","/**\n * The guest side of the host ABI, as the compiled code sees it.\n *\n * Compiled programs reach this through `sbx_host_call` in\n * `python-runtime/native/js/library_sbx.js`, which copies a frame out of the\n * module's memory, calls {@link HostAbiClient.callRaw}, and copies the answer\n * back. The typed methods below are for the JavaScript side of the worker —\n * loaders, the probe harness, and tests — which need the same operations\n * without going through Wasm memory.\n */\n\nimport { Errno, ERRNO_NAMES, OP_NAMES, Op, SBX_HOST_ABI_VERSION } from \"./host-abi.js\";\nimport { Reader, Writer, decodeResponse, encodeRequest, type RequestHeader } from \"./protocol.js\";\nimport type { HostCallClient } from \"./sync-transport.js\";\n\nexport class HostAbiError extends Error {\n errno: number;\n code: string;\n constructor(errno: number, op: number) {\n const name = ERRNO_NAMES[errno] ?? String(errno);\n super(`${OP_NAMES[op] ?? `op ${op}`} failed: ${name}`);\n this.errno = errno;\n this.code = name;\n }\n}\n\nexport interface HostAbiResult {\n status: number;\n payload: Uint8Array;\n}\n\n/**\n * One process's connection to the kernel.\n *\n * `generation` is stamped into every frame and checked on the way back, so a\n * completion belonging to a previous incarnation of this PID is rejected rather\n * than applied to the wrong descriptor table.\n */\nexport class HostAbiClient {\n private transport: HostCallClient;\n private generation: number;\n private nextRequestId = 1;\n\n constructor(transport: HostCallClient, generation: number) {\n this.transport = transport;\n this.generation = generation;\n }\n\n /** Send one frame, blocking. Returns the status and payload verbatim. */\n callRaw(op: number, payload: Uint8Array): HostAbiResult {\n const header: RequestHeader = {\n version: SBX_HOST_ABI_VERSION,\n op,\n requestId: this.nextRequestId++,\n generation: this.generation,\n };\n const frame = this.transport.call(encodeRequest(header, payload));\n const response = decodeResponse(frame, header);\n return { status: response.status, payload: response.payload };\n }\n\n /** As {@link callRaw}, but a negative status becomes an exception. */\n private call(op: number, payload: Uint8Array): HostAbiResult {\n const result = this.callRaw(op, payload);\n if (result.status < 0) throw new HostAbiError(-result.status, op);\n return result;\n }\n\n handshake(): { version: number; capabilities: Record<string, boolean> } {\n const { payload } = this.call(Op.handshake, new Uint8Array());\n const r = new Reader(payload);\n const version = r.u32();\n const count = r.u32();\n const capabilities: Record<string, boolean> = {};\n for (let i = 0; i < count; i += 1) capabilities[r.string()] = r.u32() === 1;\n return { version, capabilities };\n }\n\n open(path: string, flags: number, mode = 0o666): number {\n return this.call(Op.openat, new Writer().string(path).u32(flags).u32(mode).finish()).status;\n }\n\n close(fd: number): void {\n this.call(Op.close, new Writer().i32(fd).finish());\n }\n\n read(fd: number, length: number): Uint8Array {\n return this.call(Op.read, new Writer().i32(fd).u32(length).finish()).payload;\n }\n\n write(fd: number, data: Uint8Array): number {\n return this.call(Op.write, new Writer().i32(fd).bytes32(data).finish()).status;\n }\n\n /** Write every byte, looping over short writes the way a guest's libc must. */\n writeAll(fd: number, data: Uint8Array): void {\n let at = 0;\n while (at < data.length) at += this.write(fd, data.subarray(at));\n }\n\n pread(fd: number, length: number, offset: number): Uint8Array {\n return this.call(Op.pread, new Writer().i32(fd).u32(length).u64(offset).finish()).payload;\n }\n\n pwrite(fd: number, data: Uint8Array, offset: number): number {\n return this.call(Op.pwrite, new Writer().i32(fd).bytes32(data).u64(offset).finish()).status;\n }\n\n seek(fd: number, offset: number, whence: number): number {\n const { payload } = this.call(Op.lseek, new Writer().i32(fd).i64(offset).u32(whence).finish());\n return new Reader(payload).i64();\n }\n\n fstat(fd: number): HostStat {\n return decodeStat(this.call(Op.fstat, new Writer().i32(fd).finish()).payload);\n }\n\n stat(path: string, followLinks = true): HostStat {\n return decodeStat(\n this.call(Op.statat, new Writer().string(path).u32(followLinks ? 1 : 0).finish()).payload,\n );\n }\n\n ftruncate(fd: number, length: number): void {\n this.call(Op.ftruncate, new Writer().i32(fd).u64(length).finish());\n }\n\n rename(from: string, to: string): void {\n this.call(Op.renameat, new Writer().string(from).string(to).finish());\n }\n\n unlink(path: string, removeDirectory = false): void {\n this.call(Op.unlinkat, new Writer().string(path).u32(removeDirectory ? 1 : 0).finish());\n }\n\n mkdir(path: string, mode = 0o777): void {\n this.call(Op.mkdirat, new Writer().string(path).u32(mode).finish());\n }\n\n readlink(path: string): string {\n return new Reader(this.call(Op.readlinkat, new Writer().string(path).finish()).payload).string();\n }\n\n symlink(target: string, path: string): void {\n this.call(Op.symlinkat, new Writer().string(target).string(path).finish());\n }\n\n readdir(fd: number, bufferSize = 4096): string[] {\n const { payload } = this.call(Op.getdents, new Writer().i32(fd).u32(bufferSize).finish());\n const text = new TextDecoder().decode(payload);\n return text.split(\"\\0\").filter((name) => name.length > 0);\n }\n\n dup(fd: number, from = 0): number {\n return this.call(Op.dup, new Writer().i32(fd).u32(from).finish()).status;\n }\n\n dup2(fd: number, target: number): number {\n return this.call(Op.dup2, new Writer().i32(fd).i32(target).finish()).status;\n }\n\n getFlags(fd: number): { flags: number; cloexec: boolean } {\n const r = new Reader(this.call(Op.get_flags, new Writer().i32(fd).finish()).payload);\n return { flags: r.u32(), cloexec: r.u32() === 1 };\n }\n\n setFlags(fd: number, flags: number, cloexec: boolean): void {\n this.call(Op.set_flags, new Writer().i32(fd).u32(flags).u32(cloexec ? 1 : 0).finish());\n }\n\n pipe(flags = 0): [number, number] {\n const r = new Reader(this.call(Op.pipe, new Writer().u32(flags).finish()).payload);\n return [r.i32(), r.i32()];\n }\n\n poll(entries: { fd: number; events: number }[], timeoutMs: number): { fd: number; revents: number }[] {\n const w = new Writer().u32(entries.length);\n for (const entry of entries) w.i32(entry.fd).u32(entry.events);\n w.i64(timeoutMs);\n const r = new Reader(this.call(Op.poll, w.finish()).payload);\n const count = r.u32();\n const out: { fd: number; revents: number }[] = [];\n for (let i = 0; i < count; i += 1) out.push({ fd: r.i32(), revents: r.u32() });\n return out;\n }\n\n clockGettime(monotonic: boolean): { seconds: number; nanos: number } {\n const r = new Reader(this.call(Op.clock_gettime, new Writer().u32(monotonic ? 1 : 0).finish()).payload);\n return { seconds: r.i64(), nanos: r.u32() };\n }\n\n sleep(nanos: number): void {\n this.call(Op.sleep, new Writer().u64(nanos).finish());\n }\n\n identity(): { pid: number; ppid: number; uid: number; gid: number; umask: number } {\n const r = new Reader(this.call(Op.getpid, new Uint8Array()).payload);\n return { pid: r.i32(), ppid: r.i32(), uid: r.u32(), gid: r.u32(), umask: r.u32() };\n }\n\n getcwd(): string {\n return new Reader(this.call(Op.getcwd, new Uint8Array()).payload).string();\n }\n\n chdir(path: string): void {\n this.call(Op.chdir, new Writer().string(path).finish());\n }\n\n environ(): Record<string, string> {\n const joined = new Reader(this.call(Op.environ, new Uint8Array()).payload).string();\n const out: Record<string, string> = {};\n for (const entry of joined.split(\"\\0\")) {\n if (!entry) continue;\n const split = entry.indexOf(\"=\");\n out[entry.slice(0, split)] = entry.slice(split + 1);\n }\n return out;\n }\n\n getrandom(length: number): Uint8Array {\n return this.call(Op.getrandom, new Writer().u32(length).finish()).payload;\n }\n\n socket(family: number, type: number, protocol = 0): number {\n return this.call(Op.socket, new Writer().u32(family).u32(type).i32(protocol).finish()).status;\n }\n\n bind(fd: number, address: string, port: number): void {\n this.call(Op.bind, new Writer().i32(fd).string(address).u32(port).finish());\n }\n\n listen(fd: number, backlog = 128): void {\n this.call(Op.listen, new Writer().i32(fd).u32(backlog).finish());\n }\n\n accept(fd: number): { fd: number; address: string; port: number } {\n const result = this.call(Op.accept, new Writer().i32(fd).finish());\n const r = new Reader(result.payload);\n return { fd: result.status, address: r.string(), port: r.u32() };\n }\n\n connect(fd: number, address: string, port: number): void {\n this.call(Op.connect, new Writer().i32(fd).string(address).u32(port).finish());\n }\n\n send(fd: number, data: Uint8Array): number {\n return this.call(Op.send, new Writer().i32(fd).bytes32(data).finish()).status;\n }\n\n recv(fd: number, length: number): Uint8Array {\n return this.call(Op.recv, new Writer().i32(fd).u32(length).finish()).payload;\n }\n\n shutdown(fd: number, how: number): void {\n this.call(Op.shutdown, new Writer().i32(fd).u32(how).finish());\n }\n\n socketName(fd: number, peer = false): { address: string; port: number } {\n const payload = this.call(peer ? Op.getpeername : Op.getsockname, new Writer().i32(fd).finish()).payload;\n const r = new Reader(payload);\n return { address: r.string(), port: r.u32() };\n }\n}\n\nexport interface HostStat {\n ino: number;\n mode: number;\n size: number;\n uid: number;\n gid: number;\n nlink: number;\n atimeNs: number;\n mtimeNs: number;\n ctimeNs: number;\n}\n\nfunction decodeStat(payload: Uint8Array): HostStat {\n const r = new Reader(payload);\n return {\n ino: r.u64(), mode: r.u32(), size: r.u64(),\n uid: r.u32(), gid: r.u32(), nlink: r.u32(),\n atimeNs: r.i64(), mtimeNs: r.i64(), ctimeNs: r.i64(),\n };\n}\n\nexport { Errno, Op };\n","/**\n * The transport under the host ABI: one blocking client, one non-blocking host.\n *\n * This is deliberately not `runtime/sync-channel.ts`. That channel predates the\n * ABI and carries no request identity, so a late or duplicated answer is\n * indistinguishable from the right one; worse, its server answers a failed\n * handler with a zero-length frame, which a caller can only read as a\n * successful empty result. Both are acceptable for `spawnSync`, where the\n * payload is self-describing JSON, and neither is acceptable for `read()`,\n * where an empty result means end of input.\n *\n * So the framing here always carries a full response header, a transport\n * failure is always an error, and the client verifies that the answer it got\n * belongs to the question it asked.\n *\n * Only the client blocks, and the client never owns shared state. The host\n * services requests from its ordinary event loop and may take as long as it\n * likes — which is what lets a guest's synchronous `read()` wait for a\n * keystroke that has not been typed yet.\n */\n\n/* Control-word slots over shared memory. */\nconst STATE = 0;\nconst LENGTH = 1;\nconst MORE = 2;\nconst CONTROL_WORDS = 4;\n\nconst STATE_IDLE = 0;\nconst STATE_REQUEST = 1;\nconst STATE_RESPONSE = 2;\nconst STATE_CONTINUE = 3;\nconst STATE_CLOSED = 4;\n\n/** How long a blocked client sleeps before re-checking for a closed transport. */\nconst WAIT_SLICE_MS = 200;\n\nexport interface HostTransportBuffers {\n control: SharedArrayBuffer;\n data: SharedArrayBuffer;\n}\n\nexport function createHostTransportBuffers(windowBytes = 1 << 20): HostTransportBuffers {\n return {\n control: new SharedArrayBuffer(CONTROL_WORDS * Int32Array.BYTES_PER_ELEMENT),\n data: new SharedArrayBuffer(windowBytes),\n };\n}\n\n/**\n * Can this host support a blocking guest at all?\n *\n * `SharedArrayBuffer` needs cross-origin isolation in a browser, and\n * `Atomics.wait` is forbidden on a browser's main thread — which is why the\n * blocking side is always the worker. Reporting the cause matters: without it\n * the failure surfaces as an interpreter that will not start, with nothing\n * naming the header the host is missing.\n */\nexport function syncTransportUnavailableReason(): string | null {\n if (typeof globalThis.crossOriginIsolated === \"boolean\" && !globalThis.crossOriginIsolated) {\n return \"the page is not cross-origin isolated. Serve it with Cross-Origin-Opener-Policy: same-origin and \" +\n \"Cross-Origin-Embedder-Policy: require-corp.\";\n }\n if (typeof SharedArrayBuffer !== \"function\") return \"SharedArrayBuffer is unavailable in this host.\";\n if (typeof Atomics !== \"object\" || typeof Atomics.wait !== \"function\") return \"Atomics.wait is unavailable in this host.\";\n return null;\n}\n\nexport class HostTransportError extends Error {\n code = \"ERR_SBX_HOST_TRANSPORT\";\n}\n\n/**\n * The guest side. Lives in the worker with the compiled program and blocks.\n *\n * `wake` nudges the host's event loop: the host cannot poll shared memory\n * without spinning, so each window is announced with an ordinary message.\n */\nexport class HostCallClient {\n private control: Int32Array;\n private data: Uint8Array;\n private capacity: number;\n private wake: () => void;\n private closed = false;\n\n constructor(buffers: HostTransportBuffers, wake: () => void) {\n this.control = new Int32Array(buffers.control);\n this.data = new Uint8Array(buffers.data);\n this.capacity = this.data.length;\n this.wake = wake;\n }\n\n /** Send a frame and block until the whole answer is back. Never returns empty. */\n call(request: Uint8Array): Uint8Array {\n /* A transport that has already gone away stays gone. Without this the next\n * call republishes a request over the closed marker and waits for an answer\n * from a host that is no longer listening — a killed process would hang on\n * its way out instead of exiting. */\n if (this.closed || Atomics.load(this.control, STATE) === STATE_CLOSED) {\n this.closed = true;\n throw new HostTransportError(\"the host transport is closed\");\n }\n this.send(request);\n const response = this.receive();\n if (response.length === 0) {\n throw new HostTransportError(\"the host answered with no frame; the kernel side failed or went away\");\n }\n return response;\n }\n\n private send(request: Uint8Array): void {\n let offset = 0;\n for (;;) {\n const size = Math.min(this.capacity, request.length - offset);\n this.data.set(request.subarray(offset, offset + size), 0);\n offset += size;\n Atomics.store(this.control, LENGTH, size);\n Atomics.store(this.control, MORE, offset < request.length ? 1 : 0);\n this.publish(STATE_REQUEST);\n const next = this.waitWhile(STATE_REQUEST);\n if (next === STATE_RESPONSE) return;\n if (next !== STATE_CONTINUE) {\n this.closed = true;\n throw new HostTransportError(\"the host went away mid-request\");\n }\n }\n }\n\n private receive(): Uint8Array {\n const parts: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const size = Atomics.load(this.control, LENGTH);\n parts.push(this.data.slice(0, size));\n total += size;\n if (Atomics.load(this.control, MORE) === 0) break;\n this.publish(STATE_CONTINUE);\n if (this.waitWhile(STATE_CONTINUE) !== STATE_RESPONSE) {\n this.closed = true;\n throw new HostTransportError(\"the host went away mid-response\");\n }\n }\n Atomics.store(this.control, STATE, STATE_IDLE);\n if (parts.length === 1) return parts[0];\n const joined = new Uint8Array(total);\n let at = 0;\n for (const part of parts) { joined.set(part, at); at += part.length; }\n return joined;\n }\n\n private publish(state: number): void {\n Atomics.store(this.control, STATE, state);\n Atomics.notify(this.control, STATE);\n this.wake();\n }\n\n private waitWhile(state: number): number {\n for (;;) {\n Atomics.wait(this.control, STATE, state, WAIT_SLICE_MS);\n const current = Atomics.load(this.control, STATE);\n if (current !== state) return current;\n }\n }\n}\n\n/**\n * The host side. Lives wherever the volume and the process table do, and never\n * blocks; `handle` is free to be asynchronous.\n */\nexport class HostCallServer {\n private control: Int32Array;\n private data: Uint8Array;\n private capacity: number;\n private handle: (request: Uint8Array) => Promise<Uint8Array> | Uint8Array;\n private onFault: (error: unknown) => void;\n\n private incoming: Uint8Array[] = [];\n private outgoing: Uint8Array | null = null;\n private sent = 0;\n private closed = false;\n\n constructor(\n buffers: HostTransportBuffers,\n handle: (request: Uint8Array) => Promise<Uint8Array> | Uint8Array,\n onFault: (error: unknown) => void = () => {},\n ) {\n this.control = new Int32Array(buffers.control);\n this.data = new Uint8Array(buffers.data);\n this.capacity = this.data.length;\n this.handle = handle;\n this.onFault = onFault;\n }\n\n /** Call on each wake message from the client. */\n async pump(): Promise<void> {\n if (this.closed) return;\n const state = Atomics.load(this.control, STATE);\n if (state === STATE_REQUEST) {\n const size = Atomics.load(this.control, LENGTH);\n this.incoming.push(this.data.slice(0, size));\n if (Atomics.load(this.control, MORE) === 1) {\n this.publish(STATE_CONTINUE);\n return;\n }\n const request = concat(this.incoming);\n this.incoming = [];\n let response: Uint8Array;\n try {\n response = await this.handle(request);\n } catch (error) {\n /* Anything escaping the handler is a bug in the dispatcher. Closing the\n * transport is the honest answer: the client raises, rather than\n * reading a zero-length frame as a successful empty result. */\n this.onFault(error);\n this.close();\n return;\n }\n if (this.closed) return;\n this.outgoing = response;\n this.sent = 0;\n this.sendWindow();\n return;\n }\n if (state === STATE_CONTINUE) this.sendWindow();\n }\n\n /** Release a blocked client — container teardown, or the worker being killed. */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n Atomics.store(this.control, STATE, STATE_CLOSED);\n Atomics.notify(this.control, STATE);\n }\n\n private sendWindow(): void {\n const payload = this.outgoing ?? new Uint8Array();\n const size = Math.min(this.capacity, payload.length - this.sent);\n this.data.set(payload.subarray(this.sent, this.sent + size), 0);\n this.sent += size;\n Atomics.store(this.control, LENGTH, size);\n Atomics.store(this.control, MORE, this.sent < payload.length ? 1 : 0);\n this.publish(STATE_RESPONSE);\n }\n\n private publish(state: number): void {\n Atomics.store(this.control, STATE, state);\n Atomics.notify(this.control, STATE);\n }\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n if (parts.length === 1) return parts[0];\n const total = parts.reduce((sum, part) => sum + part.length, 0);\n const joined = new Uint8Array(total);\n let at = 0;\n for (const part of parts) { joined.set(part, at); at += part.length; }\n return joined;\n}\n","/**\n * An Emscripten filesystem backed by the SandboxedJs kernel.\n *\n * The interpreter is compiled expecting a POSIX filesystem, and Emscripten\n * supplies one — in the guest's own memory. That is exactly the arrangement\n * this whole design exists to avoid: a second copy of the container's state,\n * private to one process, diverging from the moment anything writes.\n *\n * So the container's directories are mounted on a filesystem whose every\n * operation is a blocking call to the kernel over `sbx_host_v1`. There is one\n * authority for files, and the interpreter is not it.\n *\n * The shape below is Emscripten's `FS` backend contract, the same one NODEFS\n * implements. It has to be synchronous, which is precisely what the host ABI's\n * blocking transport provides.\n */\n\nimport { ERRNO_NAMES, Errno } from \"./host-abi.js\";\nimport { HostAbiError, type HostAbiClient } from \"./syscall-client.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\n\n/**\n * Build the filesystem backend for one process.\n *\n * `FS` is the interpreter module's own filesystem object, `errnoCodes` is that\n * build's `ERRNO_CODES` table, and `client` is the process's connection to the\n * kernel — one per process, never shared, so a file opened here belongs to a\n * descriptor table the kernel can clean up when the process goes.\n */\nexport function createSbxFs(FS: any, client: HostAbiClient, errnoCodes: Record<string, number>): any {\n /**\n * Translate a kernel errno into the number *this libc* uses.\n *\n * Not a formality. Emscripten's musl numbering is not Linux's: `ENOENT` is\n * 44 there and 2 here, and 2 is `EACCES`. Passing our number through\n * unchanged turns \"no such file\" into \"permission denied\" — which is exactly\n * how a perfectly good `open(path, \"w\")` came back as a PermissionError\n * carrying the errno of a different failure. The ABI's canonical values are\n * Linux's; every adapter translates at its own edge.\n */\n const translate = (canonical: number): number => {\n const name = ERRNO_NAMES[canonical];\n const mapped = name ? errnoCodes[name] : undefined;\n return mapped ?? errnoCodes.EIO ?? canonical;\n };\n\n const raise = (canonical: number): never => {\n throw new FS.ErrnoError(translate(canonical));\n };\n\n const fail = (error: unknown): never => {\n if (error instanceof HostAbiError) return raise(error.errno);\n return raise(Errno.EIO);\n };\n\n const SBXFS = {\n /** Where this mount sits in the guest's namespace, and where in the container. */\n mount(mount: any): any {\n return SBXFS.createNode(null, \"/\", S_IFDIR | 0o777, 0);\n },\n\n createNode(parent: any, name: string, mode: number, dev: number): any {\n if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) raise(Errno.EINVAL);\n const node = FS.createNode(parent, name, mode, dev);\n node.node_ops = SBXFS.node_ops;\n node.stream_ops = SBXFS.stream_ops;\n return node;\n },\n\n /** The container path a guest node stands for. */\n realPath(node: any): string {\n const parts: string[] = [];\n let current = node;\n while (current.parent !== current) {\n parts.push(current.name);\n current = current.parent;\n }\n parts.push(current.mount.opts.root);\n parts.reverse();\n return parts.join(\"/\").replace(/\\/+/g, \"/\");\n },\n\n node_ops: {\n getattr(node: any): any {\n const path = SBXFS.realPath(node);\n let stat;\n try {\n stat = client.stat(path, false);\n } catch (error) {\n return fail(error);\n }\n return {\n dev: 1,\n ino: stat.ino,\n mode: stat.mode,\n nlink: stat.nlink,\n uid: stat.uid,\n gid: stat.gid,\n rdev: 0,\n size: stat.size,\n atime: new Date(stat.atimeNs / 1e6),\n mtime: new Date(stat.mtimeNs / 1e6),\n ctime: new Date(stat.ctimeNs / 1e6),\n /* Emscripten sizes its own reads from this; a wrong block size shows\n * up as short reads on large files rather than as an error. */\n blksize: 4096,\n blocks: Math.ceil(stat.size / 4096),\n };\n },\n\n setattr(node: any, attr: any): void {\n const path = SBXFS.realPath(node);\n try {\n if (attr.size !== undefined) {\n const fd = client.open(path, 1 /* O_WRONLY */);\n try {\n client.ftruncate(fd, attr.size);\n } finally {\n client.close(fd);\n }\n }\n /* Mode and times are accepted and dropped for now: the volume has no\n * per-descriptor chmod through the ABI yet, and refusing here would\n * break `pip`, which sets a mode on everything it installs. */\n } catch (error) {\n fail(error);\n }\n },\n\n lookup(parent: any, name: string): any {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n let stat;\n try {\n stat = client.stat(path, false);\n } catch (error) {\n /* A missing entry is not an error here — it is how `lookup` says\n * \"no\". Anything else is, and must not be flattened into ENOENT. */\n if (error instanceof HostAbiError && error.errno === Errno.ENOENT) raise(Errno.ENOENT);\n return fail(error);\n }\n const node = SBXFS.createNode(parent, name, stat.mode, 0);\n node.node_ops = SBXFS.node_ops;\n node.stream_ops = SBXFS.stream_ops;\n return node;\n },\n\n mknod(parent: any, name: string, mode: number, dev: number): any {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n if ((mode & S_IFDIR) === S_IFDIR) client.mkdir(path, mode & 0o777);\n else {\n const fd = client.open(path, 0o1 | 0o100 /* O_WRONLY|O_CREAT */, mode & 0o777);\n client.close(fd);\n }\n } catch (error) {\n fail(error);\n }\n return SBXFS.createNode(parent, name, mode, dev);\n },\n\n rename(node: any, newParent: any, newName: string): void {\n const from = SBXFS.realPath(node);\n const to = `${SBXFS.realPath(newParent)}/${newName}`.replace(/\\/+/g, \"/\");\n try {\n client.rename(from, to);\n } catch (error) {\n fail(error);\n }\n /* Emscripten keeps its own name tree, so it has to be told too, or the\n * next lookup finds the file under the name it no longer has. */\n node.name = newName;\n node.parent = newParent;\n },\n\n unlink(parent: any, name: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.unlink(path, false);\n } catch (error) {\n fail(error);\n }\n },\n\n rmdir(parent: any, name: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.unlink(path, true);\n } catch (error) {\n fail(error);\n }\n },\n\n readdir(node: any): string[] {\n const path = SBXFS.realPath(node);\n try {\n const fd = client.open(path, 0 /* O_RDONLY */);\n try {\n const names: string[] = [];\n for (;;) {\n const batch = client.readdir(fd, 8192);\n if (batch.length === 0) break;\n names.push(...batch);\n }\n return names;\n } finally {\n client.close(fd);\n }\n } catch (error) {\n return fail(error);\n }\n },\n\n symlink(parent: any, name: string, target: string): void {\n const path = `${SBXFS.realPath(parent)}/${name}`.replace(/\\/+/g, \"/\");\n try {\n client.symlink(target, path);\n } catch (error) {\n fail(error);\n }\n },\n\n readlink(node: any): string {\n try {\n return client.readlink(SBXFS.realPath(node));\n } catch (error) {\n return fail(error);\n }\n },\n },\n\n stream_ops: {\n open(stream: any): void {\n const path = SBXFS.realPath(stream.node);\n if (FS.isDir(stream.node.mode)) return;\n try {\n /* The guest's flags are already POSIX numbers, and the kernel's ABI\n * uses the same ones — no translation, and none invented. */\n stream.sbxFd = client.open(path, stream.flags & ~0o2000000 /* drop O_CLOEXEC */);\n } catch (error) {\n fail(error);\n }\n },\n\n close(stream: any): void {\n if (stream.sbxFd === undefined) return;\n try {\n client.close(stream.sbxFd);\n } catch {\n /* A close that fails has still released the descriptor here; raising\n * would leak the guest's stream instead. */\n }\n stream.sbxFd = undefined;\n },\n\n read(stream: any, buffer: Uint8Array, offset: number, length: number, position: number): number {\n if (length === 0) return 0;\n try {\n const data = client.pread(stream.sbxFd, length, position);\n buffer.set(data, offset);\n return data.length;\n } catch (error) {\n return fail(error);\n }\n },\n\n write(stream: any, buffer: Uint8Array, offset: number, length: number, position: number): number {\n if (length === 0) return 0;\n try {\n return client.pwrite(stream.sbxFd, buffer.subarray(offset, offset + length), position);\n } catch (error) {\n return fail(error);\n }\n },\n\n llseek(stream: any, offset: number, whence: number): number {\n let position = offset;\n if (whence === 1) position += stream.position;\n else if (whence === 2 && FS.isFile(stream.node.mode)) {\n position += SBXFS.node_ops.getattr(stream.node).size;\n }\n if (position < 0) raise(Errno.EINVAL);\n return position;\n },\n },\n };\n\n return SBXFS;\n}\n","/**\n * Compression and hashing, resolved at runtime rather than at import time.\n *\n * On Node these delegate to `node:zlib` and `node:crypto`. In a browser they\n * fall back to `CompressionStream` and `crypto.subtle`, with a small MD5 in\n * JavaScript because Web Crypto does not offer it. Loading this module never\n * imports a `node:` builtin, so the package can be bundled for the browser;\n * the platform is only decided when a byte actually needs compressing.\n */\n\nexport type HashAlgorithm = \"md5\" | \"sha1\" | \"sha224\" | \"sha256\" | \"sha384\" | \"sha512\";\n\nconst isNode =\n typeof process !== \"undefined\" && process.versions != null && process.versions.node != null;\n\n/**\n * Import a Node builtin without a bundler noticing.\n *\n * The specifier is assembled at runtime so esbuild/Vite/webpack cannot analyse\n * it: a browser bundle then contains no reference to `zlib` or `crypto` to\n * resolve, while Node still loads them normally. (A literal `import(\"node:zlib\")`\n * gets rewritten to a bare `import(\"zlib\")` by esbuild's node platform, which a\n * browser bundler would then try — and fail — to resolve from node_modules.)\n */\nexport async function nodeBuiltin<T>(name: string): Promise<T> {\n const specifier = `node:${name}`;\n return (await import(/* @vite-ignore */ /* webpackIgnore: true */ specifier)) as T;\n}\n\n/**\n * Import a Node-only package the same way, and for the same reason.\n *\n * A dynamic `import()` of a *literal* specifier is still resolved and bundled\n * — it only becomes a separate chunk. So `import(\"esbuild-wasm\")`\n * still drags `node:worker_threads` into a browser build even though a browser\n * host never calls it. Assembling the specifier at runtime is what actually\n * keeps it out of the graph.\n */\nexport async function nodeOnlyModule<T>(specifier: string): Promise<T> {\n const parts = specifier.split(\"/\");\n const runtimeSpecifier = parts.join(\"/\");\n return (await import(/* @vite-ignore */ /* webpackIgnore: true */ runtimeSpecifier)) as T;\n}\n\n// ── zlib ────────────────────────────────────────────────────────────────────\n\ntype ZlibModule = typeof import(\"node:zlib\");\nlet zlibPromise: Promise<ZlibModule> | null = null;\n\nfunction nodeZlib(): Promise<ZlibModule> {\n zlibPromise ??= nodeBuiltin<ZlibModule>(\"zlib\");\n return zlibPromise;\n}\n\n/** Run bytes through a `CompressionStream`/`DecompressionStream`. */\nasync function throughStream(data: Uint8Array, stream: unknown): Promise<Uint8Array> {\n const source = new Blob([data as BlobPart]).stream();\n const piped = (source as unknown as { pipeThrough(s: unknown): ReadableStream }).pipeThrough(stream);\n return new Uint8Array(await new Response(piped).arrayBuffer());\n}\n\nexport async function gzip(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).gzipSync(data));\n return throughStream(data, new CompressionStream(\"gzip\"));\n}\n\nexport async function gunzip(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).gunzipSync(data));\n return throughStream(data, new DecompressionStream(\"gzip\"));\n}\n\nexport async function deflate(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).deflateSync(data));\n return throughStream(data, new CompressionStream(\"deflate\"));\n}\n\nexport async function inflate(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).inflateSync(data));\n return throughStream(data, new DecompressionStream(\"deflate\"));\n}\n\n/** Raw deflate, with no zlib header — what zip entries use. */\nexport async function inflateRaw(data: Uint8Array): Promise<Uint8Array> {\n if (isNode) return new Uint8Array((await nodeZlib()).inflateRawSync(data));\n return throughStream(data, new DecompressionStream(\"deflate-raw\"));\n}\n\n// ── hashing ─────────────────────────────────────────────────────────────────\n\ntype CryptoModule = typeof import(\"node:crypto\");\nlet cryptoPromise: Promise<CryptoModule> | null = null;\n\nfunction nodeCrypto(): Promise<CryptoModule> {\n cryptoPromise ??= nodeBuiltin<CryptoModule>(\"crypto\");\n return cryptoPromise;\n}\n\nconst SUBTLE_NAMES: Partial<Record<HashAlgorithm, string>> = {\n sha1: \"SHA-1\",\n sha256: \"SHA-256\",\n sha384: \"SHA-384\",\n sha512: \"SHA-512\",\n};\n\nexport class UnsupportedAlgorithmError extends Error {\n constructor(algorithm: string) {\n super(`${algorithm} is not available in this environment`);\n this.name = \"UnsupportedAlgorithmError\";\n }\n}\n\n/** Hex digest of `data`. */\nexport async function digestHex(algorithm: HashAlgorithm, data: Uint8Array): Promise<string> {\n if (isNode) {\n const { createHash } = await nodeCrypto();\n return createHash(algorithm).update(data).digest(\"hex\");\n }\n if (algorithm === \"md5\") return md5Hex(data);\n const name = SUBTLE_NAMES[algorithm];\n if (!name) throw new UnsupportedAlgorithmError(algorithm);\n const buffer = await crypto.subtle.digest(name, data as BufferSource);\n return toHex(new Uint8Array(buffer));\n}\n\nexport async function randomUuid(): Promise<string> {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") return crypto.randomUUID();\n const { randomUUID } = await nodeCrypto();\n return randomUUID();\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = \"\";\n for (const byte of bytes) out += byte.toString(16).padStart(2, \"0\");\n return out;\n}\n\n// ── MD5 ─────────────────────────────────────────────────────────────────────\n\n/**\n * RFC 1321 MD5. Only reached in browsers, where Web Crypto deliberately omits\n * it; Node uses its own implementation above. Exported so the test suite can\n * exercise the browser path while running on Node.\n */\nexport function md5Hex(input: Uint8Array): string {\n const S = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n ];\n const K = new Uint32Array(64);\n for (let i = 0; i < 64; i++) K[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 2 ** 32);\n\n const bitLength = input.length * 8;\n const padded = new Uint8Array((((input.length + 8) >> 6) + 1) * 64);\n padded.set(input);\n padded[input.length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, bitLength >>> 0, true);\n view.setUint32(padded.length - 4, Math.floor(bitLength / 2 ** 32), true);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n for (let chunk = 0; chunk < padded.length; chunk += 64) {\n const M = new Uint32Array(16);\n for (let i = 0; i < 16; i++) M[i] = view.getUint32(chunk + i * 4, true);\n\n let [a, b, c, d] = [a0, b0, c0, d0];\n for (let i = 0; i < 64; i++) {\n let f: number;\n let g: number;\n if (i < 16) {\n f = (b & c) | (~b & d);\n g = i;\n } else if (i < 32) {\n f = (d & b) | (~d & c);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n f = b ^ c ^ d;\n g = (3 * i + 5) % 16;\n } else {\n f = c ^ (b | ~d);\n g = (7 * i) % 16;\n }\n const tmp = d;\n d = c;\n c = b;\n const sum = (a + f + K[i]! + M[g]!) >>> 0;\n b = (b + ((sum << S[i]!) | (sum >>> (32 - S[i]!)))) >>> 0;\n a = tmp;\n }\n a0 = (a0 + a) >>> 0;\n b0 = (b0 + b) >>> 0;\n c0 = (c0 + c) >>> 0;\n d0 = (d0 + d) >>> 0;\n }\n\n const out = new Uint8Array(16);\n new DataView(out.buffer).setUint32(0, a0, true);\n new DataView(out.buffer).setUint32(4, b0, true);\n new DataView(out.buffer).setUint32(8, c0, true);\n new DataView(out.buffer).setUint32(12, d0, true);\n return toHex(out);\n}\n","/**\n * One Python process, in its own worker.\n *\n * This is the rule the old integration could not keep: **one active Python\n * process owns one interpreter instance.** A worker starts, instantiates the\n * interpreter from the release artifact, runs one command line, and exits.\n * Nothing survives it — not `sys.modules`, not logging handlers, not a native\n * extension's static state — because there is nothing for it to survive in.\n *\n * Everything the interpreter would ask an operating system for goes to the\n * kernel over `sbx_host_v1`, synchronously, while this worker blocks. The\n * kernel is on another thread and stays awake, which is what makes a blocking\n * `read()` of a terminal nobody has typed into possible at all.\n */\n\nimport { HostAbiClient } from \"./syscall-client.js\";\nimport { HostCallClient, type HostTransportBuffers } from \"./sync-transport.js\";\nimport { createSbxFs } from \"./sbxfs.js\";\nimport { ERRNO_NAMES } from \"./host-abi.js\";\nimport { nodeBuiltin } from \"../../util/binary.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface PythonWorkerStart {\n buffers: HostTransportBuffers;\n generation: number;\n moduleUrl: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n /** The identity the kernel gave this process; libc's own is a constant. */\n pid: number;\n ppid: number;\n /** Container directories to mount, and where. */\n mounts: { guest: string; container: string }[];\n /** True when stdout is a terminal, which Python checks before buffering. */\n isTty: boolean;\n /**\n * Descriptor numbers this process inherited, beyond the standard three.\n *\n * A child is *told* which number each inherited descriptor has — on its\n * command line, in `multiprocessing`'s case — so the numbers are not this\n * side's to choose. Each is installed at exactly the number the kernel put\n * it at, which is the number the parent named.\n */\n inheritFds?: number[];\n}\n\nexport interface PythonWorkerPort {\n postMessage(message: unknown): void;\n}\n\n/**\n * Directories the interpreter owns and the container must not cover.\n *\n * The standard library lives inside the module's own data image. Mounting the\n * container over it would replace Python with whatever the container happens\n * to have at that path — usually nothing.\n */\nconst INTERPRETER_OWNED = new Set([\"/lib\", \"/dev\", \"/proc\", \"/usr/local\"]);\n\nexport async function runPythonProcess(start: PythonWorkerStart, port: PythonWorkerPort): Promise<void> {\n const transport = new HostCallClient(start.buffers, () => port.postMessage({ type: \"wake\" }));\n\n /* The guest may not assert its own identity: the transport belongs to one\n * process, and the kernel stamps the generation it was created with. */\n const stampedCall = (request: Uint8Array): Uint8Array => {\n const stamped = request.slice();\n new DataView(stamped.buffer).setUint32(8, start.generation, true);\n return transport.call(stamped);\n };\n const client = new HostAbiClient(\n { call: stampedCall } as unknown as HostCallClient,\n start.generation,\n );\n\n const factory = (await import(/* @vite-ignore */ start.moduleUrl)).default;\n\n let exitCode = 0;\n\n /* The guest's linear memory, captured at instantiation.\n *\n * `_sbx_socket` is the one native module that reaches the host through the\n * raw Wasm `sbx_host_call` import rather than the JS filesystem bridge, so\n * this shim has to copy request and response bytes in and out of that\n * memory itself. The Emscripten loader does not put `HEAPU8` on the Module\n * object unless it is in `EXPORTED_RUNTIME_METHODS`, and this build's list\n * deliberately does not carry it — so the shim reads the buffer straight\n * from the imported `WebAssembly.Memory` instead, re-viewing it on every\n * call because memory growth detaches the old `ArrayBuffer`. */\n let guestMemory: WebAssembly.Memory | undefined;\n const guestHeap = (): Uint8Array | undefined => {\n const exported = config.HEAPU8 as Uint8Array | undefined;\n if (exported && exported.byteLength > 0) return exported;\n return guestMemory ? new Uint8Array(guestMemory.buffer) : undefined;\n };\n\n /**\n * Rewrite a failed response's errno into the number *this libc* uses.\n *\n * The ABI's errno values are Linux's; Emscripten's musl numbering is not.\n * `sbxfs.ts` translates at its own edge, and this is the other edge: native\n * modules that call `sbx_host_call` directly take the status straight into\n * `errno`, so an untranslated value does not merely mislabel the failure, it\n * *changes which failure it is*. `EAGAIN` (11 here) is `ECANCELED` there, so\n * \"this socket would block\" reached asyncio as a fatal error instead of the\n * BlockingIOError its accept and recv loops are built to expect — a server\n * that had already produced a correct response then hung, because the\n * event loop treated a routine retry as a broken connection.\n */\n const translateResponseErrno = (response: Uint8Array): void => {\n const view = new DataView(response.buffer, response.byteOffset, response.byteLength);\n const status = view.getInt32(12, true);\n if (status >= 0) return;\n const codes = (config.ERRNO_CODES ?? {}) as Record<string, number>;\n const name = ERRNO_NAMES[-status];\n const mapped = name ? codes[name] : undefined;\n view.setInt32(12, -(mapped ?? codes.EIO ?? -status), true);\n };\n\n /* Emscripten uses the object it is given *as* the module, so this one gains\n * `FS` and `ENV` before `preRun` fires. Reaching for them through `this`\n * instead depends on how the callback happens to be invoked, which has\n * changed between Emscripten releases and fails as \"cannot read FS of\n * undefined\" — a long way from the cause. */\n const config: any = {\n /* Emscripten resolves `python.wasm` and `python.data` beside its loader;\n * saying so explicitly survives a host that serves the loader from a\n * different path than it was built at.\n *\n * Under Node the loader reads them with `fs`, which wants a path and not a\n * `file://` URL — and reports the difference as a bare ENOENT naming the\n * URL, which reads like a missing file rather than a wrong kind of name. */\n locateFile: (file: string) => {\n const resolved = new URL(file, start.moduleUrl);\n if (resolved.protocol !== \"file:\") {\n const release = new URL(start.moduleUrl).searchParams.get(\"sbx-runtime\");\n if (release) resolved.searchParams.set(\"sbx-runtime\", release);\n return resolved.href;\n }\n return decodeURIComponent(resolved.pathname);\n },\n arguments: start.argv,\n /* Read by the `--wrap`ped `getpid`/`getppid` in library_sbx_posix.js. */\n sbxPid: start.pid,\n sbxPpid: start.ppid,\n /* Native CPython modules call the same ABI import as the filesystem\n * bridge. Stamp the process generation here so C callers cannot forge it.\n *\n * The JS library normally lowers this to `Module.sbxHostCall`; dynamic\n * Emscripten links may retain `env.sbx_host_call` as a direct Wasm import,\n * though. Supplying the exact import name keeps both link shapes working.\n */\n sbxHostCall: (request: Uint8Array) => stampedCall(request),\n sbx_host_call: (requestPtr: number, requestLength: number, responsePtr: number, responseCapacity: number) => {\n const heap = guestHeap();\n if (!heap) return -5; // EIO: the runtime called before memory was ready.\n try {\n const response = stampedCall(heap.slice(requestPtr, requestPtr + requestLength));\n if (response.length < 20 || response.length > responseCapacity) return -34; // ERANGE\n translateResponseErrno(response);\n guestHeap()!.set(response, responsePtr);\n return response.length;\n } catch (error) {\n config.sbxHostFault = error;\n return -5; // EIO\n }\n },\n /* `_sbx_socket` is a native module and therefore retains the ABI call as\n * an `env` import in dynamic builds. Emscripten's generated loader does\n * not copy arbitrary Module properties into that import object, so bind it\n * at the one supported extension point before instantiation. */\n instantiateWasm: (imports: { env: Record<string, unknown> }, receiveInstance: (instance: WebAssembly.Instance, module: WebAssembly.Module) => void) => {\n imports.env.sbx_host_call = config.sbx_host_call;\n if (imports.env.memory instanceof WebAssembly.Memory) guestMemory = imports.env.memory;\n void (async () => {\n try {\n const url = config.locateFile(\"python.wasm\");\n let bytes: Uint8Array;\n if (String(url).startsWith(\"file:\" ) || String(url).startsWith(\"/\")) {\n const [{ readFile }, { fileURLToPath }] = await Promise.all([\n nodeBuiltin<typeof import(\"node:fs/promises\")>(\"fs/promises\"),\n nodeBuiltin<typeof import(\"node:url\")>(\"url\"),\n ]);\n bytes = new Uint8Array(await readFile(String(url).startsWith(\"file:\") ? fileURLToPath(url) : url));\n } else {\n bytes = new Uint8Array(await (await fetch(url)).arrayBuffer());\n }\n const result = await WebAssembly.instantiate(\n bytes as BufferSource,\n imports as WebAssembly.Imports,\n ) as WebAssembly.WebAssemblyInstantiatedSource;\n if (!guestMemory && result.instance.exports.memory instanceof WebAssembly.Memory) {\n guestMemory = result.instance.exports.memory;\n }\n receiveInstance(result.instance, result.module);\n } catch (error) {\n config.onAbort?.(error);\n throw error;\n }\n })();\n return {};\n },\n quit: (status: number) => {\n exitCode = status;\n },\n };\n\n config.preRun = [\n () => {\n mountContainer(config.FS, client, start.mounts, config.ERRNO_CODES ?? {});\n bindStdio(config.FS, client, start.isTty);\n for (const [key, value] of Object.entries(start.env)) config.ENV[key] = value;\n try {\n config.FS.chdir(start.cwd);\n } catch {\n /* A cwd the container does not have is the caller's problem to report,\n * not a reason to fail before `main` runs. */\n }\n },\n ];\n\n const module = await factory(config);\n\n /* After the module exists, because the descriptor bridge is part of it — and\n * before `main`, because the program's first act may be to read one. */\n for (const fd of start.inheritFds ?? []) {\n const register = (module as { sbxRegisterFd?: (hostFd: number, atFd: number) => number }).sbxRegisterFd;\n if (typeof register !== \"function\") {\n port.postMessage({ type: \"failed\", message: \"this Python build cannot receive inherited descriptors\" });\n return;\n }\n register(fd, fd);\n }\n\n try {\n exitCode = module.callMain(start.argv) ?? exitCode;\n } catch (error) {\n const status = (error as { status?: number }).status;\n if (typeof status === \"number\") exitCode = status;\n else {\n port.postMessage({ type: \"failed\", message: String((error as Error)?.message ?? error) });\n return;\n }\n }\n port.postMessage({ type: \"exit\", code: exitCode });\n}\n\n/** Put the container's directories where a program expects to find them. */\nfunction mountContainer(\n FS: any,\n client: HostAbiClient,\n mounts: { guest: string; container: string }[],\n errnoCodes: Record<string, number>,\n): void {\n const SBXFS = createSbxFs(FS, client, errnoCodes);\n for (const mount of mounts) {\n if (INTERPRETER_OWNED.has(mount.guest)) continue;\n try {\n FS.mkdirTree(mount.guest);\n } catch {\n /* Already there. */\n }\n FS.mount(SBXFS, { root: mount.container }, mount.guest);\n }\n}\n\n/**\n * Wire the process's standard streams to the kernel's.\n *\n * Byte by byte, and never decoded: the terminal boundary is where a multi-byte\n * character gets cut in half, and a stream that decodes here turns that into a\n * replacement character the program can never recover.\n *\n * Whether these are *terminals* is the part that decides how the interpreter\n * behaves, not just how it looks. Handing Emscripten byte callbacks through\n * `FS.init(input, output, error)` makes plain character devices, so `isatty`\n * is false — and CPython with a non-terminal stdin does not start a REPL, it\n * reads stdin as a script file. `python` at an interactive prompt then sits\n * there forever with no banner, having decided it was given a program.\n *\n * So a terminal gets real TTY streams — `FS.init(null, null, null)` symlinks\n * `/dev/stdin` to `/dev/tty` — with this process's ops swapped in afterwards.\n * A pipe gets the character devices, which is what a pipe should be.\n */\nfunction bindStdio(FS: any, client: HostAbiClient, isTty: boolean): void {\n /** One byte from the kernel, or null at end of input. Blocks in between. */\n const readByte = (): number | null => {\n const data = client.read(0, 1);\n return data.length === 0 ? null : data[0]!;\n };\n\n if (!isTty) {\n FS.init(readByte, writeThrough(client, 1), writeThrough(client, 2));\n return;\n }\n\n FS.init(null, null, null);\n\n /* The stream's own ops are replaced rather than the TTY's.\n *\n * Emscripten's TTY writes a byte at a time and flushes on a newline, because\n * its sink is a `console.log`-shaped line printer. A prompt has no newline —\n * `>>> ` would sit in that buffer forever, and `fflush` does not reach it,\n * because C's `fflush` issues a `write`, not an `fsync`. Handling the whole\n * `write` here means one kernel write per guest write, which is both correct\n * and what a terminal actually looks like.\n *\n * `stream.tty` is left in place, so `isatty` still says yes.\n */\n for (const [fd, sink] of [[1, 1], [2, 2]] as [number, number][]) {\n const stream = FS.getStream(fd);\n if (!stream) continue;\n stream.stream_ops = {\n ...stream.stream_ops,\n write(_stream: any, buffer: Uint8Array, offset: number, length: number): number {\n if (length > 0) client.writeAll(sink, buffer.subarray(offset, offset + length));\n return length;\n },\n fsync(): number {\n return 0;\n },\n };\n }\n\n const stdin = FS.getStream(0);\n if (stdin) {\n stdin.stream_ops = {\n ...stdin.stream_ops,\n read(_stream: any, buffer: Uint8Array, offset: number, length: number): number {\n /* Blocks in the kernel until a key is pressed. Returning zero here\n * means end of input, so it must never be how \"nothing yet\" is\n * reported. */\n const data = client.read(0, length);\n buffer.set(data, offset);\n return data.length;\n },\n };\n }\n}\n\n/** A line-buffered writer for a non-terminal stream. */\nfunction writeThrough(client: HostAbiClient, fd: number): (charCode: number | null) => void {\n let pending: number[] = [];\n return (charCode) => {\n if (charCode === null) {\n if (pending.length > 0) {\n client.writeAll(fd, new Uint8Array(pending));\n pending = [];\n }\n return;\n }\n pending.push(charCode);\n /* Flush on a newline so output appears when it was written, and on size so\n * a long line is not held indefinitely. */\n if (charCode === 10 || pending.length >= 4096) {\n client.writeAll(fd, new Uint8Array(pending));\n pending = [];\n }\n };\n}\n","/**\n * The process worker's entry point.\n *\n * Built as its own bundle: a worker is fetched as its own module graph, so\n * anything left unresolved here has to resolve from wherever the loader\n * happens to be — the trap HANDOFF.md records for the guest worker.\n *\n * It waits for its buffers rather than reading them from `workerData`, so the\n * same file serves a browser `Worker` and a Node `worker_threads` one.\n */\n\nimport { runPythonProcess, type PythonWorkerStart } from \"./worker-entry.js\";\n\ninterface Port {\n postMessage(message: unknown): void;\n}\n\nasync function connect(): Promise<{ port: Port; onStart: (handler: (start: PythonWorkerStart) => void) => void }> {\n /* A browser worker posts and listens on its own global scope; Node's worker\n * has neither and reaches its parent through `worker_threads`. Feature\n * detection rather than a build flag, so one bundle serves both. */\n const scope = globalThis as unknown as {\n postMessage?: (message: unknown) => void;\n addEventListener?: (type: string, handler: (event: MessageEvent) => void) => void;\n };\n\n if (typeof scope.postMessage === \"function\" && typeof scope.addEventListener === \"function\") {\n const post = scope.postMessage.bind(globalThis);\n const listen = scope.addEventListener.bind(globalThis);\n return {\n port: { postMessage: post },\n onStart: (handler) =>\n listen(\"message\", (event: MessageEvent) => {\n const data = event.data as PythonWorkerStart & { type?: string };\n if (data?.type === \"start\") handler(data);\n }),\n };\n }\n\n const specifier = [\"node\", \"worker_threads\"].join(\":\");\n const { parentPort } = (await import(/* @vite-ignore */ /* webpackIgnore: true */ specifier)) as {\n parentPort: { postMessage(value: unknown): void; on(event: string, listener: (value: unknown) => void): void };\n };\n return {\n port: parentPort,\n onStart: (handler) =>\n parentPort.on(\"message\", (message) => {\n const data = message as PythonWorkerStart & { type?: string };\n if (data?.type === \"start\") handler(data);\n }),\n };\n}\n\nvoid connect().then(({ port, onStart }) => {\n onStart((start) => {\n void runPythonProcess(start, port).catch((error: Error) =>\n port.postMessage({ type: \"failed\", message: String(error?.message ?? error) }),\n );\n });\n /* The supervisor waits for this before sending the start message, so that a\n * worker whose script failed to load is reported rather than hung. */\n port.postMessage({ type: \"sandboxedjs:ready\" });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sandboxedjs",
3
- "version": "0.1.68",
3
+ "version": "0.1.69",
4
4
  "description": "A Linux-like container that runs entirely inside Node.js \u2014 POSIX shell, ~140 coreutils, Node.js and Python runtimes, virtual filesystem and networking. No Docker, no VM, no native modules.",
5
5
  "type": "module",
6
6
  "license": "MIT",