@ai-ecoverse/slicc-kernel 1.40.1 → 1.41.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/kernel-worker.js +233 -130
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-process-worker.js +197 -64
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +255 -152
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +197 -64
- package/dist/process-worker.js.map +4 -4
- package/package.json +3 -3
package/dist/node.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/node.ts", "../src/cdp/port.ts", "../src/fs/types.ts", "../src/kernel/pipe.ts", "../src/kernel/fd-table.ts", "../src/process/wasi/wasi-abi.ts", "../src/process/wasi-errno.ts", "../src/kernel/net/uplink-socket.ts", "../src/kernel/socket.ts", "../src/kernel/dial.ts", "../src/kernel/signals.ts", "../src/body-idle.ts", "../src/kernel/net/ws-queue.ts", "../src/websocket-transport.ts", "../src/transport.ts", "../src/client/protocol.ts", "../src/client/serve-client.ts", "../src/fs/meta.ts", "../src/fs/opfs.ts", "../src/fs/unlinked.ts", "../src/kernel/net/http1.ts", "../src/cdp/types.ts", "../src/cdp/websocket.ts", "../src/cdp/facade.ts", "../src/cdp/hosts.ts", "../src/commands.ts", "../src/fs/commands.ts", "../src/fs/watch.ts", "../src/kernel/children.ts", "../src/mount/protocol.ts", "../src/mount/connection.ts", "../src/mount/mount-fs.ts", "../src/realm/sync-fs-token-registry.ts", "../src/realm/sync-fs-wire.ts", "../src/realm/sync-fs-dispatch.ts", "../src/realm/sync-sab-wire.ts", "../src/realm/sync-sab-responder.ts", "../src/kernel/host-ops.ts", "../src/kernel/net/loopback-names.ts", "../src/kernel/net/proxy-service.ts", "../src/kernel/net/x509.ts", "../src/kernel/net/realm-ca.ts", "../src/kernel/net/tls-engine.ts", "../src/kernel/net/tls-tunnel.ts", "../src/kernel/net/network.ts", "../src/kernel/net/http-syscalls.ts", "../src/kernel/net/routes.ts", "../src/kernel/net/uplink.ts", "../src/kernel/net/resolver.ts", "../src/kernel/tty.ts", "../src/kernel/pty.ts", "../src/kernel/select.ts", "../src/kernel/socket-syscalls.ts", "../src/fs/pages.ts", "../src/fs/ranged.ts", "../src/kernel/vfs-file.ts", "../src/kernel/process.ts", "../src/kernel/protocol.ts", "../src/kernel/host.ts", "../src/kernel/jobs.ts", "../src/kernel/settling.ts", "../src/mount/driver.ts", "../src/mount/medium.ts", "../src/mount/fsa.ts", "../src/mount/syscall.ts", "../src/mount/fstab.ts", "../src/mount/hostfs.ts", "../src/mount/media.ts", "../src/mount/chunked.ts", "../src/mount/tmpfs.ts", "../src/process/wasi/wasi-module.ts", "../src/launcher.ts", "../src/node/memory-root.ts", "../src/kernel/net/remote-transport.ts", "../src/serve.ts", "../src/client/dial-stream.ts", "../src/client/loopback-fetch.ts", "../src/client/attach.ts"],
|
|
4
|
-
"sourcesContent": ["import { MessageChannel, type MessagePort, Worker } from 'node:worker_threads';\nimport type { CdpHook } from './cdp/types.ts';\nimport type { MessagePortLike } from './client/protocol.ts';\nimport { type ServedClient, serveClient } from './client/serve-client.ts';\nimport { OpfsFs } from './fs/opfs.ts';\nimport { pidOwner } from './fs/unlinked.ts';\nimport type { RunOptions, RunResult, Terminal, TerminalOptions } from './index.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport type { RouteTable } from './kernel/net/routes.ts';\nimport type { NetworkUplink } from './kernel/net/uplink.ts';\nimport { Launcher } from './launcher.ts';\nimport type { FetchLike, HostfsGrantHook } from './mount/hostfs.ts';\nimport type { MountEntry, MountSpec } from './mount/mount-fs.ts';\nimport type { ProcessMountPolicy } from './mount/syscall.ts';\nimport { isMemoryRoot, memoryRoot } from './node/memory-root.ts';\nimport { signalNumber } from './serve.ts';\nimport { fetchTransport, type NetworkTransport } from './transport.ts';\n\nexport type { CdpConnection, CdpHook, CdpRequest } from './cdp/types.ts';\nexport {\n type AttachOptions,\n attachKernel,\n type ClientFetchRequest,\n type ClientFs,\n type ClientRunOptions,\n type ClientRunResult,\n type ClientTerminal,\n type ClientTerminalOptions,\n KernelCallError,\n type KernelClient,\n KernelGoneError,\n type ProcessEntry,\n type SpawnedProcess,\n type SpawnOptions,\n type WatchChange,\n} from './client/attach.ts';\nexport type {\n NetworkUplink,\n ResolveAnswer,\n ResolveFamily,\n RouteTable,\n RunOptions,\n RunResult,\n Terminal,\n TerminalOptions,\n TerminalSignal,\n} from './index.ts';\nexport type { MountEntry, MountSpec } from './mount/mount-fs.ts';\nexport { fetchTransport, type NetworkTransport } from './transport.ts';\nexport { memoryRoot };\n\nexport interface NodeKernelOptions {\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n network?: { transport?: NetworkTransport; uplink?: NetworkUplink };\n worker?: string | URL;\n driverWorker?: string | URL;\n processMounts?: ProcessMountPolicy;\n fstabRetries?: readonly number[];\n hostfs?: HostfsGrantHook;\n hostfsFetch?: FetchLike;\n hostfsOrigin?: string;\n cdp?: CdpHook;\n hostname?: string;\n}\n\nexport interface NodeKernel {\n readonly root: FileSystemDirectoryHandle;\n run(argv: string[], options?: RunOptions): Promise<RunResult>;\n openTerminal(argv: string[], options?: TerminalOptions): Promise<Terminal>;\n writeFile(path: string, data: string | Uint8Array): Promise<void>;\n readFile(path: string): Promise<Uint8Array>;\n connect(): Promise<MessagePort>;\n setRoutes(routes: RouteTable): Promise<void>;\n mount(spec: MountSpec): Promise<MountEntry>;\n umount(target: string): Promise<void>;\n mounts(): Promise<MountEntry[]>;\n terminate(): void;\n}\n\nfunction hostfsFetchOf(options: NodeKernelOptions): { hostfsFetch?: FetchLike } {\n const { hostfsFetch, hostfsOrigin } = options;\n if (hostfsOrigin === undefined) return hostfsFetch ? { hostfsFetch } : {};\n const base: FetchLike = hostfsFetch ?? ((url, init) => fetch(url, init));\n return {\n hostfsFetch: (url, init) => {\n const headers = new Headers(init.headers);\n headers.set('Origin', hostfsOrigin);\n return base(url, { ...init, headers });\n },\n };\n}\n\nexport function nodeTransport(): NetworkTransport {\n const transport = fetchTransport({ webSocket: true, webSocketHeaders: true });\n return { ...transport, traits: { ...transport.traits, crossOrigin: 'any' } };\n}\n\nconst TERMINATED = 'the kernel is terminated';\n\nfunction nodeWorker(file: string | URL, live: Set<() => void>, closed: boolean): WasmWorkerLike {\n const errors = new Set<(event: MessageEvent) => void>();\n const messages = new Map<(event: MessageEvent) => void, (data: unknown) => void>();\n const fail = (message: string) => {\n for (const handler of [...errors]) {\n handler({ message, preventDefault() {} } as unknown as MessageEvent);\n }\n };\n const worker = closed ? undefined : new Worker(file);\n if (worker) {\n const kill = () => {\n void worker.terminate();\n fail(TERMINATED);\n };\n live.add(kill);\n worker.once('exit', () => live.delete(kill));\n worker.on('error', (err) => fail(String(err)));\n } else {\n setTimeout(() => fail(TERMINATED), 0);\n }\n return {\n postMessage: (message, transfer) => worker?.postMessage(message, transfer as never),\n addEventListener(type, handler) {\n if (type === 'error') {\n errors.add(handler);\n return;\n }\n const listener = (data: unknown) => handler({ data } as MessageEvent);\n messages.set(handler, listener);\n worker?.on('message', listener);\n },\n removeEventListener(type, handler) {\n errors.delete(handler);\n const listener = messages.get(handler);\n if (listener) worker?.off('message', listener);\n },\n terminate: () => void worker?.terminate(),\n };\n}\n\nfunction textOf(on: ((text: string) => void) | undefined) {\n if (!on) return undefined;\n const decoder = new TextDecoder();\n return (bytes: Uint8Array) => on(decoder.decode(bytes, { stream: true }));\n}\n\nexport async function createNodeKernel(options: NodeKernelOptions = {}): Promise<NodeKernel> {\n const root = options.root ?? memoryRoot();\n const fs = new OpfsFs(root, undefined, undefined, { ranged: isMemoryRoot(root) });\n await fs.reconcile();\n const live = new Set<() => void>();\n const pending = new Set<(err: Error) => void>();\n const clients = new Set<ServedClient>();\n let terminated = false;\n const file = options.worker ?? new URL('./node-process-worker.js', import.meta.url);\n const transport = options.network?.transport;\n const launcher = new Launcher({\n fs,\n unlinkOwner: pidOwner(process),\n createWorker: () => nodeWorker(file, live, terminated),\n createDriverWorker: () =>\n nodeWorker(\n options.driverWorker ?? new URL('./node-driver-worker.js', import.meta.url),\n live,\n terminated\n ),\n ...(options.modules ? { modules: options.modules } : {}),\n ...(options.env ? { env: options.env } : {}),\n ...(transport ? { transport } : {}),\n ...(options.network?.uplink ? { uplink: options.network.uplink } : {}),\n ...(options.processMounts !== undefined ? { processMounts: options.processMounts } : {}),\n ...(options.fstabRetries ? { fstabRetries: options.fstabRetries } : {}),\n ...(options.hostfs ? { hostfs: options.hostfs } : {}),\n ...hostfsFetchOf(options),\n ...(options.cdp ? { cdp: options.cdp } : {}),\n ...(options.hostname !== undefined ? { hostname: options.hostname } : {}),\n });\n await launcher.prepare();\n const guard = <T>(work: () => Promise<T>): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n if (terminated) return reject(new Error(TERMINATED));\n pending.add(reject);\n work()\n .then(resolve, reject)\n .finally(() => pending.delete(reject));\n });\n const decoder = new TextDecoder();\n return {\n root,\n async run(argv, opts = {}) {\n const { stdin, onStdout, onStderr, ...rest } = opts;\n const onOut = textOf(onStdout);\n const onErr = textOf(onStderr);\n const result = await guard(() =>\n launcher.run(argv, {\n ...rest,\n ...(stdin !== undefined\n ? { stdin: typeof stdin === 'string' ? new TextEncoder().encode(stdin) : stdin }\n : {}),\n ...(onOut ? { onStdout: onOut } : {}),\n ...(onErr ? { onStderr: onErr } : {}),\n })\n );\n return {\n status: result.status,\n stdout: decoder.decode(result.stdout),\n stderr: decoder.decode(result.stderr),\n };\n },\n async openTerminal(argv, opts = {}) {\n const { onData, ...rest } = opts;\n let listener = onData ?? null;\n const backlog: Uint8Array[] = [];\n const session = await guard(() =>\n launcher.openTerminal(argv, {\n ...rest,\n onData: (bytes) => (listener ? listener(bytes) : backlog.push(bytes)),\n })\n );\n return {\n pid: session.pid,\n exited: guard(() => session.exited),\n get onData() {\n return listener;\n },\n set onData(next) {\n listener = next;\n if (next) for (const bytes of backlog.splice(0)) next(bytes);\n },\n write: (data) =>\n session.write(typeof data === 'string' ? new TextEncoder().encode(data) : data),\n resize: (cols, rows) => session.resize(cols, rows),\n signal: (name) => session.signal(signalNumber(name)),\n close: () => session.close(),\n };\n },\n async writeFile(path, data) {\n const parent = path.slice(0, path.lastIndexOf('/')) || '/';\n await launcher.fs.mkdir(parent, { recursive: true });\n await launcher.fs.writeFile(path, data);\n },\n readFile: async (path) => launcher.fs.readFileBuffer(path),\n mount: (spec) => guard(() => launcher.mount(spec)),\n umount: (target) => guard(async () => launcher.umount(target)),\n mounts: async () => launcher.mounts.list(),\n setRoutes: (routes) => guard(async () => launcher.setRoutes(routes)),\n async connect() {\n if (terminated) throw new Error(TERMINATED);\n const { port1, port2 } = new MessageChannel();\n const served = serveClient(port1 as unknown as MessagePortLike, {\n launcher: async () => launcher,\n signal: signalNumber,\n });\n clients.add(served);\n void served.closed.then(() => clients.delete(served));\n return port2;\n },\n terminate() {\n terminated = true;\n for (const client of [...clients]) client.detach();\n for (const reject of [...pending]) reject(new Error(TERMINATED));\n for (const kill of [...live]) kill();\n launcher.cdp.close();\n launcher.unmountAll();\n },\n };\n}\n", "import type { CdpConnection, CdpHook, CdpRequest } from './types.ts';\n\nexport interface CdpPortLike {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close(): void;\n}\n\nexport type CdpWire = { open: true } | { error: string } | { m: string } | { close: string | null };\n\nexport interface CdpOpen {\n cdpOpen: CdpRequest & { registration?: number };\n port: CdpPortLike;\n}\n\nexport function serveCdpPort(\n port: CdpPortLike,\n hook: CdpHook,\n request: CdpRequest,\n onDone?: () => void\n): () => void {\n let conn: CdpConnection | undefined;\n let done = false;\n const end = () => {\n done = true;\n port.close();\n onDone?.();\n };\n const finish = (reason: string | null) => {\n if (done) return;\n port.postMessage({ close: reason });\n end();\n };\n port.addEventListener('message', ({ data }: MessageEvent<{ m?: string; close?: true }>) => {\n if (data.m !== undefined) conn?.send(data.m);\n else if (data.close && !done) {\n end();\n conn?.close();\n }\n });\n port.start?.();\n new Promise<CdpConnection>((resolve) => resolve(hook(request))).then(\n (opened) => {\n conn = opened;\n if (done) return opened.close();\n opened.onmessage = (m) => {\n if (!done) port.postMessage({ m });\n };\n opened.onclose = (reason) => finish(reason ?? null);\n port.postMessage({ open: true });\n },\n (e: unknown) => {\n if (done) return;\n port.postMessage({ error: e instanceof Error ? e.message : String(e) });\n end();\n }\n );\n return () => {\n if (done) return;\n conn?.close();\n finish('the CDP host is gone');\n };\n}\n\nexport function portCdpHook(\n ask: (request: CdpRequest, port: CdpPortLike) => void,\n gone?: Promise<unknown>\n): CdpHook {\n return (request) =>\n new Promise((resolve, reject) => {\n const { port1, port2 } = new MessageChannel();\n let closed = false;\n const conn: CdpConnection = {\n send: (m) => {\n if (!closed) port1.postMessage({ m });\n },\n onmessage: null,\n onclose: null,\n close: () => {\n if (closed) return;\n closed = true;\n port1.postMessage({ close: true });\n port1.close();\n },\n };\n port1.addEventListener('message', ({ data }: MessageEvent<CdpWire>) => {\n if ('m' in data) conn.onmessage?.(data.m);\n else if ('open' in data) resolve(conn);\n else if ('error' in data) {\n closed = true;\n port1.close();\n reject(new Error(data.error));\n } else if (!closed) {\n closed = true;\n port1.close();\n conn.onclose?.(data.close ?? undefined);\n }\n });\n port1.start();\n void gone?.then(() => {\n if (closed) return;\n closed = true;\n port1.close();\n reject(new Error('the CDP host is gone'));\n conn.onclose?.('the CDP host is gone');\n });\n ask(request, port2 as unknown as CdpPortLike);\n });\n}\n", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n version?: string;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n realpath?(path: string, follow: boolean): Promise<string>;\n createExclusive?(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n lutimes?(path: string, atime: Date, mtime: Date): Promise<void>;\n pread?(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate?(path: string, size: number): Promise<void>;\n}\n\nexport type RangedOps = Required<Pick<KernelFs, 'pread' | 'pwrite' | 'truncate'>>;\n\nexport function rangedOps(fs: Partial<RangedOps>): RangedOps | undefined {\n const { pread, pwrite, truncate } = fs;\n if (!pread || !pwrite || !truncate) return undefined;\n return { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n}\n\nexport async function lutimesOf(\n fs: KernelFs,\n path: string,\n atime: Date,\n mtime: Date\n): Promise<void> {\n if (fs.lutimes) return fs.lutimes(path, atime, mtime);\n if ((await fs.lstat(path)).isSymbolicLink) throw fsError('EOPNOTSUPP', path);\n return fs.utimes(path, atime, mtime);\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ENOEXEC'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'ENOSPC'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN'\n | 'EROFS'\n | 'EFBIG'\n | 'EALREADY'\n | 'ETIMEDOUT'\n | 'ECONNABORTED'\n | 'EHOSTUNREACH'\n | 'ECONNRESET';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string; twin?: number } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'full' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function sinkFile(onData: (bytes: Uint8Array) => void): OpenFile {\n return new OpenFile({\n write: async (bytes) => {\n onData(bytes.slice());\n return bytes.length;\n },\n close: () => {},\n });\n}\n\nexport function nullFile(): OpenFile {\n return new OpenFile({\n read: async () => new Uint8Array(0),\n write: async (bytes) => bytes.length,\n close: () => {},\n });\n}\n\nfunction written(device: KernelDevice, bytes: Uint8Array): number {\n if (device === 'full' && bytes.length > 0) throw new KernelError('ENOSPC');\n return bytes.length;\n}\n\nexport function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile {\n const read = async (max: number): Promise<Uint8Array> => {\n if (device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(max);\n if (device === 'urandom') {\n for (let at = 0; at < max; at += 65536) {\n crypto.getRandomValues(out.subarray(at, Math.min(max, at + 65536)));\n }\n }\n return out;\n };\n return new OpenFile({\n ...(access !== 'write' ? { read } : {}),\n ...(access !== 'read' ? { write: async (bytes: Uint8Array) => written(device, bytes) } : {}),\n seek: async () => 0,\n heldMeta: { device, ...(access ? { access } : {}) },\n close: () => {},\n });\n}\n\nexport function heldFile(meta?: HeldMeta): OpenFile {\n return new OpenFile({ held: true, ...(meta ? { heldMeta: meta } : {}), close: () => {} });\n}\n\nexport type KernelFdKind = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device';\n\nexport function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'> {\n if (file.held) return 'held';\n if (file.heldMeta && 'device' in file.heldMeta) return 'device';\n if (file.tty) return 'tty';\n return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "export const E = {\n SUCCESS: 0,\n '2BIG': 1,\n ACCES: 2,\n ADDRINUSE: 3,\n ADDRNOTAVAIL: 4,\n AFNOSUPPORT: 5,\n AGAIN: 6,\n ALREADY: 7,\n BADF: 8,\n BADMSG: 9,\n BUSY: 10,\n CANCELED: 11,\n CHILD: 12,\n CONNABORTED: 13,\n CONNREFUSED: 14,\n CONNRESET: 15,\n DEADLK: 16,\n DESTADDRREQ: 17,\n DOM: 18,\n DQUOT: 19,\n EXIST: 20,\n FAULT: 21,\n FBIG: 22,\n HOSTUNREACH: 23,\n IDRM: 24,\n ILSEQ: 25,\n INPROGRESS: 26,\n INTR: 27,\n INVAL: 28,\n IO: 29,\n ISCONN: 30,\n ISDIR: 31,\n LOOP: 32,\n MFILE: 33,\n MLINK: 34,\n MSGSIZE: 35,\n MULTIHOP: 36,\n NAMETOOLONG: 37,\n NETDOWN: 38,\n NETRESET: 39,\n NETUNREACH: 40,\n NFILE: 41,\n NOBUFS: 42,\n NODEV: 43,\n NOENT: 44,\n NOEXEC: 45,\n NOLCK: 46,\n NOLINK: 47,\n NOMEM: 48,\n NOMSG: 49,\n NOPROTOOPT: 50,\n NOSPC: 51,\n NOSYS: 52,\n NOTCONN: 53,\n NOTDIR: 54,\n NOTEMPTY: 55,\n NOTRECOVERABLE: 56,\n NOTSOCK: 57,\n NOTSUP: 58,\n NOTTY: 59,\n NXIO: 60,\n OVERFLOW: 61,\n OWNERDEAD: 62,\n PERM: 63,\n PIPE: 64,\n PROTO: 65,\n PROTONOSUPPORT: 66,\n PROTOTYPE: 67,\n RANGE: 68,\n ROFS: 69,\n SPIPE: 70,\n SRCH: 71,\n STALE: 72,\n TIMEDOUT: 73,\n TXTBSY: 74,\n XDEV: 75,\n NOTCAPABLE: 76,\n} as const;\n\nexport function wasiErrnoOf(code: string | undefined): number {\n if (!code) return E.IO;\n const name = code.startsWith('E') ? code.slice(1) : code;\n if (name === 'OPNOTSUPP') return E.NOTSUP;\n if (name === 'WOULDBLOCK') return E.AGAIN;\n if (name === 'NOMEDIUM') return E.NODEV;\n return (E as Record<string, number>)[name] ?? E.IO;\n}\n\nexport const FILETYPE = {\n UNKNOWN: 0,\n BLOCK_DEVICE: 1,\n CHARACTER_DEVICE: 2,\n DIRECTORY: 3,\n REGULAR_FILE: 4,\n SOCKET_DGRAM: 5,\n SOCKET_STREAM: 6,\n SYMBOLIC_LINK: 7,\n} as const;\n\nexport const RIGHTS = {\n FD_DATASYNC: 1n << 0n,\n FD_READ: 1n << 1n,\n FD_SEEK: 1n << 2n,\n FD_FDSTAT_SET_FLAGS: 1n << 3n,\n FD_SYNC: 1n << 4n,\n FD_TELL: 1n << 5n,\n FD_WRITE: 1n << 6n,\n\n ALL: (1n << 30n) - 1n,\n} as const;\n\nexport const OFLAGS = { CREAT: 1, DIRECTORY: 2, EXCL: 4, TRUNC: 8 } as const;\nexport const FDFLAGS = { APPEND: 1, DSYNC: 2, NONBLOCK: 4, RSYNC: 8, SYNC: 16 } as const;\nexport const LOOKUP_SYMLINK_FOLLOW = 1;\nexport const WHENCE = { SET: 0, CUR: 1, END: 2 } as const;\nexport const CLOCK = { REALTIME: 0, MONOTONIC: 1, PROCESS_CPUTIME: 2, THREAD_CPUTIME: 3 } as const;\nexport const FSTFLAGS = { ATIM: 1, ATIM_NOW: 2, MTIM: 4, MTIM_NOW: 8 } as const;\nexport const EVENTTYPE = { CLOCK: 0, FD_READ: 1, FD_WRITE: 2 } as const;\nexport const SUBCLOCK_ABSTIME = 1;\n\nexport const EVENT_FD_READWRITE_HANGUP = 1;\n\nexport const RIFLAGS = { PEEK: 1, WAITALL: 2 } as const;\n\nexport const SDFLAGS = { RD: 1, WR: 2 } as const;\nexport const PREOPENTYPE_DIR = 0;\n\nexport const SIZE = {\n FILESTAT: 64,\n FDSTAT: 24,\n DIRENT: 24,\n SUBSCRIPTION: 48,\n EVENT: 32,\n} as const;\n\nexport const WASI_SIGNAL_TO_POSIX: Readonly<Record<number, number>> = Object.fromEntries(\n Array.from({ length: 30 }, (_, i) => [i + 1, i + 1 < 16 ? i + 1 : i + 2])\n);\n", "import { E } from './wasi/wasi-abi.ts';\n\nconst WASI_ERRNO: Readonly<Partial<Record<string, number>>> = {\n ...Object.fromEntries(Object.entries(E).map(([name, errno]) => [`E${name}`, errno])),\n EWOULDBLOCK: E.AGAIN,\n ENOTSUP: 138,\n EOPNOTSUPP: 138,\n ENOMEDIUM: 148,\n};\n\nexport function wasiErrno(code: string): number {\n return WASI_ERRNO[code] ?? E.IO;\n}\n", "import { KernelPipe } from '../pipe.ts';\nimport type { UplinkConn } from './uplink.ts';\n\nconst CHUNK = 64 * 1024;\n\nexport interface UplinkLink {\n rx: KernelPipe;\n tx: KernelPipe;\n}\n\nexport function hostPort(text: string): { host: string; port: number } | undefined {\n const match = /^\\[?([^\\]]*?)\\]?:(\\d{1,5})$/.exec(text);\n const port = Number(match?.[2]);\n const host = match?.[1];\n if (!host || port > 65535) return undefined;\n return { host, port };\n}\n\nasync function inbound(conn: UplinkConn, rx: KernelPipe): Promise<void> {\n for (;;) {\n while (!rx.writeReady) await rx.changed();\n if (rx.readersGone) return;\n const bytes = await conn.read();\n if (!bytes) return;\n await rx.write(bytes);\n }\n}\n\nasync function outbound(conn: UplinkConn, tx: KernelPipe): Promise<void> {\n for (;;) {\n const bytes = await tx.read(CHUNK);\n if (bytes.length === 0) {\n conn.closeWrite();\n return;\n }\n for (let at = 0; at < bytes.length; ) {\n const n = await conn.write(bytes.subarray(at));\n if (!(n > 0)) throw new Error('the uplink wrote nothing');\n at += n;\n }\n }\n}\n\nasync function released(rx: KernelPipe, tx: KernelPipe): Promise<void> {\n while (!(rx.readersGone && tx.writersGone)) await Promise.race([rx.changed(), tx.changed()]);\n}\n\nexport function uplinkLink(conn: UplinkConn, onReset: () => void): UplinkLink {\n const rx = new KernelPipe();\n const tx = new KernelPipe();\n for (const pipe of [rx, tx]) {\n pipe.openRead();\n pipe.openWrite();\n }\n let open = true;\n const close = () => {\n if (!open) return;\n open = false;\n conn.close();\n };\n void inbound(conn, rx)\n .catch(() => {\n onReset();\n close();\n tx.closeRead();\n })\n .finally(() => rx.closeWrite());\n void outbound(conn, tx)\n .catch(close)\n .finally(() => tx.closeRead());\n void released(rx, tx).then(close);\n return { rx, tx };\n}\n", "import { wasiErrno } from '../process/wasi-errno.ts';\nimport { type KernelErrno, KernelError, type KernelFile, type PollState } from './fd-table.ts';\nimport type { Routes } from './net/routes.ts';\nimport type { NetworkUplink, UplinkConn } from './net/uplink.ts';\nimport { hostPort, uplinkLink } from './net/uplink-socket.ts';\nimport { KernelPipe, PIPE_CAPACITY, PipeError } from './pipe.ts';\nexport type SockAddr =\n | {\n family: 'inet';\n host: string;\n port: number;\n }\n | {\n family: 'unix';\n path: string;\n };\nexport type SocketDomain = SockAddr['family'];\nconst SOMAXCONN = 4096;\nconst EPHEMERAL_FIRST = 32768;\nconst EPHEMERAL_LAST = 60999;\nconst SOL_SOCKET = 1;\nconst SO_TYPE = 3;\nconst SO_ERROR = 4;\nconst SO_SNDBUF = 7;\nconst SO_RCVBUF = 8;\nconst SO_ACCEPTCONN = 30;\nconst SO_DOMAIN = 39;\nconst SOCK_STREAM = 1;\nconst AF_UNIX = 1;\nconst AF_INET = 2;\nexport const SHUT_RD = 0;\nexport const SHUT_WR = 1;\nexport const SHUT_RDWR = 2;\nexport const DIAL_TIMEOUT_MS = 30_000;\nconst DIAL_ERRORS: readonly KernelErrno[] = [\n 'ECONNREFUSED',\n 'ENETUNREACH',\n 'EHOSTUNREACH',\n 'ETIMEDOUT',\n 'ECONNRESET',\n];\nexport interface UplinkRoute {\n uplink: NetworkUplink;\n routes: Routes;\n timeoutMs?: number;\n}\nfunction dialError(e: unknown, timedOut: boolean, closed: boolean): KernelError {\n if (timedOut) return new KernelError('ETIMEDOUT');\n if (closed) return new KernelError('ECONNABORTED');\n const code = (e as { code?: unknown } | null)?.code;\n const known = DIAL_ERRORS.find((errno) => errno === code);\n return new KernelError(known ?? 'EHOSTUNREACH');\n}\nfunction isLoopback(host: string): boolean {\n return /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host);\n}\nasync function pipeCall<T>(op: () => Promise<T>): Promise<T> {\n try {\n return await op();\n } catch (e) {\n if (e instanceof PipeError) throw new KernelError(e.code);\n throw e;\n }\n}\nclass Changes {\n private waiters: Array<() => void> = [];\n wait(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\ninterface Link {\n rx: KernelPipe;\n tx: KernelPipe;\n}\nfunction link(a: KernelSocket, b: KernelSocket): void {\n const ab = new KernelPipe();\n const ba = new KernelPipe();\n for (const pipe of [ab, ba]) {\n pipe.openRead();\n pipe.openWrite();\n }\n a.attach({ rx: ba, tx: ab });\n b.attach({ rx: ab, tx: ba });\n}\nexport class KernelSocket implements KernelFile {\n private readonly net: LoopbackNet;\n readonly domain: SocketDomain;\n private state: 'open' | 'connecting' | 'listening' | 'connected' | 'closed' = 'open';\n private dialing: AbortController | undefined;\n private failed: string | undefined;\n private reset = false;\n local: SockAddr | undefined;\n peer: SockAddr | undefined;\n private link: Link | undefined;\n private readShut = false;\n private writeShut = false;\n private readonly queue: KernelSocket[] = [];\n private backlog = 0;\n private boundAt: SockAddr | undefined;\n private readonly changes = new Changes();\n private readonly options = new Map<string, number>();\n constructor(net: LoopbackNet, domain: SocketDomain) {\n this.net = net;\n this.domain = domain;\n }\n attach(link: Link): void {\n this.link = link;\n this.state = 'connected';\n this.changes.wake();\n }\n get listening(): boolean {\n return this.state === 'listening';\n }\n private connection(): Link {\n if (!this.link || this.state !== 'connected') throw new KernelError('ENOTCONN');\n return this.link;\n }\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n const bytes = await pipeCall(() => rx.read(max, signal));\n if (bytes.length === 0 && this.reset) throw new KernelError('ECONNRESET');\n return bytes;\n }\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n const bytes = await pipeCall(() => rx.peek(max, signal));\n if (bytes.length === 0 && this.reset) throw new KernelError('ECONNRESET');\n return bytes;\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n const { tx } = this.connection();\n if (this.writeShut) throw new KernelError('EPIPE');\n return pipeCall(() => tx.write(bytes, signal));\n }\n poll(): PollState {\n if (this.state === 'listening') {\n return { readable: this.queue.length > 0, writable: false, hangup: false };\n }\n if (this.state === 'connecting') return { readable: false, writable: false, hangup: false };\n if (this.failed) return { readable: true, writable: true, hangup: true };\n if (this.state !== 'connected' || !this.link) {\n return { readable: false, writable: false, hangup: true };\n }\n const { rx, tx } = this.link;\n return {\n readable: this.readShut || rx.readReady,\n writable: this.writeShut || tx.writeReady,\n hangup: rx.writersGone && tx.readersGone,\n };\n }\n changed(signal?: AbortSignal): Promise<void> {\n const own = this.changes.wait(signal);\n if (this.state !== 'connected' || !this.link) return own;\n const waits = [own, this.link.rx.changed(signal), this.link.tx.changed(signal)];\n for (const wait of waits) wait.catch(() => undefined);\n return pipeCall(() => Promise.race(waits));\n }\n bind(addr: SockAddr): void {\n if (this.state !== 'open' || this.local) throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n this.local = this.net.bind(this, addr);\n this.boundAt = this.local;\n }\n listen(backlog: number): void {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state !== 'open' && this.state !== 'listening') throw new KernelError('EINVAL');\n if (!this.local) {\n if (this.domain === 'unix') throw new KernelError('EINVAL');\n this.bind({ family: 'inet', host: '0.0.0.0', port: 0 });\n }\n this.backlog = Math.min(Math.max(backlog, 1), SOMAXCONN);\n this.state = 'listening';\n }\n async accept(signal?: AbortSignal, nonblock = false): Promise<KernelSocket> {\n for (;;) {\n if (this.state !== 'listening') throw new KernelError('EINVAL');\n const next = this.queue.shift();\n if (next) return next;\n if (nonblock) throw new KernelError('EAGAIN');\n await this.changes.wait(signal);\n }\n }\n offer(server: KernelSocket): boolean {\n if (this.state !== 'listening' || this.queue.length >= this.backlog) return false;\n this.queue.push(server);\n this.changes.wake();\n return true;\n }\n connect(addr: SockAddr, viaUplink = true): Promise<void> | undefined {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state === 'connecting') throw new KernelError('EALREADY');\n if (this.state !== 'open') throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n this.failed = undefined;\n const route = viaUplink && addr.family === 'inet' ? this.net.uplinkFor(addr.host) : undefined;\n if (route) return this.dial(addr as Extract<SockAddr, { family: 'inet' }>, route);\n const target = this.net.target(addr);\n if (!this.local) {\n if (addr.family === 'inet') {\n this.local = this.net.bind(this, { family: 'inet', host: '127.0.0.1', port: 0 });\n this.boundAt = this.local;\n } else this.local = { family: 'unix', path: '' };\n }\n const server = new KernelSocket(this.net, this.domain);\n server.local = addr.family === 'inet' ? { ...addr, host: canonicalHost(addr.host) } : addr;\n server.peer = this.local;\n this.peer = server.local;\n link(this, server);\n if (!target.offer(server)) {\n this.unlink();\n server.close();\n throw new KernelError('ECONNREFUSED');\n }\n return undefined;\n }\n private dial(addr: Extract<SockAddr, { family: 'inet' }>, route: UplinkRoute): Promise<void> {\n this.state = 'connecting';\n const abort = new AbortController();\n this.dialing = abort;\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n abort.abort(new KernelError('ETIMEDOUT'));\n }, route.timeoutMs ?? DIAL_TIMEOUT_MS);\n const abandoned = new Promise<never>((_, reject) => {\n abort.signal.addEventListener('abort', () => reject(abort.signal.reason), { once: true });\n });\n const { host, port } = addr;\n const dialled = new Promise<UplinkConn>((resolve) =>\n resolve(route.uplink.dial({ network: 'tcp', host, port, signal: abort.signal }))\n );\n dialled.then(\n (conn) => abort.signal.aborted && conn.close(),\n () => undefined\n );\n return Promise.race([dialled, abandoned])\n .then(\n (conn) => {\n if (abort.signal.aborted) throw dialError(abort.signal.reason, timedOut, true);\n this.local = { family: 'inet', host: '0.0.0.0', port: 0, ...hostPort(conn.localAddr) };\n this.peer = { ...addr, ...hostPort(conn.remoteAddr) };\n this.dialing = undefined;\n this.attach(\n uplinkLink(conn, () => {\n this.reset = true;\n this.changes.wake();\n })\n );\n },\n (e: unknown) => {\n const error = dialError(e, timedOut, abort.signal.aborted);\n if (this.dialing === abort) {\n this.dialing = undefined;\n this.failed = error.code;\n this.state = 'open';\n this.changes.wake();\n }\n throw error;\n }\n )\n .finally(() => clearTimeout(timer));\n }\n private unlink(): void {\n const link = this.link;\n if (link) {\n link.rx.closeRead();\n link.tx.closeWrite();\n }\n this.link = undefined;\n this.peer = undefined;\n this.state = 'open';\n }\n shutdown(how: number): void {\n const { rx, tx } = this.connection();\n if (how !== SHUT_RD && how !== SHUT_WR && how !== SHUT_RDWR) throw new KernelError('EINVAL');\n if (how !== SHUT_WR && !this.readShut) {\n this.readShut = true;\n rx.closeRead();\n }\n if (how !== SHUT_RD && !this.writeShut) {\n this.writeShut = true;\n tx.closeWrite();\n }\n this.changes.wake();\n }\n getOption(level: number, name: number): number {\n if (level === SOL_SOCKET) {\n switch (name) {\n case SO_TYPE:\n return SOCK_STREAM;\n case SO_ERROR: {\n const failed = this.failed;\n this.failed = undefined;\n return failed ? wasiErrno(failed) : 0;\n }\n case SO_ACCEPTCONN:\n return this.state === 'listening' ? 1 : 0;\n case SO_DOMAIN:\n return this.domain === 'inet' ? AF_INET : AF_UNIX;\n case SO_SNDBUF:\n case SO_RCVBUF:\n return this.options.get(`${level}:${name}`) ?? PIPE_CAPACITY;\n }\n }\n return this.options.get(`${level}:${name}`) ?? 0;\n }\n setOption(level: number, name: number, value: number): void {\n this.options.set(`${level}:${name}`, value);\n }\n close(): void {\n const was = this.state;\n this.state = 'closed';\n this.dialing?.abort(new KernelError('ECONNABORTED'));\n this.dialing = undefined;\n if (was === 'listening') {\n for (const pending of this.queue.splice(0)) pending.close();\n }\n if (this.link) {\n if (!this.readShut) this.link.rx.closeRead();\n if (!this.writeShut) this.link.tx.closeWrite();\n this.readShut = true;\n this.writeShut = true;\n }\n if (this.boundAt) this.net.release(this.boundAt, this);\n this.boundAt = undefined;\n this.changes.wake();\n }\n static pair(net: LoopbackNet, domain: SocketDomain): [KernelSocket, KernelSocket] {\n const a = new KernelSocket(net, domain);\n const b = new KernelSocket(net, domain);\n const name: SockAddr =\n domain === 'inet'\n ? { family: 'inet', host: '127.0.0.1', port: 0 }\n : { family: 'unix', path: '' };\n a.local = b.local = a.peer = b.peer = name;\n link(a, b);\n return [a, b];\n }\n}\nfunction canonicalHost(host: string): string {\n return host === '0.0.0.0' ? '127.0.0.1' : host;\n}\nfunction keyOf(addr: SockAddr): string {\n return addr.family === 'inet' ? `inet:${addr.port}` : `unix:${addr.path}`;\n}\nexport class LoopbackNet {\n private readonly bound = new Map<string, KernelSocket>();\n private readonly activators = new Map<string, () => void>();\n private readonly internal = new Set<number>();\n private nextEphemeral = EPHEMERAL_FIRST;\n private route: UplinkRoute | undefined;\n useUplink(route: UplinkRoute): void {\n this.route = route;\n }\n uplinkFor(host: string): UplinkRoute | undefined {\n const route = this.route;\n if (!route) return undefined;\n return route.routes.classify(host) === 'uplink' ? route : undefined;\n }\n kernelOnly(port: number, reserve = false): boolean {\n if (reserve) this.internal.add(port);\n return this.internal.has(port);\n }\n activate(addr: SockAddr, start: () => void): void {\n this.activators.set(keyOf(addr), start);\n }\n socket(domain: SocketDomain): KernelSocket {\n return new KernelSocket(this, domain);\n }\n listen(addr: SockAddr, backlog = 128): KernelSocket {\n const socket = this.socket(addr.family);\n socket.bind(addr);\n socket.listen(backlog);\n return socket;\n }\n connect(addr: SockAddr): KernelSocket {\n const socket = this.socket(addr.family);\n void socket.connect(addr, false);\n return socket;\n }\n bind(socket: KernelSocket, addr: SockAddr): SockAddr {\n if (addr.family === 'unix') {\n if (addr.path === '') throw new KernelError('EINVAL');\n } else if (addr.host !== '0.0.0.0' && !isLoopback(addr.host)) {\n throw new KernelError('EADDRNOTAVAIL');\n }\n const named =\n addr.family === 'inet' && addr.port === 0 ? { ...addr, port: this.ephemeral() } : addr;\n const key = keyOf(named);\n if (this.bound.has(key)) throw new KernelError('EADDRINUSE');\n this.bound.set(key, socket);\n return named;\n }\n release(addr: SockAddr, socket: KernelSocket): void {\n const key = keyOf(addr);\n if (this.bound.get(key) === socket) this.bound.delete(key);\n }\n target(addr: SockAddr): KernelSocket {\n if (addr.family === 'inet' && !isLoopback(canonicalHost(addr.host))) {\n throw new KernelError('ENETUNREACH');\n }\n const key = keyOf(addr);\n if (!this.bound.has(key)) this.activators.get(key)?.();\n const socket = this.bound.get(key);\n if (!socket?.listening) throw new KernelError('ECONNREFUSED');\n return socket;\n }\n private ephemeral(): number {\n const span = EPHEMERAL_LAST - EPHEMERAL_FIRST + 1;\n for (let i = 0; i < span; i++) {\n const port = this.nextEphemeral;\n this.nextEphemeral = port === EPHEMERAL_LAST ? EPHEMERAL_FIRST : port + 1;\n if (!this.bound.has(`inet:${port}`)) return port;\n }\n throw new KernelError('EADDRINUSE');\n }\n}\nconst namespaces = new Map<string, LoopbackNet>();\nexport function loopbackNet(owner: string): LoopbackNet {\n let net = namespaces.get(owner);\n if (!net) {\n net = new LoopbackNet();\n namespaces.set(owner, net);\n }\n return net;\n}\nexport function ownerKey(\n owner:\n | {\n kind: string;\n scoopJid?: string;\n }\n | undefined\n): string {\n return owner ? `${owner.kind}:${owner.scoopJid ?? ''}` : 'local';\n}\n", "import { KernelError } from './fd-table.ts';\nimport { type KernelSocket, type LoopbackNet, SHUT_WR } from './socket.ts';\n\nexport interface DialPortLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close(): void;\n}\n\nexport type DialMessage =\n | Uint8Array\n | { end: true }\n | { close: true }\n | { more: true }\n | { ack: true }\n | { error: string };\n\nconst CHUNK = 64 * 1024;\n\nconst LOOPBACK_NAMES = new Set(['127.0.0.1', 'localhost', '::1', '[::1]']);\n\nexport function dialSocket(net: LoopbackNet, port: number, host = '127.0.0.1'): KernelSocket {\n if (!Number.isInteger(port) || port < 1 || port > 65535) throw new KernelError('EINVAL');\n const target = LOOPBACK_NAMES.has(host.toLowerCase()) ? '127.0.0.1' : host;\n if (net.kernelOnly(port)) {\n throw Object.assign(\n new Error(`ECONNREFUSED: port ${port} only takes connections from inside the kernel`),\n {\n code: 'ECONNREFUSED',\n }\n );\n }\n return net.connect({ family: 'inet', host: target, port });\n}\n\nconst codeOf = (err: unknown) => {\n const code = (err as { code?: unknown } | null)?.code;\n return typeof code === 'string' ? code : 'EIO';\n};\n\nexport function serveSocket(\n socket: KernelSocket,\n port: DialPortLike,\n onClose?: () => void\n): () => void {\n let closed = false;\n let writes = Promise.resolve();\n let credit = 0;\n let granted: (() => void) | undefined;\n const send = (message: DialMessage, transfer?: Transferable[]) => {\n if (!closed) port.postMessage(message, transfer);\n };\n const close = (reset = false) => {\n if (closed) return;\n if (reset) send({ error: 'ECONNRESET' });\n closed = true;\n granted?.();\n socket.close();\n port.close();\n onClose?.();\n };\n const write = (data: Uint8Array) => {\n writes = writes.then(async () => {\n if (closed) return;\n try {\n await socket.write(data);\n send({ ack: true });\n } catch (err) {\n send({ error: codeOf(err) });\n }\n });\n };\n port.addEventListener('message', ({ data }: MessageEvent<DialMessage>) => {\n if (data instanceof Uint8Array) write(data);\n else if ('more' in data) {\n credit++;\n granted?.();\n } else if ('end' in data) {\n writes = writes.then(() => {\n if (!closed) socket.shutdown(SHUT_WR);\n });\n } else if ('close' in data) close();\n });\n port.start?.();\n const turn = () =>\n credit > 0 || closed ? Promise.resolve() : new Promise<void>((r) => (granted = r));\n void (async () => {\n try {\n for (;;) {\n await turn();\n if (closed) return;\n const chunk = await socket.read(CHUNK);\n if (chunk.length === 0) break;\n credit--;\n send(chunk, [chunk.buffer as ArrayBuffer]);\n }\n send({ end: true });\n } catch (err) {\n send({ error: codeOf(err) });\n }\n })();\n return () => close(true);\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "export const BODY_IDLE_MS = 5 * 60 * 1000;\n\nexport function idleFailure(ms: number): Error {\n return Object.assign(new Error(`the response body sent no data for ${ms} ms`), {\n code: 'ETIMEDOUT',\n });\n}\n\nexport async function readWithin<T>(\n reader: ReadableStreamDefaultReader<T>,\n ms: number\n): Promise<ReadableStreamReadResult<T>> {\n if (!(ms > 0 && ms < Number.POSITIVE_INFINITY)) return reader.read();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const idle = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(idleFailure(ms)), ms);\n });\n try {\n return await Promise.race([reader.read(), idle]);\n } finally {\n clearTimeout(timer);\n }\n}\n", "import type { RealmWebSocketClose, RealmWebSocketMessage } from './transport.ts';\n\nexport const INBOUND_LIMIT = 16 * 1024 * 1024;\nexport const MESSAGE_LIMIT = 64 * 1024 * 1024;\nexport const TOO_BIG = 1009;\n\nexport function payloadSize(message: RealmWebSocketMessage): number {\n return typeof message === 'string' ? new TextEncoder().encode(message).length : message.length;\n}\n\nexport class MessageQueue implements AsyncIterable<RealmWebSocketMessage> {\n private readonly items: RealmWebSocketMessage[] = [];\n private readonly limit: number;\n private waiter: (() => void) | undefined;\n private size = 0;\n private ended = false;\n private readonly overflow: () => void;\n private readonly taken: ((n: number) => void) | undefined;\n readonly closed: Promise<RealmWebSocketClose>;\n private settle!: (close: RealmWebSocketClose) => void;\n\n constructor(overflow: () => void, limit = INBOUND_LIMIT, taken?: (n: number) => void) {\n this.overflow = overflow;\n this.limit = limit;\n this.taken = taken;\n this.closed = new Promise((resolve) => {\n this.settle = resolve;\n });\n }\n\n push(message: RealmWebSocketMessage): void {\n if (this.ended) return;\n const size = payloadSize(message);\n const huge = size > MESSAGE_LIMIT;\n if (huge || (this.items.length > 0 && this.size + size > this.limit)) {\n const reason = huge\n ? `a message is over ${MESSAGE_LIMIT} bytes`\n : `over ${this.limit} bytes of messages are waiting`;\n this.end({ code: TOO_BIG, reason });\n this.overflow();\n return;\n }\n this.size += size;\n this.items.push(message);\n this.wake();\n }\n\n end(close: RealmWebSocketClose): void {\n if (this.ended) return;\n this.ended = true;\n this.settle(close);\n this.wake();\n }\n\n private wake(): void {\n const waiter = this.waiter;\n this.waiter = undefined;\n waiter?.();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<RealmWebSocketMessage> {\n for (;;) {\n const next = this.items.shift();\n if (next !== undefined) {\n const n = payloadSize(next);\n this.size -= n;\n this.taken?.(n);\n yield next;\n continue;\n }\n if (this.ended) return;\n await new Promise<void>((resolve) => {\n this.waiter = resolve;\n });\n }\n }\n}\n", "import type {\n HeaderList,\n RealmWebSocket,\n RealmWebSocketMessage,\n RealmWebSocketRequest,\n} from './kernel/net/transport.ts';\nimport { MessageQueue } from './kernel/net/ws-queue.ts';\n\nexport interface WebSocketLike {\n binaryType: string;\n readonly protocol: string;\n readonly bufferedAmount: number;\n send(data: string | ArrayBufferView): void;\n close(code?: number, reason?: string): void;\n addEventListener(type: string, listener: (event: never) => void): void;\n}\n\nexport type WebSocketConstructor = new (url: string, init?: unknown) => WebSocketLike;\n\nconst SENT_HEADERS_DROP = new Set([\n 'host',\n 'connection',\n 'upgrade',\n 'sec-websocket-key',\n 'sec-websocket-version',\n 'sec-websocket-extensions',\n 'sec-websocket-protocol',\n]);\n\nfunction headerRecord(headers: HeaderList): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [name, value] of headers) {\n if (!SENT_HEADERS_DROP.has(name.toLowerCase())) out[name] = value;\n }\n return out;\n}\n\nexport function sendableClose(code?: number): number {\n return code === 1000 || (code !== undefined && code >= 3000 && code <= 4999) ? code : 1000;\n}\n\nfunction blockedReason(url: string, e: unknown): string {\n const name = (e as { name?: unknown } | null)?.name;\n if (name === 'SecurityError' && url.startsWith('ws:')) {\n return `${url}: ws:// is blocked from an https page; use wss:// or slicc-node`;\n }\n return `${url}: ${e instanceof Error ? e.message : String(e)}`;\n}\n\nexport function openWebSocket(\n Socket: WebSocketConstructor,\n request: RealmWebSocketRequest,\n withHeaders: boolean\n): Promise<RealmWebSocket> {\n const { url, protocols, signal } = request;\n signal.throwIfAborted();\n let socket: WebSocketLike;\n try {\n socket = withHeaders\n ? new Socket(url, { protocols, headers: headerRecord(request.headers) })\n : new Socket(url, protocols);\n } catch (e) {\n return Promise.reject(Object.assign(new Error(blockedReason(url, e)), { status: 502 }));\n }\n socket.binaryType = 'arraybuffer';\n const queue = new MessageQueue(() => socket.close(1000, 'too many waiting messages'));\n return new Promise((resolve, reject) => {\n let open = false;\n const abort = () => {\n socket.close(1000, 'aborted');\n reject(signal.reason);\n };\n signal.addEventListener('abort', abort, { once: true });\n socket.addEventListener('open', () => {\n open = true;\n signal.removeEventListener('abort', abort);\n resolve({\n protocol: socket.protocol,\n get buffered() {\n return socket.bufferedAmount;\n },\n send: (data: RealmWebSocketMessage) => socket.send(data),\n messages: queue,\n close: (code?: number, reason?: string) => socket.close(sendableClose(code), reason),\n closed: queue.closed,\n });\n });\n socket.addEventListener('message', (event: { data: string | ArrayBuffer }) => {\n queue.push(typeof event.data === 'string' ? event.data : new Uint8Array(event.data));\n });\n socket.addEventListener('close', (event: { code: number; reason: string }) => {\n queue.end({ code: event.code, reason: event.reason });\n if (open) return;\n signal.removeEventListener('abort', abort);\n reject(\n Object.assign(new Error(`${url}: the WebSocket closed (${event.code}) before it opened`), {\n status: 502,\n })\n );\n });\n });\n}\n", "import { BODY_IDLE_MS, readWithin } from './body-idle.ts';\nimport type { TransportCall, TransportReply } from './kernel/net/remote-transport.ts';\nimport type {\n HeaderList,\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n RealmTransportTraits,\n RealmWebSocket,\n RealmWebSocketRequest,\n} from './kernel/net/transport.ts';\nimport { INBOUND_LIMIT, MESSAGE_LIMIT, payloadSize } from './kernel/net/ws-queue.ts';\nimport { openWebSocket, type WebSocketConstructor } from './websocket-transport.ts';\n\nexport type {\n HeaderList,\n RealmTransport as NetworkTransport,\n RealmTransportRequest as NetworkRequest,\n RealmTransportResponse as NetworkResponse,\n RealmTransportTraits as NetworkTraits,\n RealmWebSocket as NetworkWebSocket,\n RealmWebSocketRequest as NetworkWebSocketRequest,\n};\n\nexport interface FetchTransportOptions {\n fetch?: typeof globalThis.fetch;\n maxRequestBody?: number;\n hint?: string;\n bodyIdleMs?: number;\n webSocket?: boolean | WebSocketConstructor;\n webSocketHeaders?: boolean;\n}\n\nexport const SEND_BUFFER = 1024 * 1024;\nconst CLOSE_WAIT_MS = 5000;\n\nconst NO_WEBSOCKET =\n 'WebSocket not supported by this transport (fetchTransport needs { webSocket: true })';\n\nconst MAX_REQUEST_BODY = 64 * 1024 * 1024;\n\nfunction joinHeaders(headers: HeaderList): Headers {\n const out = new Headers();\n for (const [name, value] of headers) {\n try {\n out.append(name, value);\n } catch {}\n }\n return out;\n}\n\nasync function* chunks(\n body: ReadableStream<Uint8Array> | null,\n idleMs: number\n): AsyncGenerator<Uint8Array> {\n if (!body) return;\n const reader = body.getReader();\n try {\n for (\n let next = await readWithin(reader, idleMs);\n !next.done;\n next = await readWithin(reader, idleMs)\n ) {\n if (next.value.byteLength > 0) yield next.value;\n }\n } finally {\n await reader.cancel().catch(() => undefined);\n }\n}\n\nexport function fetchTransport(options: FetchTransportOptions = {}): RealmTransport {\n const send = options.fetch ?? globalThis.fetch.bind(globalThis);\n const Socket =\n options.webSocket === true\n ? (globalThis as { WebSocket?: WebSocketConstructor }).WebSocket\n : options.webSocket || undefined;\n const headers = options.webSocketHeaders === true;\n return {\n traits: {\n manualRedirects: false,\n encodedBodies: false,\n maxRequestBody: options.maxRequestBody ?? MAX_REQUEST_BODY,\n crossOrigin: 'cors',\n ...(Socket ? { websocket: true as const } : {}),\n },\n ...(Socket ? { websocket: (request) => openWebSocket(Socket, request, headers) } : {}),\n async fetch(request: RealmTransportRequest): Promise<RealmTransportResponse> {\n let response: Response;\n try {\n response = await send(request.url, {\n method: request.method,\n headers: joinHeaders(request.headers),\n ...(request.body ? { body: request.body as BodyInit } : {}),\n signal: request.signal,\n redirect: 'follow',\n credentials: 'omit',\n mode: 'cors',\n });\n } catch (e) {\n if (request.signal.aborted) throw e;\n throw Object.assign(\n new Error(\n `fetch ${request.url} failed (unreachable, or not allowed by CORS)${options.hint ? `: ${options.hint}` : ''}`\n ),\n { status: 502 }\n );\n }\n const headers: Array<[string, string]> = [];\n response.headers.forEach((value, name) => {\n headers.push([name, value]);\n });\n const body = chunks(response.body, options.bodyIdleMs ?? BODY_IDLE_MS);\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n cancel: async () => {\n await body.return(undefined);\n await response.body?.cancel().catch(() => undefined);\n },\n };\n },\n };\n}\n\nexport interface TransportPeer {\n postMessage(message: TransportReply, transfer?: Transferable[]): void;\n}\n\nexport interface TransportServer {\n answer(call: TransportCall): void;\n close(): void;\n}\n\ninterface Flow {\n inflight: number;\n closing: boolean;\n deadline(): void;\n wake?: () => void;\n}\n\nexport function serveTransport(\n peer: TransportPeer,\n transport: RealmTransport,\n { closeWaitMs = CLOSE_WAIT_MS }: { closeWaitMs?: number } = {}\n): TransportServer {\n const open = new Map<\n number,\n { abort: AbortController; body?: AsyncIterator<Uint8Array>; response?: RealmTransportResponse }\n >();\n const fail = (nid: number, e: unknown) => {\n open.delete(nid);\n const { status, code } = e as { status?: unknown; code?: unknown };\n peer.postMessage({\n net: 'error',\n nid,\n message: e instanceof Error ? e.message : String(e),\n ...(typeof status === 'number' ? { status } : {}),\n ...(typeof code === 'string' ? { code } : {}),\n });\n };\n const start = async (call: Extract<TransportCall, { net: 'fetch' }>) => {\n const abort = new AbortController();\n const entry: { abort: AbortController; body?: AsyncIterator<Uint8Array> } = { abort };\n open.set(call.nid, entry);\n try {\n const response = await transport.fetch({\n url: call.url,\n method: call.method,\n headers: call.headers,\n ...(call.body ? { body: call.body } : {}),\n signal: abort.signal,\n });\n if (!open.has(call.nid)) {\n await response.cancel();\n return;\n }\n open.set(call.nid, { abort, body: response.body[Symbol.asyncIterator](), response });\n peer.postMessage({\n net: 'head',\n nid: call.nid,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n } catch (e) {\n fail(call.nid, e);\n }\n };\n const sockets = new Map<number, RealmWebSocket>();\n const credit = new Map<number, Flow>();\n const refill = (nid: number, n: number, closing = false) => {\n const flow = credit.get(nid);\n if (!flow) return;\n flow.inflight -= n;\n if (closing && !flow.closing) {\n flow.closing = true;\n flow.deadline();\n }\n flow.wake?.();\n };\n const openSocket = async (call: Extract<TransportCall, { net: 'ws-open' }>) => {\n const abort = new AbortController();\n open.set(call.nid, { abort });\n try {\n if (!transport.websocket) throw new Error(NO_WEBSOCKET);\n const socket = await transport.websocket({\n url: call.url,\n protocols: call.protocols,\n headers: call.headers,\n signal: abort.signal,\n });\n if (!open.delete(call.nid)) {\n socket.close(1000, 'cancelled');\n return;\n }\n sockets.set(call.nid, socket);\n peer.postMessage({ net: 'ws-opened', nid: call.nid, protocol: socket.protocol });\n void relay(call.nid, socket);\n } catch (e) {\n fail(call.nid, e);\n }\n };\n const relay = async (nid: number, socket: RealmWebSocket) => {\n let ending: { code: number; reason: string };\n let late!: () => void;\n const unanswered = new Promise<'late'>((resolve) => {\n late = () => resolve('late');\n });\n const flow: Flow = {\n inflight: 0,\n closing: false,\n deadline: () =>\n AbortSignal.timeout(closeWaitMs).addEventListener('abort', late, { once: true }),\n };\n credit.set(nid, flow);\n const timedOut = { code: 1006, reason: 'the far end did not answer the close' };\n let oversize = false;\n try {\n const messages = socket.messages[Symbol.asyncIterator]();\n for (;;) {\n const next = await Promise.race([messages.next(), unanswered]);\n if (next === 'late' || next.done) break;\n const data = next.value;\n if (flow.closing) continue;\n if (payloadSize(data) > MESSAGE_LIMIT) {\n oversize = true;\n break;\n }\n if (typeof data === 'string') peer.postMessage({ net: 'ws-message', nid, data });\n else {\n const bytes = data.slice();\n peer.postMessage({ net: 'ws-message', nid, data: bytes }, [bytes.buffer]);\n }\n flow.inflight += payloadSize(data);\n while (flow.inflight > INBOUND_LIMIT && !flow.closing) {\n await new Promise<void>((resolve) => {\n flow.wake = resolve;\n });\n }\n }\n if (oversize) socket.close(1000, 'a message is too big');\n ending = oversize\n ? { code: 1009, reason: `a message is over ${MESSAGE_LIMIT} bytes` }\n : await Promise.race([socket.closed, unanswered.then(() => timedOut)]);\n } catch (e) {\n socket.close(1000, 'the relay failed');\n ending = { code: 1011, reason: e instanceof Error ? e.message : String(e) };\n }\n sockets.delete(nid);\n credit.delete(nid);\n peer.postMessage({ net: 'ws-closed', nid, ...ending });\n };\n const sendOn = async (call: Extract<TransportCall, { net: 'ws-send' }>) => {\n const socket = sockets.get(call.nid);\n if (!socket) return;\n socket.send(call.data);\n while (socket.buffered > SEND_BUFFER && sockets.has(call.nid)) {\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n peer.postMessage({ net: 'ws-acked', nid: call.nid, n: payloadSize(call.data) });\n };\n const read = async (nid: number) => {\n const body = open.get(nid)?.body;\n if (!body) return;\n try {\n const next = await body.next();\n if (next.done) {\n open.delete(nid);\n peer.postMessage({ net: 'end', nid });\n } else {\n const bytes = next.value.slice();\n peer.postMessage({ net: 'chunk', nid, bytes }, [bytes.buffer]);\n }\n } catch (e) {\n fail(nid, e);\n }\n };\n const drop = (nid: number) => {\n sockets.get(nid)?.close(1000, 'cancelled');\n refill(nid, 0, true);\n const entry = open.get(nid);\n open.delete(nid);\n entry?.abort.abort();\n void entry?.response?.cancel().catch(() => undefined);\n };\n return {\n answer(call) {\n if (call.net === 'fetch') void start(call);\n else if (call.net === 'read') void read(call.nid);\n else if (call.net === 'ws-open') void openSocket(call);\n else if (call.net === 'ws-send') void sendOn(call);\n else if (call.net === 'ws-close') {\n sockets.get(call.nid)?.close(call.code, call.reason);\n refill(call.nid, 0, true);\n } else if (call.net === 'ws-consumed') refill(call.nid, call.n);\n else drop(call.nid);\n },\n close() {\n for (const nid of [...open.keys(), ...sockets.keys()]) drop(nid);\n },\n };\n}\n", "import type { WatchChange } from '../fs/watch.ts';\nimport type { TransportCall, TransportReply } from '../kernel/net/remote-transport.ts';\nimport type { RealmTransportTraits } from '../kernel/net/transport.ts';\nimport type { MountSpec } from '../mount/mount-fs.ts';\n\nexport const PROTOCOL: readonly [number, number] = [1, 7];\n\nexport interface ClientHello {\n protocol: readonly [number, number];\n lock?: string;\n}\n\nexport interface KernelHello {\n protocol: readonly [number, number];\n lock?: string;\n traits?: RealmTransportTraits;\n error?: string;\n}\n\nexport interface SpawnRequestOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n pgid?: number;\n}\n\nexport interface TerminalRequestOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n}\n\nexport type TerminalAction =\n | { action: 'write'; bytes: Uint8Array }\n | { action: 'resize'; cols: number; rows: number }\n | { action: 'signal'; signal: string }\n | { action: 'close' };\n\nexport const FS_METHODS = [\n 'readFile',\n 'writeFile',\n 'stat',\n 'lstat',\n 'readdir',\n 'mkdir',\n 'rm',\n 'rename',\n 'realpath',\n 'symlink',\n 'readlink',\n 'exists',\n] as const;\n\nexport type FsMethod = (typeof FS_METHODS)[number];\n\nexport type ClientCall =\n | { op: 'spawn'; argv: string[]; options: SpawnRequestOptions }\n | { op: 'open-terminal'; argv: string[]; options: TerminalRequestOptions }\n | ({ op: 'terminal'; terminal: number } & TerminalAction)\n | { op: 'kill'; pid: number; signal: string }\n | { op: 'ps' }\n | { op: 'fs'; method: FsMethod; args: unknown[] }\n | { op: 'watch'; paths: string[]; recursive: boolean }\n | { op: 'unwatch'; watch: number }\n | { op: 'mount'; spec: MountSpec }\n | { op: 'umount'; target: string }\n | { op: 'mounts' }\n | { op: 'dial'; port: number; host?: string }\n | { op: 'serve-cdp'; runtime?: string }\n | { op: 'unserve-cdp'; registration: number }\n | { op: 'detach'; kill?: boolean };\n\nexport type ClientRequest = ClientCall & { id: number };\n\nexport interface ClientReply {\n id: number;\n result?: unknown;\n error?: string;\n code?: string;\n fd?: 1 | 2;\n bytes?: Uint8Array;\n started?: number;\n}\n\nexport type ClientMessage = { hello: ClientHello } | ClientRequest | TransportCall;\n\nexport interface WatchEvent {\n watch: number;\n change: WatchChange;\n}\n\nexport type KernelMessage = { hello: KernelHello } | ClientReply | WatchEvent | TransportReply;\n\nexport interface ProcessEntry {\n pid: number;\n ppid: number;\n pgid: number;\n sid: number;\n argv: string[];\n tty: string | null;\n started: number;\n state: 'S' | 'Z';\n memory: number;\n}\n\nexport interface MessagePortLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'close', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close?(): void;\n}\n\nexport interface LockManagerLike {\n request(name: string, callback: () => Promise<unknown> | unknown): Promise<unknown>;\n}\n\nexport function locksOf(scope: object = globalThis): LockManagerLike | undefined {\n const locks = (scope as { navigator?: { locks?: LockManagerLike } }).navigator?.locks;\n return typeof locks?.request === 'function' ? locks : undefined;\n}\n\nexport function versionError(theirs: unknown): string | undefined {\n const major = Array.isArray(theirs) ? theirs[0] : undefined;\n if (major === PROTOCOL[0]) return undefined;\n const named = typeof major === 'number' ? `${major}.x` : 'without a version';\n return `slicc-kernel client protocol ${named} is not supported: this side speaks ${PROTOCOL.join('.')}`;\n}\n", "import { portCdpHook } from '../cdp/port.ts';\nimport { fsError, type KernelFs } from '../fs/types.ts';\nimport { dialSocket, serveSocket } from '../kernel/dial.ts';\nimport type { TransportCall } from '../kernel/net/remote-transport.ts';\nimport type { RealmTransport } from '../kernel/net/transport.ts';\nimport { SIG } from '../kernel/signals.ts';\nimport type { Launcher, TerminalSession } from '../launcher.ts';\nimport { serveTransport, type TransportServer } from '../transport.ts';\nimport {\n type ClientHello,\n type ClientRequest,\n FS_METHODS,\n type LockManagerLike,\n type MessagePortLike,\n PROTOCOL,\n type ProcessEntry,\n type TerminalAction,\n versionError,\n} from './protocol.ts';\n\nexport interface ClientHost {\n scope?: 'transport';\n launcher: () => Promise<Launcher>;\n transport?: () => RealmTransport;\n locks?: LockManagerLike;\n lock?: string;\n signal?: (name: string) => number;\n}\n\nexport interface ServedClient {\n detach(kill?: boolean): void;\n readonly closed: Promise<void>;\n}\n\ninterface Answer {\n result: unknown;\n transfer?: Transferable[];\n}\n\nconst MAX_LINKS = 40;\n\nfunction act(session: TerminalSession, req: TerminalAction, signal: (name: string) => number) {\n if (req.action === 'write') session.write(req.bytes);\n else if (req.action === 'resize') session.resize(req.cols, req.rows);\n else if (req.action === 'signal') session.signal(signal(req.signal));\n else session.close();\n}\n\nasync function realpath(fs: KernelFs, path: string): Promise<string> {\n let parts = fs.resolvePath('/', path).split('/').filter(Boolean);\n let resolved = '';\n for (let hops = 0; parts.length > 0; ) {\n const [name, ...rest] = parts;\n const next = `${resolved}/${name}`;\n if (!(await fs.lstat(next)).isSymbolicLink) {\n resolved = next;\n parts = rest;\n continue;\n }\n if (++hops > MAX_LINKS) throw fsError('ELOOP', path);\n const target = await fs.readlink(next);\n const base = target.startsWith('/') ? '/' : resolved || '/';\n parts = [...fs.resolvePath(base, target).split('/').filter(Boolean), ...rest];\n resolved = '';\n }\n return resolved || '/';\n}\n\nasync function fsCall(fs: KernelFs, method: string, args: unknown[]): Promise<Answer> {\n const path = (i: number) => fs.resolvePath('/', String(args[i]));\n switch (method) {\n case 'readFile': {\n const bytes = (await fs.readFileBuffer(path(0))).slice();\n return { result: bytes, transfer: [bytes.buffer] };\n }\n case 'writeFile':\n await fs.writeFile(path(0), args[1] as Uint8Array | string);\n return { result: true };\n case 'stat':\n return { result: await fs.stat(path(0)) };\n case 'lstat':\n return { result: await fs.lstat(path(0)) };\n case 'readdir':\n return { result: await fs.readdir(path(0)) };\n case 'mkdir':\n await fs.mkdir(path(0), { recursive: true });\n return { result: true };\n case 'rm':\n await fs.rm(path(0), { recursive: true, force: args[1] === true });\n return { result: true };\n case 'rename':\n await fs.rename(path(0), path(1));\n return { result: true };\n case 'realpath':\n return { result: await realpath(fs, String(args[0])) };\n case 'symlink':\n await fs.symlink(String(args[0]), path(1));\n return { result: true };\n case 'readlink':\n return { result: await fs.readlink(path(0)) };\n default:\n return { result: await fs.exists(path(0)) };\n }\n}\n\nfunction signalOf(host: ClientHost): (name: string) => number {\n return (\n host.signal ??\n ((name) => {\n throw fsError('EINVAL', `this kernel names no signal ${name}`);\n })\n );\n}\n\nfunction dialFor(\n l: Launcher,\n req: Extract<ClientRequest, { op: 'dial' }>,\n open: Map<number, () => void>\n): Answer {\n const socket = dialSocket(l.net, req.port, req.host);\n const { port1, port2 } = new MessageChannel();\n open.set(\n req.id,\n serveSocket(socket, port1, () => open.delete(req.id))\n );\n return { result: port2, transfer: [port2] };\n}\n\nfunction killGroups(host: ClientHost, pgids: number[]): void {\n if (pgids.length === 0) return;\n void host.launcher().then((launcher) => {\n for (const pgid of pgids) launcher.kill(-pgid, SIG.KILL);\n });\n}\n\nfunction joinable(l: Launcher, pgid: number, ours: (sid: number) => boolean): void {\n const sid = l.groupSession(pgid);\n if (sid === undefined) throw fsError('ESRCH', `no process group ${pgid}`);\n if (!ours(sid)) throw fsError('EPERM', `process group ${pgid} is in another session`);\n}\n\nfunction cdpRegistry(\n send: (message: object, transfer: Transferable[]) => void,\n gone: Promise<void>\n) {\n const registered = new Map<number, () => void>();\n const drop = (id: number) => {\n registered.get(id)?.();\n return registered.delete(id);\n };\n return {\n serve(l: Launcher, req: Extract<ClientRequest, { op: 'serve-cdp' }>): number {\n const hook = portCdpHook(\n (request, cdp) =>\n send({ cdpOpen: { ...request, registration: req.id }, port: cdp }, [\n cdp as unknown as Transferable,\n ]),\n gone\n );\n registered.set(req.id, l.cdp.register(hook, req.runtime));\n return req.id;\n },\n drop,\n close: () => {\n for (const id of [...registered.keys()]) drop(id);\n },\n };\n}\n\nfunction watchOp(\n l: Launcher,\n req: Extract<ClientRequest, { op: 'watch' | 'unwatch' }>,\n watches: Map<number, () => void>,\n send: (message: object) => void\n): Answer {\n if (req.op === 'unwatch') {\n watches.get(req.watch)?.();\n watches.delete(req.watch);\n return { result: true };\n }\n const unwatch = l.watchers.watch(req.paths, { recursive: req.recursive }, (change) =>\n send({ watch: req.id, change })\n );\n watches.set(req.id, unwatch);\n return { result: req.id };\n}\n\nexport function serveClient(port: MessagePortLike, host: ClientHost): ServedClient {\n let state: 'new' | 'open' | 'closed' = 'new';\n const terminals = new Map<number, TerminalSession>();\n const groups = new Set<number>();\n const sessions = new Set<number>();\n const watches = new Map<number, () => void>();\n let net: TransportServer | undefined;\n const ended = Promise.withResolvers<void>();\n const send = (message: object, transfer: Transferable[] = []) => {\n if (state !== 'closed') port.postMessage(message, transfer);\n };\n const reply = (id: number, body: object, transfer?: Transferable[]) =>\n send({ id, ...body }, transfer);\n const cdps = cdpRegistry(send, ended.promise);\n\n function detach(kill = false, bye = 'the slicc-kernel detached this client'): void {\n if (state === 'closed') return;\n send({ bye });\n state = 'closed';\n net?.close();\n for (const unwatch of watches.values()) unwatch();\n watches.clear();\n cdps.close();\n for (const session of terminals.values()) session.close();\n terminals.clear();\n if (kill) killGroups(host, [...groups]);\n groups.clear();\n port.close?.();\n ended.resolve();\n }\n\n async function hello(message: ClientHello): Promise<void> {\n const refused = versionError(message.protocol);\n if (refused) {\n send({ hello: { protocol: PROTOCOL, error: refused } });\n detach();\n return;\n }\n const launcher = await host.launcher();\n const transport = host.transport?.() ?? launcher.transport;\n net = serveTransport({ postMessage: (m, t) => send(m, t) }, transport);\n state = 'open';\n if (message.lock && host.locks) void host.locks.request(message.lock, () => detach());\n send({\n hello: {\n protocol: PROTOCOL,\n traits: transport.traits,\n ...(host.lock ? { lock: host.lock } : {}),\n },\n });\n }\n\n async function terminal(req: Extract<ClientRequest, { op: 'open-terminal' }>, l: Launcher) {\n const session = await l.openTerminal(req.argv, {\n ...req.options,\n onData: (bytes) => reply(req.id, { fd: 1, bytes: bytes.slice() }),\n });\n if (state === 'closed') {\n session.close();\n } else {\n terminals.set(req.id, session);\n sessions.add(session.pid);\n reply(req.id, { started: session.pid });\n }\n try {\n return { result: await session.exited };\n } finally {\n terminals.delete(req.id);\n }\n }\n\n async function spawn(req: Extract<ClientRequest, { op: 'spawn' }>, l: Launcher) {\n const out = (fd: 1 | 2) => (bytes: Uint8Array) => reply(req.id, { fd, bytes: bytes.slice() });\n if (req.options.pgid !== undefined) joinable(l, req.options.pgid, (sid) => sessions.has(sid));\n let leader: number | undefined;\n const result = await l.run(req.argv, {\n ...req.options,\n collect: false,\n onStdout: out(1),\n onStderr: out(2),\n onStarted: (pid) => {\n leader = pid;\n if (state === 'closed') return;\n groups.add(req.options.pgid ?? pid);\n if (req.options.pgid === undefined) sessions.add(pid);\n reply(req.id, { started: pid });\n },\n });\n if (leader === undefined) throw fsError('ENOENT', `${req.argv[0] ?? ''}: command not found`);\n if (!l.list().some((p) => p.pgid === leader)) groups.delete(leader);\n return { result: result.status };\n }\n\n async function handle(req: ClientRequest): Promise<Answer> {\n if (host.scope === 'transport' && req.op !== 'detach') {\n throw fsError('EPERM', `${req.op}: this client may only use the network transport`);\n }\n const l = await host.launcher();\n switch (req.op) {\n case 'spawn':\n return spawn(req, l);\n case 'open-terminal':\n return terminal(req, l);\n case 'terminal': {\n const session = terminals.get(req.terminal);\n if (!session) throw new Error(`no terminal ${req.terminal}`);\n act(session, req, signalOf(host));\n return { result: true };\n }\n case 'kill':\n if (!l.kill(req.pid, signalOf(host)(req.signal))) throw fsError('ESRCH', `pid ${req.pid}`);\n return { result: true };\n case 'ps':\n return {\n result: l.list().map(({ tid: _, ...entry }): ProcessEntry => entry),\n };\n case 'fs':\n if (!(FS_METHODS as readonly string[]).includes(req.method)) {\n throw new Error(`unknown file system call ${req.method}`);\n }\n return fsCall(l.fs, req.method, req.args);\n case 'watch':\n case 'unwatch':\n return watchOp(l, req, watches, send);\n case 'mount':\n return { result: await l.mount(req.spec) };\n case 'umount':\n l.umount(req.target);\n return { result: true };\n case 'mounts':\n return { result: l.mounts.list() };\n case 'dial':\n return dialFor(l, req, watches);\n case 'serve-cdp':\n return { result: cdps.serve(l, req) };\n case 'unserve-cdp':\n return { result: cdps.drop(req.registration) };\n case 'detach':\n return { result: true };\n default:\n throw new Error(`unknown op ${(req as { op: string }).op}`);\n }\n }\n\n port.addEventListener('message', (event) => {\n const data = event.data as { hello?: ClientHello; net?: unknown };\n if (state === 'closed') return;\n if (data.hello) {\n if (state === 'new') {\n hello(data.hello).catch((err: unknown) => {\n send({ hello: { protocol: PROTOCOL, error: String((err as Error)?.message ?? err) } });\n detach();\n });\n }\n return;\n }\n if (state !== 'open') return;\n if (data.net !== undefined) {\n net?.answer(data as TransportCall);\n return;\n }\n const req = data as ClientRequest;\n handle(req).then(\n ({ result, transfer }) => {\n reply(req.id, { result }, transfer);\n if (req.op === 'detach') detach(req.kill === true);\n },\n (err: unknown) => {\n const code = (err as { code?: unknown })?.code;\n reply(req.id, {\n error: err instanceof Error ? err.message : String(err),\n ...(typeof code === 'string' ? { code } : {}),\n });\n }\n );\n });\n port.addEventListener('close', () => detach());\n port.start?.();\n return { detach, closed: ended.promise };\n}\n", "export interface MetaEntry {\n path: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n mtimeFor?: number;\n ctimeMs?: number;\n ino?: number;\n link?: string;\n dir?: string;\n}\n\nexport type MetaChange = (entry: MetaEntry | undefined) => MetaEntry | undefined;\n\nexport interface MetaStore {\n get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n update(path: string, change: MetaChange): Promise<void>;\n move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry): Promise<void>;\n remove(paths: readonly string[]): Promise<void>;\n links(dir: string): Promise<MetaEntry[]>;\n under(path: string): Promise<MetaEntry[]>;\n all(): Promise<MetaEntry[]>;\n}\n\nexport const META_DB = 'slicc-kernel';\nexport const META_VERSION = 1;\nexport const META_STORE = 'entries';\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction moved(entry: MetaEntry, path: string): MetaEntry {\n return entry.link === undefined ? { ...entry, path } : { ...entry, path, dir: parentOf(path) };\n}\n\nfunction under(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class MemoryMeta implements MetaStore {\n private readonly entries = new Map<string, MetaEntry>();\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return paths.map((path) => this.entries.get(path));\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.set(path, change(this.entries.get(path)));\n }\n\n private set(path: string, entry: MetaEntry | undefined): void {\n if (entry) this.entries.set(path, entry);\n else this.entries.delete(path);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n await this.remove([to]);\n const carried = [...this.entries.values()].filter((entry) => under(entry.path, from));\n for (const entry of carried) this.entries.delete(entry.path);\n for (const entry of carried) {\n const path = to + entry.path.slice(from.length);\n if (path !== to) this.entries.set(path, moved(entry, path));\n }\n this.entries.set(to, moved(root(carried.find((entry) => entry.path === from)), to));\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n for (const key of [...this.entries.keys()]) {\n if (paths.some((path) => under(key, path))) this.entries.delete(key);\n }\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => entry.dir === dir);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => under(entry.path, path));\n }\n\n async all(): Promise<MetaEntry[]> {\n return [...this.entries.values()];\n }\n}\n\nfunction descendants(path: string): IDBKeyRange {\n return IDBKeyRange.bound(`${path}/`, `${path}0`, false, true);\n}\n\nfunction settle<T>(transaction: IDBTransaction, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve(value());\n transaction.onabort = () =>\n reject(transaction.error ?? new Error('metadata transaction aborted'));\n });\n}\n\ninterface Invalidation {\n paths?: readonly string[];\n trees?: readonly string[];\n}\n\nexport class IndexedDbMeta implements MetaStore {\n private readonly db: IDBDatabase;\n private readonly cache = new Map<string, MetaEntry | null>();\n private readonly channel: BroadcastChannel;\n private generation = 0;\n\n constructor(db: IDBDatabase) {\n this.db = db;\n db.onversionchange = () => db.close();\n this.channel = new BroadcastChannel(`slicc-kernel-meta:${db.name}`);\n this.channel.onmessage = ({ data }) => this.drop(data as Invalidation);\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n\n private drop({ paths = [], trees = [] }: Invalidation): void {\n this.generation++;\n for (const path of paths) this.cache.delete(path);\n for (const key of [...this.cache.keys()]) {\n if (trees.some((tree) => under(key, tree))) this.cache.delete(key);\n }\n }\n\n private changed(invalidation: Invalidation): void {\n this.drop(invalidation);\n this.channel.postMessage(invalidation);\n }\n\n private transaction(mode: IDBTransactionMode): [IDBTransaction, IDBObjectStore] {\n const transaction = this.db.transaction(META_STORE, mode);\n return [transaction, transaction.objectStore(META_STORE)];\n }\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const missing = paths.filter((path) => !this.cache.has(path));\n if (missing.length > 0) {\n const generation = this.generation;\n const [transaction, store] = this.transaction('readonly');\n const found = new Map<string, MetaEntry | null>();\n for (const path of missing) {\n const request = store.get(path);\n request.onsuccess = () => void found.set(path, request.result ?? null);\n }\n await settle(transaction, () => undefined);\n if (generation === this.generation)\n for (const [path, entry] of found) this.cache.set(path, entry);\n return paths.map(\n (path) => (found.has(path) ? found.get(path) : this.cache.get(path)) ?? undefined\n );\n }\n return paths.map((path) => this.cache.get(path) ?? undefined);\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n const request = store.get(path);\n let next: MetaEntry | undefined;\n request.onsuccess = () => {\n next = change(request.result);\n if (next) store.put(next);\n else store.delete(path);\n };\n await settle(transaction, () => undefined);\n this.changed({ paths: [path] });\n this.cache.set(path, next ?? null);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n const [transaction, store] = this.transaction('readwrite');\n store.delete(to);\n store.delete(descendants(to));\n const source = store.get(from);\n const below = store.getAll(descendants(from));\n below.onsuccess = () => {\n store.delete(from);\n store.delete(descendants(from));\n for (const entry of below.result as MetaEntry[]) {\n store.put(moved(entry, to + entry.path.slice(from.length)));\n }\n store.put(moved(root(source.result), to));\n };\n await settle(transaction, () => undefined);\n this.changed({ trees: [from, to] });\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const path of paths) {\n store.delete(path);\n store.delete(descendants(path));\n }\n await settle(transaction, () => undefined);\n this.changed({ trees: paths });\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.index('dir').getAll(dir);\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const self = store.get(path);\n const below = store.getAll(descendants(path));\n return settle(transaction, () =>\n [self.result as MetaEntry | undefined, ...(below.result as MetaEntry[])].filter(\n (entry): entry is MetaEntry => entry !== undefined\n )\n );\n }\n\n async all(): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.getAll();\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n}\n\nexport function openMeta(name: string, factory: IDBFactory): Promise<IndexedDbMeta> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, META_VERSION);\n request.onupgradeneeded = (event) => {\n if (event.oldVersion < 1) {\n request.result.createObjectStore(META_STORE, { keyPath: 'path' }).createIndex('dir', 'dir');\n }\n };\n request.onsuccess = () => resolve(new IndexedDbMeta(request.result));\n request.onerror = () => reject(request.error);\n });\n}\n", "import { MemoryMeta, type MetaEntry, type MetaStore } from './meta.ts';\nimport { type FsStat, fsError, inodeOf, type KernelFs, resolvePath } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\nconst PERM_MASK = 0o7777;\nconst READ_ATTEMPTS = 3;\nconst MAX_LINKS = 40;\nconst CHECK_MS = 1000;\nconst EXECUTABLE = /\\/node_modules\\/(?:@[^/]+\\/)?[^/]+\\/bin\\//;\n\ntype Handle = FileSystemFileHandle | FileSystemDirectoryHandle;\n\ninterface MovableHandle {\n move?(parent: FileSystemDirectoryHandle, name: string): Promise<void>;\n}\n\ninterface Located {\n path: string;\n handle?: Handle;\n link?: MetaEntry;\n}\n\nconst ERRNO_BY_DOM_ERROR: Readonly<Record<string, string>> = {\n NotFoundError: 'ENOENT',\n TypeMismatchError: 'ENOTDIR',\n InvalidModificationError: 'ENOTEMPTY',\n NoModificationAllowedError: 'EBUSY',\n TypeError: 'EINVAL',\n NotAllowedError: 'EACCES',\n};\n\nfunction translate(err: unknown, path: string): Error {\n if (typeof (err as { code?: unknown })?.code === 'string') return err as Error;\n const name = (err as { name?: unknown })?.name;\n return fsError((typeof name === 'string' && ERRNO_BY_DOM_ERROR[name]) || 'EIO', path);\n}\n\nfunction missing(err: unknown): boolean {\n const code = (err as { code?: unknown })?.code;\n return code === 'ENOENT' || code === 'ENOTDIR';\n}\n\nfunction split(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction baseOf(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction prefixes(path: string): string[] {\n const parts = split(path);\n return parts.map((_, i) => `/${parts.slice(0, i + 1).join('/')}`);\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\ninterface Positioned {\n write(at: number, bytes: Uint8Array): unknown;\n truncate(size: number): unknown;\n}\n\ninterface SyncAccess {\n write(bytes: Uint8Array, options: { at: number }): number;\n truncate(size: number): void;\n flush(): void;\n close(): void;\n}\n\ntype SyncCapable = FileSystemFileHandle & {\n createSyncAccessHandle?(options?: { mode?: string }): Promise<SyncAccess>;\n};\n\nconst LOCKED = new Set(['NotReadableError', 'NoModificationAllowedError', 'InvalidStateError']);\n\nconst SYNC_BACKOFF_MS = [5, 10, 20, 40, 80];\n\nasync function openSync(handle: FileSystemFileHandle): Promise<SyncAccess | undefined> {\n const sync = (handle as SyncCapable).createSyncAccessHandle;\n if (!sync) return undefined;\n for (let attempt = 0; ; attempt++) {\n try {\n return await sync.call(handle, { mode: 'readwrite-unsafe' });\n } catch (err) {\n const delay = SYNC_BACKOFF_MS[attempt];\n if (!LOCKED.has((err as { name?: unknown })?.name as string)) throw err;\n if (delay === undefined) return undefined;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n\nfunction writeAll(access: SyncAccess, at: number, bytes: Uint8Array): void {\n for (let done = 0; done < bytes.length; ) {\n const n = access.write(bytes.subarray(done), { at: at + done });\n if (!(n > 0))\n throw Object.assign(new Error('the file system took no more bytes'), { code: 'ENOSPC' });\n done += n;\n }\n}\n\nasync function positioned(handle: FileSystemFileHandle, op: (io: Positioned) => unknown) {\n const access = await openSync(handle);\n if (access) {\n try {\n op({\n write: (at, bytes) => writeAll(access, at, bytes),\n truncate: (n) => access.truncate(n),\n });\n access.flush();\n } finally {\n access.close();\n }\n return;\n }\n const writable = await handle.createWritable({ keepExistingData: true });\n try {\n await op({\n write: (at, bytes) =>\n writable.write({ type: 'write', position: at, data: bytes as Uint8Array<ArrayBuffer> }),\n truncate: (n) => writable.truncate(n),\n });\n } catch (err) {\n await writable.abort();\n throw err;\n }\n await writable.close();\n}\n\nexport interface WriteSession {\n write(at: number, bytes: Uint8Array): Promise<void>;\n truncate(size: number): Promise<void>;\n close(): Promise<void>;\n}\n\nexport function syncAccessHandles(scope: object = globalThis): boolean {\n const handle = (scope as { FileSystemFileHandle?: { prototype: object } }).FileSystemFileHandle;\n return handle !== undefined && 'createSyncAccessHandle' in handle.prototype;\n}\n\nfunction isHandle(child: Handle | MetaEntry): child is Handle {\n return 'kind' in child;\n}\n\nexport class OpfsFs implements KernelFs {\n private readonly root: FileSystemDirectoryHandle;\n private readonly meta: MetaStore;\n private readonly dirs = new Map<string, FileSystemDirectoryHandle>();\n private readonly checked = new WeakMap<FileSystemDirectoryHandle, number>();\n\n private readonly channel: BroadcastChannel | undefined;\n private readonly ranged: boolean;\n\n constructor(\n root: FileSystemDirectoryHandle,\n meta: MetaStore = new MemoryMeta(),\n channel?: string,\n options: { ranged?: boolean } = {}\n ) {\n this.root = root;\n this.meta = meta;\n this.ranged = options.ranged === true;\n this.channel = channel === undefined ? undefined : new BroadcastChannel(channel);\n if (this.channel) {\n this.channel.onmessage = ({ data }) => {\n for (const path of data as string[]) this.forget(path);\n };\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n }\n\n private changed(...paths: string[]): void {\n for (const path of paths) this.forget(path);\n this.channel?.postMessage(paths);\n }\n\n resolvePath(base: string, path: string): string {\n return resolvePath(base, path);\n }\n\n private async walk(parts: string[], from: number, start: FileSystemDirectoryHandle) {\n let dir = start;\n for (let at = from; at < parts.length; at++) {\n dir = await dir.getDirectoryHandle(parts[at] as string);\n this.dirs.set(`/${parts.slice(0, at + 1).join('/')}`, dir);\n this.checked.set(dir, performance.now());\n }\n return dir;\n }\n\n private async dir(path: string): Promise<FileSystemDirectoryHandle> {\n const parts = split(path);\n let from = parts.length;\n let cached: FileSystemDirectoryHandle | undefined;\n for (; from > 0 && !cached; from--)\n cached = this.dirs.get(`/${parts.slice(0, from).join('/')}`);\n if (cached) from++;\n const at = `/${parts.slice(0, from).join('/')}`;\n if (cached && !(await this.current(at, cached))) {\n this.forget(at);\n cached = undefined;\n from = 0;\n }\n try {\n return await this.walk(parts, from, cached ?? this.root);\n } catch (err) {\n throw translate(err, path);\n }\n }\n\n private async current(path: string, dir: FileSystemDirectoryHandle): Promise<boolean> {\n if (performance.now() - (this.checked.get(dir) ?? -CHECK_MS) < CHECK_MS) return true;\n const where = await this.root.resolve(dir).catch(() => null);\n if (where === null || `/${where.join('/')}` !== path) return false;\n this.checked.set(dir, performance.now());\n return true;\n }\n\n private forget(path: string): void {\n for (const key of [...this.dirs.keys()]) if (within(key, path)) this.dirs.delete(key);\n }\n\n private async inDir<T>(path: string, op: (dir: FileSystemDirectoryHandle) => Promise<T>) {\n const dir = await this.dir(path);\n try {\n return await op(dir);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'NotFoundError' || (await this.current(path, dir)))\n throw err;\n this.forget(path);\n return op(await this.dir(path));\n }\n }\n\n private async child(\n parent: FileSystemDirectoryHandle,\n name: string,\n kind: 'file' | 'directory'\n ): Promise<Handle> {\n return kind === 'file' ? parent.getFileHandle(name) : parent.getDirectoryHandle(name);\n }\n\n private async parent(path: string): Promise<[string, string]> {\n const parts = split(path);\n const name = parts.pop();\n if (name === undefined) throw fsError('EBUSY', path);\n return [`/${parts.join('/')}`, name];\n }\n\n private async handle(path: string): Promise<Handle> {\n if (split(path).length === 0) return this.root;\n const [dir, name] = await this.parent(path);\n const known = this.dirs.has(path);\n return this.inDir(dir, async (parent): Promise<Handle> => {\n const [first, second] = known\n ? (['directory', 'file'] as const)\n : (['file', 'directory'] as const);\n try {\n return await this.child(parent, name, first);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'TypeMismatchError') throw err;\n }\n return this.child(parent, name, second);\n }).catch((err) => {\n throw translate(err, path);\n });\n }\n\n private real(path: string): Promise<boolean> {\n return this.handle(path).then(\n () => true,\n () => false\n );\n }\n\n private async linkAlong(path: string): Promise<MetaEntry | undefined> {\n for (const entry of await this.meta.get(prefixes(path))) {\n if (entry?.link === undefined) continue;\n if (!(await this.real(entry.path)) && (await this.real(parentOf(entry.path)))) return entry;\n }\n return undefined;\n }\n\n private async locate(path: string, follow: boolean): Promise<Located> {\n let current = path;\n for (let hops = 0; hops <= MAX_LINKS; hops++) {\n try {\n return { path: current, handle: await this.handle(current) };\n } catch (err) {\n if (!missing(err)) throw err;\n const link = await this.linkAlong(current);\n if (!link) throw err;\n if (link.path === current && !follow) return { path: current, link };\n const rest = current.slice(link.path.length);\n current = resolvePath(parentOf(link.path), `${link.link}${rest}`);\n }\n }\n throw fsError('ELOOP', path);\n }\n\n private mode(path: string, directory: boolean, meta: MetaEntry | undefined): number {\n const fallback = directory || EXECUTABLE.test(path) ? 0o755 : 0o644;\n return (directory ? S_IFDIR : S_IFREG) | (meta?.mode ?? fallback);\n }\n\n private readonly dirTimes = new Map<string, number>();\n private readonly dirDirty = new Set<string>();\n private dirFlush: Promise<void> | undefined;\n\n private touch(...dirs: string[]): void {\n const now = Date.now();\n for (const dir of dirs) {\n this.dirTimes.set(dir, now);\n this.dirDirty.add(dir);\n }\n this.dirFlush ??= Promise.resolve()\n .then(() => this.flushDirTimes())\n .catch(() => undefined)\n .finally(() => {\n this.dirFlush = undefined;\n });\n }\n\n private async flushDirTimes(): Promise<void> {\n for (const path of this.dirDirty) {\n this.dirDirty.delete(path);\n const ms = this.dirTimes.get(path);\n if (ms === undefined) continue;\n await this.meta.update(path, (entry) => ({\n ...entry,\n path,\n mtimeMs: ms,\n mtimeFor: 0,\n ctimeMs: ms,\n }));\n if (this.dirTimes.get(path) === ms) this.dirTimes.delete(path);\n }\n }\n\n private async statOf(path: string, handle: Handle, meta: MetaEntry | undefined): Promise<FsStat> {\n const directory = handle.kind === 'directory';\n const file = directory ? undefined : await (handle as FileSystemFileHandle).getFile();\n const modified = file?.lastModified ?? 0;\n const touched = directory ? this.dirTimes.get(path) : undefined;\n const kept =\n meta?.mtimeMs !== undefined && meta.mtimeFor === modified ? meta.mtimeMs : modified;\n const mtime = touched ?? kept;\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: file?.size ?? 0,\n mode: this.mode(path, directory, meta),\n mtime: new Date(mtime),\n atime: new Date(meta?.atimeMs ?? mtime),\n ctime: new Date(Math.max(touched ?? meta?.ctimeMs ?? mtime, modified)),\n ino: meta?.ino ?? inodeOf(path),\n ...(this.ranged && !directory ? { ranged: true } : {}),\n };\n }\n\n private linkStat(entry: MetaEntry): FsStat {\n const time = new Date(entry.mtimeMs ?? 0);\n return {\n isFile: false,\n isDirectory: false,\n isSymbolicLink: true,\n size: new TextEncoder().encode(entry.link).length,\n mode: S_IFLNK | 0o777,\n mtime: time,\n atime: entry.atimeMs === undefined ? time : new Date(entry.atimeMs),\n ctime: new Date(entry.ctimeMs ?? 0),\n ino: entry.ino ?? inodeOf(entry.path),\n };\n }\n\n private async describe(found: Located): Promise<FsStat> {\n if (found.link) return this.linkStat(found.link);\n const [meta] = await this.meta.get([found.path]);\n return this.statOf(found.path, found.handle as Handle, meta);\n }\n\n async stat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, true));\n }\n\n async lstat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, false));\n }\n\n async exists(path: string): Promise<boolean> {\n return this.locate(path, true).then(\n () => true,\n () => false\n );\n }\n\n private async retrying<T>(path: string, op: () => Promise<T>, locks: boolean): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await op();\n } catch (err) {\n const name = (err as { name?: unknown })?.name;\n const again = name === 'NotReadableError' || (locks && LOCKED.has(name as string));\n if (!again || attempt >= READ_ATTEMPTS) throw translate(err, path);\n await new Promise((resolve) => setTimeout(resolve, attempt * 10));\n }\n }\n }\n\n private async existing(path: string): Promise<FileSystemFileHandle> {\n const handle = (await this.locate(path, true)).handle as Handle;\n if (handle.kind === 'directory') throw fsError('EISDIR', path);\n return handle;\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const handle = await this.existing(path);\n return this.retrying(\n path,\n async () => new Uint8Array(await (await handle.getFile()).arrayBuffer()),\n false\n );\n }\n\n async pread(path: string, offset: number, length: number): Promise<Uint8Array> {\n const handle = await this.existing(path);\n return this.retrying(\n path,\n async () =>\n new Uint8Array(await (await handle.getFile()).slice(offset, offset + length).arrayBuffer()),\n false\n );\n }\n\n async pwrite(path: string, offset: number, bytes: Uint8Array): Promise<void> {\n const handle = (await this.fileFor(path))[0];\n await this.retrying(path, () => positioned(handle, (io) => io.write(offset, bytes)), true);\n }\n\n async truncate(path: string, size: number): Promise<void> {\n const handle = await this.existing(path);\n await this.retrying(path, () => positioned(handle, (io) => io.truncate(size)), true);\n }\n\n async writeSession(path: string, truncate: boolean): Promise<WriteSession> {\n const handle = (await this.fileFor(path))[0];\n const writable = await this.retrying(\n path,\n () => handle.createWritable({ keepExistingData: !truncate }),\n true\n );\n return {\n write: (at, bytes) =>\n writable.write({ type: 'write', position: at, data: bytes as Uint8Array<ArrayBuffer> }),\n truncate: (size) => writable.truncate(size),\n close: () => writable.close(),\n };\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n private async writeTarget(path: string): Promise<[string, boolean]> {\n try {\n return [(await this.locate(path, true)).path, true];\n } catch (err) {\n if (!missing(err)) throw err;\n }\n const [entry] = await this.meta.get([path]);\n const wanted = entry?.link === undefined ? path : resolvePath(parentOf(path), entry.link);\n return [resolvePath((await this.locate(parentOf(wanted), true)).path, baseOf(wanted)), false];\n }\n\n private async fileFor(path: string): Promise<[FileSystemFileHandle, boolean]> {\n const [target, existed] = await this.writeTarget(path);\n const [dir, name] = await this.parent(target);\n try {\n const handle = await this.inDir(dir, (parent) =>\n parent.getFileHandle(name, { create: true })\n );\n if (!existed) this.touch(parentOf(target));\n return [handle, existed];\n } catch (err) {\n const code = (err as { name?: unknown })?.name === 'TypeMismatchError' ? 'EISDIR' : null;\n throw code ? fsError(code, path) : translate(err, path);\n }\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const [file, existed] = await this.fileFor(path);\n if (!existed && content.length === 0) return;\n const writable = await file.createWritable();\n await writable.write(content as FileSystemWriteChunkType);\n await writable.close();\n }\n\n private async listing(path: string): Promise<[string, Array<[string, Handle | MetaEntry]>]> {\n const found = await this.locate(path, true);\n const handle = found.handle as Handle;\n if (handle.kind !== 'directory') throw fsError('ENOTDIR', path);\n const children = new Map<string, Handle | MetaEntry>();\n for await (const child of handle.values()) children.set(child.name, child);\n for (const link of await this.meta.links(found.path)) {\n const name = baseOf(link.path);\n if (!children.has(name)) children.set(name, link);\n }\n return [found.path, [...children].sort(([a], [b]) => (a < b ? -1 : 1))];\n }\n\n async readdir(path: string): Promise<string[]> {\n return (await this.listing(path))[1].map(([name]) => name);\n }\n\n async readdirStat(path: string): Promise<Array<[string, FsStat | null]>> {\n const [dir, children] = await this.listing(path);\n const base = dir === '/' ? '' : dir;\n const metas = await this.meta.get(children.map(([name]) => `${base}/${name}`));\n return Promise.all(\n children.map(async ([name, child], i): Promise<[string, FsStat | null]> => {\n if (!isHandle(child)) return [name, this.linkStat(child)];\n const stat = await this.statOf(`${base}/${name}`, child, metas[i]).catch(() => null);\n return [name, stat];\n })\n );\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n let found: Located | undefined;\n try {\n found = await this.locate(path, true);\n } catch (err) {\n if (!missing(err)) throw err;\n }\n if (found) {\n const directory = found.handle?.kind === 'directory';\n if (options.recursive && directory) return;\n throw fsError(options.recursive ? 'ENOTDIR' : 'EEXIST', path);\n }\n const [entry] = await this.meta.get([path]);\n if (entry?.link !== undefined) throw fsError('EEXIST', path);\n if (options.recursive) await this.mkdir(parentOf(path), options);\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n await parent.handle.getDirectoryHandle(baseOf(path), { create: true });\n this.touch(parent.path);\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n let found: Located;\n try {\n found = await this.locate(path, false);\n } catch (err) {\n const error = translate(err, path) as Error & { code: string };\n if (options.force && error.code === 'ENOENT') return;\n throw error;\n }\n if (found.handle) {\n const [dir, name] = await this.parent(found.path);\n try {\n await this.inDir(dir, (parent) =>\n parent.removeEntry(name, { recursive: options.recursive === true })\n );\n } catch (err) {\n throw translate(err, path);\n }\n this.changed(found.path);\n }\n await this.meta.remove([found.path]);\n this.touch(parentOf(found.path));\n }\n\n async rename(from: string, to: string): Promise<void> {\n if (from === to) return;\n const source = await this.locate(from, false);\n this.forget(source.path);\n const parent = await this.locate(parentOf(to), true);\n const destination = resolvePath(parent.path, baseOf(to));\n const sourceStat = await this.describe(source);\n if (sourceStat.isDirectory && within(destination, source.path)) throw fsError('EINVAL', to);\n const target = await this.locate(destination, false).catch((err) => {\n if (missing(err)) return null;\n throw err;\n });\n const targetStat = target && (await this.describe(target));\n if (targetStat?.isDirectory && !sourceStat.isDirectory) throw fsError('EISDIR', to);\n if (targetStat && !targetStat.isDirectory && sourceStat.isDirectory) {\n throw fsError('ENOTDIR', to);\n }\n if (targetStat?.isDirectory && (await this.readdir(destination)).length > 0) {\n throw fsError('ENOTEMPTY', to);\n }\n const now = Date.now();\n const carry = (entry: MetaEntry | undefined): MetaEntry => ({\n ino: inodeOf(source.path),\n ...entry,\n path: destination,\n ctimeMs: now,\n });\n if (source.link) {\n if (target?.handle) await this.rm(destination);\n await this.meta.move(source.path, destination, carry);\n this.touch(parentOf(source.path), parent.path);\n return;\n }\n const dir = parent.handle as FileSystemDirectoryHandle;\n const name = baseOf(destination);\n const swap = targetStat?.isDirectory === true;\n const staging = swap ? `.${name}.${crypto.randomUUID()}` : name;\n this.forget(destination);\n const timed = await this.explicitTimes(source.path);\n const moved = await this.place(source.handle as Handle, dir, staging);\n if (swap) await this.rm(destination, { recursive: true });\n await this.meta.move(source.path, destination, carry);\n if (!moved) await this.rm(source.path, { recursive: true });\n let copied = !moved;\n if (swap) {\n const staged = await dir.getDirectoryHandle(staging);\n const placed = await this.place(staged, dir, name);\n if (!placed) await dir.removeEntry(staging, { recursive: true });\n copied ||= !placed;\n }\n if (copied) await this.restamp(destination, timed);\n this.changed(source.path, destination);\n this.touch(parentOf(source.path), parent.path);\n }\n\n private async modified(path: string): Promise<number> {\n const handle = await this.handle(path);\n return handle.kind === 'file' ? (await handle.getFile()).lastModified : 0;\n }\n\n private async explicitTimes(path: string): Promise<string[]> {\n const timed: string[] = [];\n for (const entry of await this.meta.under(path)) {\n if (entry.mtimeFor === undefined || entry.link !== undefined) continue;\n const current = await this.modified(entry.path).catch(() => undefined);\n if (current === entry.mtimeFor) timed.push(entry.path.slice(path.length));\n }\n return timed;\n }\n\n private async restamp(path: string, timed: string[]): Promise<void> {\n for (const rest of timed) {\n const mtimeFor = await this.modified(path + rest);\n await this.meta.update(path + rest, (entry) => entry && { ...entry, mtimeFor });\n }\n }\n\n private async place(handle: Handle, dir: FileSystemDirectoryHandle, name: string) {\n const moved = await (handle as Handle & MovableHandle).move?.(dir, name).then(\n () => true,\n () => false\n );\n if (moved) return true;\n try {\n await this.copy(handle, dir, name);\n } catch (err) {\n if (handle.kind === 'directory') await dir.removeEntry(name, { recursive: true });\n throw translate(err, name);\n }\n return false;\n }\n\n private async copy(handle: Handle, dir: FileSystemDirectoryHandle, name: string): Promise<void> {\n if (handle.kind === 'file') {\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await writable.write(await handle.getFile());\n await writable.close();\n return;\n }\n const target = await dir.getDirectoryHandle(name, { create: true });\n for await (const child of handle.values()) await this.copy(child, target, child.name);\n }\n\n async symlink(target: string, path: string): Promise<void> {\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n const at = resolvePath(parent.path, baseOf(path));\n if (\n await this.locate(at, false).then(\n () => true,\n (err) => !missing(err)\n )\n ) {\n throw fsError('EEXIST', path);\n }\n const now = Date.now();\n await this.meta.update(at, () => ({\n path: at,\n link: target,\n dir: parent.path,\n ino: inodeOf(at),\n mtimeMs: now,\n ctimeMs: now,\n }));\n this.touch(parent.path);\n }\n\n async realpath(path: string, follow: boolean): Promise<string> {\n return (await this.locate(path, follow)).path;\n }\n\n async readlink(path: string): Promise<string> {\n const found = await this.locate(path, false);\n if (found.link) return found.link.link as string;\n throw fsError('EINVAL', path);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n const found = await this.locate(path, true);\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n mode: mode & PERM_MASK,\n ctimeMs,\n }));\n }\n\n async utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n await this.setTimes(await this.locate(path, true), atime, mtime);\n }\n\n async lutimes(path: string, atime: Date, mtime: Date): Promise<void> {\n await this.setTimes(await this.locate(path, false), atime, mtime);\n }\n\n private async setTimes(found: Located, atime: Date, mtime: Date): Promise<void> {\n const { link } = found;\n if (link) {\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...link,\n ...entry,\n atimeMs: atime.getTime(),\n mtimeMs: mtime.getTime(),\n ctimeMs,\n }));\n return;\n }\n const handle = found.handle as Handle;\n const file = handle.kind === 'file' ? await handle.getFile() : undefined;\n this.dirTimes.delete(found.path);\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n atimeMs: atime.getTime(),\n mtimeMs: mtime.getTime(),\n mtimeFor: file?.lastModified ?? 0,\n ctimeMs,\n }));\n }\n\n async reconcile(): Promise<number> {\n let removed = 0;\n for (const entry of await this.meta.all()) {\n const real = await this.real(entry.path);\n const stale =\n entry.link === undefined ? !real : real || !(await this.real(parentOf(entry.path)));\n if (!stale) continue;\n await this.meta.update(entry.path, () => undefined);\n removed++;\n }\n return removed;\n }\n}\n", "import type { KernelFs } from './types.ts';\n\nexport const UNLINKED_DIR = '.slicc-unlinked';\n\nexport interface KeptFile {\n readonly hidden: string;\n release(): void;\n}\n\nexport interface UnlinkHolder {\n held(): Iterable<string>;\n owns(path: string): boolean;\n isKept(path: string): boolean;\n keep(path: string, file: KeptFile): void;\n unkeep(path: string, file: KeptFile): void;\n}\n\nexport interface UnlinkOwner {\n readonly id: string;\n alive(id: string): boolean;\n}\n\nexport interface UnlinkLocks {\n request(name: string, callback: () => Promise<unknown>): Promise<unknown>;\n query?(): Promise<{ held?: Array<{ name?: string }> }>;\n}\n\nexport function pidOwner(proc: {\n pid: number;\n kill(pid: number, signal: number): unknown;\n}): UnlinkOwner {\n return {\n id: `p${proc.pid}`,\n alive(id) {\n try {\n proc.kill(Number(id.slice(1)), 0);\n return true;\n } catch (err) {\n return (err as { code?: string }).code !== 'ESRCH';\n }\n },\n };\n}\n\nexport function webLocks(): UnlinkLocks | undefined {\n return (globalThis as { navigator?: { locks?: UnlinkLocks } }).navigator?.locks;\n}\n\nconst within = (path: string, target: string) =>\n path === target || target === '/' || path.startsWith(`${target}/`);\n\nconst parentOf = (path: string) => path.slice(0, path.lastIndexOf('/')) || '/';\n\nconst lockName = (instance: string) => `slicc-unlinked:${instance}`;\n\nconst dirOf = (root: string) => (root === '/' ? `/${UNLINKED_DIR}` : `${root}/${UNLINKED_DIR}`);\n\nexport class PathGate {\n private readonly tails = new Map<string, Promise<void>>();\n\n async acquire(path: string): Promise<() => void> {\n const prev = this.tails.get(path) ?? Promise.resolve();\n const { promise, resolve } = Promise.withResolvers<void>();\n const tail = prev.then(() => promise);\n this.tails.set(path, tail);\n await prev;\n return () => {\n resolve();\n if (this.tails.get(path) === tail) this.tails.delete(path);\n };\n }\n\n async run<T>(path: string, op: () => Promise<T>): Promise<T> {\n const release = await this.acquire(path);\n try {\n return await op();\n } finally {\n release();\n }\n }\n}\n\ninterface Pinned {\n moved: Set<string>;\n commit(): void;\n rollback(): Promise<void>;\n}\n\nexport class UnlinkedKeeper {\n private readonly fs: KernelFs;\n private readonly holders: Iterable<UnlinkHolder>;\n private readonly rootOf: (path: string) => string;\n private readonly locks: UnlinkLocks | undefined;\n private readonly busy: (path: string) => boolean;\n private readonly waiting = new Set<string>();\n private readonly owner: UnlinkOwner | undefined;\n private readonly instance: string;\n readonly gate = new PathGate();\n private queue: Promise<unknown> = Promise.resolve();\n private count = 0;\n\n constructor(\n fs: KernelFs,\n holders: Iterable<UnlinkHolder>,\n rootOf: (path: string) => string,\n options: {\n locks?: UnlinkLocks | undefined;\n busy?: (path: string) => boolean;\n owner?: UnlinkOwner | undefined;\n } = {}\n ) {\n const { locks, owner } = options;\n this.fs = fs;\n this.holders = holders;\n this.rootOf = rootOf;\n this.locks = locks;\n this.busy = options.busy ?? (() => false);\n this.owner = owner;\n this.instance = owner ? `${owner.id}~${crypto.randomUUID()}` : crypto.randomUUID();\n void locks?.request(lockName(this.instance), () => new Promise(() => undefined));\n }\n\n private serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n wrap(fs: KernelFs = this.fs): KernelFs {\n const keeper = this;\n const visible = (names: string[]) => names.filter((name) => name !== UNLINKED_DIR);\n return {\n ...fs,\n async rm(path, options) {\n const target = fs.resolvePath('/', path);\n const pinned = await keeper.pin(target);\n if (pinned.moved.has(target)) pinned.commit();\n else await keeper.settle(pinned, () => fs.rm(path, options));\n },\n async rename(from, to) {\n const target = fs.resolvePath('/', to);\n if (target === fs.resolvePath('/', from)) return fs.rename(from, to);\n const pinned = await keeper.pin(target);\n await keeper.settle(pinned, () => fs.rename(from, to));\n },\n readdir: async (path) => visible(await fs.readdir(path)),\n readdirStat: async (path) =>\n (await fs.readdirStat(path)).filter(([name]) => name !== UNLINKED_DIR),\n };\n }\n\n async settle(pinned: Pinned, op: () => Promise<void>): Promise<void> {\n try {\n await op();\n } catch (err) {\n await pinned.rollback();\n throw err;\n }\n pinned.commit();\n }\n\n async pin(target: string): Promise<Pinned> {\n const held = new Map<string, UnlinkHolder[]>();\n for (const holder of this.holders) {\n if (holder.owns(target)) continue;\n for (const path of holder.held()) {\n if (!within(path, target) || holder.isKept(path)) continue;\n held.set(path, [...(held.get(path) ?? []), holder]);\n }\n }\n const paths = [...held.keys()].sort();\n const releases: Array<() => void> = [];\n for (const path of paths) releases.push(await this.gate.acquire(path));\n const hidden = new Map<string, string>();\n for (const path of paths) {\n const at = await this.hide(path);\n if (at !== undefined) hidden.set(path, at);\n }\n const done = () => {\n for (const release of releases) release();\n };\n const files = new Map<string, KeptFile>();\n for (const [path, at] of hidden) {\n const holders = held.get(path) as UnlinkHolder[];\n const file = this.keptFile(at, { refs: holders.length + 1 });\n files.set(path, file);\n for (const holder of holders) holder.keep(path, file);\n }\n return {\n moved: new Set(hidden.keys()),\n commit: () => {\n for (const file of files.values()) file.release();\n done();\n },\n rollback: async () => {\n for (const [path, file] of files) {\n for (const holder of held.get(path) as UnlinkHolder[]) holder.unkeep(path, file);\n await this.serial(async () => {\n await Promise.allSettled([this.fs.rename(file.hidden, path)]);\n await this.tidy(parentOf(file.hidden));\n });\n }\n done();\n },\n };\n }\n\n private keptFile(hidden: string, entry: { refs: number }): KeptFile {\n return {\n hidden,\n release: () => {\n if (--entry.refs === 0) void this.serial(() => this.drop(hidden));\n },\n };\n }\n\n private hide(path: string): Promise<string | undefined> {\n return this.serial(async () => {\n const dir = dirOf(this.rootOf(path));\n const hidden = `${dir}/${this.instance}.${++this.count}`;\n try {\n await this.fs.mkdir(dir, { recursive: true });\n await this.fs.rename(path, hidden);\n return hidden;\n } catch {\n await this.tidy(dir);\n return undefined;\n }\n });\n }\n\n closed(path: string): void {\n if (this.waiting.delete(path)) void this.serial(() => this.drop(path));\n }\n\n private async drop(hidden: string): Promise<void> {\n if (this.busy(hidden)) {\n this.waiting.add(hidden);\n return;\n }\n await this.fs.rm(hidden).catch(() => undefined);\n await this.tidy(parentOf(hidden));\n }\n\n private async tidy(dir: string): Promise<void> {\n const left = await this.fs.readdir(dir).catch(() => [UNLINKED_DIR]);\n if (left.length === 0) await this.fs.rm(dir, { recursive: true }).catch(() => undefined);\n }\n\n sweep(root: string): Promise<void> {\n const query = this.locks?.query?.bind(this.locks);\n const owner = this.owner;\n if (!query && !owner) return Promise.resolve();\n return this.serial(async () => {\n const dir = dirOf(root);\n const names = await this.fs.readdir(dir).catch(() => undefined);\n if (!names) return;\n const held = query && new Set(((await query()).held ?? []).map((lock) => lock.name));\n for (const name of names) {\n const id = name.slice(0, name.lastIndexOf('.'));\n const at = id.indexOf('~');\n const dead =\n id !== this.instance &&\n (at < 0\n ? held !== undefined && !held.has(lockName(id))\n : owner?.alive(id.slice(0, at)) === false);\n if (dead) await this.fs.rm(`${dir}/${name}`, { recursive: true }).catch(() => undefined);\n }\n await this.tidy(dir);\n });\n }\n}\n", "import type { HeaderList } from './transport.ts';\nexport interface ByteSource {\n read(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n}\nexport class HttpError extends Error {\n readonly status: number;\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n}\nconst CR = 13;\nconst LF = 10;\nconst READ_SIZE = 64 * 1024;\nconst TOKEN = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nexport const REASON: Readonly<Record<number, string>> = {\n 100: 'Continue',\n 200: 'OK',\n 400: 'Bad Request',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 413: 'Content Too Large',\n 417: 'Expectation Failed',\n 421: 'Misdirected Request',\n 431: 'Request Header Fields Too Large',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n};\nexport class Incoming {\n private readonly source: ByteSource;\n private buf = new Uint8Array(0);\n private eof = false;\n constructor(source: ByteSource) {\n this.source = source;\n }\n get buffered(): number {\n return this.buf.length;\n }\n private async fill(signal?: AbortSignal): Promise<boolean> {\n if (this.eof) return false;\n const chunk = await this.source.read(READ_SIZE, signal);\n if (chunk.length === 0) {\n this.eof = true;\n return false;\n }\n const next = new Uint8Array(this.buf.length + chunk.length);\n next.set(this.buf);\n next.set(chunk, this.buf.length);\n this.buf = next;\n return true;\n }\n private take(n: number): Uint8Array {\n const out = this.buf.slice(0, n);\n this.buf = this.buf.subarray(n);\n return out;\n }\n async peek(signal?: AbortSignal): Promise<number | undefined> {\n if (this.buf.length === 0) await this.fill(signal);\n return this.buf[0];\n }\n async some(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n if (this.buf.length > 0) return this.take(Math.min(max, this.buf.length));\n if (this.eof) return new Uint8Array(0);\n const chunk = await this.source.read(max, signal);\n if (chunk.length === 0) this.eof = true;\n return chunk;\n }\n async head(limit: number, signal?: AbortSignal): Promise<Uint8Array | null> {\n let from = 0;\n for (;;) {\n const end = headEnd(this.buf, from);\n if (end > 0) {\n if (end > limit) throw new HttpError(431, 'request head too large');\n return this.take(end);\n }\n if (this.buf.length > limit) throw new HttpError(431, 'request head too large');\n from = Math.max(0, this.buf.length - 3);\n if (!(await this.fill(signal))) {\n if (this.buf.length === 0) return null;\n throw new HttpError(400, 'connection closed inside a request head');\n }\n }\n }\n async line(limit: number, signal?: AbortSignal): Promise<string> {\n let from = 0;\n for (;;) {\n const at = this.buf.indexOf(LF, from);\n if (at >= 0) {\n const line = this.take(at + 1);\n const text = latin1(line.subarray(0, line[at - 1] === CR ? at - 1 : at));\n return text;\n }\n if (this.buf.length > limit) throw new HttpError(400, 'line too long');\n from = this.buf.length;\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n }\n async exactly(n: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.buf.length < n) {\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n return this.take(n);\n }\n}\nfunction headEnd(buf: Uint8Array, from: number): number {\n for (let i = from; i < buf.length; i++) {\n if (buf[i] !== LF) continue;\n if (buf[i + 1] === LF) return i + 2;\n if (buf[i + 1] === CR && buf[i + 2] === LF) return i + 3;\n }\n return 0;\n}\nexport function latin1(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n out += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return out;\n}\nexport function latin1Bytes(text: string): Uint8Array {\n const out = new Uint8Array(text.length);\n for (let i = 0; i < text.length; i++) out[i] = text.charCodeAt(i) & 0xff;\n return out;\n}\nexport interface RequestHead {\n method: string;\n target: string;\n minor: number;\n headers: HeaderList;\n}\nexport function parseRequestHead(bytes: Uint8Array): RequestHead {\n const lines = latin1(bytes).split(/\\r?\\n/);\n while (lines.length > 0 && lines[0] === '') lines.shift();\n const match = /^([!#$%&'*+\\-.^_`|~0-9A-Za-z]+) (\\S+) HTTP\\/(\\d)\\.(\\d)$/.exec(lines.shift() ?? '');\n if (!match) throw new HttpError(400, 'malformed request line');\n if (match[3] !== '1') throw new HttpError(505, `HTTP/${match[3]}.${match[4]} is not supported`);\n return {\n method: match[1],\n target: match[2],\n minor: Number(match[4]),\n headers: parseFields(lines),\n };\n}\nfunction parseFields(lines: string[]): HeaderList {\n const headers: Array<readonly [string, string]> = [];\n for (const line of lines) {\n if (line === '') continue;\n if (line.startsWith(' ') || line.startsWith('\\t')) {\n throw new HttpError(400, 'obsolete line folding');\n }\n const colon = line.indexOf(':');\n const name = colon > 0 ? line.slice(0, colon) : '';\n if (!TOKEN.test(name)) throw new HttpError(400, 'malformed header field');\n headers.push([name, line.slice(colon + 1).trim()]);\n }\n return headers;\n}\nexport function fieldValues(headers: HeaderList, name: string): string[] {\n const lower = name.toLowerCase();\n return headers.filter(([n]) => n.toLowerCase() === lower).map(([, v]) => v);\n}\nexport function fieldTokens(headers: HeaderList, name: string): string[] {\n return fieldValues(headers, name)\n .flatMap((v) => v.split(','))\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t !== '');\n}\nexport type BodyFraming =\n | {\n kind: 'none';\n }\n | {\n kind: 'length';\n length: number;\n }\n | {\n kind: 'chunked';\n };\nexport function requestFraming(headers: HeaderList): BodyFraming {\n const codings = fieldTokens(headers, 'transfer-encoding');\n const lengths = fieldValues(headers, 'content-length');\n if (codings.length > 0) {\n if (lengths.length > 0) throw new HttpError(400, 'both Transfer-Encoding and Content-Length');\n if (codings.length !== 1 || codings[0] !== 'chunked') {\n throw new HttpError(501, `unsupported Transfer-Encoding: ${codings.join(', ')}`);\n }\n return { kind: 'chunked' };\n }\n if (lengths.length === 0) return { kind: 'none' };\n const distinct = new Set(lengths.flatMap((v) => v.split(',')).map((v) => v.trim()));\n const [only] = distinct;\n if (distinct.size !== 1 || !/^\\d{1,15}$/.test(only)) {\n throw new HttpError(400, 'invalid Content-Length');\n }\n const length = Number(only);\n return length === 0 ? { kind: 'none' } : { kind: 'length', length };\n}\nconst MAX_CHUNK_LINE = 4096;\nconst MAX_TRAILERS = 64 * 1024;\nexport async function readBody(\n incoming: Incoming,\n framing: BodyFraming,\n cap: number,\n signal?: AbortSignal\n): Promise<Uint8Array | undefined> {\n if (framing.kind === 'none') return undefined;\n if (framing.kind === 'length') {\n if (framing.length > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n return incoming.exactly(framing.length, signal);\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const sizeLine = await incoming.line(MAX_CHUNK_LINE, signal);\n const size = /^([0-9A-Fa-f]{1,12})[ \\t]*(;.*)?$/.exec(sizeLine);\n if (!size) throw new HttpError(400, 'malformed chunk size');\n const n = Number.parseInt(size[1], 16);\n if (n === 0) break;\n total += n;\n if (total > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n chunks.push(await incoming.exactly(n, signal));\n if ((await incoming.line(2, signal)) !== '') throw new HttpError(400, 'malformed chunk');\n }\n let trailers = 0;\n for (let line = await incoming.line(MAX_TRAILERS, signal); line !== ''; ) {\n trailers += line.length;\n if (trailers > MAX_TRAILERS) throw new HttpError(431, 'trailers too large');\n line = await incoming.line(MAX_TRAILERS, signal);\n }\n return concat(chunks, total);\n}\nexport function concat(chunks: Uint8Array[], total = chunks.reduce((n, c) => n + c.length, 0)) {\n const out = new Uint8Array(total);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\nfunction safeValue(value: string): boolean {\n return !/[\\r\\n\\0]/.test(value);\n}\nexport function responseHead(status: number, reason: string, headers: HeaderList): Uint8Array {\n const phrase = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/.test(reason) ? reason : '';\n let head = `HTTP/1.1 ${status} ${phrase}\\r\\n`;\n for (const [name, value] of headers) {\n if (TOKEN.test(name) && safeValue(value)) head += `${name}: ${value}\\r\\n`;\n }\n return latin1Bytes(`${head}\\r\\n`);\n}\nexport function chunk(bytes: Uint8Array): Uint8Array {\n const size = latin1Bytes(`${bytes.length.toString(16)}\\r\\n`);\n const out = new Uint8Array(size.length + bytes.length + 2);\n out.set(size);\n out.set(bytes, size.length);\n out[out.length - 2] = CR;\n out[out.length - 1] = LF;\n return out;\n}\nexport const LAST_CHUNK = latin1Bytes('0\\r\\n\\r\\n');\n", "export interface CdpConnection {\n send(message: string): void;\n onmessage: ((message: string) => void) | null;\n onclose: ((reason?: string) => void) | null;\n close(): void;\n}\n\nexport interface CdpRequest {\n runtime?: string;\n}\n\nexport type CdpHook = (request: CdpRequest) => Promise<CdpConnection>;\n\nexport const CDP_PORT = 9222;\n\nexport const NO_CDP_HOST =\n 'slicc-kernel: no CDP host is attached (createKernel({ cdp }) or client.serveCdp)';\n", "import { concat, HttpError, type Incoming, latin1Bytes } from '../kernel/net/http1.ts';\nimport type { HeaderList } from '../kernel/net/transport.ts';\n\nconst GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';\n\nexport const MAX_MESSAGE = 256 * 1024 * 1024;\n\nexport const CLOSE = {\n normal: 1000,\n protocol: 1002,\n unsupported: 1003,\n invalid: 1007,\n tooBig: 1009,\n error: 1011,\n} as const;\n\nexport const OP_TEXT = 1;\nexport const OP_BINARY = 2;\n\nconst OP = {\n continuation: 0,\n text: OP_TEXT,\n binary: OP_BINARY,\n close: 8,\n ping: 9,\n pong: 10,\n} as const;\n\nexport interface Sink {\n write(bytes: Uint8Array, signal?: AbortSignal): Promise<unknown>;\n}\n\nexport type WsEvent =\n | { kind: 'text'; text: string }\n | { kind: 'ping'; payload: Uint8Array }\n | { kind: 'close'; code: number; reason: string };\n\nexport type WsBinaryEvent = { kind: 'binary'; bytes: Uint8Array };\n\nexport class WsError extends Error {\n readonly code: number;\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport function sendableCode(code: number): boolean {\n if (code >= 3000 && code <= 4999) return true;\n return code >= 1000 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006;\n}\n\nfunction field(headers: HeaderList, name: string): string | undefined {\n return headers.find(([n]) => n.toLowerCase() === name)?.[1];\n}\n\nexport async function acceptKey(headers: HeaderList): Promise<string> {\n const tokens = (name: string) =>\n (field(headers, name) ?? '').split(',').map((t) => t.trim().toLowerCase());\n if (!tokens('upgrade').includes('websocket') || !tokens('connection').includes('upgrade')) {\n throw new HttpError(400, 'expected a WebSocket upgrade');\n }\n if (field(headers, 'sec-websocket-version') !== '13') {\n throw new HttpError(400, 'Sec-WebSocket-Version must be 13');\n }\n const key = field(headers, 'sec-websocket-key') ?? '';\n if (!/^[A-Za-z0-9+/]{22}==$/.test(key)) throw new HttpError(400, 'bad Sec-WebSocket-Key');\n const digest = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(key + GUID));\n return btoa(String.fromCharCode(...new Uint8Array(digest)));\n}\n\nexport function isUpgrade(headers: HeaderList): boolean {\n return (field(headers, 'upgrade') ?? '').toLowerCase().includes('websocket');\n}\n\nexport function frame(opcode: number, payload: Uint8Array): Uint8Array {\n const n = payload.length;\n const size = n < 126 ? 2 : n < 0x10000 ? 4 : 10;\n const out = new Uint8Array(size + n);\n const view = new DataView(out.buffer);\n out[0] = 0x80 | opcode;\n if (n < 126) out[1] = n;\n else if (n < 0x10000) {\n out[1] = 126;\n view.setUint16(2, n);\n } else {\n out[1] = 127;\n view.setBigUint64(2, BigInt(n));\n }\n out.set(payload, size);\n return out;\n}\n\nexport function closeFrame(code: number, reason = ''): Uint8Array {\n let bytes = new TextEncoder().encode(reason);\n if (bytes.length > 123) {\n let end = 123;\n while ((bytes[end] & 0xc0) === 0x80) end--;\n bytes = bytes.subarray(0, end);\n }\n const payload = new Uint8Array(2 + bytes.length);\n new DataView(payload.buffer).setUint16(0, code);\n payload.set(bytes, 2);\n return frame(OP.close, payload);\n}\n\nexport function pongFrame(payload: Uint8Array): Uint8Array {\n return frame(OP.pong, payload);\n}\n\nasync function fill(incoming: Incoming, out: Uint8Array, signal?: AbortSignal): Promise<void> {\n for (let at = 0; at < out.length; ) {\n const piece = await incoming.some(out.length - at, signal);\n if (piece.length === 0) throw new WsError(CLOSE.protocol, 'the connection closed mid-frame');\n out.set(piece, at);\n at += piece.length;\n }\n}\n\nconst fatal = new TextDecoder('utf-8', { fatal: true });\n\nfunction decode(bytes: Uint8Array): string {\n try {\n return fatal.decode(bytes);\n } catch {\n throw new WsError(CLOSE.invalid, 'a text message is not UTF-8');\n }\n}\n\nexport class WsReader<Binary extends boolean = false> {\n private readonly incoming: Incoming;\n private readonly max: number;\n private parts: Uint8Array[] = [];\n private size = 0;\n private continuing = false;\n private binaryMessage = false;\n private readonly binary: Binary | undefined;\n\n constructor(incoming: Incoming, max = MAX_MESSAGE, binary?: Binary) {\n this.incoming = incoming;\n this.max = max;\n this.binary = binary;\n }\n\n async next(\n signal?: AbortSignal\n ): Promise<WsEvent | (Binary extends true ? WsBinaryEvent : never) | null> {\n for (;;) {\n const first = await this.incoming.some(1, signal);\n if (first.length === 0) return null;\n const head = new Uint8Array(2);\n head[0] = first[0];\n await fill(this.incoming, head.subarray(1), signal);\n const fin = (head[0] & 0x80) !== 0;\n const opcode = head[0] & 0x0f;\n if ((head[0] & 0x70) !== 0) throw new WsError(CLOSE.protocol, 'reserved bits are set');\n if ((head[1] & 0x80) === 0) throw new WsError(CLOSE.protocol, 'client frames must be masked');\n const length = await this.length(head[1] & 0x7f, signal);\n const control = opcode >= 8;\n if (control && (length > 125 || !fin)) {\n throw new WsError(CLOSE.protocol, 'a control frame is too long or fragmented');\n }\n if (!control && this.size + length > this.max) {\n throw new WsError(CLOSE.tooBig, `a message is over ${this.max} bytes`);\n }\n const mask = new Uint8Array(4);\n await fill(this.incoming, mask, signal);\n const payload = new Uint8Array(length);\n await fill(this.incoming, payload, signal);\n for (let i = 0; i < length; i++) payload[i] ^= mask[i & 3];\n const event = this.take(opcode, fin, payload);\n if (event) return event as WsEvent | (Binary extends true ? WsBinaryEvent : never);\n }\n }\n\n private data(\n opcode: number,\n fin: boolean,\n payload: Uint8Array\n ): WsEvent | WsBinaryEvent | undefined {\n if ((opcode === OP.continuation) !== this.continuing) {\n throw new WsError(CLOSE.protocol, 'unexpected continuation frame');\n }\n if (opcode !== OP.continuation) this.binaryMessage = opcode === OP.binary;\n this.parts.push(payload);\n this.size += payload.length;\n this.continuing = !fin;\n if (!fin) return undefined;\n const whole = this.parts.length === 1 ? payload : concat(this.parts, this.size);\n this.parts = [];\n this.size = 0;\n return this.binaryMessage\n ? { kind: 'binary', bytes: whole }\n : { kind: 'text', text: decode(whole) };\n }\n\n private async length(short: number, signal?: AbortSignal): Promise<number> {\n if (short < 126) return short;\n const ext = new Uint8Array(short === 126 ? 2 : 8);\n await fill(this.incoming, ext, signal);\n const view = new DataView(ext.buffer);\n if (short === 126) return view.getUint16(0);\n const long = view.getBigUint64(0);\n return long > BigInt(this.max) ? this.max + 1 : Number(long);\n }\n\n private take(\n opcode: number,\n fin: boolean,\n payload: Uint8Array\n ): WsEvent | WsBinaryEvent | undefined {\n switch (opcode) {\n case OP.ping:\n return { kind: 'ping', payload };\n case OP.pong:\n return undefined;\n case OP.close: {\n if (payload.length === 1) throw new WsError(CLOSE.protocol, 'a close frame is malformed');\n const code = payload.length >= 2 ? new DataView(payload.buffer).getUint16(0) : 1005;\n if (payload.length >= 2 && !sendableCode(code)) {\n throw new WsError(CLOSE.protocol, `close code ${code} may not be sent`);\n }\n return { kind: 'close', code, reason: decode(payload.subarray(2)) };\n }\n case OP.binary:\n if (!this.binary) throw new WsError(CLOSE.unsupported, 'CDP messages are text');\n return this.data(opcode, fin, payload);\n case OP.text:\n case OP.continuation:\n return this.data(opcode, fin, payload);\n default:\n throw new WsError(CLOSE.protocol, `unknown opcode ${opcode}`);\n }\n }\n}\n\nexport function switchingHead(accept: string, protocol = ''): Uint8Array {\n const chosen = protocol ? `Sec-WebSocket-Protocol: ${protocol}\\r\\n` : '';\n return latin1Bytes(\n `HTTP/1.1 101 Switching Protocols\\r\\nUpgrade: websocket\\r\\nConnection: Upgrade\\r\\nSec-WebSocket-Accept: ${accept}\\r\\n${chosen}\\r\\n`\n );\n}\n", "import {\n HttpError,\n Incoming,\n latin1Bytes,\n parseRequestHead,\n REASON,\n type RequestHead,\n} from '../kernel/net/http1.ts';\nimport type { KernelSocket, LoopbackNet } from '../kernel/socket.ts';\nimport type { CdpHosts } from './hosts.ts';\nimport { CDP_PORT, type CdpConnection, NO_CDP_HOST } from './types.ts';\nimport {\n acceptKey,\n CLOSE,\n closeFrame,\n frame,\n isUpgrade,\n MAX_MESSAGE,\n OP_TEXT,\n pongFrame,\n switchingHead,\n WsError,\n WsReader,\n} from './websocket.ts';\n\nconst MAX_HEAD = 64 * 1024;\nconst LIST_TIMEOUT = 10000;\n\nconst CLOSE_WAIT_MS = 1000;\n\nexport interface CdpFacadeOptions {\n net: LoopbackNet;\n hosts: CdpHosts;\n port?: number;\n maxMessage?: number;\n closeWaitMs?: number;\n listTimeout?: number;\n}\n\ninterface TargetInfo {\n targetId: string;\n type: string;\n title: string;\n url: string;\n attached?: boolean;\n}\n\nfunction respond(status: number, body: string, type = 'text/plain; charset=utf-8'): Uint8Array {\n const bytes = new TextEncoder().encode(body);\n const head = latin1Bytes(\n `HTTP/1.1 ${status} ${REASON[status]}\\r\\nContent-Type: ${type}\\r\\nContent-Length: ${bytes.length}\\r\\nConnection: close\\r\\n\\r\\n`\n );\n const out = new Uint8Array(head.length + bytes.length);\n out.set(head);\n out.set(bytes, head.length);\n return out;\n}\n\nfunction json(value: unknown): Uint8Array {\n return respond(200, `${JSON.stringify(value, null, 2)}\\n`, 'application/json; charset=UTF-8');\n}\n\nexport class CdpFacade {\n private readonly options: CdpFacadeOptions;\n private readonly listener: KernelSocket;\n private readonly stop = new AbortController();\n private readonly connections = new Set<KernelSocket>();\n readonly closed: Promise<void>;\n\n constructor(options: CdpFacadeOptions) {\n this.options = options;\n this.listener = options.net.listen({\n family: 'inet',\n host: '127.0.0.1',\n port: options.port ?? CDP_PORT,\n });\n this.closed = this.acceptLoop();\n }\n\n close(): void {\n if (this.stop.signal.aborted) return;\n this.stop.abort();\n this.listener.close();\n for (const conn of this.connections) conn.close();\n }\n\n private async acceptLoop(): Promise<void> {\n const served = new Set<Promise<void>>();\n for (;;) {\n let conn: KernelSocket;\n try {\n conn = await this.listener.accept(this.stop.signal);\n } catch {\n break;\n }\n const done = this.serve(conn).finally(() => served.delete(done));\n served.add(done);\n }\n await Promise.allSettled([...served]);\n }\n\n private async serve(conn: KernelSocket): Promise<void> {\n this.connections.add(conn);\n const incoming = new Incoming(conn);\n try {\n const head = await incoming.head(MAX_HEAD, this.stop.signal);\n if (head) await this.route(conn, incoming, parseRequestHead(head));\n } catch (e) {\n if (e instanceof HttpError) await this.write(conn, respond(e.status, `${e.message}\\n`));\n } finally {\n this.connections.delete(conn);\n conn.close();\n }\n }\n\n private async write(conn: KernelSocket, bytes: Uint8Array): Promise<void> {\n try {\n await conn.write(bytes, this.stop.signal);\n } catch {}\n }\n\n private async route(conn: KernelSocket, incoming: Incoming, req: RequestHead): Promise<void> {\n const url = new URL(req.target, 'http://127.0.0.1');\n const runtime = url.searchParams.get('runtime') ?? undefined;\n const host = req.headers.find(([n]) => n.toLowerCase() === 'host')?.[1] ?? '127.0.0.1';\n if (req.method !== 'GET') throw new HttpError(405, `${req.method} is not supported here`);\n const { hosts } = this.options;\n if (url.pathname === hosts.path && isUpgrade(req.headers)) {\n return this.upgrade(conn, incoming, req, runtime);\n }\n const path = url.pathname.replace(/\\/+$/, '');\n if (path !== '/json/version' && path !== '/json/list' && path !== '/json') {\n throw new HttpError(404, 'not found: try /json/version');\n }\n if (!this.options.hosts.available(runtime)) {\n throw new HttpError(503, NO_CDP_HOST);\n }\n if (path === '/json/version') {\n await this.write(\n conn,\n json({\n Browser: 'slicc-kernel',\n 'Protocol-Version': '1.3',\n webSocketDebuggerUrl: `ws://${host}${hosts.path}${url.search}`,\n })\n );\n return;\n }\n await this.write(conn, json(await this.list(runtime)));\n }\n\n private async list(runtime: string | undefined): Promise<unknown[]> {\n const conn = await this.host(runtime);\n try {\n const reply = await new Promise<{ result?: { targetInfos?: TargetInfo[] }; error?: unknown }>(\n (resolve, reject) => {\n const timer = setTimeout(\n () => reject(new HttpError(504, 'the CDP host did not answer Target.getTargets')),\n this.options.listTimeout ?? LIST_TIMEOUT\n );\n conn.onclose = (reason) => {\n clearTimeout(timer);\n reject(new HttpError(502, `the CDP host closed: ${reason ?? 'no reason'}`));\n };\n conn.onmessage = (message) => {\n const parsed = JSON.parse(message) as { id?: number };\n if (parsed.id !== 1) return;\n clearTimeout(timer);\n resolve(parsed as never);\n };\n conn.send(JSON.stringify({ id: 1, method: 'Target.getTargets' }));\n }\n );\n if (!reply.result) {\n throw new HttpError(502, `Target.getTargets failed: ${JSON.stringify(reply.error)}`);\n }\n return (reply.result.targetInfos ?? []).map((t) => ({\n description: '',\n id: t.targetId,\n title: t.title,\n type: t.type,\n url: t.url,\n }));\n } finally {\n conn.close();\n }\n }\n\n private host(runtime: string | undefined): Promise<CdpConnection> {\n return this.options.hosts.connect(runtime ? { runtime } : {});\n }\n\n private async upgrade(\n conn: KernelSocket,\n incoming: Incoming,\n req: RequestHead,\n runtime: string | undefined\n ): Promise<void> {\n const accept = await acceptKey(req.headers);\n const host = await this.host(runtime);\n const limits = {\n max: this.options.maxMessage ?? MAX_MESSAGE,\n closeWaitMs: this.options.closeWaitMs ?? CLOSE_WAIT_MS,\n };\n await new Relay(conn, incoming, host, limits, this.stop.signal)\n .start(switchingHead(accept))\n .finally(() => host.close());\n }\n}\n\nclass Relay {\n private writes: Promise<unknown> = Promise.resolve();\n private ended = false;\n\n private readonly conn: KernelSocket;\n private readonly incoming: Incoming;\n private readonly host: CdpConnection;\n private readonly max: number;\n private readonly closeWaitMs: number;\n private readonly stop: AbortSignal;\n\n constructor(\n conn: KernelSocket,\n incoming: Incoming,\n host: CdpConnection,\n limits: { max: number; closeWaitMs: number },\n stop: AbortSignal\n ) {\n this.conn = conn;\n this.incoming = incoming;\n this.host = host;\n this.max = limits.max;\n this.closeWaitMs = limits.closeWaitMs;\n this.stop = stop;\n }\n\n private send(bytes: Uint8Array): Promise<unknown> {\n this.writes = this.writes.then(() => this.conn.write(bytes, this.stop)).catch(() => undefined);\n return this.writes;\n }\n\n private end(code: number, reason: string): Promise<unknown> {\n if (this.ended) return this.writes;\n this.ended = true;\n return this.send(closeFrame(code, reason));\n }\n\n async start(head: Uint8Array): Promise<void> {\n await this.send(head);\n const hostGone = new Promise<void>((resolve) => {\n this.host.onclose = (reason) => {\n void this.end(reason ? CLOSE.error : CLOSE.normal, reason ?? '').then(() => resolve());\n };\n });\n this.host.onmessage = (message) => {\n if (this.ended) return;\n const bytes = new TextEncoder().encode(message);\n if (bytes.length > this.max)\n void this.end(CLOSE.tooBig, `a message is over ${this.max} bytes`);\n else void this.send(frame(OP_TEXT, bytes));\n };\n const pumping = this.pump();\n await Promise.race([pumping, hostGone]);\n await this.writes;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const waited = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, this.closeWaitMs);\n });\n await Promise.race([pumping, waited]);\n clearTimeout(timer);\n }\n\n private async pump(): Promise<void> {\n const reader = new WsReader(this.incoming, this.max);\n try {\n for (;;) {\n const event = await reader.next(this.stop);\n if (!event) return;\n if (event.kind === 'text') this.host.send(event.text);\n else if (event.kind === 'ping') void this.send(pongFrame(event.payload));\n else {\n await this.end(event.code === 1005 ? CLOSE.normal : event.code, '');\n return;\n }\n }\n } catch (e) {\n if (e instanceof WsError) await this.end(e.code, e.message);\n }\n }\n}\n\nexport function enableCdp(net: LoopbackNet, hosts: CdpHosts): () => CdpFacade | undefined {\n let facade: CdpFacade | undefined;\n net.kernelOnly(CDP_PORT, true);\n net.activate({ family: 'inet', host: '127.0.0.1', port: CDP_PORT }, () => {\n const started = new CdpFacade({ net, hosts });\n facade = started;\n void started.closed.then(() => {\n if (facade === started) facade = undefined;\n });\n });\n return () => facade;\n}\n", "import { HttpError } from '../kernel/net/http1.ts';\nimport {\n CDP_PORT,\n type CdpConnection,\n type CdpHook,\n type CdpRequest,\n NO_CDP_HOST,\n} from './types.ts';\n\ninterface Registration {\n hook: CdpHook;\n runtime: string | undefined;\n open: Set<CdpConnection>;\n}\n\nexport class CdpHosts {\n private readonly embedder: Registration | undefined;\n private readonly clients: Registration[] = [];\n private closed = false;\n readonly path = `/devtools/browser/${crypto.randomUUID()}`;\n readonly url = `ws://127.0.0.1:${CDP_PORT}${this.path}`;\n\n constructor(hook?: CdpHook) {\n this.embedder = hook ? { hook, runtime: undefined, open: new Set() } : undefined;\n }\n\n register(hook: CdpHook, runtime?: string): () => void {\n const entry: Registration = { hook, runtime, open: new Set() };\n this.clients.push(entry);\n return () => {\n const at = this.clients.indexOf(entry);\n if (at >= 0) this.clients.splice(at, 1);\n closeAll(entry);\n };\n }\n\n private pick(runtime: string | undefined): Registration | undefined {\n if (this.closed) return undefined;\n const named = runtime ? this.clients.findLast((c) => c.runtime === runtime) : undefined;\n return named ?? this.embedder ?? this.clients.at(-1);\n }\n\n available(runtime?: string): boolean {\n return this.pick(runtime) !== undefined;\n }\n\n async connect(request: CdpRequest): Promise<CdpConnection> {\n const entry = this.pick(request.runtime);\n if (!entry) throw new HttpError(503, NO_CDP_HOST);\n let conn: CdpConnection;\n try {\n conn = await entry.hook(request.runtime ? { runtime: request.runtime } : {});\n } catch (e) {\n throw new HttpError(502, `CDP host: ${e instanceof Error ? e.message : String(e)}`);\n }\n if (this.closed || !(entry === this.embedder || this.clients.includes(entry))) {\n conn.close();\n throw new HttpError(503, NO_CDP_HOST);\n }\n entry.open.add(conn);\n const close = conn.close.bind(conn);\n conn.close = () => {\n if (entry.open.delete(conn)) close();\n };\n return conn;\n }\n\n close(): void {\n this.closed = true;\n for (const entry of [this.embedder, ...this.clients]) if (entry) closeAll(entry);\n }\n}\n\nfunction closeAll(entry: Registration): void {\n for (const conn of [...entry.open]) {\n conn.close();\n conn.onclose?.('the CDP host is gone');\n }\n}\n", "import type { KernelFs } from './fs/types.ts';\n\nexport type Abi = 'emscripten' | 'wasi' | 'js';\n\nexport interface Command {\n name: string;\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n argv0Path?: boolean;\n preopenRoot?: boolean;\n args?: string[];\n env?: Record<string, string>;\n unset?: string[];\n script?: string;\n imports?: string;\n}\n\ninterface CommandEntry {\n abi?: unknown;\n glue?: unknown;\n wasm?: unknown;\n argv0?: unknown;\n argv0Path?: unknown;\n preopenRoot?: unknown;\n args?: unknown;\n env?: unknown;\n script?: unknown;\n imports?: unknown;\n module?: unknown;\n}\n\ninterface Manifest {\n slicc?: {\n abi?: unknown;\n commands?: unknown;\n env?: unknown;\n filesystems?: unknown;\n binfmt?: unknown;\n };\n}\n\nconst NAME = /^[A-Za-z0-9._+-]+$/;\nconst ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst PACKAGE = /\\$\\{package\\}/g;\n\nfunction inside(pkg: string, rel: unknown): string | undefined {\n if (typeof rel !== 'string' || rel === '') return undefined;\n const clean = rel.replace(/^\\.\\//, '');\n if (clean.startsWith('/') || clean.split('/').includes('..')) return undefined;\n return `${pkg}/${clean}`;\n}\n\ntype ManifestEnv = Record<string, string | null>;\n\nfunction envOf(pkg: string, raw: unknown): ManifestEnv {\n const env: ManifestEnv = {};\n if (!raw || typeof raw !== 'object') return env;\n for (const [key, value] of Object.entries(raw)) {\n if (!ENV_KEY.test(key)) continue;\n if (typeof value === 'string') env[key] = value.replace(PACKAGE, pkg);\n else if (value === null) env[key] = null;\n }\n return env;\n}\n\nfunction envFields(merged: ManifestEnv): { env?: Record<string, string>; unset?: string[] } {\n const env: Record<string, string> = {};\n const unset: string[] = [];\n for (const [key, value] of Object.entries(merged)) {\n if (value === null) unset.push(key);\n else env[key] = value;\n }\n return {\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(unset.length > 0 ? { unset } : {}),\n };\n}\n\nfunction argsOf(pkg: string, raw: unknown): string[] | undefined {\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n if (!raw.every((arg) => typeof arg === 'string')) return undefined;\n return raw.map((arg) => arg.replace(PACKAGE, pkg));\n}\n\nfunction abiOf(raw: unknown, fallback: Abi): Abi | undefined {\n const abi = raw ?? fallback;\n return abi === 'emscripten' || abi === 'wasi' || abi === 'js' ? abi : undefined;\n}\n\nfunction commandOf(\n pkg: string,\n name: string,\n raw: CommandEntry,\n packageAbi: Abi,\n shared: ManifestEnv\n): Command | undefined {\n const withEnv = envFields({ ...shared, ...envOf(pkg, raw.env) });\n const script = inside(pkg, raw.script);\n if (script) {\n return { name, abi: packageAbi, glue: script, wasm: script, argv0: name, script, ...withEnv };\n }\n const abi = abiOf(raw.abi, packageAbi);\n const argv0 = typeof raw.argv0 === 'string' && raw.argv0 ? raw.argv0 : name;\n const args = argsOf(pkg, raw.args);\n if (abi === 'js') {\n const module = inside(pkg, raw.module);\n if (!module) return undefined;\n return {\n name,\n abi,\n glue: module,\n wasm: module,\n argv0,\n ...(raw.argv0Path === true ? { argv0Path: true } : {}),\n ...(args ? { args } : {}),\n ...withEnv,\n };\n }\n const wasm = inside(pkg, raw.wasm);\n const glue = abi === 'wasi' ? wasm : inside(pkg, raw.glue);\n if (!abi || !glue || !wasm) return undefined;\n const imports = abi === 'wasi' ? inside(pkg, raw.imports) : undefined;\n return {\n name,\n abi,\n glue,\n wasm,\n argv0,\n ...(raw.argv0Path === true ? { argv0Path: true } : {}),\n ...(abi === 'wasi' && raw.preopenRoot === true ? { preopenRoot: true } : {}),\n ...(args ? { args } : {}),\n ...withEnv,\n ...(imports ? { imports } : {}),\n };\n}\n\nexport function commandsOf(pkg: string, manifest: Manifest): Command[] {\n const slicc = manifest.slicc;\n if (!slicc || typeof slicc !== 'object') return [];\n const packageAbi = abiOf(slicc.abi, 'emscripten');\n const entries = slicc.commands;\n if (!packageAbi || !entries || typeof entries !== 'object') return [];\n const shared = envOf(pkg, slicc.env);\n const out: Command[] = [];\n for (const [name, raw] of Object.entries(entries as Record<string, CommandEntry>)) {\n if (!NAME.test(name) || name === '.' || name === '..' || !raw || typeof raw !== 'object') {\n continue;\n }\n const command = commandOf(pkg, name, raw, packageAbi, shared);\n if (command) out.push(command);\n }\n return out;\n}\n\nasync function withPackagePaths(fs: KernelFs, pkg: string, command: Command): Promise<Command> {\n if (!command.env) return command;\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(command.env)) {\n const path = !value.startsWith('/') && value.includes('/') && inside(pkg, value);\n env[key] = path && (await fs.exists(path)) ? path : value;\n }\n return { ...command, env };\n}\n\nasync function packages(fs: KernelFs, modules: string): Promise<string[]> {\n const names = await fs.readdir(modules).catch(() => []);\n const packageNames: string[] = [];\n for (const name of names) {\n if (name.startsWith('.')) continue;\n if (!name.startsWith('@')) {\n packageNames.push(name);\n continue;\n }\n for (const inner of await fs.readdir(`${modules}/${name}`).catch(() => [])) {\n packageNames.push(`${name}/${inner}`);\n }\n }\n packageNames.sort();\n return packageNames.map((name) => `${modules}/${name}`);\n}\n\nexport async function pnpmGlobalRoots(fs: KernelFs, home: string): Promise<string[]> {\n const roots: string[] = [];\n const global = `${home}/global`;\n for (const version of (await fs.readdir(global).catch(() => [])).sort()) {\n for (const group of (await fs.readdir(`${global}/${version}`).catch(() => [])).sort()) {\n const dir = `${global}/${version}/${group}`;\n const st = await fs.lstat(dir).catch(() => undefined);\n if (st?.isDirectory && (await fs.exists(`${dir}/node_modules`)))\n roots.push(`${dir}/node_modules`);\n }\n }\n return roots;\n}\n\nasync function packagesIn(fs: KernelFs, roots: string | string[]): Promise<string[]> {\n const dirs: string[] = [];\n for (const root of typeof roots === 'string' ? [roots] : roots)\n dirs.push(...(await packages(fs, root)));\n return dirs;\n}\n\nexport async function scanCommands(\n fs: KernelFs,\n modules: string | string[]\n): Promise<Map<string, Command>> {\n const found = new Map<string, Command>();\n for (const pkg of await packagesIn(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n for (const command of commandsOf(pkg, manifest)) {\n if (!found.has(command.name))\n found.set(command.name, await withPackagePaths(fs, pkg, command));\n }\n }\n if (!found.has('sh') && found.has('bash')) {\n found.set('sh', { ...(found.get('bash') as Command), name: 'sh', argv0: 'sh' });\n }\n return found;\n}\n\nexport async function scanFilesystems(\n fs: KernelFs,\n modules: string | string[]\n): Promise<Map<string, string>> {\n const found = new Map<string, string>();\n for (const pkg of await packagesIn(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n const declared = manifest.slicc?.filesystems;\n if (!declared || typeof declared !== 'object') continue;\n for (const [type, entry] of Object.entries(declared)) {\n const module = inside(pkg, (entry as { module?: unknown } | null)?.module);\n if (NAME.test(type) && module && !found.has(type)) found.set(type, module);\n }\n }\n return found;\n}\n\nconst SUFFIX = /^\\.[A-Za-z0-9_+-][A-Za-z0-9._+-]*$/;\n\nexport async function scanBinfmts(\n fs: KernelFs,\n modules: string | string[],\n warn: (message: string) => void = () => {}\n): Promise<Map<string, string>> {\n const found = new Map<string, string>();\n const owners = new Map<string, string>();\n for (const pkg of await packagesIn(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n const declared = manifest.slicc?.binfmt;\n if (!declared || typeof declared !== 'object') continue;\n for (const [suffix, command] of Object.entries(declared)) {\n if (!SUFFIX.test(suffix) || typeof command !== 'string' || !NAME.test(command)) continue;\n const owner = owners.get(suffix);\n if (owner === undefined) {\n found.set(suffix, command);\n owners.set(suffix, pkg);\n } else if (found.get(suffix) !== command) {\n warn(\n `binfmt ${suffix}: ${owner} maps it to ${found.get(suffix)}, so ${pkg}'s ${command} is ignored`\n );\n }\n }\n }\n return found;\n}\n\nexport function binfmtOf(binfmts: ReadonlyMap<string, string>, path: string): string | undefined {\n const name = path.slice(path.lastIndexOf('/') + 1);\n let best: string | undefined;\n for (const suffix of binfmts.keys()) {\n if (name.length > suffix.length && name.endsWith(suffix)) {\n if (best === undefined || suffix.length > best.length) best = suffix;\n }\n }\n return best === undefined ? undefined : binfmts.get(best);\n}\n", "import { type FsStat, inodeOf, type KernelFs, lutimesOf, rangedOps } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst MAX_LINKS = 40;\n\nfunction missing(err: unknown): boolean {\n return (err as { code?: unknown })?.code === 'ENOENT';\n}\n\nfunction synthetic(directory: boolean, path: string): FsStat {\n const epoch = new Date(0);\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: 0,\n mode: (directory ? S_IFDIR : S_IFREG) | 0o755,\n mtime: epoch,\n atime: epoch,\n ctime: epoch,\n ino: inodeOf(path),\n };\n}\n\nexport async function followLinks(fs: KernelFs, path: string): Promise<string> {\n let current = path;\n for (let hops = 0; hops < MAX_LINKS; hops++) {\n const st = await fs.lstat(current).catch(() => undefined);\n if (!st?.isSymbolicLink) return current;\n const parent = current.slice(0, current.lastIndexOf('/')) || '/';\n current = fs.resolvePath(parent, await fs.readlink(current));\n }\n return current;\n}\n\nexport function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>): KernelFs {\n async function children(path: string): Promise<string[] | undefined> {\n if (path === '/') return ['bin', 'usr'];\n if (path === '/usr') return ['bin'];\n if (path === '/bin' || path === '/usr/bin') return [...(await names())];\n return undefined;\n }\n\n async function virtual(path: string): Promise<FsStat | undefined> {\n if (path === '/usr' || path === '/bin' || path === '/usr/bin') return synthetic(true, path);\n const name = COMMAND.exec(path)?.[1];\n return name !== undefined && (await names()).has(name) ? synthetic(false, path) : undefined;\n }\n\n async function linked(path: string): Promise<FsStat | undefined> {\n return (await virtual(path)) ?? virtual(await followLinks(fs, path));\n }\n\n async function stat(path: string, real: (path: string) => Promise<FsStat>): Promise<FsStat> {\n try {\n return await real(path);\n } catch (err) {\n const found = missing(err) ? await linked(path) : undefined;\n if (found) return found;\n throw err;\n }\n }\n\n return {\n resolvePath: (base, path) => fs.resolvePath(base, path),\n readFile: (path) => fs.readFile(path),\n async readFileBuffer(path) {\n try {\n return await fs.readFileBuffer(path);\n } catch (err) {\n if (missing(err) && (await linked(path))?.isFile) return new Uint8Array(0);\n throw err;\n }\n },\n writeFile: (path, content) => fs.writeFile(path, content),\n async exists(path) {\n return (await fs.exists(path)) || (await linked(path)) !== undefined;\n },\n stat: (path) => stat(path, (p) => fs.stat(p)),\n lstat: (path) => stat(path, (p) => fs.lstat(p)),\n async readdir(path) {\n const extra = await children(path);\n if (!extra) return fs.readdir(path);\n const real = await fs.readdir(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n return [...new Set([...real, ...extra])].sort();\n },\n async readdirStat(path) {\n const extra = await children(path);\n if (!extra) return fs.readdirStat(path);\n const real = await fs.readdirStat(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n const seen = new Set(real.map(([name]) => name));\n const base = path === '/' ? '' : path;\n const added = extra.filter((name) => !seen.has(name));\n const virtuals = await Promise.all(\n added.map(\n async (name): Promise<[string, FsStat | null]> => [\n name,\n (await virtual(`${base}/${name}`)) as FsStat,\n ]\n )\n );\n return [...real, ...virtuals].sort(([a], [b]) => (a < b ? -1 : 1));\n },\n mkdir: (path, options) => fs.mkdir(path, options),\n rm: (path, options) => fs.rm(path, options),\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n ...(fs.realpath ? { realpath: fs.realpath.bind(fs) } : {}),\n chmod: (path, mode) => fs.chmod(path, mode),\n utimes: (path, atime, mtime) => fs.utimes(path, atime, mtime),\n lutimes: (path, atime, mtime) => lutimesOf(fs, path, atime, mtime),\n ...(rangedOps(fs) ?? {}),\n };\n}\n", "import { type KernelFs, lutimesOf, normalizePath, rangedOps } from './types.ts';\n\nexport type WatchChange = { paths: string[] } | { overflow: true };\n\nexport interface WatchOptions {\n recursive?: boolean;\n}\n\ninterface Watcher {\n paths: string[];\n recursive: boolean;\n notify: (change: WatchChange) => void;\n pending: Set<string>;\n scheduled: boolean;\n}\n\nexport const WATCH_BATCH_LIMIT = 1000;\n\nconst under = (path: string, dir: string) => dir === '/' || path.startsWith(`${dir}/`);\nconst parentOf = (path: string) => path.slice(0, path.lastIndexOf('/')) || '/';\n\nfunction touches(watcher: Watcher, changed: string): boolean {\n return watcher.paths.some(\n (watched) =>\n changed === watched ||\n under(watched, changed) ||\n (watcher.recursive ? under(changed, watched) : parentOf(changed) === watched)\n );\n}\n\nexport class FsWatchers {\n private readonly watchers = new Set<Watcher>();\n\n watch(paths: string[], options: WatchOptions, notify: (change: WatchChange) => void): () => void {\n const watcher: Watcher = {\n paths: paths.map(normalizePath),\n recursive: options.recursive === true,\n notify,\n pending: new Set(),\n scheduled: false,\n };\n this.watchers.add(watcher);\n return () => {\n this.watchers.delete(watcher);\n };\n }\n\n changed(...paths: string[]): void {\n for (const watcher of this.watchers) {\n for (const path of paths) {\n const changed = normalizePath(path);\n if (touches(watcher, changed)) watcher.pending.add(changed);\n }\n if (watcher.pending.size === 0 || watcher.scheduled) continue;\n watcher.scheduled = true;\n setTimeout(() => this.flush(watcher), 0);\n }\n }\n\n private flush(watcher: Watcher): void {\n watcher.scheduled = false;\n const paths = [...watcher.pending];\n watcher.pending.clear();\n if (!this.watchers.has(watcher)) return;\n watcher.notify(paths.length > WATCH_BATCH_LIMIT ? { overflow: true } : { paths });\n }\n\n wrap(fs: KernelFs): KernelFs {\n const after =\n <A extends unknown[]>(\n run: (...args: A) => Promise<void>,\n changed: (...args: A) => string[]\n ) =>\n async (...args: A) => {\n try {\n await run(...args);\n } finally {\n this.changed(...changed(...args));\n }\n };\n const overrides: Partial<Record<keyof KernelFs, unknown>> = {\n writeFile: after(fs.writeFile.bind(fs), (path) => [path]),\n mkdir: async (path: string, options?: { recursive?: boolean }) => {\n const created: string[] = [];\n if (options?.recursive) {\n const parts = normalizePath(path).split('/').filter(Boolean);\n for (let at = 1; at < parts.length; at++) {\n const ancestor = `/${parts.slice(0, at).join('/')}`;\n if (created.length > 0 || !(await fs.exists(ancestor))) created.push(ancestor);\n }\n }\n try {\n await fs.mkdir(path, options);\n } finally {\n this.changed(...created, path);\n }\n },\n rm: after(fs.rm.bind(fs), (path) => [path]),\n rename: after(fs.rename.bind(fs), (from, to) => [from, to]),\n symlink: after(fs.symlink.bind(fs), (_target, path) => [path]),\n chmod: after(fs.chmod.bind(fs), (path) => [path]),\n utimes: after(fs.utimes.bind(fs), (path) => [path]),\n lutimes: after(\n (path: string, atime: Date, mtime: Date) => lutimesOf(fs, path, atime, mtime),\n (path) => [path]\n ),\n };\n const ranged = rangedOps(fs);\n if (ranged) {\n overrides.pwrite = after(ranged.pwrite, (path) => [path]);\n overrides.truncate = after(ranged.truncate, (path) => [path]);\n }\n return new Proxy(fs, {\n get(target, key, receiver) {\n if (Object.hasOwn(overrides, key)) return overrides[key as keyof KernelFs];\n const value = Reflect.get(target, key, receiver);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n }\n}\n", "import {\n bytesSource,\n type DeviceMeta,\n deviceFile,\n FdTable,\n heldFile,\n type KernelErrno,\n KernelError,\n type OpenFile,\n sinkFile,\n} from './fd-table.ts';\nimport type { ForkState } from './protocol.ts';\n\nexport type ChildStdio =\n | { fd: number }\n | { input: Uint8Array }\n | { capture: true }\n | { none: true }\n | { dir: string }\n | DeviceMeta;\n\nexport type InheritedSlot =\n | { fd: number; kernel: number; flags?: number }\n | ({ fd: number } & DeviceMeta);\n\nexport interface ChildSpawnRequest {\n file: string;\n\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n\n exec?: boolean;\n}\n\nexport interface ChildHandle {\n pid: number;\n\n exited: Promise<number>;\n\n termsig?: () => number | undefined;\n\n onState?: (listener: ChildStateListener) => void;\n}\n\nexport type ChildStateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport interface WaitFlags {\n untraced?: boolean;\n\n continued?: boolean;\n\n inGroup?: (childPid: number) => boolean;\n}\n\nexport class SpawnError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport type ChildSpawner = (req: ChildSpawnRequest, fds: FdTable) => Promise<ChildHandle>;\n\nexport type ChildForker = (state: ForkState, fds: FdTable) => Promise<ChildHandle>;\n\ninterface Child {\n exited: Promise<number>;\n termsig?: () => number | undefined;\n\n code?: number;\n\n stopReport?: number;\n\n continueReport?: boolean;\n\n captured: Map<number, Uint8Array[]>;\n}\n\nfunction interrupted(signal: AbortSignal | undefined): {\n promise: Promise<never>;\n\n done(): void;\n} {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal?.aborted) fail();\n else signal?.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal?.removeEventListener('abort', fail) };\n}\n\nexport function stoppedStatus(sig: number): number {\n return ((sig & 0xff) << 8) | 0x7f;\n}\n\nexport const CONTINUED_STATUS = 0xffff;\n\nexport function waitStatus(code: number, termsig?: number): number {\n return termsig ? termsig & 0x7f : (code & 0xff) << 8;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class ChildTable {\n private readonly children = new Map<number, Child>();\n\n private readonly leftovers = new Map<number, Map<number, Uint8Array[]>>();\n\n onChildState?: () => void;\n\n onReap?: (pid: number) => void;\n\n private stateChanged: Array<() => void> = [];\n\n private readonly watchers = new Map<number, ChildStateListener>();\n\n private readonly parentFds: FdTable;\n\n private readonly spawner: ChildSpawner | undefined;\n\n private readonly forker?: ChildForker;\n\n constructor(\n parentFds: FdTable,\n\n spawner: ChildSpawner | undefined,\n\n forker?: ChildForker\n ) {\n this.parentFds = parentFds;\n\n this.spawner = spawner;\n\n this.forker = forker;\n }\n\n async fork(state: ForkState): Promise<number> {\n if (!this.forker) throw new SpawnError('ENOSYS');\n return this.track(state, this.parentFds.fork(), new Map(), this.forker);\n }\n\n async spawn(\n req: ChildSpawnRequest,\n stdio: readonly ChildStdio[],\n inherit: readonly InheritedSlot[] = []\n ): Promise<number> {\n if (!this.spawner) throw new SpawnError('ENOSYS');\n const fds = new FdTable();\n const captured = new Map<number, Uint8Array[]>();\n try {\n for (const [n, slot] of stdio.entries()) fds.installAt(n, this.openSlot(slot, n, captured));\n\n for (const slot of inherit) {\n if (slot.fd <= 2) continue;\n if ('device' in slot) {\n fds.installAt(slot.fd, deviceFile(slot.device, slot.access));\n continue;\n }\n fds.installAt(slot.fd, this.parentFds.get(slot.kernel).retain());\n if (slot.flags !== undefined) fds.setStatusFlags(slot.fd, slot.flags);\n }\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n return this.track(req, fds, captured, this.spawner);\n }\n\n private async track<R>(\n req: R,\n fds: FdTable,\n captured: Map<number, Uint8Array[]>,\n start: (req: R, fds: FdTable) => Promise<ChildHandle>\n ): Promise<number> {\n let handle: ChildHandle;\n try {\n handle = await start(req, fds);\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n const child: Child = { exited: handle.exited, termsig: handle.termsig, captured };\n void handle.exited.then((code) => {\n child.code = code;\n this.watchers.delete(handle.pid);\n this.onChildState?.();\n });\n handle.onState?.((state, sig) => {\n child.stopReport = state === 'stopped' ? sig : undefined;\n child.continueReport = state === 'continued';\n this.watchers.get(handle.pid)?.(state, sig);\n const waiters = this.stateChanged;\n this.stateChanged = [];\n for (const wake of waiters) wake();\n this.onChildState?.();\n });\n this.children.set(handle.pid, child);\n return handle.pid;\n }\n\n watch(pid: number, listener: ChildStateListener): void {\n if (this.children.has(pid)) this.watchers.set(pid, listener);\n }\n\n private openSlot(slot: ChildStdio, n: number, captured: Map<number, Uint8Array[]>): OpenFile {\n if ('fd' in slot) return this.parentFds.get(slot.fd).retain();\n if ('input' in slot) return bytesSource(slot.input);\n if ('device' in slot) return deviceFile(slot.device, slot.access);\n if ('dir' in slot) return heldFile({ dir: slot.dir });\n if ('capture' in slot) {\n const chunks: Uint8Array[] = [];\n captured.set(n, chunks);\n return sinkFile((bytes) => chunks.push(bytes));\n }\n return deviceFile('null');\n }\n\n async wait(\n pid: number,\n nohang: boolean,\n signal?: AbortSignal,\n flags: WaitFlags = {}\n ): Promise<[number, number]> {\n let interrupt: ReturnType<typeof interrupted> | undefined;\n try {\n for (;;) {\n const candidates = this.candidates(pid, flags);\n if (candidates.length === 0) throw new KernelError('ECHILD');\n const done = candidates.find(([, child]) => child.code !== undefined);\n if (done) return this.reap(done[0], done[1].code as number);\n const changed = this.stateReport(candidates, flags);\n if (changed) return changed;\n if (nohang) return [0, 0];\n interrupt ??= interrupted(signal);\n await this.nextChange(candidates, flags, interrupt.promise);\n }\n } finally {\n interrupt?.done();\n }\n }\n\n private candidates(pid: number, flags: WaitFlags): [number, Child][] {\n const all = [...this.children];\n if (pid > 0) return all.filter(([p]) => p === pid);\n const inGroup = flags.inGroup;\n return pid === -1 || !inGroup ? all : all.filter(([p]) => inGroup(p));\n }\n\n private async nextChange(\n candidates: [number, Child][],\n flags: WaitFlags,\n interrupt: Promise<never>\n ): Promise<void> {\n let wake: (() => void) | undefined;\n const stateChange = new Promise<void>((resolve) => (wake = resolve));\n const watching = flags.untraced || flags.continued;\n if (watching && wake) this.stateChanged.push(wake);\n try {\n await Promise.race([\n ...candidates.map(([, child]) => child.exited),\n ...(watching ? [stateChange] : []),\n interrupt,\n ]);\n } finally {\n this.stateChanged = this.stateChanged.filter((w) => w !== wake);\n }\n }\n\n private stateReport(candidates: [number, Child][], flags: WaitFlags): [number, number] | null {\n for (const [p, child] of candidates) {\n if (flags.untraced && child.stopReport !== undefined) {\n const sig = child.stopReport;\n child.stopReport = undefined;\n return [p, stoppedStatus(sig)];\n }\n if (flags.continued && child.continueReport) {\n child.continueReport = false;\n return [p, CONTINUED_STATUS];\n }\n }\n return null;\n }\n\n private reap(pid: number, code: number): [number, number] {\n const child = this.children.get(pid);\n this.children.delete(pid);\n this.onReap?.(pid);\n if (child && child.captured.size > 0) this.leftovers.set(pid, child.captured);\n return [pid, waitStatus(code, child?.termsig?.())];\n }\n\n pids(): number[] {\n return [...this.children.keys()];\n }\n\n captured(pid: number, slot: number): Uint8Array {\n const slots = this.leftovers.get(pid);\n const chunks = slots?.get(slot);\n if (!slots || !chunks) return new Uint8Array(0);\n slots.delete(slot);\n if (slots.size === 0) this.leftovers.delete(pid);\n return concat(chunks);\n }\n}\n", "export const DRIVER_PROTOCOL: readonly [number, number] = [1, 1];\n\nexport interface DriverCapabilities {\n readonly?: boolean;\n symlinks?: boolean;\n chmod?: boolean;\n linkTimes?: boolean;\n ranges?: boolean;\n sessions?: boolean;\n listingStats?: boolean;\n caseInsensitive?: boolean;\n normalization?: 'none' | 'nfc' | 'nfd-insensitive';\n maxIo?: number;\n maxFile?: number;\n attrTtl?: number;\n entryTtl?: number;\n}\n\nexport interface DriverAttr {\n kind: 'file' | 'directory' | 'symlink';\n size: number;\n mtime: number;\n mode?: number;\n ino?: number;\n etag?: string;\n}\n\nexport interface DriverEntry {\n name: string;\n kind: DriverAttr['kind'];\n attr?: DriverAttr;\n}\n\nexport interface DriverStatfs {\n bsize: number;\n blocks: number;\n bfree: number;\n}\n\nexport interface MountRequestInfo {\n source: string;\n options: Record<string, string>;\n}\n\nexport type DriverCall =\n | { op: 'getattr'; path: string }\n | { op: 'readdir'; path: string }\n | {\n op: 'open';\n path: string;\n write: boolean;\n create: boolean;\n truncate: boolean;\n exclusive: boolean;\n ifMatch?: string;\n }\n | { op: 'read'; fh: number; offset: number; size: number }\n | { op: 'write'; fh: number; offset: number; bytes: Uint8Array }\n | { op: 'release'; fh: number }\n | { op: 'mkdir'; path: string }\n | { op: 'rmdir'; path: string }\n | { op: 'unlink'; path: string }\n | { op: 'rename'; from: string; to: string }\n | { op: 'symlink'; target: string; path: string }\n | { op: 'readlink'; path: string }\n | { op: 'setattr'; path: string; mode?: number; mtime?: number; size?: number }\n | { op: 'statfs' };\n\nexport type DriverRequest = DriverCall & { id: number };\n\nexport interface DriverReply {\n id: number;\n result?: unknown;\n errno?: string;\n message?: string;\n}\n\nexport interface KernelDriverHello {\n protocol: readonly [number, number];\n mount: MountRequestInfo;\n}\n\nexport interface DriverHello {\n protocol: readonly [number, number];\n capabilities?: DriverCapabilities;\n error?: string;\n errno?: string;\n}\n\nexport type KernelToDriver = { hello: KernelDriverHello } | DriverRequest;\n\nexport type DriverToKernel = { hello: DriverHello } | DriverReply | { invalidate: string[] | true };\n\nexport function driverVersionError(theirs: unknown): string | undefined {\n const major = Array.isArray(theirs) ? theirs[0] : undefined;\n if (major === DRIVER_PROTOCOL[0]) return undefined;\n const named = typeof major === 'number' ? `${major}.x` : 'without a version';\n return `slicc-kernel driver protocol ${named} is not supported: this side speaks ${DRIVER_PROTOCOL.join('.')}`;\n}\n", "import {\n DRIVER_PROTOCOL,\n type DriverCall,\n type DriverCapabilities,\n type DriverHello,\n type DriverReply,\n driverVersionError,\n type MountRequestInfo,\n} from './protocol.ts';\n\nexport interface DriverPortLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close?(): void;\n}\n\nexport interface ConnectionOptions {\n timeoutMs?: number;\n onInvalidate?: (paths: string[] | true) => void;\n onFail?: (error: Error) => void;\n}\n\ninterface Waiting {\n resolve(value: unknown): void;\n reject(error: Error): void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nexport const DRIVER_TIMEOUT_MS = 30_000;\n\nfunction unref(timer: ReturnType<typeof setTimeout>): ReturnType<typeof setTimeout> {\n (timer as { unref?: () => void }).unref?.();\n return timer;\n}\n\nexport function errnoError(code: string, message: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${message}`), { code });\n}\n\nexport class DriverConnection {\n readonly capabilities: DriverCapabilities;\n failure: Error | undefined;\n private readonly port: DriverPortLike;\n private readonly waiting: Map<number, Waiting>;\n private readonly timeoutMs: number;\n private nextId = 0;\n private readonly onFail: ((error: Error) => void) | undefined;\n\n private constructor(\n port: DriverPortLike,\n capabilities: DriverCapabilities,\n waiting: Map<number, Waiting>,\n timeoutMs: number,\n onFail: ((error: Error) => void) | undefined\n ) {\n this.port = port;\n this.capabilities = capabilities;\n this.waiting = waiting;\n this.timeoutMs = timeoutMs;\n this.onFail = onFail;\n }\n\n static async open(\n port: DriverPortLike,\n mount: MountRequestInfo,\n options: ConnectionOptions = {}\n ): Promise<DriverConnection> {\n const timeoutMs = options.timeoutMs ?? DRIVER_TIMEOUT_MS;\n const waiting = new Map<number, Waiting>();\n const greeted = Promise.withResolvers<DriverHello>();\n port.addEventListener('message', (event) => {\n const data = event.data as {\n hello?: DriverHello;\n invalidate?: string[] | true;\n } & DriverReply;\n if (data.hello) return greeted.resolve(data.hello);\n if (data.invalidate !== undefined) return options.onInvalidate?.(data.invalidate);\n const call = waiting.get(data.id);\n if (!call) return;\n waiting.delete(data.id);\n clearTimeout(call.timer);\n if (data.errno) call.reject(errnoError(data.errno, data.message ?? data.errno));\n else call.resolve(data.result);\n });\n port.start?.();\n port.postMessage({ hello: { protocol: DRIVER_PROTOCOL, mount } });\n const timer = unref(\n setTimeout(\n () => greeted.reject(errnoError('EIO', `the driver did not answer within ${timeoutMs} ms`)),\n timeoutMs\n )\n );\n let hello: DriverHello;\n try {\n hello = await greeted.promise;\n } finally {\n clearTimeout(timer);\n }\n const refused = driverVersionError(hello.protocol);\n if (refused) throw errnoError('EPROTO', refused);\n if (hello.error) throw errnoError(hello.errno ?? 'EIO', hello.error);\n return new DriverConnection(port, hello.capabilities ?? {}, waiting, timeoutMs, options.onFail);\n }\n\n call(call: DriverCall, transfer: Transferable[] = []): Promise<unknown> {\n if (this.failure) return Promise.reject(this.failure);\n const id = ++this.nextId;\n return new Promise((resolve, reject) => {\n const timer = unref(\n setTimeout(() => {\n this.waiting.delete(id);\n const error = errnoError(\n 'EIO',\n `the driver did not answer ${call.op} within ${this.timeoutMs} ms`\n );\n reject(error);\n this.fail(error);\n this.onFail?.(error);\n }, this.timeoutMs)\n );\n this.waiting.set(id, { resolve, reject, timer });\n this.port.postMessage({ ...call, id }, transfer);\n });\n }\n\n fail(error: Error): void {\n if (this.failure) return;\n this.failure = error;\n for (const call of this.waiting.values()) {\n clearTimeout(call.timer);\n call.reject(error);\n }\n this.waiting.clear();\n }\n\n close(): void {\n this.fail(errnoError('EIO', 'the file system is unmounted'));\n this.port.close?.();\n }\n}\n", "import { type FsStat, inodeOf, type KernelFs, lutimesOf, normalizePath } from '../fs/types.ts';\nimport type { KeptFile, UnlinkHolder } from '../fs/unlinked.ts';\nimport { DriverConnection, type DriverPortLike, errnoError } from './connection.ts';\nimport type { DriverAttr, DriverCapabilities, DriverEntry, DriverStatfs } from './protocol.ts';\n\nexport interface MountSpec {\n type: string;\n source: string;\n target: string;\n options?: Record<string, string>;\n}\n\nexport interface MountEntry {\n type: string;\n source: string;\n target: string;\n options: Record<string, string>;\n state: 'ok' | 'failed' | 'nomedium' | 'pending';\n error?: string;\n}\n\nexport interface OpenedDriver {\n port: DriverPortLike;\n dispose(): void;\n onCrash?(listener: (error: Error) => void): void;\n present?(): boolean;\n}\n\nexport interface MountDeps {\n open(type: string, spec: MountSpec): Promise<OpenedDriver>;\n busy(target: string): boolean;\n changed?(...paths: string[]): void;\n timeoutMs?: number;\n}\n\ninterface Cached<T> {\n value: T;\n expires: number;\n}\n\ninterface Mount extends MountEntry {\n dev: number;\n conn: DriverConnection;\n caps: DriverCapabilities;\n maxFile: number;\n attrs: Map<string, Cached<DriverAttr>>;\n lists: Map<string, Cached<DriverEntry[]>>;\n dispose(): void;\n present?(): boolean;\n}\n\nconst MAX_LINKS = 40;\nconst STALE_RETRIES = 3;\nconst DEFAULT_IO = 8 * 1024 * 1024;\nconst UNITS: Record<string, number> = { '': 1, k: 1024, m: 1024 ** 2, g: 1024 ** 3, t: 1024 ** 4 };\n\nexport function parseSize(text: string): number {\n const match = /^(\\d+(?:\\.\\d+)?)\\s*([kmgt]?)i?b?$/i.exec(text.trim());\n if (!match) throw errnoError('EINVAL', `not a size: ${text}`);\n return Math.floor(Number(match[1]) * (UNITS[(match[2] as string).toLowerCase()] as number));\n}\n\nconst within = (path: string, target: string) =>\n path === target || target === '/' || path.startsWith(`${target}/`);\nexport class HeldSet extends Set<HeldPaths> {\n private readonly idle: (path: string) => void;\n\n constructor(idle: (path: string) => void) {\n super();\n this.idle = idle;\n }\n\n override add(holds: HeldPaths): this {\n holds.onIdle = this.idle;\n return super.add(holds);\n }\n\n override delete(holds: HeldPaths): boolean {\n const removed = super.delete(holds);\n for (const path of new Set([...holds.keys(), ...holds.opens.keys()])) this.idle(path);\n for (const kept of holds.unlinked.values()) kept.release();\n holds.unlinked.clear();\n return removed;\n }\n}\n\nexport function heldUnder(held: Iterable<Map<string, number>>, target: string): boolean {\n for (const paths of held) for (const path of paths.keys()) if (within(path, target)) return true;\n return false;\n}\n\nexport class HeldPaths extends Map<string, number> implements UnlinkHolder {\n private readonly revoked = new Set<string>();\n readonly opens = new Map<string, number>();\n readonly unlinked = new Map<string, KeptFile>();\n private readonly aliases = new Map<string, string>();\n private owning: string | undefined;\n\n onIdle?: (path: string) => void;\n\n keyOf(path: string): string {\n return this.aliases.get(path) ?? path;\n }\n\n keptAt(path: string): KeptFile | undefined {\n return this.unlinked.get(this.keyOf(path));\n }\n\n holding(path: string): boolean {\n return this.opens.has(this.keyOf(path));\n }\n\n held(): Iterable<string> {\n return this.opens.keys();\n }\n\n isKept(path: string): boolean {\n return this.unlinked.has(path);\n }\n\n keep(path: string, file: KeptFile): void {\n this.unlinked.set(path, file);\n }\n\n unkeep(path: string): void {\n this.unlinked.delete(path);\n }\n\n hold(path: string, on: boolean, open = false, real?: string): void {\n if (open) {\n const key = real ?? this.keyOf(path);\n if (key !== path) this.aliases.set(path, key);\n const count = (this.opens.get(key) ?? 0) + (on ? 1 : -1);\n if (count > 0) this.opens.set(key, count);\n else {\n this.opens.delete(key);\n this.unlinked.get(key)?.release();\n this.unlinked.delete(key);\n for (const [alias, target] of this.aliases) if (target === key) this.aliases.delete(alias);\n this.onIdle?.(key);\n }\n return;\n }\n const count = (this.get(path) ?? 0) + (on ? 1 : -1);\n if (count > 0) this.set(path, count);\n else {\n this.delete(path);\n this.revoked.delete(path);\n this.onIdle?.(path);\n }\n }\n\n async own<T>(path: string, op: () => Promise<T>): Promise<T> {\n this.owning = path;\n try {\n return await op();\n } finally {\n this.owning = undefined;\n }\n }\n\n owns(path: string): boolean {\n return this.owning === path;\n }\n\n revoke(prefix: string): void {\n for (const path of this.keys()) if (within(path, prefix)) this.revoked.add(path);\n }\n\n renamed(from: string, to: string): void {\n for (const [path, count] of [...this]) {\n if (!within(path, from)) continue;\n const moved = to + path.slice(from.length);\n this.delete(path);\n this.set(moved, (this.get(moved) ?? 0) + count);\n if (this.revoked.delete(path)) this.revoked.add(moved);\n }\n for (const [path, count] of [...this.opens]) {\n if (!within(path, from)) continue;\n const moved = to + path.slice(from.length);\n this.opens.delete(path);\n this.opens.set(moved, (this.opens.get(moved) ?? 0) + count);\n }\n }\n\n isRevoked(path: string): boolean {\n return this.revoked.has(path);\n }\n}\n\nconst parentOf = (path: string) => path.slice(0, path.lastIndexOf('/')) || '/';\n\nconst readonly = (mount: Mount): boolean =>\n mount.caps.readonly === true || mount.options.ro !== undefined;\n\nfunction statOf(attr: DriverAttr, path: string, mount: Mount): FsStat {\n const mtime = new Date(attr.mtime);\n const fallback =\n attr.kind === 'directory' ? 0o40755 : attr.kind === 'symlink' ? 0o120777 : 0o100644;\n return {\n isFile: attr.kind === 'file',\n isDirectory: attr.kind === 'directory',\n isSymbolicLink: attr.kind === 'symlink',\n size: attr.size,\n mode: attr.mode ?? fallback,\n mtime,\n atime: mtime,\n ctime: mtime,\n ino: attr.ino ?? inodeOf(path),\n dev: mount.dev,\n ...(readonly(mount) ? { readonly: true } : {}),\n ...(mount.maxFile > 0 ? { maxFile: mount.maxFile } : {}),\n ...(mount.caps.ranges ? { ranged: true } : {}),\n ...(attr.etag !== undefined ? { version: attr.etag } : {}),\n };\n}\n\nfunction concat(chunks: Uint8Array[], total: number): Uint8Array {\n if (chunks.length === 1 && chunks[0]?.length === total) return chunks[0];\n const out = new Uint8Array(total);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\n\nfunction resized(bytes: Uint8Array, size: number): Uint8Array {\n if (size <= bytes.length) return bytes.subarray(0, size);\n const out = new Uint8Array(size);\n out.set(bytes);\n return out;\n}\n\nfunction handed(bytes: Uint8Array, transfer: boolean, chunk: number): boolean {\n const whole = bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength;\n return transfer && whole && bytes.length <= chunk && bytes.buffer instanceof ArrayBuffer;\n}\n\nfunction spliced(bytes: Uint8Array, offset: number, part: Uint8Array): Uint8Array {\n const out = resized(bytes, Math.max(bytes.length, offset + part.length));\n out.set(part, offset);\n return out;\n}\n\ninterface WriteSession {\n mount: Mount;\n fh: Promise<number>;\n extents: Array<[number, number]>;\n truncated: boolean;\n}\n\nexport class MountTable {\n private readonly mounts = new Map<string, Mount>();\n private readonly sessions = new Map<string, WriteSession>();\n private readonly committing = new Map<string, { mount: Mount; done: Promise<void> }>();\n private devices = 0;\n private readonly pending = new Set<string>();\n private readonly notes = new Map<string, MountEntry>();\n private readonly deps: MountDeps;\n\n constructor(deps: MountDeps) {\n this.deps = deps;\n }\n\n mounted(target: string): MountEntry | undefined {\n return this.mounts.get(target);\n }\n\n list(): MountEntry[] {\n const mounted = [...this.mounts.values()].map(\n ({ type, source, target, options, state, error, present }): MountEntry => ({\n type,\n source,\n target,\n options: { ...options },\n state: state === 'ok' && present?.() === false ? 'nomedium' : state,\n ...(error ? { error } : {}),\n })\n );\n const noted = [...this.notes.values()].filter((note) => !this.mounts.has(note.target));\n return [...mounted, ...noted.map((note) => ({ ...note, options: { ...note.options } }))];\n }\n\n note(spec: MountSpec, state: 'pending' | 'failed', error?: string): void {\n const target = normalizePath(spec.target);\n this.notes.set(target, {\n type: spec.type,\n source: spec.source,\n target,\n options: { ...spec.options },\n state,\n ...(error ? { error } : {}),\n });\n }\n\n locate(path: string): { mount: Mount; rel: string } | undefined {\n let best: Mount | undefined;\n for (const mount of this.mounts.values()) {\n if (within(path, mount.target) && (!best || mount.target.length > best.target.length))\n best = mount;\n }\n if (!best) return undefined;\n const rel = best.target === '/' ? path : path.slice(best.target.length);\n return { mount: best, rel: rel || '/' };\n }\n\n async mount(spec: MountSpec, fs: KernelFs): Promise<MountEntry> {\n const target = normalizePath(spec.target);\n if (this.mounts.has(target) || this.pending.has(target)) {\n throw errnoError('EBUSY', `${target} is already mounted`);\n }\n this.pending.add(target);\n try {\n return await this.attach(spec, target, fs);\n } finally {\n this.pending.delete(target);\n }\n }\n\n private async attach(spec: MountSpec, target: string, fs: KernelFs): Promise<MountEntry> {\n const st = await fs.stat(target);\n if (!st.isDirectory) throw errnoError('ENOTDIR', target);\n const options = { ...spec.options };\n const maxFile = options.maxfile !== undefined ? parseSize(options.maxfile) : undefined;\n const opened = await this.deps.open(spec.type, { ...spec, target, options });\n let mounted: Mount | undefined;\n const started = Promise.withResolvers<never>();\n opened.onCrash?.((error) => {\n if (mounted) this.crashed(mounted, error);\n else\n started.reject(\n errnoError('EIO', `the ${spec.type} driver failed to start: ${error.message}`)\n );\n });\n let conn: DriverConnection;\n try {\n conn = await Promise.race([\n DriverConnection.open(\n opened.port,\n { source: spec.source, options },\n {\n ...(this.deps.timeoutMs ? { timeoutMs: this.deps.timeoutMs } : {}),\n onInvalidate: (paths) => this.invalidated(target, paths),\n onFail: (error) => {\n if (mounted) this.crashed(mounted, error);\n },\n }\n ),\n started.promise,\n ]);\n } catch (err) {\n opened.dispose();\n throw err;\n }\n const caps = conn.capabilities;\n const mount: Mount = {\n type: spec.type,\n source: spec.source,\n target,\n options,\n state: 'ok',\n dev: 256 + ++this.devices,\n conn,\n caps,\n maxFile: maxFile ?? caps.maxFile ?? 0,\n attrs: new Map(),\n lists: new Map(),\n dispose: () => opened.dispose(),\n ...(opened.present ? { present: opened.present } : {}),\n };\n mounted = mount;\n this.mounts.set(target, mount);\n this.notes.delete(target);\n return this.list().find((m) => m.target === target) as MountEntry;\n }\n\n unnote(target: string): void {\n this.notes.delete(normalizePath(target));\n }\n\n umount(target: string, detach = false): void {\n const at = normalizePath(target);\n const mount = this.mounts.get(at);\n if (!mount && this.notes.delete(at)) return;\n if (!mount) throw errnoError('EINVAL', `${at} is not mounted`);\n if (!detach && this.deps.busy(at)) throw errnoError('EBUSY', `${at} has open files`);\n this.notes.delete(at);\n this.mounts.delete(at);\n const waits = [...this.sessions]\n .filter(([, s]) => s.mount === mount)\n .map(([real]) => this.commit(real));\n for (const c of this.committing.values()) if (c.mount === mount) waits.push(c.done);\n const close = () => {\n mount.conn.close();\n mount.dispose();\n };\n if (waits.length === 0) close();\n else void Promise.allSettled(waits).then(close);\n }\n\n session(mount: Mount, real: string, rel: string): WriteSession {\n let session = this.sessions.get(real);\n if (!session) {\n const open = () =>\n mount.conn.call({\n op: 'open',\n path: rel,\n write: true,\n create: true,\n truncate: false,\n exclusive: false,\n }) as Promise<number>;\n const before = this.committing.get(real)?.done ?? Promise.resolve();\n const fh = before.then(open, open);\n session = { mount, fh, extents: [], truncated: false };\n this.sessions.set(real, session);\n fh.catch(() => this.sessions.delete(real));\n }\n return session;\n }\n\n writing(real: string): WriteSession | undefined {\n return this.sessions.get(real);\n }\n\n async commit(real: string): Promise<void> {\n const session = this.sessions.get(real);\n if (!session) return this.committing.get(real)?.done;\n this.sessions.delete(real);\n const done = (async () => {\n try {\n await session.mount.conn.call({ op: 'release', fh: await session.fh });\n } finally {\n this.forget(session.mount, real);\n }\n })();\n const entry = { mount: session.mount, done };\n this.committing.set(real, entry);\n const settle = () => {\n if (this.committing.get(real) === entry) this.committing.delete(real);\n };\n done.then(settle, settle);\n return done;\n }\n\n async commitUnder(prefix: string): Promise<void> {\n const at = normalizePath(prefix);\n await Promise.all(\n [...this.sessions.keys()].filter((p) => within(p, at)).map((p) => this.commit(p))\n );\n }\n\n async commitOverlapping(real: string, offset: number, length: number): Promise<void> {\n const session = this.sessions.get(real);\n if (!session) return;\n const end = offset + length;\n if (session.truncated || session.extents.some(([a, b]) => a < end && offset < b)) {\n await this.commit(real);\n }\n }\n\n private crashed(mount: Mount, error: Error): void {\n mount.state = 'failed';\n mount.attrs.clear();\n mount.lists.clear();\n mount.error = error.message;\n mount.conn.fail(\n errnoError('EIO', `the ${mount.type} driver for ${mount.target} failed: ${error.message}`)\n );\n }\n\n private invalidated(target: string, paths: string[] | true): void {\n const mount = this.mounts.get(target);\n if (!mount) return;\n if (paths === true) {\n mount.attrs.clear();\n mount.lists.clear();\n this.deps.changed?.(target);\n return;\n }\n const full = paths.map((p) => normalizePath(`${target}/${p}`));\n for (const path of full) this.forget(mount, path);\n this.deps.changed?.(...full);\n }\n\n forget(mount: Mount, path: string): void {\n for (const key of [...mount.attrs.keys()]) if (within(key, path)) mount.attrs.delete(key);\n mount.lists.delete(path);\n mount.lists.delete(parentOf(path));\n for (const key of [...mount.lists.keys()]) if (within(key, path)) mount.lists.delete(key);\n }\n\n async getattr(mount: Mount, path: string, rel: string): Promise<DriverAttr> {\n if (mount.conn.failure) throw mount.conn.failure;\n const cached = mount.attrs.get(path);\n if (cached && cached.expires > Date.now()) return cached.value;\n const attr = (await mount.conn.call({ op: 'getattr', path: rel })) as DriverAttr;\n const ttl = mount.caps.attrTtl ?? 1000;\n if (ttl > 0) mount.attrs.set(path, { value: attr, expires: Date.now() + ttl });\n return attr;\n }\n\n async readdir(mount: Mount, path: string, rel: string): Promise<DriverEntry[]> {\n if (mount.conn.failure) throw mount.conn.failure;\n const cached = mount.lists.get(path);\n if (cached && cached.expires > Date.now()) return cached.value;\n const entries = (await mount.conn.call({ op: 'readdir', path: rel })) as DriverEntry[];\n const ttl = mount.caps.entryTtl ?? mount.caps.attrTtl ?? 1000;\n if (ttl > 0) mount.lists.set(path, { value: entries, expires: Date.now() + ttl });\n return entries;\n }\n\n async statfs(path: string): Promise<{ quota: number; usage: number } | undefined> {\n const found = this.locate(normalizePath(path));\n if (!found) return undefined;\n const st = (await found.mount.conn.call({ op: 'statfs' })) as DriverStatfs | null;\n if (!st) return { quota: 0, usage: 0 };\n return { quota: st.blocks * st.bsize, usage: (st.blocks - st.bfree) * st.bsize };\n }\n\n wrap(base: KernelFs): KernelFs {\n return new MountFs(this, base);\n }\n}\n\ntype Located = { mount: Mount; rel: string };\n\nfunction noteExtent(extents: Array<[number, number]>, from: number, to: number): void {\n const last = extents.at(-1);\n if (last && from <= last[1] && to >= last[0]) {\n last[0] = Math.min(last[0], from);\n last[1] = Math.max(last[1], to);\n } else extents.push([from, to]);\n}\n\nclass MountFs implements KernelFs {\n private readonly table: MountTable;\n private readonly base: KernelFs;\n\n constructor(table: MountTable, base: KernelFs) {\n this.table = table;\n this.base = base;\n }\n\n private at(path: string): Located | undefined {\n return this.table.locate(normalizePath(path));\n }\n\n private writable(mount: Mount, path: string): void {\n if (readonly(mount)) throw errnoError('EROFS', path);\n }\n\n private async follow(path: string, hops = 0, create = false): Promise<string> {\n const found = this.at(path);\n if (!found) return path;\n const real = normalizePath(path);\n let attr: DriverAttr;\n try {\n attr = await this.table.getattr(found.mount, real, found.rel);\n } catch (err) {\n if (create && (err as { code?: unknown }).code === 'ENOENT') return real;\n throw err;\n }\n if (attr.kind !== 'symlink') return real;\n if (hops >= MAX_LINKS) throw errnoError('ELOOP', path);\n const target = (await found.mount.conn.call({ op: 'readlink', path: found.rel })) as string;\n return this.follow(this.base.resolvePath(parentOf(real), target), hops + 1, create);\n }\n\n private async open(mount: Mount, rel: string, write: boolean): Promise<number> {\n return (await mount.conn.call({\n op: 'open',\n path: rel,\n write,\n create: write,\n truncate: write,\n exclusive: false,\n })) as number;\n }\n\n resolvePath(base: string, path: string): string {\n return this.base.resolvePath(base, path);\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found) return this.base.readFileBuffer(real);\n for (let attempt = 1; ; attempt++) {\n try {\n return await this.readWhole(found.mount, real, found.rel);\n } catch (err) {\n if ((err as { code?: unknown }).code !== 'ESTALE' || attempt >= STALE_RETRIES) throw err;\n this.table.forget(found.mount, real);\n }\n }\n }\n\n private async readWhole(mount: Mount, real: string, rel: string): Promise<Uint8Array> {\n await this.table.commit(real);\n const attr = await this.table.getattr(mount, real, rel);\n if (attr.kind === 'directory') throw errnoError('EISDIR', real);\n if (mount.maxFile > 0 && attr.size > mount.maxFile) {\n throw errnoError('EFBIG', `${real} is larger than this mount's maxfile (${mount.maxFile})`);\n }\n const fh = await this.open(mount, rel, false);\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const bytes = (await mount.conn.call({\n op: 'read',\n fh,\n offset: total,\n size: chunk,\n })) as Uint8Array;\n if (bytes.length === 0) break;\n chunks.push(bytes);\n total += bytes.length;\n if (bytes.length < chunk && total >= attr.size) break;\n }\n } finally {\n await mount.conn.call({ op: 'release', fh });\n }\n return concat(chunks, total);\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const real = await this.follow(path, 0, true);\n const found = this.at(real);\n if (!found) return this.base.writeFile(real, content);\n const { mount, rel } = found;\n this.writable(mount, real);\n const bytes = typeof content === 'string' ? new TextEncoder().encode(content) : content;\n if (mount.maxFile > 0 && bytes.length > mount.maxFile) {\n throw errnoError(\n 'EFBIG',\n `${real} would be larger than this mount's maxfile (${mount.maxFile})`\n );\n }\n for (let attempt = 1; ; attempt++) {\n try {\n return await this.writeWhole(mount, real, rel, bytes);\n } catch (err) {\n if ((err as { code?: unknown }).code !== 'ESTALE' || attempt >= STALE_RETRIES) throw err;\n }\n }\n }\n\n private async writeWhole(mount: Mount, real: string, rel: string, bytes: Uint8Array) {\n await this.table.commit(real);\n this.table.forget(mount, real);\n const fh = await this.open(mount, rel, true);\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n try {\n for (let offset = 0; offset < bytes.length; offset += chunk) {\n const part = bytes.slice(offset, offset + chunk);\n await mount.conn.call({ op: 'write', fh, offset, bytes: part }, [part.buffer]);\n }\n } finally {\n await mount.conn.call({ op: 'release', fh });\n this.table.forget(mount, real);\n }\n }\n\n async pread(path: string, offset: number, length: number, version?: string): Promise<Uint8Array> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found && this.base.pread) return this.base.pread(real, offset, length);\n if (!found) return (await this.base.readFileBuffer(real)).slice(offset, offset + length);\n const { mount, rel } = found;\n if ((await this.table.getattr(mount, real, rel)).kind === 'directory') {\n throw errnoError('EISDIR', real);\n }\n await this.table.commitOverlapping(real, offset, length);\n const fh = (await mount.conn\n .call({\n op: 'open',\n path: rel,\n write: false,\n create: false,\n truncate: false,\n exclusive: false,\n ...(version !== undefined ? { ifMatch: version } : {}),\n })\n .catch((err: unknown) => {\n const gone = version !== undefined && (err as { code?: unknown }).code === 'ENOENT';\n throw gone ? errnoError('ESTALE', `${real} is gone from the host`) : err;\n })) as number;\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (total < length) {\n const bytes = (await mount.conn.call({\n op: 'read',\n fh,\n offset: offset + total,\n size: Math.min(chunk, length - total),\n })) as Uint8Array;\n if (bytes.length === 0) break;\n chunks.push(bytes);\n total += bytes.length;\n }\n } finally {\n await mount.conn.call({ op: 'release', fh });\n }\n return concat(chunks, total);\n }\n\n private fits(mount: Mount, real: string, end: number): void {\n if (mount.maxFile > 0 && end > mount.maxFile) {\n throw errnoError(\n 'EFBIG',\n `${real} would be larger than this mount's maxfile (${mount.maxFile})`\n );\n }\n }\n\n async pwrite(path: string, offset: number, bytes: Uint8Array, transfer = false): Promise<void> {\n const real = await this.follow(path, 0, true);\n const found = this.at(real);\n if (!found && this.base.pwrite) return this.base.pwrite(real, offset, bytes);\n if (!found)\n return this.base.writeFile(\n real,\n spliced(await this.base.readFileBuffer(real), offset, bytes)\n );\n const { mount, rel } = found;\n this.writable(mount, real);\n this.fits(mount, real, offset + bytes.length);\n this.table.forget(mount, real);\n if (mount.caps.sessions) {\n const session = this.table.session(mount, real, rel);\n const end = offset + bytes.length;\n await this.writeRuns(mount, await session.fh, offset, bytes, transfer);\n noteExtent(session.extents, offset, end);\n this.table.forget(mount, real);\n return;\n }\n const fh = (await mount.conn.call({\n op: 'open',\n path: rel,\n write: true,\n create: true,\n truncate: false,\n exclusive: false,\n })) as number;\n try {\n await this.writeRuns(mount, fh, offset, bytes, transfer);\n } finally {\n await mount.conn.call({ op: 'release', fh });\n this.table.forget(mount, real);\n }\n }\n\n private async writeRuns(\n mount: Mount,\n fh: number,\n offset: number,\n bytes: Uint8Array,\n transfer: boolean\n ): Promise<void> {\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n for (let at = 0; at < bytes.length; at += chunk) {\n const part = handed(bytes, transfer, chunk) ? bytes : bytes.slice(at, at + chunk);\n await mount.conn.call({ op: 'write', fh, offset: offset + at, bytes: part }, [part.buffer]);\n }\n }\n\n async truncate(path: string, size: number): Promise<void> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found && this.base.truncate) return this.base.truncate(real, size);\n if (!found?.mount.caps.ranges) {\n return this.writeFile(real, resized(await this.readFileBuffer(real), size));\n }\n const { mount, rel } = found;\n this.writable(mount, real);\n this.fits(mount, real, size);\n this.table.forget(mount, real);\n const session = this.table.writing(real);\n if (session) session.truncated = true;\n try {\n await mount.conn.call({ op: 'setattr', path: rel, size });\n } finally {\n this.table.forget(mount, real);\n }\n }\n\n async exists(path: string): Promise<boolean> {\n if (!this.at(path)) return this.base.exists(path);\n try {\n await this.stat(path);\n return true;\n } catch (err) {\n const code = (err as { code?: unknown }).code;\n if (code === 'ENOENT' || code === 'ENOTDIR') return false;\n throw err;\n }\n }\n\n async lstat(path: string): Promise<FsStat> {\n const found = this.at(path);\n if (!found) return this.base.lstat(path);\n const real = normalizePath(path);\n if (this.table.writing(real)?.truncated) await this.table.commit(real);\n return this.statWriting(\n await this.table.getattr(found.mount, real, found.rel),\n real,\n found.mount\n );\n }\n\n private statWriting(attr: DriverAttr, real: string, mount: Mount): FsStat {\n const ends = (this.table.writing(real)?.extents ?? []).map(([, end]) => end);\n return statOf({ ...attr, size: Math.max(attr.size, ...ends) }, real, mount);\n }\n\n async stat(path: string): Promise<FsStat> {\n const real = await this.follow(path);\n return this.at(real) ? this.lstat(real) : this.base.stat(real);\n }\n\n private async entries(\n path: string\n ): Promise<{ real: string; mount: Mount; list: DriverEntry[] }> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found) throw errnoError('ENOTDIR', real);\n return {\n real,\n mount: found.mount,\n list: await this.table.readdir(found.mount, real, found.rel),\n };\n }\n\n async readdir(path: string): Promise<string[]> {\n if (!this.at(path)) return this.base.readdir(path);\n return (await this.entries(path)).list.map((e) => e.name);\n }\n\n async readdirStat(path: string): Promise<Array<[string, FsStat | null]>> {\n if (!this.at(path)) return this.base.readdirStat(path);\n const { real, mount, list } = await this.entries(path);\n return Promise.all(\n list.map(async (entry): Promise<[string, FsStat | null]> => {\n const child = normalizePath(`${real}/${entry.name}`);\n if (entry.attr && mount.caps.listingStats) {\n return [entry.name, this.statWriting(entry.attr, child, mount)];\n }\n return [entry.name, await this.lstat(child).catch(() => null)];\n })\n );\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.mkdir(path, options);\n const { mount, rel } = found;\n const real = normalizePath(path);\n this.writable(mount, real);\n if (!options.recursive) {\n if (rel === '/') throw errnoError('EEXIST', real);\n this.table.forget(mount, real);\n await mount.conn.call({ op: 'mkdir', path: rel });\n return;\n }\n const parts = rel.split('/').filter(Boolean);\n for (let n = 1; n <= parts.length; n++) {\n const sub = `/${parts.slice(0, n).join('/')}`;\n const full = normalizePath(`${mount.target}${sub}`);\n const exists = await this.table.getattr(mount, full, sub).catch(() => undefined);\n if (exists?.kind === 'directory') continue;\n if (exists) throw errnoError('ENOTDIR', full);\n this.table.forget(mount, full);\n await mount.conn.call({ op: 'mkdir', path: sub });\n }\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.rm(path, options);\n const { mount, rel } = found;\n const real = normalizePath(path);\n if (rel === '/') throw errnoError('EBUSY', `${real} is a mount point`);\n this.writable(mount, real);\n await this.table.commitUnder(real);\n let attr: DriverAttr;\n try {\n attr = await this.table.getattr(mount, real, rel);\n } catch (err) {\n if (options.force && (err as { code?: unknown }).code === 'ENOENT') return;\n throw err;\n }\n this.table.forget(mount, real);\n if (attr.kind === 'directory' && options.recursive) {\n for (const entry of await this.table.readdir(mount, real, rel)) {\n await this.rm(`${real}/${entry.name}`, { recursive: true, force: options.force ?? false });\n }\n this.table.forget(mount, real);\n }\n await mount.conn.call({ op: attr.kind === 'directory' ? 'rmdir' : 'unlink', path: rel });\n this.table.forget(mount, real);\n }\n\n async rename(from: string, to: string): Promise<void> {\n const a = this.at(from);\n const b = this.at(to);\n if (!a && !b) return this.base.rename(from, to);\n if (!a || !b || a.mount !== b.mount) throw errnoError('EXDEV', `${from} -> ${to}`);\n this.writable(a.mount, normalizePath(to));\n await this.table.commitUnder(from);\n await this.table.commitUnder(to);\n this.table.forget(a.mount, normalizePath(from));\n this.table.forget(a.mount, normalizePath(to));\n try {\n await a.mount.conn.call({ op: 'rename', from: a.rel, to: b.rel });\n } finally {\n this.table.forget(a.mount, normalizePath(from));\n this.table.forget(a.mount, normalizePath(to));\n }\n }\n\n async symlink(target: string, path: string): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.symlink(target, path);\n this.writable(found.mount, normalizePath(path));\n if (!found.mount.caps.symlinks)\n throw errnoError('EPERM', `${path}: this file system has no symlinks`);\n this.table.forget(found.mount, normalizePath(path));\n await found.mount.conn.call({ op: 'symlink', target, path: found.rel });\n }\n\n async realpath(path: string, follow: boolean): Promise<string> {\n if (this.at(path) || !this.base.realpath) throw errnoError('ENOSYS', path);\n const real = await this.base.realpath(path, follow);\n if (this.at(real)) throw errnoError('ENOSYS', path);\n return real;\n }\n\n async readlink(path: string): Promise<string> {\n const found = this.at(path);\n if (!found) return this.base.readlink(path);\n return (await found.mount.conn.call({ op: 'readlink', path: found.rel })) as string;\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.chmod(path, mode);\n this.writable(found.mount, normalizePath(path));\n if (!found.mount.caps.chmod) return;\n this.table.forget(found.mount, normalizePath(path));\n await found.mount.conn.call({ op: 'setattr', path: found.rel, mode });\n }\n\n async utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found) return this.base.utimes(real, atime, mtime);\n await this.setMtime(found, real, mtime);\n }\n\n async lutimes(path: string, atime: Date, mtime: Date): Promise<void> {\n const found = this.at(path);\n if (!found) return lutimesOf(this.base, path, atime, mtime);\n const real = normalizePath(path);\n if (!found.mount.caps.linkTimes && (await this.lstat(real)).isSymbolicLink) {\n throw errnoError('EOPNOTSUPP', path);\n }\n await this.setMtime(found, real, mtime);\n }\n\n private async setMtime(found: Located, real: string, mtime: Date): Promise<void> {\n this.writable(found.mount, real);\n this.table.forget(found.mount, real);\n await found.mount.conn.call({ op: 'setattr', path: found.rel, mtime: mtime.getTime() });\n }\n}\n", "import type { KernelFs } from '../fs/types.ts';\nimport type { KeptFile } from '../fs/unlinked.ts';\n\nexport interface SyncFsTokenEntry {\n fs: KernelFs;\n cwd: string;\n statfs?: (path: string) => Promise<{ quota: number; usage: number } | undefined>;\n hold?: (path: string, held: boolean, open: boolean, real?: string) => void;\n gate?: <T>(path: string, op: () => Promise<T>) => Promise<T>;\n unlinked?: (path: string) => KeptFile | undefined;\n own?: <T>(path: string, op: () => Promise<T>) => Promise<T>;\n revoked?: (path: string) => boolean;\n renamed?: (from: string, to: string) => void;\n}\n\nconst registry = new Map<string, SyncFsTokenEntry>();\n\nexport function mintSyncFsToken(entry: SyncFsTokenEntry): string {\n const token = crypto.randomUUID();\n registry.set(token, entry);\n return token;\n}\n\nexport function resolveSyncFsToken(token: string): SyncFsTokenEntry | null {\n return registry.get(token) ?? null;\n}\n\nexport function revokeSyncFsToken(token: string): void {\n registry.delete(token);\n}\n", "export const SYNC_FS_OPS = [\n 'read',\n 'write',\n 'exists',\n 'stat',\n 'lstat',\n 'readdir',\n 'readdir-stat',\n 'mkdir',\n 'rm',\n 'rename',\n 'unlink',\n 'rmdir',\n 'symlink',\n 'readlink',\n 'chmod',\n 'utimes',\n 'lutimes',\n 'statfs',\n 'hold',\n 'create',\n 'pread',\n 'pwrite',\n 'truncate',\n] as const;\n\nexport type SyncFsOp = (typeof SYNC_FS_OPS)[number];\n\nexport interface SyncFsRequest {\n token: string;\n op: SyncFsOp;\n path: string;\n body?: Uint8Array;\n arg2?: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n offset?: number;\n length?: number;\n version?: string;\n}\n\nexport type SyncFsResult =\n | { ok: true; kind: 'bytes'; bytes: Uint8Array }\n | { ok: true; kind: 'json'; json: unknown }\n | { ok: true; kind: 'void' }\n | { ok: false; errno: string; message: string };\n\nexport const SYNC_FS_REQUEST_TIMEOUT_MS = 25_000;\n\nexport interface SyncFsBridgeStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink?: boolean;\n size: number;\n mode?: number;\n mtimeMs?: number;\n atimeMs?: number;\n ctimeMs?: number;\n ino?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n version?: string;\n}\n\nexport interface SyncFsUsage {\n quota: number;\n usage: number;\n}\n\nexport function parseSyncFsUsage(json: unknown): SyncFsUsage | null {\n const u = json as Partial<SyncFsUsage> | null;\n if (!u || typeof u.quota !== 'number' || typeof u.usage !== 'number') return null;\n return { quota: u.quota, usage: u.usage };\n}\n\nexport interface SyncFsPosixBridge {\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array, open?: boolean): void;\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n readdir(path: string): string[];\n exists(path: string): boolean;\n mkdir(path: string): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n unlink(path: string): void;\n rmdir(path: string): void;\n symlink(target: string, linkPath: string): void;\n readlink(path: string): string;\n chmod(path: string, mode: number): void;\n utimes(path: string, atimeMs: number, mtimeMs: number): void;\n lutimes(path: string, atimeMs: number, mtimeMs: number): void;\n hold?(path: string, held: boolean, open?: boolean): void;\n create?(path: string): void;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n statfs?(path?: string): SyncFsUsage | null;\n pread?(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate?(path: string, size: number): void;\n}\n\nexport function syncError(code: string, label: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${label}`), { code });\n}\n\nexport function parseSyncFsStat(json: unknown): SyncFsBridgeStat | null {\n const s = json as Partial<SyncFsBridgeStat> | null;\n if (\n !s ||\n typeof s.isFile !== 'boolean' ||\n typeof s.isDirectory !== 'boolean' ||\n typeof s.size !== 'number'\n ) {\n return null;\n }\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n ...(typeof s.mode === 'number' ? { mode: s.mode } : {}),\n ...(typeof s.mtimeMs === 'number' ? { mtimeMs: s.mtimeMs } : {}),\n ...(typeof s.atimeMs === 'number' ? { atimeMs: s.atimeMs } : {}),\n ...(typeof s.ctimeMs === 'number' ? { ctimeMs: s.ctimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\n ...(typeof s.dev === 'number' ? { dev: s.dev } : {}),\n ...(s.readonly === true ? { readonly: true } : {}),\n ...(typeof s.maxFile === 'number' ? { maxFile: s.maxFile } : {}),\n ...(s.ranged === true ? { ranged: true } : {}),\n ...(typeof s.version === 'string' ? { version: s.version } : {}),\n };\n}\n", "import { type FsStat, type KernelFs, lutimesOf, rangedOps } from '../fs/types.ts';\nimport { resolveSyncFsToken, type SyncFsTokenEntry } from './sync-fs-token-registry.ts';\nimport {\n type SyncFsOp,\n type SyncFsRequest,\n type SyncFsResult,\n type SyncFsUsage,\n syncError,\n} from './sync-fs-wire.ts';\n\nexport function toErrno(err: unknown): SyncFsResult {\n const message = err instanceof Error ? err.message : String(err);\n const code = (err as { code?: unknown })?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message };\n }\n return { ok: false, errno: 'EIO', message };\n}\n\nexport interface SyncFsStatJson {\n isDirectory: boolean;\n isFile: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtimeMs: number;\n atimeMs: number;\n ctimeMs: number;\n ino: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n version?: string;\n}\n\nfunction statJson(s: FsStat): SyncFsStatJson {\n return {\n isDirectory: s.isDirectory,\n isFile: s.isFile,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mode: s.mode,\n mtimeMs: s.mtime.getTime(),\n atimeMs: s.atime.getTime(),\n ctimeMs: s.ctime.getTime(),\n ino: s.ino,\n ...(s.dev !== undefined ? { dev: s.dev } : {}),\n ...(s.readonly ? { readonly: true } : {}),\n ...(s.maxFile ? { maxFile: s.maxFile } : {}),\n ...(s.ranged ? { ranged: true } : {}),\n ...(s.version !== undefined ? { version: s.version } : {}),\n };\n}\n\nasync function readdirStat(\n fs: KernelFs,\n dir: string\n): Promise<Array<[string, SyncFsStatJson | null]>> {\n return (await fs.readdirStat(dir)).map(([name, stat]) => [name, stat && statJson(stat)]);\n}\n\nasync function storageUsage(): Promise<SyncFsUsage | null> {\n const estimate = await globalThis.navigator?.storage?.estimate?.();\n if (typeof estimate?.quota !== 'number') return null;\n return { quota: estimate.quota, usage: estimate.usage ?? 0 };\n}\n\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nfunction json(value: unknown): SyncFsResult {\n return { ok: true, kind: 'json', json: value };\n}\n\nasync function run(\n entry: SyncFsTokenEntry,\n path: string,\n req: SyncFsRequest\n): Promise<SyncFsResult> {\n const { fs, cwd } = entry;\n switch (req.op) {\n case 'read':\n return { ok: true, kind: 'bytes', bytes: await fs.readFileBuffer(path) };\n case 'write':\n await fs.writeFile(path, req.body ?? new Uint8Array(0));\n return done;\n case 'exists':\n return json(await fs.exists(path));\n case 'stat':\n return json(statJson(await fs.stat(path)));\n case 'lstat':\n return json(statJson(await fs.lstat(path)));\n case 'readdir':\n return json(await fs.readdir(path));\n case 'readdir-stat':\n return json(await readdirStat(fs, path));\n case 'mkdir':\n await fs.mkdir(path, { recursive: true });\n return done;\n case 'rm':\n await fs.rm(path, { recursive: true });\n return done;\n case 'rename': {\n const to = fs.resolvePath(cwd, req.arg2 ?? '');\n await fs.rename(path, to);\n entry.renamed?.(path, to);\n return done;\n }\n case 'unlink':\n if ((await fs.lstat(path)).isDirectory) throw syncError('EISDIR', path);\n await fs.rm(path);\n return done;\n case 'rmdir':\n if (!(await fs.lstat(path)).isDirectory) throw syncError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw syncError('ENOTEMPTY', path);\n await fs.rm(path, { recursive: true });\n return done;\n case 'symlink':\n await fs.symlink(req.arg2 ?? '', path);\n return done;\n case 'create':\n await createExclusive(fs, path);\n return done;\n case 'readlink':\n return json(await fs.readlink(path));\n case 'chmod':\n await fs.chmod(path, req.mode ?? 0);\n return done;\n case 'utimes':\n await fs.utimes(path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n case 'lutimes':\n await lutimesOf(fs, path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n case 'pread':\n case 'pwrite':\n case 'truncate':\n return ranged(fs, path, req);\n default:\n return { ok: false, errno: 'EINVAL', message: `sync-fs: unknown op '${req.op as string}'` };\n }\n}\n\nasync function createExclusive(fs: KernelFs, path: string): Promise<void> {\n if (fs.createExclusive) return fs.createExclusive(path);\n if (\n await fs.lstat(path).then(\n () => true,\n () => false\n )\n )\n throw syncError('EEXIST', path);\n await fs.writeFile(path, new Uint8Array(0));\n}\n\nasync function ranged(fs: KernelFs, path: string, req: SyncFsRequest): Promise<SyncFsResult> {\n const ops = rangedOps(fs);\n if (!ops) throw syncError('ENOSYS', path);\n const offset = req.offset ?? 0;\n if (req.op === 'pread')\n return {\n ok: true,\n kind: 'bytes',\n bytes: await ops.pread(path, offset, req.length ?? 0, req.version),\n };\n if (req.op === 'pwrite') await ops.pwrite(path, offset, req.body ?? new Uint8Array(0), true);\n else await ops.truncate(path, req.length ?? 0);\n return done;\n}\n\nconst UNLINKED_OPS = new Set<SyncFsOp>(['read', 'pread', 'pwrite', 'truncate']);\nconst OWN_OPS = new Set<SyncFsOp>(['rm', 'unlink', 'rmdir', 'rename']);\n\nexport async function dispatchSyncFs(req: SyncFsRequest): Promise<SyncFsResult> {\n const entry = resolveSyncFsToken(req.token);\n if (!entry) return { ok: false, errno: 'EACCES', message: 'sync-fs: unknown or revoked token' };\n const { fs, cwd } = entry;\n try {\n const path = fs.resolvePath(cwd, req.path);\n if (req.op === 'statfs') return json((await entry.statfs?.(path)) ?? (await storageUsage()));\n if (req.op === 'hold') {\n const [on, open] = [((req.mode ?? 0) & 1) === 1, ((req.mode ?? 0) & 2) === 2];\n const real = on && open ? await fs.realpath?.(path, true).catch(() => path) : undefined;\n entry.hold?.(path, on, open, real);\n return done;\n }\n if (entry.revoked?.(path)) return { ok: false, errno: 'EIO', message: `${path} was unmounted` };\n if ((req.op === 'write' && req.mode === 1) || UNLINKED_OPS.has(req.op)) {\n const serve = async () => {\n const kept = entry.unlinked?.(path);\n return run(entry, kept && !(await fs.exists(path)) ? kept.hidden : path, req);\n };\n return await (entry.gate ? entry.gate(path, serve) : serve());\n }\n if (!entry.own || !OWN_OPS.has(req.op)) return await run(entry, path, req);\n const target = req.op === 'rename' ? fs.resolvePath(cwd, req.arg2 ?? '') : path;\n return await entry.own(target, () => run(entry, path, req));\n } catch (err) {\n return toErrno(err);\n }\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport type { SyncFsRequest, SyncFsResult } from './sync-fs-wire.ts';\n\nexport const SAB_HEADER_I32 = 16;\nexport const SAB_HEADER_BYTES = SAB_HEADER_I32 * 4;\n\nexport const SAB_I_STATE = 0;\nexport const SAB_I_SEQ = 1;\nexport const SAB_I_STATUS = 2;\nexport const SAB_I_TOTAL = 3;\nexport const SAB_I_CHUNK = 4;\nexport const SAB_I_OFFSET = 5;\nexport const SAB_I_REQ = 6;\nexport const SAB_I_PUB = 7;\n\nexport const SAB_I_SIGNALS = 8;\n\nexport const SAB_I_TIMERS = 9;\n\nexport const SAB_I_MEMORY = 10;\n\nexport const SAB_I_TOTAL_HI = 11;\n\nexport const SAB_I_OFFSET_HI = 12;\n\nexport const SAB_I_KILLED = 13;\n\nexport const SAB_I_ASYNC = 14;\n\nexport const SAB_I_STOP = 15;\n\nconst U32 = 2 ** 32;\n\nexport function storeU53(header: Int32Array, lo: number, hi: number, value: number): void {\n Atomics.store(header, hi, Math.floor(value / U32));\n Atomics.store(header, lo, (value % U32) | 0);\n}\n\nexport function loadU53(header: Int32Array, lo: number, hi: number): number {\n return (Atomics.load(header, lo) >>> 0) + Atomics.load(header, hi) * U32;\n}\n\nexport function publishMemory(sab: SharedArrayBuffer, bytes: number): void {\n if (bytes > 0)\n Atomics.store(new Int32Array(sab, 0, SAB_HEADER_I32), SAB_I_MEMORY, Math.ceil(bytes / 65536));\n}\n\nexport const SAB_STATE_IDLE = 0;\nexport const SAB_STATE_PENDING = 1;\nexport const SAB_STATE_READY = 2;\n\nexport const SAB_STATUS_BYTES = 1;\nexport const SAB_STATUS_JSON = 2;\nexport const SAB_STATUS_VOID = 3;\nexport const SAB_STATUS_ERRNO = 4;\n\nexport const SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;\n\nexport const SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;\n\nexport const SYNC_SAB_REQ_MSG = 'sync-sab-req';\n\nexport const SYNC_SAB_NEXT_MSG = 'sync-sab-next';\n\nexport type SyncSabRequestBody = Omit<SyncFsRequest, 'token'> | WasmSyscall;\n\nexport interface SyncSabReqMsg {\n type: typeof SYNC_SAB_REQ_MSG;\n id: number;\n req: SyncSabRequestBody;\n}\nexport interface SyncSabNextMsg {\n type: typeof SYNC_SAB_NEXT_MSG;\n id: number;\n offset: number;\n}\n\nexport interface SabEncodedResult {\n status: number;\n payload: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function encodeSabResult(result: SyncFsResult): SabEncodedResult {\n if (!result.ok) {\n return {\n status: SAB_STATUS_ERRNO,\n payload: encoder.encode(JSON.stringify({ errno: result.errno, message: result.message })),\n };\n }\n switch (result.kind) {\n case 'bytes':\n return { status: SAB_STATUS_BYTES, payload: result.bytes };\n case 'json':\n return { status: SAB_STATUS_JSON, payload: encoder.encode(JSON.stringify(result.json)) };\n default:\n return { status: SAB_STATUS_VOID, payload: new Uint8Array(0) };\n }\n}\n\nexport function decodeSabResult(status: number, payload: Uint8Array): SyncFsResult {\n switch (status) {\n case SAB_STATUS_BYTES:\n return { ok: true, kind: 'bytes', bytes: payload };\n case SAB_STATUS_VOID:\n return { ok: true, kind: 'void' };\n case SAB_STATUS_JSON: {\n try {\n return { ok: true, kind: 'json', json: JSON.parse(decoder.decode(payload)) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed json payload' };\n }\n }\n case SAB_STATUS_ERRNO: {\n try {\n const parsed = JSON.parse(decoder.decode(payload)) as {\n errno?: unknown;\n message?: unknown;\n };\n const errno =\n typeof parsed.errno === 'string' && /^E[A-Z]+$/.test(parsed.errno) ? parsed.errno : 'EIO';\n return { ok: false, errno, message: String(parsed.message ?? errno) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed errno payload' };\n }\n }\n default:\n return { ok: false, errno: 'EIO', message: `sync-sab: unknown status ${status}` };\n }\n}\n\nexport interface SabViews {\n header: Int32Array;\n window: Uint8Array;\n}\n\nexport function sabViews(sab: SharedArrayBuffer): SabViews {\n if (sab.byteLength < SAB_MIN_BYTES) {\n throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);\n }\n return {\n header: new Int32Array(sab, 0, SAB_HEADER_I32),\n window: new Uint8Array(sab, SAB_HEADER_BYTES),\n };\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport {\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsRequest,\n type SyncFsResult,\n} from './sync-fs-wire.ts';\nimport {\n encodeSabResult,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_OFFSET_HI,\n SAB_I_PUB,\n SAB_I_REQ,\n SAB_I_SEQ,\n SAB_I_STATE,\n SAB_I_STATUS,\n SAB_I_TOTAL,\n SAB_I_TOTAL_HI,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n sabViews,\n storeU53,\n} from './sync-sab-wire.ts';\n\nexport interface SabPortLike {\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface SyncSabResponderHandle {\n dispose(): void;\n}\n\ninterface PendingPayload {\n status: number;\n payload: Uint8Array;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst PENDING_TTL_MS = SYNC_FS_REQUEST_TIMEOUT_MS + 5_000;\n\nexport type SyncSabDispatchRequest = SyncFsRequest | (WasmSyscall & { token: string });\n\nexport interface SyncSabResponderOptions {\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>;\n}\n\nexport function attachSyncSabResponder(\n port: SabPortLike,\n sab: SharedArrayBuffer,\n token: string,\n opts: SyncSabResponderOptions\n): SyncSabResponderHandle {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const pending = new Map<number, PendingPayload>();\n let disposed = false;\n\n const { dispatch } = opts;\n\n function drop(id: number): void {\n const entry = pending.get(id);\n if (!entry) return;\n clearTimeout(entry.timer);\n pending.delete(id);\n }\n\n function publish(id: number, entry: PendingPayload, offset: number): void {\n if (Atomics.load(header, SAB_I_REQ) !== id) {\n drop(id);\n return;\n }\n const chunk = Math.min(window.byteLength, entry.payload.byteLength - offset);\n if (chunk > 0) window.set(entry.payload.subarray(offset, offset + chunk));\n Atomics.store(header, SAB_I_STATUS, entry.status);\n storeU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI, entry.payload.byteLength);\n Atomics.store(header, SAB_I_CHUNK, chunk);\n storeU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI, offset);\n Atomics.store(header, SAB_I_SEQ, id);\n Atomics.store(header, SAB_I_STATE, SAB_STATE_READY);\n Atomics.add(header, SAB_I_PUB, 1);\n Atomics.notify(header, SAB_I_PUB);\n\n if (offset + chunk >= entry.payload.byteLength) drop(id);\n }\n\n function settle(id: number, result: SyncFsResult): void {\n if (disposed) return;\n const { status, payload } = encodeSabResult(result);\n\n drop(id);\n const entry: PendingPayload = {\n status,\n payload,\n timer: setTimeout(() => drop(id), PENDING_TTL_MS),\n };\n pending.set(id, entry);\n publish(id, entry, 0);\n }\n\n const handler = (event: MessageEvent): void => {\n const data = event.data as\n | { type?: unknown; id?: unknown; req?: unknown; offset?: unknown }\n | undefined;\n if (!data || typeof data.id !== 'number') return;\n if (data.type === SYNC_SAB_NEXT_MSG) {\n const entry = pending.get(data.id);\n const offset = (data as Partial<SyncSabNextMsg>).offset;\n if (\n !entry ||\n typeof offset !== 'number' ||\n !Number.isInteger(offset) ||\n offset < 0 ||\n offset > entry.payload.byteLength\n ) {\n settle(data.id, { ok: false, errno: 'EIO', message: 'sync-sab: bad continuation' });\n return;\n }\n publish(data.id, entry, offset);\n return;\n }\n if (data.type !== SYNC_SAB_REQ_MSG || !data.req || typeof data.req !== 'object') return;\n const id = data.id;\n\n const body = (data as SyncSabReqMsg).req;\n const req = { ...body, token } as SyncSabDispatchRequest;\n let dispatched: Promise<SyncFsResult>;\n try {\n dispatched = dispatch(req);\n } catch (err) {\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n void dispatched.then(\n (result) => settle(id, result),\n (err) =>\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n };\n\n port.addEventListener('message', handler);\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n port.removeEventListener('message', handler);\n for (const id of [...pending.keys()]) drop(id);\n },\n };\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { KernelError } from './fd-table.ts';\n\nexport type HostSyscall =\n | { op: 'lock'; path: string; exclusive: boolean; fd: number }\n | { op: 'unlock'; path: string }\n | { op: 'async-submit'; req: { op: string } }\n | { op: 'async-wait'; timeoutMs?: number }\n | { op: 'async-take'; id: number }\n | { op: 'async-resolve'; value: unknown }\n | { op: 'async-hold' }\n | { op: 'async-cancel'; id: number }\n | { op: 'async-close' };\n\nexport const HOST_OPS: readonly HostSyscall['op'][] = [\n 'lock',\n 'unlock',\n 'async-submit',\n 'async-wait',\n 'async-take',\n 'async-resolve',\n 'async-hold',\n 'async-cancel',\n 'async-close',\n];\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\ninterface Holder {\n exclusive: boolean;\n fds: Set<number>;\n}\n\nexport class LockTable {\n private readonly held = new Map<string, Map<number, Holder>>();\n\n lock(pid: number, path: string, exclusive: boolean, fd: number): boolean {\n const holders = this.held.get(path) ?? new Map<number, Holder>();\n for (const [other, h] of holders) if (other !== pid && (exclusive || h.exclusive)) return false;\n const mine = holders.get(pid) ?? { exclusive, fds: new Set<number>() };\n mine.exclusive = exclusive;\n mine.fds.add(fd);\n holders.set(pid, mine);\n this.held.set(path, holders);\n return true;\n }\n\n unlock(pid: number, path: string): void {\n const holders = this.held.get(path);\n holders?.delete(pid);\n if (holders?.size === 0) this.held.delete(path);\n }\n\n closed(pid: number, fd: number): void {\n for (const [path, holders] of [...this.held]) {\n const mine = holders.get(pid);\n if (mine?.fds.delete(fd) && mine.fds.size === 0) this.unlock(pid, path);\n }\n }\n\n release(pid: number): void {\n for (const path of [...this.held.keys()]) this.unlock(pid, path);\n }\n}\n\ntype Run = (req: { op: string }, cancelled: AbortSignal) => Promise<SyncFsResult>;\n\nexport class AsyncOps {\n private next = 1;\n private readonly results = new Map<number, SyncFsResult | undefined>();\n private readonly ready: number[] = [];\n private readonly running = new Map<number, AbortController>();\n private readonly waiters = new Set<() => void>();\n private closed = false;\n private readonly run: Run;\n private readonly onReady: (() => void) | undefined;\n\n constructor(run: Run, onReady?: () => void) {\n this.run = run;\n this.onReady = onReady;\n }\n\n submit(req: { op: string }): number {\n const id = this.hold();\n const running = new AbortController();\n this.running.set(id, running);\n this.run(req, running.signal).then(\n (result) => this.complete(id, result),\n (err: unknown) => this.complete(id, { ok: false, errno: 'EIO', message: String(err) })\n );\n return id;\n }\n\n resolve(value: unknown): number {\n const id = this.hold();\n this.complete(id, json(value));\n return id;\n }\n\n hold(): number {\n const id = this.next++;\n this.results.set(id, undefined);\n return id;\n }\n\n take(id: number): SyncFsResult {\n if (!this.results.has(id)) throw new KernelError('EINVAL');\n const result = this.results.get(id);\n if (!result) throw new KernelError('EAGAIN');\n this.forget(id);\n return result;\n }\n\n cancel(id: number): void {\n this.running.get(id)?.abort();\n this.forget(id);\n }\n\n private forget(id: number): void {\n this.running.delete(id);\n this.results.delete(id);\n const at = this.ready.indexOf(id);\n if (at >= 0) this.ready.splice(at, 1);\n }\n\n async wait(timeoutMs: number | undefined, signal: AbortSignal): Promise<number> {\n for (;;) {\n if (this.closed) return -1;\n const id = this.ready.shift();\n if (id !== undefined) return id;\n if (timeoutMs !== undefined && timeoutMs <= 0) return 0;\n const woke = await this.sleep(timeoutMs, signal);\n if (!woke) return 0;\n }\n }\n\n close(): void {\n this.closed = true;\n this.wake();\n }\n\n private sleep(timeoutMs: number | undefined, signal: AbortSignal): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n clearTimeout(timer);\n this.waiters.delete(wake);\n signal.removeEventListener('abort', abort);\n };\n const wake = () => {\n cleanup();\n resolve(true);\n };\n const abort = () => {\n cleanup();\n reject(new KernelError('EINTR'));\n };\n this.waiters.add(wake);\n signal.addEventListener('abort', abort, { once: true });\n if (timeoutMs !== undefined) {\n timer = setTimeout(() => {\n cleanup();\n resolve(false);\n }, timeoutMs);\n }\n });\n }\n\n private complete(id: number, result: SyncFsResult): void {\n this.running.delete(id);\n if (!this.results.has(id)) return;\n this.results.set(id, result);\n this.ready.push(id);\n this.wake();\n this.onReady?.();\n }\n\n private wake(): void {\n for (const wake of [...this.waiters]) wake();\n }\n}\n\nexport interface HostOpsContext {\n pid: number;\n locks: LockTable | undefined;\n ops: AsyncOps;\n blocking: () => AbortSignal;\n valid: (req: { op: string }) => boolean;\n}\n\nexport async function hostSyscall(req: HostSyscall, ctx: HostOpsContext): Promise<SyncFsResult> {\n switch (req.op) {\n case 'lock':\n if (!ctx.locks) throw new KernelError('ENOSYS');\n if (!ctx.locks.lock(ctx.pid, req.path, req.exclusive, req.fd))\n throw new KernelError('EAGAIN');\n return done;\n case 'unlock':\n ctx.locks?.unlock(ctx.pid, req.path);\n return done;\n case 'async-submit':\n if (!ctx.valid(req.req)) throw new KernelError('EINVAL');\n return json(ctx.ops.submit(req.req));\n case 'async-wait':\n return json(await ctx.ops.wait(req.timeoutMs, ctx.blocking()));\n case 'async-take':\n return ctx.ops.take(req.id);\n case 'async-resolve':\n return json(ctx.ops.resolve(req.value));\n case 'async-hold':\n return json(ctx.ops.hold());\n case 'async-cancel':\n ctx.ops.cancel(req.id);\n return done;\n case 'async-close':\n ctx.ops.close();\n return done;\n }\n}\n", "export const HOST_LOOPBACK = 'host.slicc.internal';\n\nexport const HOST_LOOPBACK_ADDRESS = [10, 0, 2, 2] as const;\n\nexport const PAGE_LOOPBACK = 'kernel.localhost';\n\nexport const PAGE_LOOPBACK_URL = `http://{port}.${PAGE_LOOPBACK}`;\n\nexport function toHostLoopback(href: string): string {\n const url = new URL(href);\n if (url.hostname.replace(/\\.$/, '').toLowerCase() !== HOST_LOOPBACK) return href;\n url.hostname = '127.0.0.1';\n return url.href;\n}\n\nexport const DEFAULT_HOSTNAME = 'slicc';\n\nexport const HOSTNAME_ADDRESS = '127.0.1.1';\n\nexport const LIBC_HOSTNAMES: readonly string[] = ['emscripten', 'wasmer.sh'];\n\nconst LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;\n\nfunction reserved(name: string): boolean {\n const lower = name.toLowerCase();\n return (\n lower === 'localhost' ||\n lower.endsWith('.localhost') ||\n lower === HOST_LOOPBACK ||\n lower === 'wasmer.sh' ||\n /^\\d+(\\.\\d+){3}$/.test(lower)\n );\n}\n\nexport function isHostname(name: unknown): name is string {\n if (typeof name !== 'string' || name.length > 253 || reserved(name)) return false;\n return name.split('.').every((l) => LABEL.test(l));\n}\n\nexport function hostnameOf(env: Readonly<Record<string, string>>): string {\n return isHostname(env.HOSTNAME) ? env.HOSTNAME : DEFAULT_HOSTNAME;\n}\n\nexport function ownNames(hostname: string): string[] {\n return [...new Set([hostname.toLowerCase(), ...LIBC_HOSTNAMES])];\n}\n\nexport function hostsFile(hostname: string = DEFAULT_HOSTNAME): string {\n return [\n '127.0.0.1 localhost localhost.localdomain',\n '::1 localhost ip6-localhost',\n `${HOSTNAME_ADDRESS} ${ownNames(hostname).join(' ')}`,\n `${HOST_LOOPBACK_ADDRESS.join('.')} ${HOST_LOOPBACK}`,\n '',\n ].join('\\n');\n}\n", "import {\n acceptKey,\n closeFrame,\n frame,\n isUpgrade,\n OP_BINARY,\n OP_TEXT,\n pongFrame,\n sendableCode,\n switchingHead,\n WsError,\n WsReader,\n} from '../../cdp/websocket.ts';\nimport { KernelError } from '../fd-table.ts';\nimport type { KernelSocket, LoopbackNet } from '../socket.ts';\nimport {\n type ByteSource,\n chunk,\n fieldTokens,\n fieldValues,\n HttpError,\n Incoming,\n LAST_CHUNK,\n latin1Bytes,\n parseRequestHead,\n REASON,\n type RequestHead,\n readBody,\n requestFraming,\n responseHead,\n} from './http1.ts';\nimport { toHostLoopback } from './loopback-names.ts';\nimport type {\n HeaderList,\n RealmTransport,\n RealmTransportResponse,\n RealmWebSocket,\n} from './transport.ts';\nimport { MESSAGE_LIMIT } from './ws-queue.ts';\n\nconst SEND_BUFFER = 1024 * 1024;\nconst TLS_HANDSHAKE = 0x16;\nconst TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\nconst NO_WEBSOCKET =\n 'WebSocket not supported by this transport (fetchTransport needs { webSocket: true })';\n\nexport const REALM_PROXY_PORT = 3128;\nexport interface ProxyLimits {\n maxConnections: number;\n maxHead: number;\n idleMs: number;\n bodyBudget: number;\n closeWaitMs: number;\n}\nconst DEFAULT_LIMITS: ProxyLimits = {\n maxConnections: 64,\n maxHead: 64 * 1024,\n idleMs: 120000,\n bodyBudget: 128 * 1024 * 1024,\n closeWaitMs: 5000,\n};\nexport interface TunnelTarget {\n host: string;\n port: number;\n}\nexport interface HttpSink {\n write(bytes: Uint8Array, signal?: AbortSignal): Promise<unknown>;\n}\nexport type ServeHttp = (source: ByteSource, sink: HttpSink, origin: string) => Promise<void>;\nexport type TunnelHandler = (\n conn: KernelSocket,\n incoming: Incoming,\n target: TunnelTarget,\n signal: AbortSignal,\n serveHttp: ServeHttp\n) => Promise<void>;\nexport interface RealmProxyOptions {\n net: LoopbackNet;\n transport: RealmTransport;\n host?: string;\n port?: number;\n tunnel?: TunnelHandler;\n tunnelReady?: () => Promise<void>;\n limits?: Partial<ProxyLimits>;\n}\nconst HOP_BY_HOP = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-connection',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\nconst REQUEST_OWN = new Set(['host', 'content-length', 'expect']);\nclass Budget {\n private free: number;\n private waiters: Array<() => void> = [];\n constructor(free: number) {\n this.free = free;\n }\n async acquire(n: number, signal: AbortSignal): Promise<void> {\n while (this.free < n) {\n signal.throwIfAborted();\n await new Promise<void>((resolve) => {\n const done = (): void => {\n signal.removeEventListener('abort', done);\n resolve();\n };\n this.waiters.push(done);\n signal.addEventListener('abort', done, { once: true });\n });\n }\n this.free -= n;\n }\n release(n: number): void {\n this.free += n;\n const waiters = this.waiters;\n this.waiters = [];\n for (const wake of waiters) wake();\n }\n}\nexport function canonicalHost(host: string): string | undefined {\n const bare = host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;\n try {\n return new URL(`http://${bare}/`).hostname;\n } catch {\n return undefined;\n }\n}\nfunction localV4(a: number, b: number): boolean {\n return a === 127 || a === 0 || (a === 169 && b === 254);\n}\nfunction hextets(address: string): number[] | undefined {\n const [head, tail, extra] = address.split('::');\n if (extra !== undefined) return undefined;\n const part = (text: string | undefined) =>\n text ? text.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n const groups =\n tail === undefined\n ? front\n : [...front, ...new Array(8 - front.length - back.length).fill(0), ...back];\n return groups.length === 8 && groups.every((g) => g >= 0 && g <= 0xffff) ? groups : undefined;\n}\nfunction localV6(address: string): boolean {\n const g = hextets(address);\n if (!g) return true;\n if ((g[0] & 0xffc0) === 0xfe80) return true;\n const zeroPrefix = g.slice(0, 5).every((x) => x === 0);\n if (!zeroPrefix) return false;\n if (g[5] === 0xffff || (g[5] === 0 && g[6] !== 0)) return localV4(g[6] >> 8, g[6] & 0xff);\n return g[5] === 0 && g[6] === 0;\n}\nexport function isLoopbackHost(hostname: string): boolean {\n const canonical = canonicalHost(hostname);\n if (canonical === undefined) return false;\n const host = canonical.replace(/\\.+$/, '');\n if (host === 'localhost' || host.endsWith('.localhost')) return true;\n if (host.startsWith('[')) return localV6(host.slice(1, -1));\n const v4 = /^(\\d+)\\.(\\d+)\\.\\d+\\.\\d+$/.exec(host);\n return v4 ? localV4(Number(v4[1]), Number(v4[2])) : false;\n}\nfunction dropped(headers: HeaderList): Set<string> {\n return new Set([...HOP_BY_HOP, ...fieldTokens(headers, 'connection')]);\n}\nexport function forwardRequestHeaders(headers: HeaderList): HeaderList {\n const drop = dropped(headers);\n return headers.filter(([name]) => {\n const lower = name.toLowerCase();\n return !drop.has(lower) && !REQUEST_OWN.has(lower);\n });\n}\nexport function forwardResponseHeaders(\n headers: HeaderList,\n opts: {\n encodedBodies: boolean;\n bodiless: boolean;\n }\n): Array<readonly [string, string]> {\n const drop = dropped(headers);\n if (!opts.encodedBodies) drop.add('content-encoding');\n if (!(opts.encodedBodies && opts.bodiless)) drop.add('content-length');\n return headers.filter(([name]) => !drop.has(name.toLowerCase()));\n}\nfunction keepsAlive(req: RequestHead): boolean {\n const tokens = fieldTokens(req.headers, 'connection');\n if (tokens.includes('close')) return false;\n return req.minor >= 1 || tokens.includes('keep-alive');\n}\nexport function tunnelRequestUrl(req: RequestHead, origin: string): string {\n const base = new URL(origin);\n let url: URL;\n try {\n url = new URL(req.target, req.target.startsWith('/') ? base : undefined);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n const hosts = fieldValues(req.headers, 'host');\n const hostOk = hosts.every(\n (h) => URL.canParse(`https://${h}`) && new URL(`https://${h}`).host === base.host\n );\n if (url.origin !== base.origin || !hostOk) {\n throw new HttpError(421, `this tunnel is for ${base.host}`);\n }\n return url.href;\n}\nexport function requestUrl(req: RequestHead): string {\n if (req.target.startsWith('/')) {\n throw new HttpError(400, 'this is a proxy: send the absolute URL (GET http://host/path)');\n }\n let url: URL;\n try {\n url = new URL(req.target);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new HttpError(400, `unsupported scheme ${url.protocol}`);\n }\n if (isLoopbackHost(url.hostname)) {\n throw new HttpError(\n 403,\n `${url.hostname} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return url.href;\n}\nexport function tunnelTarget(req: RequestHead): TunnelTarget {\n const match = /^([A-Za-z0-9.-]+|\\[[0-9A-Fa-f:.]+\\]):(\\d{1,5})$/.exec(req.target);\n const port = Number(match?.[2]);\n if (!match || port < 1 || port > 65535) {\n throw new HttpError(400, 'CONNECT needs host:port');\n }\n const host = canonicalHost(match[1]);\n if (host === undefined) throw new HttpError(400, 'CONNECT needs host:port');\n if (isLoopbackHost(host)) {\n throw new HttpError(\n 403,\n `${host} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return { host, port };\n}\nexport async function watchHangup(\n conn: KernelSocket,\n abort: AbortController,\n until: AbortSignal\n): Promise<void> {\n while (!until.aborted && !abort.signal.aborted) {\n if (conn.poll().hangup) {\n abort.abort(new KernelError('EPIPE'));\n return;\n }\n try {\n await conn.changed(until);\n } catch {\n return;\n }\n }\n}\nfunction untilAborted(\n response: Promise<RealmTransportResponse>,\n signal: AbortSignal\n): Promise<RealmTransportResponse> {\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason ?? new KernelError('EINTR'));\n response.then((late) => late.cancel()).catch(() => undefined);\n };\n if (signal.aborted) return onAbort();\n signal.addEventListener('abort', onAbort, { once: true });\n response.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n });\n}\ninterface Idle {\n ms: number;\n}\ninterface Exchange {\n sink: HttpSink;\n incoming: Incoming;\n origin?: string;\n conn?: KernelSocket;\n socket: KernelSocket;\n idle: Idle;\n}\nfunction plainResponse(status: number, message: string): RealmTransportResponse {\n const body = latin1Bytes(`slicc realm proxy: ${message}\\n`);\n return {\n status,\n statusText: REASON[status] ?? '',\n headers: [['Content-Type', 'text/plain; charset=utf-8']],\n body: (async function* () {\n yield body;\n })(),\n cancel: async () => undefined,\n };\n}\nfunction timedSource(conn: KernelSocket, idle: Idle, stop: AbortSignal): ByteSource {\n return {\n read: (max, signal) => {\n const own = signal ? [stop, signal] : [stop];\n if (Number.isFinite(idle.ms)) own.push(AbortSignal.timeout(idle.ms));\n return conn.read(max, AbortSignal.any(own));\n },\n };\n}\nexport function webSocketTarget(req: RequestHead): RequestHead {\n return { ...req, target: req.target.replace(/^ws(s?):/i, (_, s) => `http${s.toLowerCase()}:`) };\n}\nfunction wireCode(code: number): number {\n if (code === 1005) return 1000;\n return sendableCode(code) ? code : 1011;\n}\nfunction quietly(ms: number): Promise<void> {\n return new Promise((resolve) => {\n AbortSignal.timeout(ms).addEventListener('abort', () => resolve(), { once: true });\n });\n}\nexport class RealmProxy {\n private readonly options: RealmProxyOptions;\n private readonly listener: KernelSocket;\n private readonly stop = new AbortController();\n private readonly limits: ProxyLimits;\n private readonly slots: Budget;\n private readonly bodies: Budget;\n private readonly connections = new Set<KernelSocket>();\n private warnedWebSocket = false;\n readonly closed: Promise<void>;\n readonly port: number;\n constructor(options: RealmProxyOptions) {\n this.options = options;\n this.limits = { ...DEFAULT_LIMITS, ...options.limits };\n this.slots = new Budget(this.limits.maxConnections);\n this.bodies = new Budget(this.limits.bodyBudget);\n this.listener = options.net.listen({\n family: 'inet',\n host: options.host ?? '127.0.0.1',\n port: options.port ?? REALM_PROXY_PORT,\n });\n this.port = this.listener.local?.family === 'inet' ? this.listener.local.port : 0;\n this.closed = this.acceptLoop();\n }\n get stopped(): boolean {\n return this.stop.signal.aborted;\n }\n close(): void {\n if (this.stop.signal.aborted) return;\n this.stop.abort();\n this.listener.close();\n for (const conn of this.connections) conn.close();\n }\n private async acceptLoop(): Promise<void> {\n const served = new Set<Promise<void>>();\n try {\n for (;;) {\n await this.slots.acquire(1, this.stop.signal);\n let conn: KernelSocket;\n try {\n conn = await this.listener.accept(this.stop.signal);\n } catch {\n this.slots.release(1);\n break;\n }\n const done = this.serve(conn).finally(() => {\n this.slots.release(1);\n served.delete(done);\n });\n served.add(done);\n }\n } catch {}\n await Promise.allSettled([...served]);\n }\n private async serve(conn: KernelSocket): Promise<void> {\n this.connections.add(conn);\n const idle = { ms: this.limits.idleMs };\n const incoming = new Incoming(timedSource(conn, idle, this.stop.signal));\n try {\n await this.requests({ sink: conn, incoming, conn, socket: conn, idle });\n } finally {\n this.connections.delete(conn);\n conn.close();\n }\n }\n private async requests(ctx: Exchange): Promise<void> {\n try {\n for (;;) {\n const head = await ctx.incoming.head(this.limits.maxHead);\n if (!head || !(await this.exchange(ctx, head))) break;\n }\n } catch (e) {\n if (e instanceof HttpError) await this.refuse(ctx.sink, e);\n }\n }\n private async refuse(sink: HttpSink, error: HttpError): Promise<void> {\n try {\n await this.relay(sink, 'GET', 1, plainResponse(error.status, error.message), false);\n } catch {}\n }\n private async exchange(ctx: Exchange, head: Uint8Array): Promise<boolean> {\n const { sink: conn, incoming } = ctx;\n const req = parseRequestHead(head);\n if (req.method === 'CONNECT') {\n if (!ctx.conn) throw new HttpError(400, 'CONNECT inside a tunnel');\n await this.connect(ctx.conn, incoming, req, ctx.idle);\n return false;\n }\n if (req.method === 'GET' && isUpgrade(req.headers)) {\n await this.websocket(ctx, req);\n return false;\n }\n const url = ctx.origin ? tunnelRequestUrl(req, ctx.origin) : requestUrl(req);\n const keep = keepsAlive(req);\n const framing = requestFraming(req.headers);\n const reserve =\n framing.kind === 'length' ? framing.length : framing.kind === 'chunked' ? this.cap() : 0;\n if (reserve > this.cap()) throw new HttpError(413, `request body over ${this.cap()} bytes`);\n await this.expectContinue(conn, req, framing.kind !== 'none');\n await this.bodies.acquire(reserve, this.stop.signal);\n let response: RealmTransportResponse;\n const abort = new AbortController();\n const stopExchange = () => abort.abort();\n this.stop.signal.addEventListener('abort', stopExchange, { once: true });\n try {\n try {\n const body = await readBody(incoming, framing, this.cap());\n const waiting = new AbortController();\n void watchHangup(ctx.socket, abort, waiting.signal);\n try {\n response = await this.upstream(req, url, body, abort.signal);\n } finally {\n waiting.abort();\n }\n } finally {\n this.bodies.release(reserve);\n }\n return await this.relay(conn, req.method, req.minor, response, keep);\n } finally {\n this.stop.signal.removeEventListener('abort', stopExchange);\n abort.abort();\n }\n }\n private cap(): number {\n return Math.min(this.options.transport.traits.maxRequestBody, this.limits.bodyBudget);\n }\n private async expectContinue(conn: HttpSink, req: RequestHead, hasBody: boolean): Promise<void> {\n const expect = fieldTokens(req.headers, 'expect');\n if (expect.length === 0) return;\n if (expect.length !== 1 || expect[0] !== '100-continue') {\n throw new HttpError(417, `unsupported expectation: ${expect.join(', ')}`);\n }\n if (hasBody && req.minor >= 1) {\n await conn.write(latin1Bytes('HTTP/1.1 100 Continue\\r\\n\\r\\n'), this.stop.signal);\n }\n }\n private async upstream(\n req: RequestHead,\n url: string,\n body: Uint8Array | undefined,\n signal: AbortSignal\n ): Promise<RealmTransportResponse> {\n try {\n const fetching = this.options.transport.fetch({\n url: toHostLoopback(url),\n method: req.method.toUpperCase(),\n headers: forwardRequestHeaders(req.headers),\n body: req.method === 'GET' || req.method === 'HEAD' ? undefined : body,\n signal,\n });\n return await untilAborted(fetching, signal);\n } catch (e) {\n if (signal.aborted) throw e;\n const message = e instanceof Error ? e.message : String(e);\n const status = (\n e as {\n status?: unknown;\n } | null\n )?.status;\n const own = typeof status === 'number' && status >= 400 && status <= 599 ? status : 502;\n return plainResponse(own, message || 'upstream request failed');\n }\n }\n private async relay(\n conn: HttpSink,\n method: string,\n minor: number,\n response: RealmTransportResponse,\n keepAlive: boolean\n ): Promise<boolean> {\n const status = response.status;\n const bodiless = method === 'HEAD' || status === 204 || status === 304 || status < 200;\n const headers = forwardResponseHeaders(response.headers, {\n encodedBodies: this.options.transport.traits.encodedBodies,\n bodiless,\n });\n const chunked = !bodiless && minor >= 1;\n const keep = keepAlive && (bodiless || chunked);\n headers.push(['Connection', keep ? 'keep-alive' : 'close']);\n if (chunked) headers.push(['Transfer-Encoding', 'chunked']);\n const signal = this.stop.signal;\n await conn.write(\n responseHead(status, response.statusText || REASON[status] || '', headers),\n signal\n );\n if (bodiless) {\n await response.cancel();\n return keep;\n }\n try {\n for await (const piece of response.body) {\n if (piece.length > 0) await conn.write(chunked ? chunk(piece) : piece, signal);\n }\n } catch {\n await response.cancel().catch(() => undefined);\n return false;\n }\n if (chunked) await conn.write(LAST_CHUNK, signal);\n return keep;\n }\n private async connect(\n conn: KernelSocket,\n incoming: Incoming,\n req: RequestHead,\n idle: Idle\n ): Promise<void> {\n const target = tunnelTarget(req);\n const refused = target.port === 443 ? await this.tunnelReady(target) : undefined;\n if (refused) throw refused;\n await conn.write(latin1Bytes('HTTP/1.1 200 Connection Established\\r\\n\\r\\n'), this.stop.signal);\n try {\n const first = await incoming.peek(this.stop.signal);\n if (first === undefined) return;\n if (first !== TLS_HANDSHAKE) {\n const origin = `http://${target.port === 80 ? target.host : `${target.host}:${target.port}`}`;\n await this.requests({ sink: conn, incoming, origin, socket: conn, idle });\n return;\n }\n const tunnel = this.options.tunnel;\n if (!tunnel || (target.port !== 443 && (await this.tunnelReady(target)))) return;\n await tunnel(conn, incoming, target, this.stop.signal, (source, sink, origin) =>\n this.requests({ sink, incoming: new Incoming(source), origin, socket: conn, idle })\n );\n } catch {}\n }\n private async tunnelReady(target: TunnelTarget): Promise<HttpError | undefined> {\n const name = `CONNECT ${target.host}:${target.port}`;\n if (!this.options.tunnel) return new HttpError(501, `${name}: no tunnels through this proxy`);\n try {\n await this.options.tunnelReady?.();\n return undefined;\n } catch (e) {\n return new HttpError(501, `${name}: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n private async websocket(ctx: Exchange, req: RequestHead): Promise<void> {\n const href = ctx.origin ? tunnelRequestUrl(req, ctx.origin) : requestUrl(webSocketTarget(req));\n const { transport } = this.options;\n if (!transport.traits.websocket || !transport.websocket) {\n if (!this.warnedWebSocket) {\n this.warnedWebSocket = true;\n console.warn(`slicc-kernel: a program asked for a WebSocket: ${NO_WEBSOCKET}`);\n }\n throw new HttpError(501, NO_WEBSOCKET);\n }\n const accept = await acceptKey(req.headers);\n const protocols = fieldValues(req.headers, 'sec-websocket-protocol')\n .flatMap((v) => v.split(','))\n .map((t) => t.trim())\n .filter((t) => t !== '');\n const hangup = new AbortController();\n const waiting = new AbortController();\n void watchHangup(ctx.socket, hangup, waiting.signal);\n let socket: RealmWebSocket;\n try {\n socket = await transport.websocket({\n url: toHostLoopback(href).replace(/^http/, 'ws'),\n protocols,\n headers: forwardRequestHeaders(req.headers),\n signal: AbortSignal.any([this.stop.signal, hangup.signal]),\n });\n } catch (e) {\n waiting.abort();\n throw new HttpError(502, e instanceof Error ? e.message : String(e));\n }\n ctx.idle.ms = Number.POSITIVE_INFINITY;\n try {\n if (hangup.signal.aborted) throw hangup.signal.reason;\n if (\n socket.protocol &&\n !(protocols.includes(socket.protocol) && TOKEN.test(socket.protocol))\n ) {\n throw new HttpError(502, 'the far end chose a subprotocol the client did not offer');\n }\n await ctx.sink.write(switchingHead(accept, socket.protocol), this.stop.signal);\n await this.bridge(ctx, socket, hangup.signal);\n } catch (e) {\n socket.close(1001, 'the client went away');\n throw e;\n } finally {\n waiting.abort();\n }\n }\n private async bridge(ctx: Exchange, socket: RealmWebSocket, hangup: AbortSignal): Promise<void> {\n const stop = this.stop.signal;\n let chain: Promise<unknown> = Promise.resolve();\n const toGuest = (bytes: Uint8Array): Promise<unknown> => {\n chain = chain.then(() => ctx.sink.write(bytes, stop));\n return chain;\n };\n const done = new AbortController();\n const reading = AbortSignal.any([stop, done.signal, hangup]);\n const stopping = () => socket.close(1001, 'the proxy is stopping');\n stop.addEventListener('abort', stopping, { once: true });\n let guestDone = false;\n let closeSent = false;\n const outbound = (async () => {\n for await (const data of socket.messages) {\n if (guestDone) continue;\n const text = typeof data === 'string';\n await toGuest(\n frame(text ? OP_TEXT : OP_BINARY, text ? new TextEncoder().encode(data) : data)\n );\n }\n const closed = await socket.closed;\n if (guestDone) return;\n closeSent = true;\n await toGuest(closeFrame(wireCode(closed.code), closed.reason));\n AbortSignal.timeout(this.limits.closeWaitMs).addEventListener('abort', () => done.abort(), {\n once: true,\n });\n })().catch(() => done.abort());\n const reader = new WsReader(ctx.incoming, MESSAGE_LIMIT, true);\n try {\n for (;;) {\n const event = await reader.next(reading);\n if (!event) break;\n if (event.kind === 'ping') {\n await toGuest(pongFrame(event.payload));\n continue;\n }\n if (event.kind === 'close') {\n guestDone = true;\n if (closeSent) break;\n const code = wireCode(event.code);\n socket.close(code, event.reason);\n const reply = await Promise.race([\n socket.closed,\n quietly(this.limits.closeWaitMs).then(() => ({ code, reason: event.reason })),\n ]);\n await toGuest(closeFrame(wireCode(reply.code), reply.reason));\n break;\n }\n while (socket.buffered > SEND_BUFFER && !reading.aborted) await quietly(10);\n socket.send(event.kind === 'text' ? event.text : event.bytes);\n }\n } catch (e) {\n if (e instanceof WsError) {\n guestDone = true;\n socket.close(e.code, e.message);\n await toGuest(closeFrame(e.code, e.message)).catch(() => undefined);\n }\n } finally {\n guestDone = true;\n socket.close(1000, 'the client went away');\n stop.removeEventListener('abort', stopping);\n await Promise.race([outbound, quietly(this.limits.closeWaitMs)]);\n }\n }\n}\n", "export type Signer = (tbs: Uint8Array) => Promise<Uint8Array>;\nfunction concat(parts: readonly Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n let at = 0;\n for (const p of parts) {\n out.set(p, at);\n at += p.length;\n }\n return out;\n}\nfunction length(n: number): Uint8Array {\n if (n < 0x80) return Uint8Array.of(n);\n const bytes: number[] = [];\n for (let v = n; v > 0; v = Math.floor(v / 256)) bytes.unshift(v & 0xff);\n return Uint8Array.of(0x80 | bytes.length, ...bytes);\n}\nexport function tlv(tag: number, ...contents: readonly Uint8Array[]): Uint8Array {\n const body = concat(contents);\n return concat([Uint8Array.of(tag), length(body.length), body]);\n}\nconst seq = (...parts: Uint8Array[]) => tlv(0x30, ...parts);\nconst set = (...parts: Uint8Array[]) => tlv(0x31, ...parts);\nconst octets = (bytes: Uint8Array) => tlv(0x04, bytes);\nconst bits = (bytes: Uint8Array, unused = 0) => tlv(0x03, Uint8Array.of(unused), bytes);\nconst TRUE = tlv(0x01, Uint8Array.of(0xff));\nexport function integer(magnitude: Uint8Array): Uint8Array {\n let start = 0;\n while (start < magnitude.length - 1 && magnitude[start] === 0) start++;\n const trimmed = magnitude.subarray(start);\n return tlv(0x02, trimmed[0] & 0x80 ? concat([Uint8Array.of(0), trimmed]) : trimmed);\n}\nexport function oid(dotted: string): Uint8Array {\n const [a, b, ...rest] = dotted.split('.').map(Number);\n const out = [40 * a + b];\n for (const arc of rest) {\n const groups: number[] = [];\n for (let v = arc; ; v = Math.floor(v / 128)) {\n groups.unshift(v & 0x7f);\n if (v < 128) break;\n }\n out.push(...groups.map((g, i) => (i < groups.length - 1 ? g | 0x80 : g)));\n }\n return tlv(0x06, Uint8Array.from(out));\n}\nconst utf8 = (text: string) => tlv(0x0c, new TextEncoder().encode(text));\nconst ascii = (text: string) => Uint8Array.from(text, (c) => c.charCodeAt(0) & 0x7f);\nfunction time(date: Date): Uint8Array {\n const iso = date.toISOString().replace(/[-:T]/g, '').slice(0, 14);\n const year = date.getUTCFullYear();\n return year < 2050 ? tlv(0x17, ascii(`${iso.slice(2)}Z`)) : tlv(0x18, ascii(`${iso}Z`));\n}\nconst ECDSA_SHA256 = seq(oid('1.2.840.10045.4.3.2'));\nexport interface DistinguishedName {\n commonName: string;\n organization?: string;\n}\nfunction name(dn: DistinguishedName): Uint8Array {\n const rdns = [];\n if (dn.organization) rdns.push(set(seq(oid('2.5.4.10'), utf8(dn.organization))));\n rdns.push(set(seq(oid('2.5.4.3'), utf8(dn.commonName))));\n return seq(...rdns);\n}\nfunction extension(id: string, critical: boolean, value: Uint8Array): Uint8Array {\n return critical ? seq(oid(id), TRUE, octets(value)) : seq(oid(id), octets(value));\n}\nexport function children(der: Uint8Array): Uint8Array[] {\n const out: Uint8Array[] = [];\n const [, bodyStart, bodyEnd] = header(der, 0);\n for (let at = bodyStart; at < bodyEnd; ) {\n const [, , end] = header(der, at);\n out.push(der.subarray(at, end));\n at = end;\n }\n return out;\n}\nfunction header(der: Uint8Array, at: number): [tag: number, start: number, end: number] {\n const tag = der[at];\n let len = der[at + 1];\n let start = at + 2;\n if (len & 0x80) {\n const count = len & 0x7f;\n len = 0;\n for (let i = 0; i < count; i++) len = len * 256 + der[start + i];\n start += count;\n }\n if (start + len > der.length) throw new Error('truncated DER');\n return [tag, start, start + len];\n}\nexport function contents(element: Uint8Array): Uint8Array {\n const [, start, end] = header(element, 0);\n return element.subarray(start, end);\n}\nexport function publicKeyBits(spki: Uint8Array): Uint8Array {\n const key = children(spki)[1];\n return contents(key).subarray(1);\n}\nexport async function keyId(spki: Uint8Array): Promise<Uint8Array> {\n return new Uint8Array(\n await crypto.subtle.digest('SHA-1', publicKeyBits(spki) as Uint8Array<ArrayBuffer>)\n );\n}\nexport function ecdsaDer(raw: Uint8Array): Uint8Array {\n const half = raw.length / 2;\n return seq(integer(raw.subarray(0, half)), integer(raw.subarray(half)));\n}\nexport function randomSerial(): Uint8Array {\n const serial = crypto.getRandomValues(new Uint8Array(16));\n serial[0] = (serial[0] & 0x7f) | 0x01;\n return serial;\n}\nexport function ipv4(host: string): Uint8Array | undefined {\n const m = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host);\n if (!m) return undefined;\n const parts = m.slice(1).map(Number);\n return parts.every((p) => p <= 255) ? Uint8Array.from(parts) : undefined;\n}\nexport function ipv6(host: string): Uint8Array | undefined {\n if (!host.includes(':') || !/^[0-9A-Fa-f:.]+$/.test(host)) return undefined;\n const v4 = /(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(host);\n let text = host;\n const tail: number[] = [];\n if (v4) {\n const bytes = ipv4(v4[1]);\n if (!bytes) return undefined;\n tail.push((bytes[0] << 8) | bytes[1], (bytes[2] << 8) | bytes[3]);\n text = host.slice(0, -v4[1].length).replace(/:$/, host.endsWith(`::${v4[1]}`) ? ':' : '');\n }\n const halves = text.split('::');\n if (halves.length > 2) return undefined;\n const groups = (part: string) => (part === '' ? [] : part.split(':'));\n const head = groups(halves[0]);\n const back = halves.length === 2 ? groups(halves[1]) : [];\n if (![...head, ...back].every((g) => /^[0-9A-Fa-f]{1,4}$/.test(g))) return undefined;\n const words = [...head, ...back].map((g) => Number.parseInt(g, 16));\n const missing = 8 - words.length - tail.length;\n if (halves.length === 2 ? missing < 1 : missing !== 0) return undefined;\n const all = [\n ...head.map((g) => Number.parseInt(g, 16)),\n ...new Array(halves.length === 2 ? missing : 0).fill(0),\n ...back.map((g) => Number.parseInt(g, 16)),\n ...tail,\n ];\n return Uint8Array.from(all.flatMap((w) => [w >> 8, w & 0xff]));\n}\nexport interface CertificateRequest {\n serial: Uint8Array;\n issuer: DistinguishedName;\n subject: DistinguishedName;\n notBefore: Date;\n notAfter: Date;\n spki: Uint8Array;\n issuerSpki: Uint8Array;\n kind:\n | {\n ca: true;\n }\n | {\n ca: false;\n host: string;\n };\n sign: Signer;\n}\nasync function extensions(req: CertificateRequest): Promise<Uint8Array> {\n const list = [extension('2.5.29.14', false, octets(await keyId(req.spki)))];\n if (req.kind.ca) {\n list.push(extension('2.5.29.19', true, seq(TRUE, integer(Uint8Array.of(0)))));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x86), 1)));\n } else {\n list.push(extension('2.5.29.35', false, seq(tlv(0x80, await keyId(req.issuerSpki)))));\n list.push(extension('2.5.29.19', true, seq()));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x80), 7)));\n list.push(extension('2.5.29.37', false, seq(oid('1.3.6.1.5.5.7.3.1'))));\n const ip = ipv4(req.kind.host) ?? ipv6(req.kind.host);\n const altName = ip ? tlv(0x87, ip) : tlv(0x82, ascii(req.kind.host));\n list.push(extension('2.5.29.17', false, seq(altName)));\n }\n return tlv(0xa3, seq(...list));\n}\nexport async function certificate(req: CertificateRequest): Promise<Uint8Array> {\n const tbs = seq(\n tlv(0xa0, integer(Uint8Array.of(2))),\n integer(req.serial),\n ECDSA_SHA256,\n name(req.issuer),\n seq(time(req.notBefore), time(req.notAfter)),\n name(req.subject),\n req.spki,\n await extensions(req)\n );\n const signature = ecdsaDer(await req.sign(tbs));\n return seq(tbs, ECDSA_SHA256, bits(signature));\n}\nexport function pem(der: Uint8Array): string {\n let b64 = '';\n for (let i = 0; i < der.length; i += 0x8000) {\n b64 += String.fromCharCode(...der.subarray(i, i + 0x8000));\n }\n const lines = btoa(b64).match(/.{1,64}/g) ?? [];\n return `-----BEGIN CERTIFICATE-----\\n${lines.join('\\n')}\\n-----END CERTIFICATE-----\\n`;\n}\n", "import { certificate, type DistinguishedName, ipv6, pem, randomSerial } from './x509.ts';\nexport interface CaRecord {\n key: CryptoKey;\n cert: Uint8Array;\n spki: Uint8Array;\n notAfter: number;\n name: DistinguishedName;\n}\nexport interface CaStore {\n get(owner: string): Promise<CaRecord | undefined>;\n swap(owner: string, expected: CaRecord | undefined, record: CaRecord): Promise<CaRecord>;\n}\n\nfunction sameCert(a: CaRecord | undefined, b: CaRecord | undefined): boolean {\n if (!a || !b) return a === b;\n return a.cert.length === b.cert.length && a.cert.every((byte, i) => byte === b.cert[i]);\n}\n\nexport function winner(\n current: CaRecord | undefined,\n expected: CaRecord | undefined,\n record: CaRecord\n): CaRecord | undefined {\n return sameCert(current, expected) ? record : current;\n}\nconst DAY = 24 * 60 * 60 * 1000;\nconst CA_LIFETIME = 3650 * DAY;\nconst CA_RENEW_BEFORE = 30 * DAY;\nexport const LEAF_LIFETIME = 7 * DAY;\nconst ECDSA = { name: 'ECDSA', namedCurve: 'P-256' } as const;\nconst SIGN = { name: 'ECDSA', hash: 'SHA-256' } as const;\nfunction request<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nexport function indexedDbCaStore(dbName = 'slicc-realm-ca'): CaStore {\n let db: Promise<IDBDatabase> | undefined;\n const open = () => {\n db ??= new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, 1);\n req.onupgradeneeded = () => req.result.createObjectStore('ca');\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n db.catch(() => {\n db = undefined;\n });\n return db;\n };\n return {\n async get(owner) {\n const store = (await open()).transaction('ca').objectStore('ca');\n return (await request(store.get(owner))) as CaRecord | undefined;\n },\n async swap(owner, expected, record) {\n const tx = (await open()).transaction('ca', 'readwrite');\n const store = tx.objectStore('ca');\n let stored = record;\n const read = store.get(owner);\n read.onsuccess = () => {\n const current = read.result as CaRecord | undefined;\n const kept = winner(current, expected, record);\n if (kept === record) store.put(record, owner);\n else stored = kept as CaRecord;\n };\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n return stored;\n },\n };\n}\nexport class LeafNameError extends Error {}\nexport function validLeafName(host: string): boolean {\n if (ipv6(host)) return true;\n if (host.length === 0 || host.length > 253) return false;\n return host.split('.').every((label) => /^(?!-)[a-z0-9-]{1,63}(?<!-)$/i.test(label));\n}\nexport class RealmCa {\n private readonly record: CaRecord;\n private constructor(record: CaRecord) {\n this.record = record;\n }\n static async open(owner: string, store: CaStore, now = Date.now()): Promise<RealmCa> {\n const stored = await store.get(owner).catch(() => undefined);\n if (stored && stored.notAfter - now > CA_RENEW_BEFORE) return new RealmCa(stored);\n const record = await RealmCa.create(owner, now);\n return new RealmCa(await store.swap(owner, stored, record));\n }\n private static async create(owner: string, now: number): Promise<CaRecord> {\n const pair = await crypto.subtle.generateKey(ECDSA, false, ['sign', 'verify']);\n const spki = new Uint8Array(await crypto.subtle.exportKey('spki', pair.publicKey));\n const id = Array.from(crypto.getRandomValues(new Uint8Array(4)), (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n const name = { organization: 'SLICC', commonName: `SLICC realm CA ${owner} ${id}` };\n const notAfter = now + CA_LIFETIME;\n const cert = await certificate({\n serial: randomSerial(),\n issuer: name,\n subject: name,\n notBefore: new Date(now - DAY),\n notAfter: new Date(notAfter),\n spki,\n issuerSpki: spki,\n kind: { ca: true },\n sign: signer(pair.privateKey),\n });\n return { key: pair.privateKey, cert, spki, notAfter, name };\n }\n get cert(): Uint8Array {\n return this.record.cert;\n }\n get pem(): string {\n return pem(this.record.cert);\n }\n async issue(host: string, spki: Uint8Array, now = Date.now()): Promise<Uint8Array> {\n const name = host.toLowerCase();\n if (!validLeafName(name)) throw new LeafNameError(`no certificate for ${host}`);\n return certificate({\n serial: randomSerial(),\n issuer: this.record.name,\n subject: { commonName: name.length <= 64 ? name : 'SLICC realm leaf' },\n notBefore: new Date(now - 60 * 60 * 1000),\n notAfter: new Date(now + LEAF_LIFETIME),\n spki,\n issuerSpki: this.record.spki,\n kind: { ca: false, host: name },\n sign: signer(this.record.key),\n });\n }\n}\nfunction signer(key: CryptoKey) {\n return async (tbs: Uint8Array) =>\n new Uint8Array(await crypto.subtle.sign(SIGN, key, tbs as Uint8Array<ArrayBuffer>));\n}\nconst opened = new WeakMap<CaStore, Map<string, Promise<RealmCa>>>();\nexport function realmCa(owner: string, store: CaStore): Promise<RealmCa> {\n const cas = opened.get(store) ?? new Map<string, Promise<RealmCa>>();\n opened.set(store, cas);\n let ca = cas.get(owner);\n if (!ca) {\n const opening = RealmCa.open(owner, store);\n ca = opening;\n cas.set(owner, opening);\n opening.catch(() => {\n if (cas.get(owner) === opening) cas.delete(owner);\n });\n }\n return ca;\n}\n", "type TlsExport =\n | 'malloc'\n | 'free'\n | 'tls_last_error'\n | 'tls_strerror'\n | 'tls_leaf_new'\n | 'tls_leaf_spki'\n | 'tls_leaf_add_cert'\n | 'tls_leaf_free'\n | 'tls_session_new'\n | 'tls_feed'\n | 'tls_feed_eof'\n | 'tls_in_room'\n | 'tls_read'\n | 'tls_write'\n | 'tls_out_size'\n | 'tls_out_take'\n | 'tls_close'\n | 'tls_alpn_http11'\n | 'tls_session_free';\n\nexport type TlsEngineModule = { readonly HEAPU8: Uint8Array } & {\n readonly [K in TlsExport as `_${K}`]: (...args: number[]) => number;\n};\n\nconst SCRATCH = 64 * 1024;\nconst EOF = -1;\nexport class TlsError extends Error {\n readonly code: number;\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n }\n}\nexport class TlsEngine {\n private readonly m: TlsEngineModule;\n private readonly scratch: number;\n constructor(m: TlsEngineModule) {\n this.m = m;\n this.scratch = m._malloc(SCRATCH);\n if (!this.scratch) throw new Error('tls engine: out of memory');\n }\n private put(bytes: Uint8Array): number {\n const ptr = this.m._malloc(bytes.length + 1);\n if (!ptr) throw new Error('tls engine: out of memory');\n this.m.HEAPU8.set(bytes, ptr);\n this.m.HEAPU8[ptr + bytes.length] = 0;\n return ptr;\n }\n private taken(n: number): Uint8Array {\n return this.m.HEAPU8.slice(this.scratch, this.scratch + n);\n }\n error(code: number, what: string): TlsError {\n this.m._tls_strerror(code, this.scratch, 256);\n const end = this.m.HEAPU8.indexOf(0, this.scratch);\n const text = new TextDecoder().decode(this.m.HEAPU8.subarray(this.scratch, end));\n return new TlsError(code, `${what}: ${text || code}`);\n }\n leaf(): TlsLeaf {\n const ptr = this.m._tls_leaf_new();\n if (!ptr) throw this.error(this.m._tls_last_error(), 'leaf key');\n return new TlsLeaf(this, this.m, ptr);\n }\n session(leaf: TlsLeaf, host: string): TlsSession {\n const name = this.put(new TextEncoder().encode(host));\n try {\n const ptr = this.m._tls_session_new(leaf.ptr, name);\n if (!ptr) throw this.error(this.m._tls_last_error(), 'tls session');\n return new TlsSession(this, this.m, ptr);\n } finally {\n this.m._free(name);\n }\n }\n withBytes<T>(bytes: Uint8Array, fn: (ptr: number) => T): T {\n const ptr = this.put(bytes);\n try {\n return fn(ptr);\n } finally {\n this.m._free(ptr);\n }\n }\n intoScratch(fn: (ptr: number, max: number) => number): number | Uint8Array {\n const n = fn(this.scratch, SCRATCH);\n return n > 0 ? this.taken(n) : n;\n }\n}\nexport class TlsLeaf {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n spki(): Uint8Array {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_leaf_spki(this.ptr, ptr, max));\n if (typeof out === 'number') throw this.engine.error(out, 'leaf public key');\n return out;\n }\n addCert(der: Uint8Array): void {\n const ret = this.engine.withBytes(der, (ptr) =>\n this.m._tls_leaf_add_cert(this.ptr, ptr, der.length)\n );\n if (ret !== 0) throw this.engine.error(ret, 'leaf certificate');\n }\n release(): void {\n this.m._tls_leaf_free(this.ptr);\n }\n}\nexport class TlsSession {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n private readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n feed(bytes: Uint8Array): number {\n return this.engine.withBytes(bytes, (ptr) => this.m._tls_feed(this.ptr, ptr, bytes.length));\n }\n feedEnd(): void {\n this.m._tls_feed_eof(this.ptr);\n }\n read(): Uint8Array | 'more' | 'eof' {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_read(this.ptr, ptr, max));\n if (out instanceof Uint8Array) return out;\n if (out === 0) return 'more';\n if (out === EOF) return 'eof';\n throw this.engine.error(out, 'tls');\n }\n write(bytes: Uint8Array): number {\n const n = this.engine.withBytes(bytes, (ptr) => this.m._tls_write(this.ptr, ptr, bytes.length));\n if (n < 0) throw this.engine.error(n, 'tls');\n return n;\n }\n take(): Uint8Array {\n if (this.m._tls_out_size(this.ptr) === 0) return new Uint8Array(0);\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_out_take(this.ptr, ptr, max));\n return out instanceof Uint8Array ? out : new Uint8Array(0);\n }\n close(): void {\n this.m._tls_close(this.ptr);\n }\n free(): void {\n this.m._tls_session_free(this.ptr);\n }\n}\nconst loading = new WeakMap<() => Promise<TlsEngineModule>, Promise<TlsEngine>>();\nexport function loadTlsEngine(load: () => Promise<TlsEngineModule>): Promise<TlsEngine> {\n let engine = loading.get(load);\n if (!engine) {\n const started = load().then((m) => new TlsEngine(m));\n engine = started;\n loading.set(load, started);\n started.catch(() => {\n if (loading.get(load) === started) loading.delete(load);\n });\n }\n return engine;\n}\n", "import type { KernelSocket } from '../socket.ts';\nimport type { ByteSource, Incoming } from './http1.ts';\nimport type { HttpSink, TunnelHandler, TunnelTarget } from './proxy-service.ts';\nimport { LEAF_LIFETIME, type RealmCa } from './realm-ca.ts';\nimport type { TlsEngine, TlsLeaf, TlsSession } from './tls-engine.ts';\n\nconst LEAF_REUSE = LEAF_LIFETIME - 24 * 60 * 60 * 1000;\nconst LEAF_CACHE = 256;\nconst CIPHER_READ = 64 * 1024;\nexport class TlsStream implements ByteSource, HttpSink {\n private readonly session: TlsSession;\n private readonly cipherIn: ByteSource;\n private readonly cipherOut: KernelSocket;\n private pending: Uint8Array = new Uint8Array(0);\n private ended = false;\n constructor(session: TlsSession, cipherIn: ByteSource, cipherOut: KernelSocket) {\n this.session = session;\n this.cipherIn = cipherIn;\n this.cipherOut = cipherOut;\n }\n private async flush(signal?: AbortSignal): Promise<void> {\n for (let out = this.session.take(); out.length > 0; out = this.session.take()) {\n await this.cipherOut.write(out, signal);\n }\n }\n private feedPending(): void {\n if (this.pending.length === 0) return;\n const n = this.session.feed(this.pending);\n this.pending = this.pending.subarray(n);\n }\n async read(_max: number, signal?: AbortSignal): Promise<Uint8Array> {\n for (;;) {\n this.feedPending();\n const got = this.session.read();\n await this.flush(signal);\n if (got instanceof Uint8Array) return got;\n if (got === 'eof') return new Uint8Array(0);\n if (this.pending.length > 0) continue;\n if (this.ended) {\n this.session.feedEnd();\n const last = this.session.read();\n await this.flush(signal);\n return last instanceof Uint8Array ? last : new Uint8Array(0);\n }\n const cipher = await this.cipherIn.read(CIPHER_READ, signal);\n if (cipher.length === 0) this.ended = true;\n else this.pending = cipher;\n }\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n for (let at = 0; at < bytes.length; ) {\n const n = this.session.write(bytes.subarray(at, at + 16 * 1024));\n await this.flush(signal);\n at += n;\n }\n return bytes.length;\n }\n async close(signal?: AbortSignal): Promise<void> {\n this.session.close();\n await this.flush(signal);\n }\n}\ninterface CachedLeaf {\n leaf: Promise<TlsLeaf>;\n expires: number;\n}\nexport interface TlsTerminatorOptions {\n ca: () => Promise<RealmCa>;\n engine: () => Promise<TlsEngine>;\n now?: () => number;\n}\nexport class TlsTerminator {\n private readonly options: TlsTerminatorOptions;\n private readonly leaves = new Map<string, CachedLeaf>();\n private readonly now: () => number;\n constructor(options: TlsTerminatorOptions) {\n this.options = options;\n this.now = options.now ?? Date.now;\n }\n private leafFor(engine: TlsEngine, host: string): Promise<TlsLeaf> {\n const now = this.now();\n const cached = this.leaves.get(host);\n if (cached && cached.expires > now) {\n this.leaves.delete(host);\n this.leaves.set(host, cached);\n return cached.leaf;\n }\n if (cached) void this.drop(host, cached);\n const leaf = this.issue(engine, host, now);\n const entry = { leaf, expires: now + LEAF_REUSE };\n this.leaves.set(host, entry);\n leaf.catch(() => {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n });\n for (const [oldest, old] of this.leaves) {\n if (this.leaves.size <= LEAF_CACHE) break;\n void this.drop(oldest, old);\n }\n return leaf;\n }\n private async drop(host: string, entry: CachedLeaf): Promise<void> {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n (await entry.leaf.catch(() => undefined))?.release();\n }\n private async issue(engine: TlsEngine, host: string, now: number): Promise<TlsLeaf> {\n const ca = await this.options.ca();\n const leaf = engine.leaf();\n try {\n leaf.addCert(await ca.issue(host, leaf.spki(), now));\n leaf.addCert(ca.cert);\n return leaf;\n } catch (e) {\n leaf.release();\n throw e;\n }\n }\n async close(): Promise<void> {\n await Promise.all([...this.leaves].map(([host, entry]) => this.drop(host, entry)));\n }\n readonly handler: TunnelHandler = async (conn, incoming, target, signal, serveHttp) => {\n const engine = await this.options.engine();\n const host = target.host.replace(/^\\[|\\]$/g, '');\n const leaf = await this.leafFor(engine, host);\n const session = engine.session(leaf, host);\n try {\n const stream = new TlsStream(session, cipherSource(incoming), conn);\n const origin = `https://${authority(target)}`;\n await serveHttp(stream, stream, origin);\n await stream.close(signal).catch(() => undefined);\n } finally {\n session.free();\n }\n };\n}\nexport function authority(target: TunnelTarget): string {\n return target.port === 443 ? target.host : `${target.host}:${target.port}`;\n}\nfunction cipherSource(incoming: Incoming): ByteSource {\n return { read: (max, signal) => incoming.some(max, signal) };\n}\n", "import type { KernelFs } from '../../fs/types.ts';\nimport type { LoopbackNet } from '../socket.ts';\nimport {\n DEFAULT_HOSTNAME,\n HOST_LOOPBACK,\n ownNames,\n PAGE_LOOPBACK,\n PAGE_LOOPBACK_URL,\n} from './loopback-names.ts';\nimport { REALM_PROXY_PORT, RealmProxy } from './proxy-service.ts';\nimport {\n type CaRecord,\n type CaStore,\n indexedDbCaStore,\n type RealmCa,\n realmCa,\n winner,\n} from './realm-ca.ts';\nimport { loadTlsEngine, type TlsEngine, type TlsEngineModule } from './tls-engine.ts';\nimport { TlsTerminator } from './tls-tunnel.ts';\nimport type { RealmTransport } from './transport.ts';\n\nexport const NO_TRANSPORT =\n 'slicc-kernel: no network transport (createKernel({ network: { transport } }))';\n\nexport const TLS_ENGINE_PACKAGE = '@ai-ecoverse/wasm-tls-engine';\n\nexport const CA_PATH = '/etc/ssl/certs/slicc-kernel-ca.pem';\n\nconst PROXY_URL = `http://127.0.0.1:${REALM_PROXY_PORT}`;\n\nconst NO_PROXY = 'localhost,.localhost,127.0.0.1,127.0.0.0/8';\n\nconst CA_OWNER = 'slicc-kernel';\n\nexport const CA_DB = 'slicc-kernel-ca';\n\nexport function networkEnv(hostname: string = DEFAULT_HOSTNAME): Record<string, string> {\n const bypass = [NO_PROXY, ...ownNames(hostname).filter((n) => n !== 'wasmer.sh')].join(',');\n return {\n http_proxy: PROXY_URL,\n https_proxy: PROXY_URL,\n HTTP_PROXY: PROXY_URL,\n HTTPS_PROXY: PROXY_URL,\n no_proxy: bypass,\n NO_PROXY: bypass,\n SSL_CERT_FILE: CA_PATH,\n CURL_CA_BUNDLE: CA_PATH,\n GIT_SSL_CAINFO: CA_PATH,\n SLICC_HOST_LOOPBACK: HOST_LOOPBACK,\n SLICC_PAGE_LOOPBACK: PAGE_LOOPBACK,\n SLICC_PAGE_LOOPBACK_URL: PAGE_LOOPBACK_URL,\n };\n}\n\nexport function missingTransport(): RealmTransport {\n return {\n traits: { manualRedirects: true, encodedBodies: true, maxRequestBody: 0, unavailable: true },\n fetch: () => Promise.reject(Object.assign(new Error(NO_TRANSPORT), { status: 502 })),\n };\n}\n\nexport function memoryCaStore(): CaStore {\n const records = new Map<string, CaRecord>();\n return {\n get: async (owner) => records.get(owner),\n swap: async (owner, expected, record) => {\n const kept = winner(records.get(owner), expected, record) as CaRecord;\n records.set(owner, kept);\n return kept;\n },\n };\n}\n\nexport function caStore(name: string | false): CaStore {\n return name === false ? memoryCaStore() : indexedDbCaStore(name);\n}\n\nfunction base64(bytes: Uint8Array): string {\n let text = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(text);\n}\n\nexport function packageTlsEngine(fs: KernelFs, modules: string): () => Promise<TlsEngineModule> {\n const dir = `${modules.replace(/\\/+$/, '')}/${TLS_ENGINE_PACKAGE}/dist`;\n return async () => {\n let glue: Uint8Array;\n let wasmBinary: Uint8Array;\n try {\n [glue, wasmBinary] = await Promise.all([\n fs.readFileBuffer(`${dir}/slicc-tls-engine.mjs`),\n fs.readFileBuffer(`${dir}/slicc-tls-engine.wasm`),\n ]);\n } catch {\n throw new Error(`TLS needs ${TLS_ENGINE_PACKAGE} installed in ${modules}`);\n }\n const url = `data:text/javascript;base64,${base64(glue)}`;\n const factory = (await import(url)) as {\n default: (options: {\n wasmBinary: Uint8Array;\n locateFile: (path: string) => string;\n }) => Promise<TlsEngineModule>;\n };\n return factory.default({ wasmBinary, locateFile: (path) => path });\n };\n}\n\nexport interface NetworkOptions {\n transport?: RealmTransport;\n engine: () => Promise<TlsEngine>;\n ca: () => Promise<RealmCa>;\n now?: () => number;\n}\n\nexport function kernelCa(store: CaStore): () => Promise<RealmCa> {\n return () => realmCa(CA_OWNER, store);\n}\n\nexport function kernelTlsEngine(load: () => Promise<TlsEngineModule>): () => Promise<TlsEngine> {\n return () => loadTlsEngine(load);\n}\n\nconst CERTIFICATE = /-----BEGIN CERTIFICATE-----[\\s\\S]*?-----END CERTIFICATE-----/g;\n\nexport const CA_BUNDLE_MAX = 16;\n\nexport interface LockLike {\n request<T>(name: string, run: () => Promise<T>): Promise<T>;\n}\n\nconst CA_FILE_LOCK = 'slicc-kernel-ca-file';\nconst CA_FILE_TRIES = 3;\n\nasync function addToBundle(fs: KernelFs, own: string): Promise<boolean> {\n const current = (await fs.exists(CA_PATH)) ? await fs.readFile(CA_PATH) : '';\n const all = current.match(CERTIFICATE) ?? [];\n const others = all.filter((cert) => cert !== own);\n if (others.length < all.length) return true;\n const bundle = [...others, own].slice(-CA_BUNDLE_MAX);\n await fs.mkdir(CA_PATH.slice(0, CA_PATH.lastIndexOf('/')), { recursive: true });\n await fs.writeFile(CA_PATH, `${bundle.join('\\n')}\\n`);\n return false;\n}\n\nexport async function writeCaFile(\n fs: KernelFs,\n ca: () => Promise<RealmCa>,\n locks: LockLike | undefined = globalThis.navigator?.locks as LockLike | undefined\n): Promise<void> {\n const own = (await ca()).pem.trim();\n const update = async () => {\n for (let i = 0; i < CA_FILE_TRIES && !(await addToBundle(fs, own)); i++);\n };\n await (locks ? locks.request(CA_FILE_LOCK, update) : update());\n}\n\nexport function enableNetwork(\n net: LoopbackNet,\n options: NetworkOptions\n): () => RealmProxy | undefined {\n let proxy: RealmProxy | undefined;\n const transport = options.transport ?? missingTransport();\n net.activate({ family: 'inet', host: '127.0.0.1', port: REALM_PROXY_PORT }, () => {\n const tls = new TlsTerminator({\n ca: options.ca,\n engine: options.engine,\n ...(options.now ? { now: options.now } : {}),\n });\n const started = new RealmProxy({\n net,\n transport,\n tunnel: tls.handler,\n tunnelReady: async () => {\n await options.engine();\n },\n });\n proxy = started;\n void started.closed.then(async () => {\n if (proxy === started) proxy = undefined;\n await tls.close();\n });\n });\n return () => proxy;\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { NO_TRANSPORT } from './network.ts';\nimport type { HeaderList, RealmTransport } from './transport.ts';\n\nexport type HttpSyscall =\n | {\n op: 'net-request';\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { op: 'net-read'; handle: number; max: number }\n | { op: 'net-close'; handle: number }\n | { op: 'net-traits' };\n\nexport const HTTP_OPS: readonly string[] = ['net-request', 'net-read', 'net-close', 'net-traits'];\n\nexport interface HttpHead {\n handle: number;\n status: number;\n statusText: string;\n url: string;\n headers: HeaderList;\n}\n\ninterface Open {\n abort: AbortController;\n body: AsyncIterator<Uint8Array>;\n left: Uint8Array;\n done: boolean;\n reading: Promise<void>;\n cancel(): Promise<void>;\n}\n\nconst EMPTY = new Uint8Array(0);\n\nfunction message(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\nasync function* once(bytes: Uint8Array): AsyncGenerator<Uint8Array> {\n yield bytes;\n}\n\nexport class HttpHandles {\n private readonly transport: RealmTransport;\n\n private readonly open = new Map<number, Open>();\n\n private nextHandle = 0;\n\n constructor(transport: RealmTransport) {\n this.transport = transport;\n }\n\n syscall(req: HttpSyscall): Promise<SyncFsResult> {\n if (req.op === 'net-request') return this.request(req);\n if (req.op === 'net-read') return this.read(req.handle, req.max);\n if (req.op === 'net-traits') return Promise.resolve(this.traits());\n return this.close(req.handle);\n }\n\n private traits(): SyncFsResult {\n const { unavailable, crossOrigin = 'any', ...rest } = this.transport.traits;\n if (unavailable) return { ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT };\n return { ok: true, kind: 'json', json: { ...rest, crossOrigin } };\n }\n\n private add(\n abort: AbortController,\n body: AsyncIterable<Uint8Array>,\n cancel: () => Promise<void>\n ) {\n const handle = ++this.nextHandle;\n this.open.set(handle, {\n abort,\n body: body[Symbol.asyncIterator](),\n left: EMPTY,\n done: false,\n reading: Promise.resolve(),\n cancel,\n });\n return handle;\n }\n\n private async request(req: Extract<HttpSyscall, { op: 'net-request' }>): Promise<SyncFsResult> {\n const abort = new AbortController();\n try {\n const response = await this.transport.fetch({\n url: req.url,\n method: req.method,\n headers: req.headers,\n ...(req.body ? { body: req.body } : {}),\n signal: abort.signal,\n });\n const handle = this.add(abort, response.body, () => response.cancel());\n const head: HttpHead = {\n handle,\n status: response.status,\n statusText: response.statusText,\n url: req.url,\n headers: response.headers,\n };\n return { ok: true, kind: 'json', json: head };\n } catch (e) {\n const text = message(e);\n if (text === NO_TRANSPORT) return { ok: false, errno: 'ENETUNREACH', message: text };\n const status = (e as { status?: unknown }).status;\n if (typeof status !== 'number' || status === 502) {\n return { ok: false, errno: 'ECONNREFUSED', message: text };\n }\n const body = new TextEncoder().encode(text);\n const handle = this.add(abort, once(body), async () => undefined);\n const head: HttpHead = {\n handle,\n status,\n statusText: '',\n url: req.url,\n headers: [['content-type', 'text/plain; charset=utf-8']],\n };\n return { ok: true, kind: 'json', json: head };\n }\n }\n\n private async read(handle: number, max: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n const turn = entry.reading.then(() => this.take(entry, max));\n entry.reading = turn.then(() => undefined);\n return turn;\n }\n\n private async take(entry: Open, max: number): Promise<SyncFsResult> {\n if (entry.left.length === 0 && !entry.done) {\n try {\n const next = await entry.body.next();\n if (next.done) entry.done = true;\n else entry.left = next.value;\n } catch (e) {\n entry.done = true;\n const timedOut = (e as { code?: unknown } | null)?.code === 'ETIMEDOUT';\n return { ok: false, errno: timedOut ? 'ETIMEDOUT' : 'EIO', message: message(e) };\n }\n }\n const bytes = entry.left.subarray(0, Math.max(0, max));\n entry.left = entry.left.subarray(bytes.length);\n return { ok: true, kind: 'bytes', bytes };\n }\n\n private async close(handle: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n this.open.delete(handle);\n entry.abort.abort();\n await entry.cancel().catch(() => undefined);\n return { ok: true, kind: 'void' };\n }\n\n async closeAll(): Promise<void> {\n await Promise.all([...this.open.keys()].map((handle) => this.close(handle)));\n }\n}\n", "import { HOST_LOOPBACK, HOST_LOOPBACK_ADDRESS } from './loopback-names.ts';\n\nexport interface RouteTable {\n prefixes: readonly string[];\n exit: boolean;\n}\n\nexport type Destination = 'loopback' | 'host' | 'reserved' | 'uplink' | 'unreachable';\n\ninterface Prefix {\n v6: boolean;\n bits: bigint;\n length: number;\n}\n\nconst HOST_ADDRESS = HOST_LOOPBACK_ADDRESS.join('.');\n\nexport function ipv4Bytes(text: string): number[] | undefined {\n const parts = text.split('.');\n if (parts.length !== 4 || !parts.every((p) => /^\\d{1,3}$/.test(p))) return undefined;\n const bytes = parts.map(Number);\n return bytes.every((b) => b <= 255) ? bytes : undefined;\n}\n\nexport function ipv6Groups(text: string): number[] | undefined {\n if (!text.includes(':')) return undefined;\n let canonical: string;\n try {\n canonical = new URL(`http://[${text}]/`).hostname.slice(1, -1);\n } catch {\n return undefined;\n }\n const [head, tail] = canonical.split('::');\n const part = (s: string | undefined) =>\n s ? s.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n return tail === undefined\n ? front\n : [...front, ...new Array<number>(8 - front.length - back.length).fill(0), ...back];\n}\n\nfunction toBits(values: number[], width: number): bigint {\n return values.reduce((acc, v) => (acc << BigInt(width)) | BigInt(v), 0n);\n}\n\nfunction addressBits(host: string): { v6: boolean; bits: bigint } | undefined {\n const v4 = ipv4Bytes(host);\n if (v4) return { v6: false, bits: toBits(v4, 8) };\n const v6 = ipv6Groups(host);\n return v6 ? { v6: true, bits: toBits(v6, 16) } : undefined;\n}\n\nfunction parsePrefix(text: string): Prefix | undefined {\n const parts = text.trim().split('/');\n if (parts.length > 2) return undefined;\n const [address = '', size] = parts;\n const parsed = addressBits(address);\n if (!parsed) return undefined;\n const max = parsed.v6 ? 128 : 32;\n const length = size === undefined ? max : /^\\d{1,3}$/.test(size) ? Number(size) : -1;\n if (length < 0 || length > max) return undefined;\n return { ...parsed, length };\n}\n\nfunction within(prefix: Prefix, addr: { v6: boolean; bits: bigint }): boolean {\n if (prefix.v6 !== addr.v6) return false;\n const shift = BigInt((prefix.v6 ? 128 : 32) - prefix.length);\n return addr.bits >> shift === prefix.bits >> shift;\n}\n\nconst RESERVED = [\n '0.0.0.0/8',\n '127.0.0.0/8',\n '169.254.0.0/16',\n '224.0.0.0/4',\n '240.0.0.0/4',\n '::/96',\n '::ffff:0:0/96',\n 'fe80::/10',\n 'ff00::/8',\n].map((p) => parsePrefix(p) as Prefix);\n\nexport class Routes {\n private table: Prefix[] = [];\n private exit = false;\n readonly ipv6: boolean;\n\n constructor(ipv6 = false) {\n this.ipv6 = ipv6;\n }\n\n set(table: RouteTable): void {\n const parsed = (table.prefixes ?? []).map(parsePrefix);\n const bad = (table.prefixes ?? []).find((_, i) => !parsed[i]);\n if (bad !== undefined) throw new Error(`not an address prefix: ${bad}`);\n this.table = parsed as Prefix[];\n this.exit = table.exit === true;\n }\n\n classify(host: string): Destination {\n const name = host.toLowerCase().replace(/\\.$/, '');\n if (name === 'localhost' || name.endsWith('.localhost') || name === '0.0.0.0') {\n return 'loopback';\n }\n if (name === HOST_LOOPBACK || name === HOST_ADDRESS) return 'host';\n const addr = addressBits(name);\n if (!addr) return 'unreachable';\n if (addr.v6 && addr.bits === 1n) return 'loopback';\n if (!addr.v6 && addr.bits >> 24n === 127n) return 'loopback';\n if (RESERVED.some((p) => within(p, addr))) return 'reserved';\n if (addr.v6 && !this.ipv6) return 'unreachable';\n if (this.exit || this.table.some((p) => within(p, addr))) return 'uplink';\n return 'unreachable';\n }\n}\n", "import { Routes, type RouteTable } from './routes.ts';\n\nexport interface UplinkTraits {\n tcp: true;\n udp: false;\n ipv6: boolean;\n}\n\nexport type ResolveFamily = 0 | 4 | 6;\n\nexport interface ResolveAnswer {\n addresses: string[];\n ttl?: number;\n}\n\nexport interface UplinkConn {\n readonly localAddr: string;\n readonly remoteAddr: string;\n read(): Promise<Uint8Array | null>;\n write(bytes: Uint8Array): Promise<number>;\n closeWrite(): void;\n close(): void;\n}\n\nexport interface UplinkDial {\n network: 'tcp';\n host: string;\n port: number;\n signal: AbortSignal;\n}\n\nexport interface NetworkUplink {\n readonly traits: UplinkTraits;\n readonly routes?: RouteTable;\n resolve(\n name: string,\n family: ResolveFamily,\n signal?: AbortSignal\n ): Promise<string[] | ResolveAnswer>;\n dial(req: UplinkDial): Promise<UplinkConn>;\n}\n\nexport type UplinkCall =\n | { uplink: 'resolve'; uid: number; name: string; family: ResolveFamily }\n | { uplink: 'dial'; uid: number; host: string; port: number }\n | { uplink: 'cancel'; uid: number }\n | { uplink: 'read'; uid: number; cid: number }\n | { uplink: 'write'; uid: number; cid: number; bytes: Uint8Array }\n | { uplink: 'close-write'; cid: number }\n | { uplink: 'close'; cid: number };\n\nexport type UplinkReply =\n | { uplink: 'resolved'; uid: number; addresses: string[]; ttl?: number }\n | { uplink: 'dialled'; uid: number; cid: number; localAddr: string; remoteAddr: string }\n | { uplink: 'data'; uid: number; bytes: Uint8Array | null }\n | { uplink: 'written'; uid: number; n: number }\n | { uplink: 'error'; uid: number; message: string; code?: string };\n\nexport interface UplinkPeer {\n postMessage(message: UplinkReply, transfer?: Transferable[]): void;\n}\n\nexport interface UplinkPort {\n postMessage(message: UplinkCall, transfer?: Transferable[]): void;\n}\n\nexport interface UplinkServer {\n answer(call: UplinkCall): void;\n close(): void;\n}\n\nexport function answerOf(result: string[] | ResolveAnswer): ResolveAnswer {\n const answer = Array.isArray(result) ? { addresses: result } : result;\n const addresses = Array.isArray(answer?.addresses)\n ? answer.addresses.filter((a): a is string => typeof a === 'string')\n : [];\n return {\n addresses,\n ...(typeof answer?.ttl === 'number' && answer.ttl >= 0 ? { ttl: answer.ttl } : {}),\n };\n}\n\nfunction failure(uid: number, e: unknown): UplinkReply {\n const code = (e as { code?: unknown } | null)?.code;\n return {\n uplink: 'error',\n uid,\n message: e instanceof Error ? e.message : String(e),\n ...(typeof code === 'string' ? { code } : {}),\n };\n}\n\nconst NEVER = new Routes(true);\n\nexport function serveUplink(peer: UplinkPeer, uplink: NetworkUplink): UplinkServer {\n const conns = new Map<number, UplinkConn>();\n const pending = new Map<number, AbortController>();\n let nextCid = 0;\n let closed = false;\n const run = (uid: number, work: (signal: AbortSignal) => Promise<UplinkReply | undefined>) => {\n const abort = new AbortController();\n pending.set(uid, abort);\n void work(abort.signal)\n .then(\n (reply) => reply && peer.postMessage(reply, transferOf(reply)),\n (e: unknown) => peer.postMessage(failure(uid, e))\n )\n .finally(() => pending.delete(uid));\n };\n const conn = (cid: number): UplinkConn => {\n const found = conns.get(cid);\n if (!found) throw Object.assign(new Error('no such uplink connection'), { code: 'EBADF' });\n return found;\n };\n const dial = async (call: Extract<UplinkCall, { uplink: 'dial' }>, signal: AbortSignal) => {\n const kind = NEVER.classify(call.host);\n if (kind === 'loopback' || kind === 'host' || kind === 'reserved') {\n throw Object.assign(new Error(`the uplink does not carry ${call.host}`), {\n code: 'ENETUNREACH',\n });\n }\n const { host, port } = call;\n const opened = await uplink.dial({ network: 'tcp', host, port, signal });\n if (signal.aborted || closed) {\n opened.close();\n return undefined;\n }\n const cid = ++nextCid;\n conns.set(cid, opened);\n const { localAddr, remoteAddr } = opened;\n return { uplink: 'dialled' as const, uid: call.uid, cid, localAddr, remoteAddr };\n };\n const drop = (cid: number) => {\n const found = conns.get(cid);\n conns.delete(cid);\n found?.close();\n };\n return {\n answer(call) {\n switch (call.uplink) {\n case 'resolve':\n return run(call.uid, async (signal) => ({\n uplink: 'resolved',\n uid: call.uid,\n ...answerOf(await uplink.resolve(call.name, call.family, signal)),\n }));\n case 'dial':\n return run(call.uid, (signal) => dial(call, signal));\n case 'cancel':\n return pending.get(call.uid)?.abort();\n case 'read':\n return run(call.uid, async () => ({\n uplink: 'data',\n uid: call.uid,\n bytes: (await conn(call.cid).read())?.slice() ?? null,\n }));\n case 'write':\n return run(call.uid, async () => ({\n uplink: 'written',\n uid: call.uid,\n n: await conn(call.cid).write(call.bytes),\n }));\n case 'close-write':\n return conns.get(call.cid)?.closeWrite();\n default:\n return drop(call.cid);\n }\n },\n close() {\n closed = true;\n for (const abort of pending.values()) abort.abort();\n for (const cid of [...conns.keys()]) drop(cid);\n },\n };\n}\n\nfunction transferOf(reply: UplinkReply): Transferable[] | undefined {\n if (reply.uplink !== 'data' || !reply.bytes) return undefined;\n return [reply.bytes.buffer as ArrayBuffer];\n}\n\ntype Answer = Exclude<UplinkReply, { uplink: 'error' }>;\n\nexport class RemoteUplink implements NetworkUplink {\n readonly traits: UplinkTraits;\n readonly routes: RouteTable | undefined;\n private readonly port: UplinkPort;\n private readonly waiting = new Map<number, PromiseWithResolvers<Answer>>();\n private nextId = 0;\n\n constructor(port: UplinkPort, traits: UplinkTraits, routes?: RouteTable) {\n this.port = port;\n this.traits = traits;\n this.routes = routes;\n }\n\n receive(reply: UplinkReply): void {\n const waiter = this.waiting.get(reply.uid);\n if (!waiter) return;\n this.waiting.delete(reply.uid);\n if (reply.uplink === 'error') {\n waiter.reject(Object.assign(new Error(reply.message), { code: reply.code }));\n } else waiter.resolve(reply);\n }\n\n private ask<T extends Answer>(\n call: Extract<UplinkCall, { uid: number }>,\n signal?: AbortSignal,\n transfer?: Transferable[]\n ): Promise<T> {\n const waiter = Promise.withResolvers<Answer>();\n this.waiting.set(call.uid, waiter);\n const abort = () => {\n this.waiting.delete(call.uid);\n this.port.postMessage({ uplink: 'cancel', uid: call.uid });\n waiter.reject(signal?.reason);\n };\n signal?.addEventListener('abort', abort, { once: true });\n const settled = () => signal?.removeEventListener('abort', abort);\n waiter.promise.then(settled, settled);\n this.port.postMessage(call, transfer);\n return waiter.promise as Promise<T>;\n }\n\n async resolve(name: string, family: ResolveFamily, signal?: AbortSignal) {\n const reply = await this.ask<Extract<Answer, { uplink: 'resolved' }>>(\n { uplink: 'resolve', uid: ++this.nextId, name, family },\n signal\n );\n return answerOf(reply);\n }\n\n async dial(req: UplinkDial): Promise<UplinkConn> {\n req.signal.throwIfAborted();\n const { host, port } = req;\n const opened = await this.ask<Extract<Answer, { uplink: 'dialled' }>>(\n { uplink: 'dial', uid: ++this.nextId, host, port },\n req.signal\n );\n const { cid, localAddr, remoteAddr } = opened;\n return {\n localAddr,\n remoteAddr,\n read: async () => {\n const got = await this.ask<Extract<Answer, { uplink: 'data' }>>({\n uplink: 'read',\n uid: ++this.nextId,\n cid,\n });\n return got.bytes;\n },\n write: async (bytes) => {\n const copy = bytes.slice();\n const call = { uplink: 'write' as const, uid: ++this.nextId, cid, bytes: copy };\n const done = await this.ask<Extract<Answer, { uplink: 'written' }>>(call, undefined, [\n copy.buffer,\n ]);\n return done.n;\n },\n closeWrite: () => this.port.postMessage({ uplink: 'close-write', cid }),\n close: () => this.port.postMessage({ uplink: 'close', cid }),\n };\n }\n}\n", "import { KernelError } from '../fd-table.ts';\nimport {\n DEFAULT_HOSTNAME,\n HOST_LOOPBACK,\n HOST_LOOPBACK_ADDRESS,\n HOSTNAME_ADDRESS,\n ownNames,\n} from './loopback-names.ts';\nimport { ipv4Bytes, ipv6Groups, type Routes } from './routes.ts';\nimport { answerOf, type NetworkUplink, type ResolveFamily } from './uplink.ts';\n\nexport const RESOLVE_TTL_MAX = 60;\nexport const RESOLVE_TIMEOUT_MS = 10_000;\nexport const RESOLVE_CACHE_MAX = 256;\n\nconst LOOPBACK_NAMES = new Set(['localhost', 'localhost.localdomain', 'ip6-localhost', '::1']);\n\ninterface Cached {\n addresses: string[];\n expires: number;\n}\n\nexport interface ResolverOptions {\n uplink?: NetworkUplink | undefined;\n routes: Routes;\n now?: () => number;\n timeoutMs?: number;\n log?: (message: string) => void;\n hostname?: string;\n}\n\nfunction loopbackName(name: string, own: readonly string[]): boolean {\n return LOOPBACK_NAMES.has(name) || name.endsWith('.localhost') || own.includes(name);\n}\n\nexport function hostsEntry(\n name: string,\n own: readonly string[] = ownNames(DEFAULT_HOSTNAME)\n): string | undefined {\n if (own.includes(name)) return HOSTNAME_ADDRESS;\n if (LOOPBACK_NAMES.has(name) || name.endsWith('.localhost')) return '127.0.0.1';\n if (name === HOST_LOOPBACK) return HOST_LOOPBACK_ADDRESS.join('.');\n return ipv4Bytes(name) ? name : undefined;\n}\n\nexport class Resolver {\n private readonly uplink: NetworkUplink | undefined;\n private readonly routes: Routes;\n private readonly now: () => number;\n private readonly timeoutMs: number;\n private readonly log: (message: string) => void;\n private readonly own: readonly string[];\n private readonly cache = new Map<string, Cached>();\n private readonly pending = new Map<string, Lookup>();\n\n constructor(options: ResolverOptions) {\n this.uplink = options.uplink;\n this.routes = options.routes;\n this.now = options.now ?? Date.now;\n this.timeoutMs = options.timeoutMs ?? RESOLVE_TIMEOUT_MS;\n this.log = options.log ?? ((message) => console.warn(message));\n this.own = ownNames(options.hostname ?? DEFAULT_HOSTNAME);\n }\n\n async resolve(\n name: string,\n family: ResolveFamily,\n blocking?: () => AbortSignal\n ): Promise<string[]> {\n const key = name.toLowerCase().replace(/\\.$/, '');\n const local = hostsEntry(key, this.own);\n if (ipv6Groups(key)) {\n const v4 = family !== 6 && local ? [local] : [];\n return family === 4 ? v4 : [...v4, key];\n }\n if (local) {\n const six = loopbackName(key, this.own) ? ['::1'] : [];\n return family === 6 ? six : family === 4 ? [local] : [local, ...six];\n }\n if (!this.uplink || key === '') return [];\n const asked: ResolveFamily = this.uplink.traits.ipv6 ? family : 4;\n if (family === 6 && asked !== 6) return [];\n const id = `${asked}:${key}`;\n const hit = this.cache.get(id);\n if (hit && hit.expires > this.now()) return hit.addresses;\n const signal = blocking?.();\n if (signal?.aborted) throw new KernelError('EINTR');\n let lookup = this.pending.get(id);\n if (!lookup) {\n const abort = new AbortController();\n lookup = { work: this.lookup(key, asked, id, abort.signal), abort, waiters: 0 };\n this.pending.set(id, lookup);\n void lookup.work.then(() => this.pending.delete(id));\n }\n return waitFor(lookup, signal);\n }\n\n private async lookup(\n name: string,\n family: ResolveFamily,\n id: string,\n abandoned: AbortSignal\n ): Promise<string[]> {\n const uplink = this.uplink as NetworkUplink;\n const timeout = AbortSignal.any([AbortSignal.timeout(this.timeoutMs), abandoned]);\n let answer: { addresses: string[]; ttl?: number };\n try {\n answer = answerOf(\n await Promise.race([\n uplink.resolve(name, family, timeout),\n new Promise<never>((_, reject) =>\n timeout.addEventListener('abort', () => reject(timeout.reason), { once: true })\n ),\n ])\n );\n } catch {\n return [];\n }\n const addresses = answer.addresses.filter((a) => this.usable(name, a, family));\n if (addresses.length > 0) this.remember(id, addresses, answer.ttl);\n return addresses;\n }\n\n private usable(name: string, address: string, family: ResolveFamily): boolean {\n const v4 = ipv4Bytes(address) !== undefined;\n if (!v4 && (family === 4 || !ipv6Groups(address))) return false;\n if (v4 && family === 6) return false;\n const kind = this.routes.classify(address);\n if (kind !== 'loopback' && kind !== 'host' && kind !== 'reserved') return true;\n this.log(`slicc-kernel: dropped the uplink's answer ${address} for ${name}: it is ${kind}`);\n return false;\n }\n\n private remember(id: string, addresses: string[], ttl: number | undefined): void {\n const seconds = Math.min(ttl ?? RESOLVE_TTL_MAX, RESOLVE_TTL_MAX);\n if (seconds <= 0) return;\n this.cache.delete(id);\n this.cache.set(id, { addresses, expires: this.now() + seconds * 1000 });\n if (this.cache.size > RESOLVE_CACHE_MAX) {\n this.cache.delete(this.cache.keys().next().value as string);\n }\n }\n}\n\ninterface Lookup {\n work: Promise<string[]>;\n abort: AbortController;\n waiters: number;\n}\n\nfunction waitFor(lookup: Lookup, signal: AbortSignal | undefined): Promise<string[]> {\n lookup.waiters++;\n return new Promise<string[]>((resolve, reject) => {\n const abort = () => {\n if (--lookup.waiters === 0) lookup.abort.abort(new KernelError('EINTR'));\n reject(new KernelError('EINTR'));\n };\n signal?.addEventListener('abort', abort, { once: true });\n void lookup.work.then((value) => {\n if (signal?.aborted) return;\n lookup.waiters--;\n signal?.removeEventListener('abort', abort);\n resolve(value);\n });\n });\n}\n", "import { KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport { SIG } from './signals.ts';\n\nexport interface Termios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface TtyScreen {\n write(bytes: Uint8Array): void;\n}\n\nconst ICRNL = 0o400;\nconst IUTF8 = 0o40000;\nconst OPOST = 0o1;\nconst ONLCR = 0o4;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst ECHOE = 0o20;\nconst ECHOCTL = 0o1000;\nconst NOFLSH = 0o200;\nconst IEXTEN = 0o100000;\nconst VINTR = 0;\nconst VQUIT = 1;\nconst VERASE = 2;\nconst VKILL = 3;\nconst VEOF = 4;\nconst VSUSP = 10;\nconst VWERASE = 14;\n\nexport function defaultTermios(): Termios {\n const cCc = new Array<number>(32).fill(0);\n Object.assign(cCc, { [VINTR]: 0x03, [VQUIT]: 0x1c, [VERASE]: 0x7f, [VKILL]: 0x15 });\n Object.assign(cCc, { [VEOF]: 0x04, 6: 1, 8: 0x11, 9: 0x13, [VSUSP]: 0x1a });\n Object.assign(cCc, { 12: 0x12, 13: 0x0f, [VWERASE]: 0x17, 15: 0x16 });\n return {\n c_iflag: ICRNL | 0o2000 | 0o20000 | IUTF8,\n c_oflag: OPOST | ONLCR,\n c_cflag: 0o17 | 0o60 | 0o200,\n c_lflag: ISIG | ICANON | ECHO | ECHOE | 0o40 | ECHOCTL | 0o4000 | IEXTEN,\n c_cc: cCc,\n };\n}\n\nconst encoder = new TextEncoder();\n\nfunction isContinuation(byte: number): boolean {\n return (byte & 0xc0) === 0x80;\n}\n\nexport class KernelTty {\n private termios = defaultTermios();\n private cols = 80;\n private rows = 24;\n\n private readable: Array<Uint8Array | null> = [];\n\n private line: number[] = [];\n private waiters: Array<() => void> = [];\n\n private hungUp = false;\n\n name?: string;\n\n onRead?: () => void;\n\n private readers = 0;\n\n private readonly screen: TtyScreen;\n\n private readonly signal: (sig: number) => void;\n\n constructor(\n screen: TtyScreen,\n\n signal: (sig: number) => void\n ) {\n this.screen = screen;\n\n this.signal = signal;\n }\n\n receive(bytes: Uint8Array): void {\n for (const byte of bytes) this.key(byte);\n this.wake();\n }\n\n resize(cols: number, rows: number): void {\n this.setSize(cols, rows);\n this.signal(SIG.WINCH);\n }\n\n hangup(): void {\n this.hungUp = true;\n this.wake();\n }\n\n signalHangup(): void {\n this.signal(SIG.HUP);\n }\n\n setSize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n }\n\n tcgets(): Termios {\n return { ...this.termios, c_cc: [...this.termios.c_cc] };\n }\n\n tcsets(termios: Termios): void {\n const wasCanonical = this.canonical;\n this.termios = { ...termios, c_cc: [...termios.c_cc] };\n\n if (wasCanonical && !this.canonical && this.line.length > 0) {\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n this.wake();\n }\n }\n\n winsize(): [number, number] {\n return [this.rows, this.cols];\n }\n\n file(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.read(max, signal),\n write: async (bytes) => {\n if (this.hungUp) throw new KernelError('EIO');\n this.output(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.readable.length > 0 || this.hungUp,\n writable: true,\n hangup: this.hungUp,\n }),\n changed: (signal) => this.changed(signal),\n close: () => {},\n tty: this,\n });\n }\n\n private get canonical(): boolean {\n return (this.termios.c_lflag & ICANON) !== 0;\n }\n\n private cc(slot: number): number {\n return this.termios.c_cc[slot] ?? 0;\n }\n\n private key(input: number): void {\n const { c_iflag, c_lflag } = this.termios;\n const byte = input === 0x0d && c_iflag & ICRNL ? 0x0a : input;\n if (c_lflag & ISIG && this.signalKey(byte)) return;\n if (!this.canonical) {\n this.readable.push(Uint8Array.of(byte));\n if (c_lflag & ECHO) this.echo(byte);\n return;\n }\n this.edit(byte);\n }\n\n private signalKey(byte: number): boolean {\n const sig =\n byte === this.cc(VINTR)\n ? SIG.INT\n : byte === this.cc(VQUIT)\n ? SIG.QUIT\n : byte === this.cc(VSUSP)\n ? SIG.TSTP\n : 0;\n if (!sig || byte === 0) return false;\n if (this.termios.c_lflag & ECHO) this.echo(byte);\n if (!(this.termios.c_lflag & NOFLSH)) {\n this.line = [];\n this.readable = [];\n }\n this.signal(sig);\n return true;\n }\n\n private edit(byte: number): void {\n const echo = (this.termios.c_lflag & ECHO) !== 0;\n if (byte === this.cc(VERASE) || byte === 0x08) {\n this.rubOut(this.lastCharLength());\n } else if (byte === this.cc(VKILL)) {\n this.rubOut(this.line.length);\n } else if (byte === this.cc(VWERASE)) {\n this.rubOut(this.lastWordLength());\n } else if (byte === this.cc(VEOF)) {\n this.readable.push(this.line.length > 0 ? Uint8Array.from(this.line) : null);\n this.line = [];\n } else if (byte === 0x0a) {\n this.line.push(byte);\n if (echo) this.output(encoder.encode('\\n'));\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n } else {\n this.line.push(byte);\n if (echo) this.echo(byte);\n }\n }\n\n private lastWordLength(): number {\n let end = this.line.length;\n while (end > 0 && this.line[end - 1] === 0x20) end--;\n while (end > 0 && this.line[end - 1] !== 0x20) end--;\n return this.line.length - end;\n }\n\n private lastCharLength(): number {\n const { line } = this;\n let n = Math.min(1, line.length);\n if (this.termios.c_iflag & IUTF8) {\n while (n < line.length && isContinuation(line[line.length - n] ?? 0)) n++;\n }\n return n;\n }\n\n private rubOut(n: number): void {\n const dropped = this.line.splice(this.line.length - n, n);\n const utf8 = (this.termios.c_iflag & IUTF8) !== 0;\n const cells = utf8 ? dropped.filter((b) => !isContinuation(b)).length : dropped.length;\n if (cells > 0 && this.termios.c_lflag & ECHO) {\n this.output(encoder.encode('\\b \\b'.repeat(cells)), false);\n }\n }\n\n private echo(byte: number): void {\n if (byte < 0x20 && byte !== 0x0a && byte !== 0x09 && this.termios.c_lflag & ECHOCTL) {\n this.output(Uint8Array.of(0x5e, byte + 0x40), false);\n return;\n }\n this.output(Uint8Array.of(byte));\n }\n\n private output(bytes: Uint8Array, translate = true): void {\n const { c_oflag } = this.termios;\n if (!translate || !(c_oflag & OPOST && c_oflag & ONLCR) || !bytes.includes(0x0a)) {\n this.screen.write(bytes);\n return;\n }\n const out: number[] = [];\n for (const byte of bytes) {\n if (byte === 0x0a) out.push(0x0d);\n out.push(byte);\n }\n this.screen.write(Uint8Array.from(out));\n }\n\n get reading(): boolean {\n return this.readers > 0;\n }\n\n private async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n this.onRead?.();\n this.readers++;\n try {\n return await this.take(max, signal);\n } finally {\n this.readers--;\n }\n }\n\n private async take(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.readable.length === 0) {\n if (this.hungUp) return new Uint8Array(0);\n await this.changed(signal);\n }\n const head = this.readable[0];\n if (head === null) {\n this.readable.shift();\n return new Uint8Array(0);\n }\n if (head === undefined) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.readable.length > 0 && n < max) {\n const next = this.readable[0];\n if (next === null || next === undefined) break;\n const take = next.subarray(0, max - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.readable[0] = next.subarray(take.length);\n else this.readable.shift();\n if (this.canonical) break;\n }\n const out = new Uint8Array(n);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { KernelTty } from './tty.ts';\n\nexport type PtySignal = (tty: KernelTty, sig: number) => void;\n\nexport class PtyPair {\n readonly slave: KernelTty;\n\n locked = true;\n\n packet = false;\n private queue: Uint8Array[] = [];\n private waiters: Array<() => void> = [];\n private masterOpen = true;\n private slaveRefs = 0;\n private slaveSeen = false;\n\n readonly index: number;\n\n private readonly onFree: (pair: PtyPair) => void;\n\n constructor(\n index: number,\n\n signal: PtySignal,\n\n onFree: (pair: PtyPair) => void,\n\n onRead?: (tty: KernelTty) => void\n ) {\n this.index = index;\n\n this.onFree = onFree;\n this.slave = new KernelTty({ write: (bytes) => this.fromSlave(bytes) }, (sig) =>\n signal(this.slave, sig)\n );\n if (onRead) this.slave.onRead = () => onRead(this.slave);\n this.slave.name = `/dev/pts/${index}`;\n }\n\n master(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.readMaster(max, signal),\n write: async (bytes) => {\n this.slave.receive(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.queue.length > 0 || this.slaveGone,\n writable: true,\n hangup: this.slaveGone,\n }),\n changed: (signal) => this.changed(signal),\n close: () => this.closeMaster(),\n pty: this,\n });\n }\n\n openSlave(): OpenFile {\n if (!this.masterOpen || this.locked) throw new KernelError('EIO');\n const file = this.slave.file().file;\n this.slaveRefs += 1;\n this.slaveSeen = true;\n return new OpenFile({ ...file, close: () => this.closeSlave() });\n }\n\n private get slaveGone(): boolean {\n return this.slaveSeen && this.slaveRefs === 0;\n }\n\n private fromSlave(bytes: Uint8Array): void {\n if (!this.masterOpen) return;\n this.queue.push(bytes.slice());\n this.wake();\n }\n\n private async readMaster(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.queue.length === 0) {\n if (this.slaveGone) throw new KernelError('EIO');\n await this.changed(signal);\n }\n\n const status = this.packet ? 1 : 0;\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.queue.length > 0 && n < max - status) {\n const next = this.queue[0] as Uint8Array;\n const take = next.subarray(0, max - status - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.queue[0] = next.subarray(take.length);\n else this.queue.shift();\n }\n const out = new Uint8Array(status + n);\n let at = status;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private closeMaster(): void {\n this.masterOpen = false;\n this.queue = [];\n\n this.slave.hangup();\n this.slave.signalHangup();\n this.freeIfUnused();\n }\n\n private closeSlave(): void {\n this.slaveRefs -= 1;\n this.wake();\n this.freeIfUnused();\n }\n\n private freeIfUnused(): void {\n if (!this.masterOpen && this.slaveRefs === 0) this.onFree(this);\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n\nexport class PtyTable {\n private readonly pairs = new Map<number, PtyPair>();\n\n private readonly signal: PtySignal;\n\n private readonly onRead: ((tty: KernelTty) => void) | undefined;\n\n constructor(signal: PtySignal, onRead?: (tty: KernelTty) => void) {\n this.signal = signal;\n this.onRead = onRead;\n }\n\n open(): { pair: PtyPair; master: OpenFile } {\n let index = 0;\n while (this.pairs.has(index)) index += 1;\n const pair = new PtyPair(index, this.signal, (p) => this.pairs.delete(p.index), this.onRead);\n this.pairs.set(index, pair);\n return { pair, master: pair.master() };\n }\n\n get(index: number): PtyPair {\n const pair = this.pairs.get(index);\n if (!pair) throw new KernelError('ENOENT');\n return pair;\n }\n\n numbers(): number[] {\n return [...this.pairs.keys()].sort((a, b) => a - b);\n }\n}\n\nexport function ptsNumber(path: string): number | undefined {\n const m = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n return m ? Number(m[1]) : undefined;\n}\n\nexport type PtySyscall =\n | { op: 'pty-open' }\n | { op: 'pty-slave-open'; n: number; noctty: boolean }\n | { op: 'pty-number'; fd: number }\n | { op: 'pty-lock'; fd: number; lock: boolean }\n | { op: 'pty-ctty'; fd: number }\n | { op: 'pty-packet'; fd: number; on: boolean }\n | { op: 'pty-list' }\n | { op: 'pty-winsz-set'; fd: number; rows: number; cols: number };\n\nexport const PTY_OPS: readonly PtySyscall['op'][] = [\n 'pty-open',\n 'pty-slave-open',\n 'pty-number',\n 'pty-lock',\n 'pty-ctty',\n 'pty-packet',\n 'pty-list',\n 'pty-winsz-set',\n];\n\nexport interface PtyContext {\n pid: number;\n fds: FdTable;\n ptys?: PtyTable;\n jobs?: JobTable;\n}\n\nfunction masterOf(ctx: PtyContext, fd: number): PtyPair {\n const pair = ctx.fds.get(fd).file.pty;\n if (!pair) throw new KernelError('ENOTTY');\n return pair;\n}\n\nfunction terminalOf(ctx: PtyContext, fd: number): KernelTty {\n const file = ctx.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n}\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nexport function ptySyscall(req: PtySyscall, ctx: PtyContext): SyncFsResult {\n switch (req.op) {\n case 'pty-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n return json(ctx.fds.install(ctx.ptys.open().master, 3));\n }\n case 'pty-slave-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n const pair = ctx.ptys.get(req.n);\n const fd = ctx.fds.install(pair.openSlave(), 3);\n\n if (!req.noctty) ctx.jobs?.acquireTerminal(ctx.pid, pair.slave);\n return json(fd);\n }\n case 'pty-number':\n return json(masterOf(ctx, req.fd).index);\n case 'pty-lock':\n masterOf(ctx, req.fd).locked = req.lock;\n return done;\n case 'pty-ctty': {\n const tty = terminalOf(ctx, req.fd);\n\n const leader = ctx.jobs?.getsid(ctx.pid, 0) === ctx.pid;\n if (leader && ctx.jobs?.controllingTerminal(ctx.pid) === tty) return done;\n if (!ctx.jobs?.acquireTerminal(ctx.pid, tty)) throw new KernelError('EPERM');\n return done;\n }\n case 'pty-list':\n return json(ctx.ptys?.numbers() ?? []);\n case 'pty-packet':\n masterOf(ctx, req.fd).packet = req.on;\n return done;\n case 'pty-winsz-set':\n terminalOf(ctx, req.fd).resize(req.cols, req.rows);\n return done;\n }\n}\n", "import { type FdTable, KernelError, pollFile } from './fd-table.ts';\n\nexport interface SelectResult {\n read: number[];\n write: number[];\n\n hangup?: number[];\n}\n\nfunction ready(fds: FdTable, read: readonly number[], write: readonly number[]): SelectResult {\n const hangup = new Set<number>();\n const pick = (list: readonly number[], dir: 'readable' | 'writable') =>\n list.filter((fd) => {\n const state = pollFile(fds.get(fd).file);\n if (state.hangup) hangup.add(fd);\n return state[dir] || state.hangup;\n });\n const out: SelectResult = { read: pick(read, 'readable'), write: pick(write, 'writable') };\n if (hangup.size > 0) out.hangup = [...hangup];\n return out;\n}\n\nfunction interruption(signal: AbortSignal): { promise: Promise<never>; done(): void } {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal.aborted) fail();\n else signal.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal.removeEventListener('abort', fail) };\n}\n\nexport async function selectFds(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n timeoutMs: number,\n interrupt: AbortSignal\n): Promise<SelectResult> {\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const interrupted = interruption(interrupt);\n interrupted.promise.catch(() => {});\n try {\n return await waitReady(fds, read, write, deadline, interrupted.promise);\n } finally {\n interrupted.done();\n }\n}\n\nasync function waitReady(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n deadline: number,\n interrupted: Promise<never>\n): Promise<SelectResult> {\n for (;;) {\n const now = ready(fds, read, write);\n if (now.read.length > 0 || now.write.length > 0 || Date.now() >= deadline) return now;\n\n const round = new AbortController();\n const changes = [...new Set([...read, ...write])].flatMap((fd) => {\n const file = fds.get(fd).file;\n return file.changed === undefined ? [] : [file.changed(round.signal).catch(() => undefined)];\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const expiry =\n deadline === Number.POSITIVE_INFINITY\n ? []\n : [new Promise<void>((resolve) => (timer = setTimeout(resolve, deadline - Date.now())))];\n try {\n await Promise.race([...changes, ...expiry, interrupted]);\n } finally {\n round.abort();\n clearTimeout(timer);\n }\n }\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, pollFile } from './fd-table.ts';\nimport type { ResolveFamily } from './net/uplink.ts';\nimport { KernelSocket, type LoopbackNet, type SockAddr, type SocketDomain } from './socket.ts';\nexport type SocketSyscall =\n | {\n op: 'sock-open';\n domain: SocketDomain;\n }\n | {\n op: 'sock-pair';\n domain: SocketDomain;\n }\n | {\n op: 'sock-bind';\n fd: number;\n addr: SockAddr;\n }\n | {\n op: 'sock-listen';\n fd: number;\n backlog: number;\n }\n | {\n op: 'sock-accept';\n fd: number;\n nonblock: boolean;\n }\n | {\n op: 'sock-connect';\n fd: number;\n addr: SockAddr;\n nonblock: boolean;\n }\n | {\n op: 'sock-shutdown';\n fd: number;\n how: number;\n }\n | {\n op: 'sock-name';\n fd: number;\n peer: boolean;\n }\n | {\n op: 'sock-getopt';\n fd: number;\n level: number;\n name: number;\n }\n | {\n op: 'sock-setopt';\n fd: number;\n level: number;\n name: number;\n value: number;\n }\n | {\n op: 'sock-resolve';\n name: string;\n family: ResolveFamily;\n };\nexport const SOCKET_OPS: readonly SocketSyscall['op'][] = [\n 'sock-open',\n 'sock-pair',\n 'sock-bind',\n 'sock-listen',\n 'sock-accept',\n 'sock-connect',\n 'sock-shutdown',\n 'sock-name',\n 'sock-getopt',\n 'sock-setopt',\n 'sock-resolve',\n];\nexport interface SocketProcess {\n fds: FdTable;\n net: LoopbackNet;\n blocking(): AbortSignal;\n resolve(name: string, family: ResolveFamily, blocking: () => AbortSignal): Promise<string[]>;\n}\nfunction socketAt(fds: FdTable, fd: number): KernelSocket {\n const file = fds.get(fd).file;\n if (!(file instanceof KernelSocket)) throw new KernelError('ENOTSOCK');\n return file;\n}\nconst ok = (json?: unknown): SyncFsResult =>\n json === undefined ? { ok: true, kind: 'void' } : { ok: true, kind: 'json', json };\nexport async function socketSyscall(\n req: SocketSyscall,\n proc: SocketProcess\n): Promise<SyncFsResult> {\n const { fds, net } = proc;\n switch (req.op) {\n case 'sock-open':\n return ok(fds.install(new OpenFile(net.socket(req.domain)), 3));\n case 'sock-pair': {\n const [a, b] = KernelSocket.pair(net, req.domain);\n const first = fds.install(new OpenFile(a), 3);\n try {\n return ok([first, fds.install(new OpenFile(b), 3)]);\n } catch (e) {\n await Promise.resolve(fds.close(first));\n throw e;\n }\n }\n case 'sock-bind':\n socketAt(fds, req.fd).bind(req.addr);\n return ok();\n case 'sock-listen':\n socketAt(fds, req.fd).listen(req.backlog);\n return ok();\n case 'sock-accept':\n return ok(await accept(proc, req.fd, req.nonblock));\n case 'sock-connect': {\n const dialing = socketAt(fds, req.fd).connect(req.addr);\n if (req.nonblock) {\n dialing?.catch(() => undefined);\n throw new KernelError('EINPROGRESS');\n }\n if (dialing !== undefined) await interruptible(dialing, proc.blocking());\n return ok();\n }\n case 'sock-shutdown':\n socketAt(fds, req.fd).shutdown(req.how);\n return ok();\n case 'sock-name': {\n const socket = socketAt(fds, req.fd);\n const addr = req.peer ? socket.peer : socket.local;\n if (req.peer && !addr) throw new KernelError('ENOTCONN');\n return ok(addr ?? unnamed(socket.domain));\n }\n case 'sock-getopt':\n return ok(socketAt(fds, req.fd).getOption(req.level, req.name));\n case 'sock-setopt':\n socketAt(fds, req.fd).setOption(req.level, req.name, req.value);\n return ok();\n case 'sock-resolve': {\n const addresses = await proc.resolve(req.name, req.family, () => proc.blocking());\n if (addresses.length === 0) throw new KernelError('ENOENT');\n return ok(addresses);\n }\n }\n}\nfunction interruptible(dialing: Promise<void>, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const abort = () => reject(new KernelError('EINTR'));\n signal.addEventListener('abort', abort, { once: true });\n dialing.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));\n });\n}\nfunction unnamed(domain: SocketDomain): SockAddr {\n return domain === 'inet'\n ? { family: 'inet', host: '0.0.0.0', port: 0 }\n : { family: 'unix', path: '' };\n}\nasync function accept(\n proc: SocketProcess,\n fd: number,\n nonblock: boolean\n): Promise<{\n fd: number;\n peer: SockAddr | undefined;\n}> {\n const listener = socketAt(proc.fds, fd);\n const waits = !nonblock && !pollFile(listener).readable;\n const socket = await listener.accept(waits ? proc.blocking() : undefined, nonblock);\n return { fd: proc.fds.install(new OpenFile(socket), 3), peer: socket.peer };\n}\n", "export const PAGE = 64 * 1024;\nexport const READAHEAD = 1024 * 1024;\nexport const CLEAN_LIMIT = 4 * 1024 * 1024;\nexport const WRITEBACK = 8 * 1024 * 1024;\nexport const RUN = 1024 * 1024;\n\nexport interface Run {\n offset: number;\n bytes: Uint8Array;\n}\n\nexport interface FlushPlan {\n shrink?: number;\n runs: Run[];\n extend?: number;\n}\n\nexport class Pages {\n length: number;\n private stored: number;\n private shrink: number | undefined;\n private readonly pages = new Map<number, Uint8Array>();\n private readonly dirty = new Set<number>();\n private readonly free: Uint8Array[] = [];\n private pinned = false;\n\n constructor(size: number) {\n this.length = size;\n this.stored = size;\n }\n\n get dirtyBytes(): number {\n return this.dirty.size * PAGE;\n }\n\n get changed(): boolean {\n return this.dirty.size > 0 || this.shrink !== undefined || this.length !== this.stored;\n }\n\n missing(at: number, length: number): Array<[number, number]> {\n this.evict();\n const end = Math.min(this.stored, at + length, this.length);\n const runs: Array<[number, number]> = [];\n for (let page = Math.floor(at / PAGE); page * PAGE < end; page++) {\n if (this.pages.has(page)) continue;\n const last = runs[runs.length - 1];\n if (last && last[0] + last[1] === page * PAGE) last[1] += PAGE;\n else runs.push([page * PAGE, PAGE]);\n }\n const last = runs[runs.length - 1];\n if (last) last[1] = Math.max(last[1], Math.min(READAHEAD, this.stored - last[0]));\n return runs.map(([start, n]) => [start, Math.min(n, this.stored - start)]);\n }\n\n partial(at: number, length: number): Array<[number, number]> {\n if (length === 0) return [];\n this.evict();\n const edges = new Set([Math.floor(at / PAGE), Math.floor((at + length - 1) / PAGE)]);\n const runs: Array<[number, number]> = [];\n for (const page of edges) {\n const start = page * PAGE;\n const covered = at <= start && at + length >= start + PAGE;\n if (covered || this.pages.has(page) || start >= this.stored) continue;\n runs.push([start, Math.min(PAGE, this.stored - start)]);\n }\n return runs;\n }\n\n fill(start: number, bytes: Uint8Array): void {\n for (let at = 0; at < bytes.length; at += PAGE) {\n const page = (start + at) / PAGE;\n if (this.pages.has(page)) continue;\n const part = bytes.subarray(at, Math.min(at + PAGE, bytes.length));\n const fresh = this.take(part.length);\n fresh.set(part);\n this.pages.set(page, fresh);\n }\n }\n\n read(at: number, length: number): Uint8Array {\n const out = new Uint8Array(Math.max(0, Math.min(this.length, at + length) - at));\n this.readInto(at, out);\n return out;\n }\n\n readInto(at: number, out: Uint8Array): number {\n const end = Math.min(this.length, at + out.length);\n for (let pos = at; pos < end; ) {\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, end - pos);\n const bytes = this.pages.get(page);\n if (bytes) out.set(bytes.subarray(from, from + n), pos - at);\n else out.fill(0, pos - at, pos - at + n);\n pos += n;\n }\n return Math.max(0, end - at);\n }\n\n write(at: number, bytes: Uint8Array): void {\n for (let done = 0; done < bytes.length; ) {\n const pos = at + done;\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, bytes.length - done);\n let target = this.pages.get(page);\n if (!target) {\n target = this.take(0);\n this.pages.set(page, target);\n }\n target.set(bytes.subarray(done, done + n), from);\n this.dirty.add(page);\n done += n;\n }\n this.length = Math.max(this.length, at + bytes.length);\n }\n\n truncate(size: number): void {\n if (size < this.stored) {\n this.stored = size;\n this.shrink = Math.min(this.shrink ?? size, size);\n }\n if (size < this.length) {\n const edge = Math.floor(size / PAGE);\n for (const page of [...this.pages.keys()]) {\n if (page > edge || (page === edge && size === edge * PAGE)) this.drop(page);\n }\n this.pages.get(edge)?.fill(0, size - edge * PAGE);\n }\n this.length = size;\n }\n\n plan(): FlushPlan {\n const runs: Run[] = [];\n const sorted = [...this.dirty].sort((a, b) => a - b);\n for (let i = 0; i < sorted.length; ) {\n let j = i + 1;\n const first = sorted[i] as number;\n while (\n j < sorted.length &&\n sorted[j] === first + (j - i) &&\n ((sorted[j] as number) * PAGE) % RUN !== 0\n ) {\n j++;\n }\n const start = first * PAGE;\n const end = Math.min(this.length, (first + (j - i)) * PAGE);\n const bytes = new Uint8Array(end - start);\n for (let k = i; k < j; k++) {\n const page = this.pages.get(sorted[k] as number) as Uint8Array;\n bytes.set(page.subarray(0, Math.min(PAGE, end - (k - i) * PAGE - start)), (k - i) * PAGE);\n }\n runs.push({ offset: start, bytes });\n i = j;\n }\n const written = Math.max(this.stored, ...runs.map((r) => r.offset + r.bytes.length));\n return {\n ...(this.shrink !== undefined ? { shrink: this.shrink } : {}),\n runs,\n ...(this.length > written ? { extend: this.length } : {}),\n };\n }\n\n flushed(): void {\n this.dirty.clear();\n this.shrink = undefined;\n this.stored = this.length;\n this.evict();\n }\n\n pin(): void {\n this.pinned = true;\n }\n\n reset(size: number): void {\n if (this.pinned) return;\n for (const page of [...this.pages.keys()]) if (!this.dirty.has(page)) this.drop(page);\n if (this.changed) return;\n this.length = size;\n this.stored = size;\n }\n\n private evict(): void {\n if (this.pinned) return;\n let clean = (this.pages.size - this.dirty.size) * PAGE;\n for (const page of this.pages.keys()) {\n if (clean <= CLEAN_LIMIT) return;\n if (this.dirty.has(page)) continue;\n this.drop(page);\n clean -= PAGE;\n }\n }\n\n private take(used: number): Uint8Array {\n const page = this.free.pop();\n if (!page) return new Uint8Array(PAGE);\n page.fill(0, used);\n return page;\n }\n\n private drop(page: number): void {\n const bytes = this.pages.get(page) as Uint8Array;\n this.pages.delete(page);\n this.dirty.delete(page);\n if (this.free.length < CLEAN_LIMIT / PAGE) this.free.push(bytes);\n }\n}\n", "import { Pages, WRITEBACK } from './pages.ts';\n\nexport interface RangedIo {\n pread(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate(path: string, size: number): void;\n}\n\nexport interface AsyncRangedIo {\n pread(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate(path: string, size: number): Promise<void>;\n}\n\nexport class RangedFile {\n private readonly pages: Pages;\n private readonly io: RangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: RangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n get changed(): boolean {\n return this.pages.changed;\n }\n\n get pinnedVersion(): string | undefined {\n return this.version;\n }\n\n forget(): void {\n this.pages.reset(this.pages.length);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private fetch(runs: Array<[number, number]>): void {\n for (const [start, n] of runs) {\n this.pages.fill(start, this.io.pread(this.path, start, n, this.version));\n }\n }\n\n read(at: number, length: number): Uint8Array {\n this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n readInto(at: number, out: Uint8Array): number {\n this.fetch(this.pages.missing(at, out.length));\n return this.pages.readInto(at, out);\n }\n\n write(at: number, bytes: Uint8Array): void {\n this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n flush(): void {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n pin(): void {\n this.pinned = true;\n this.pages.pin();\n this.fetch(this.pages.missing(0, this.pages.length));\n }\n\n reset(size: number): void {\n this.pages.reset(size);\n }\n}\n\nexport class AsyncRangedFile {\n private readonly pages: Pages;\n private readonly io: AsyncRangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: AsyncRangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private async fetch(runs: Array<[number, number]>): Promise<void> {\n for (const [start, n] of runs) {\n this.pages.fill(start, await this.io.pread(this.path, start, n, this.version));\n }\n }\n\n async read(at: number, length: number): Promise<Uint8Array> {\n await this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n async write(at: number, bytes: Uint8Array): Promise<void> {\n await this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) await this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n async flush(): Promise<void> {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) await this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) await this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) await this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n async pin(): Promise<void> {\n this.pinned = true;\n this.pages.pin();\n await this.fetch(this.pages.missing(0, this.pages.length));\n }\n}\n", "import { AsyncRangedFile, type AsyncRangedIo } from '../fs/ranged.ts';\nimport { fsError, type KernelFs, rangedOps } from '../fs/types.ts';\nimport type { KeptFile, UnlinkHolder } from '../fs/unlinked.ts';\nimport { KernelError, OpenFile } from './fd-table.ts';\n\nexport interface VfsFileFs extends Partial<AsyncRangedIo> {\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array): Promise<void>;\n stat?(path: string): Promise<{\n readonly?: boolean;\n maxFile?: number;\n size?: number;\n ranged?: boolean;\n version?: string;\n }>;\n readlink?(path: string): Promise<string>;\n lstat?(path: string): Promise<unknown>;\n realpath?(path: string, follow: boolean): Promise<string>;\n}\n\nconst O_ACCMODE = 0o3;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nconst SEEK_SET = 0;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\nexport interface VfsFileOptions {\n path: string;\n\n flags: number;\n\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n dirty?: boolean;\n\n pin?: VersionPin;\n\n truncate?: boolean;\n\n create?: boolean;\n}\n\nexport interface VersionPin {\n version: string;\n size: number;\n}\n\nexport const WRITEBACK_MS = 250;\n\nconst WRITEBACK_COST_FACTOR = 10;\n\nfunction isMissing(err: unknown): boolean {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return true;\n return err instanceof Error && err.message.startsWith('ENOENT');\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n}\n\nexport class VfsNode {\n private data: Uint8Array | undefined;\n private ranged: AsyncRangedFile | undefined;\n private readonly pin: VersionPin | undefined;\n private length = 0;\n private dirty = false;\n private queue: Promise<unknown> = Promise.resolve();\n\n private writeBack: ReturnType<typeof setTimeout> | undefined;\n\n private writeBackCost = 0;\n\n opens = 0;\n\n writers = 0;\n\n private missing = false;\n\n private revoked = false;\n\n private readonly fs: VfsFileFs;\n\n path: string;\n\n orphaned: boolean;\n\n constructor(\n fs: VfsFileFs,\n\n path: string,\n\n contents?: Uint8Array,\n\n orphaned: boolean = false,\n\n dirty = false,\n\n pin?: VersionPin\n ) {\n this.fs = fs;\n this.pin = pin;\n\n this.path = path;\n\n this.orphaned = orphaned;\n if (contents !== undefined) this.data = new Uint8Array(contents);\n else if (orphaned) this.data = new Uint8Array(0);\n this.length = this.data?.length ?? 0;\n if (dirty && contents !== undefined) this.markDirty();\n }\n\n serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n revoke(): void {\n this.revoked = true;\n clearTimeout(this.writeBack);\n this.writeBack = undefined;\n this.data = undefined;\n this.ranged = undefined;\n }\n\n private async prepare(): Promise<AsyncRangedFile | undefined> {\n if (this.revoked) throw new KernelError('EIO');\n if (this.ranged || this.data) return this.ranged;\n const io = rangedOps(this.fs);\n if (io && this.pin && !this.orphaned) {\n this.ranged = new AsyncRangedFile(io, this.path, this.pin.size, this.pin.version);\n return this.ranged;\n }\n const st =\n io && !this.orphaned ? await this.fs.stat?.(this.path).catch(() => undefined) : undefined;\n if (io && st?.ranged) {\n this.ranged = new AsyncRangedFile(io, this.path, st.size ?? 0, st.version);\n return this.ranged;\n }\n await this.load();\n return undefined;\n }\n\n async keep(): Promise<void> {\n const ranged = await this.prepare();\n await ranged?.pin();\n }\n\n async load(): Promise<Uint8Array> {\n if (this.revoked) throw new KernelError('EIO');\n if (!this.data) {\n try {\n this.data = await this.fs.readFileBuffer(this.path);\n } catch (err) {\n if (!isMissing(err)) throw err;\n this.data = new Uint8Array(0);\n this.missing = true;\n }\n this.length = this.data.length;\n }\n return this.data;\n }\n\n holds(): boolean {\n return this.dirty;\n }\n\n replace(contents: Uint8Array): void {\n this.ranged = undefined;\n this.data = new Uint8Array(contents);\n this.length = this.data.length;\n this.missing = false;\n this.markDirty();\n }\n\n async materialize(): Promise<void> {\n if (await this.prepare()) return;\n if (!this.missing || this.orphaned) return;\n this.missing = false;\n await this.fs.writeFile(this.path, this.data?.slice(0, this.length) ?? new Uint8Array(0));\n if (!this.dirty) this.data = undefined;\n }\n\n async size(): Promise<number> {\n const ranged = await this.prepare();\n return ranged ? ranged.size() : this.length;\n }\n\n async pread(max: number, at: number): Promise<Uint8Array> {\n const ranged = await this.prepare();\n if (ranged) return ranged.read(at, max);\n const bytes = await this.load();\n const n = Math.max(0, Math.min(max, this.length - at));\n return bytes.slice(at, at + n);\n }\n\n private cap: Promise<number | undefined> | undefined;\n\n limit(): Promise<number | undefined> {\n if (this.cap !== undefined) return this.cap;\n const stat = this.fs.stat?.bind(this.fs);\n if (!stat || this.orphaned) return Promise.resolve(undefined);\n const parent = this.path.slice(0, this.path.lastIndexOf('/')) || '/';\n this.cap ??= stat(this.path)\n .catch(() => stat(parent))\n .then(\n (st) => st.maxFile,\n () => undefined\n );\n return this.cap;\n }\n\n private async fits(end: number): Promise<void> {\n const max = await this.limit();\n if (max !== undefined && end > max) throw new KernelError('EFBIG');\n }\n\n renamedTo(path: string): void {\n this.path = path;\n if (this.ranged) this.ranged.path = path;\n this.cap = undefined;\n }\n\n async pwrite(bytes: Uint8Array, at: number): Promise<number> {\n if (bytes.length === 0) return 0;\n await this.fits(at + bytes.length);\n const ranged = await this.prepare();\n if (ranged) {\n await ranged.write(at, bytes);\n this.markDirty();\n return bytes.length;\n }\n const buf = this.ensure(at + bytes.length);\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, at + bytes.length);\n this.markDirty();\n return bytes.length;\n }\n\n async truncate(size: number): Promise<void> {\n await this.fits(size);\n const ranged = await this.prepare();\n if (ranged) {\n ranged.truncate(size);\n this.markDirty();\n return;\n }\n const buf = this.ensure(size);\n if (size > this.length) buf.fill(0, this.length, size);\n this.length = size;\n this.markDirty();\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.writeBack !== undefined || this.orphaned) return;\n const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);\n this.writeBack = setTimeout(() => {\n this.writeBack = undefined;\n this.serial(() => this.flush()).catch(() => undefined);\n }, delay);\n }\n\n private ensure(need: number): Uint8Array {\n const cur = this.data ?? new Uint8Array(0);\n if (cur.length >= need) return cur;\n const grown = new Uint8Array(Math.max(need, cur.length * 2, 256));\n grown.set(cur.subarray(0, this.length));\n this.data = grown;\n return grown;\n }\n\n async flush(): Promise<void> {\n if (this.revoked && this.dirty) throw new KernelError('EIO');\n if (!this.dirty || this.orphaned || !(this.data || this.ranged)) return;\n this.dirty = false;\n const started = performance.now();\n try {\n if (this.ranged) await this.ranged.flush();\n else await this.fs.writeFile(this.path, (this.data as Uint8Array).slice(0, this.length));\n } catch (err) {\n this.dirty = true;\n throw err;\n }\n this.writeBackCost = performance.now() - started;\n }\n}\n\nexport class VfsNodes implements UnlinkHolder {\n private readonly byPath = new Map<string, VfsNode>();\n\n private readonly kept = new Map<VfsNode, KeptFile>();\n\n keepsOnDisk = false;\n\n private readonly fs: VfsFileFs;\n\n private readonly entries = new Map<string, Promise<unknown>>();\n\n private readonly onClosed: ((path: string) => void) | undefined;\n\n constructor(fs: VfsFileFs, onClosed?: (path: string) => void) {\n this.fs = fs;\n this.onClosed = onClosed;\n }\n\n async onEntry<T>(path: string, op: () => Promise<T>): Promise<T> {\n const key = await this.entryKey(path);\n const run = (this.entries.get(key) ?? Promise.resolve()).then(op);\n const tail = run.catch(() => undefined);\n this.entries.set(key, tail);\n void tail.then(() => {\n if (this.entries.get(key) === tail) this.entries.delete(key);\n });\n return run;\n }\n\n async entryKey(path: string): Promise<string> {\n const parent = parentOf(path);\n const dir = await this.real(parent, true, () => realDir(this.fs, parent));\n return joinName(dir, path.slice(path.lastIndexOf('/') + 1));\n }\n\n targetKey(path: string): Promise<string> {\n return this.real(path, true, () => realTarget(this.fs, path));\n }\n\n private async real(path: string, follow: boolean, walk: () => Promise<string>): Promise<string> {\n if (this.fs.realpath) {\n try {\n return await this.fs.realpath(path, follow);\n } catch (err) {\n if (errCode(err) === 'ELOOP') throw err;\n }\n }\n return walk();\n }\n\n createExclusive(path: string): Promise<void> {\n return this.onEntry(path, async () => {\n const node = this.byPath.get(path);\n const held = node ? await node.serial(async () => node.holds()) : false;\n if (held || (await present(this.fs, path))) throw fsError('EEXIST', path);\n await this.fs.writeFile(path, new Uint8Array(0));\n });\n }\n\n open(path: string, pin?: VersionPin, writable = false): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, undefined, false, false, pin);\n this.byPath.set(path, node);\n }\n node.opens++;\n if (writable) node.writers++;\n return node;\n }\n\n adopt(path: string, contents: Uint8Array, dirty: boolean, writable = false): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, contents, false, dirty);\n this.byPath.set(path, node);\n } else if (dirty) {\n node.replace(contents);\n }\n node.opens++;\n if (writable) node.writers++;\n return node;\n }\n\n holds(prefix: string): boolean {\n for (const path of this.byPath.keys()) if (within(path, prefix)) return true;\n return false;\n }\n\n writes(prefix: string): boolean {\n for (const [path, node] of this.byPath)\n if (node.writers > 0 && within(path, prefix)) return true;\n return false;\n }\n\n closed(node: VfsNode, writable = false): void {\n node.opens--;\n if (writable) node.writers--;\n if (node.opens > 0) {\n if (writable && node.writers === 0) this.onClosed?.(node.path);\n return;\n }\n if (this.byPath.get(node.path) === node) this.byPath.delete(node.path);\n this.kept.get(node)?.release();\n this.kept.delete(node);\n this.onClosed?.(node.path);\n }\n\n held(): Iterable<string> {\n return this.byPath.keys();\n }\n\n owns(): boolean {\n return false;\n }\n\n isKept(): boolean {\n return false;\n }\n\n keep(path: string, file: KeptFile): void {\n const node = this.byPath.get(path);\n if (!node) {\n file.release();\n return;\n }\n this.byPath.delete(path);\n node.renamedTo(file.hidden);\n this.byPath.set(file.hidden, node);\n this.kept.set(node, file);\n }\n\n unkeep(path: string, file: KeptFile): void {\n const node = this.byPath.get(file.hidden);\n if (!node) return;\n this.byPath.delete(file.hidden);\n node.renamedTo(path);\n this.byPath.set(path, node);\n this.kept.delete(node);\n }\n\n async flush(path: string): Promise<void> {\n for (const [p, node] of this.byPath) if (within(p, path)) await node.serial(() => node.flush());\n }\n\n async unlinking(path: string): Promise<void> {\n for (const [held, node] of [...this.byPath]) {\n if (!within(held, path)) continue;\n await node.serial(async () => {\n await Promise.all([this.keepsOnDisk || node.keep(), node.limit()]);\n });\n }\n }\n\n revoke(prefix: string): void {\n for (const [path, node] of this.byPath) {\n if (!within(path, prefix)) continue;\n node.revoke();\n this.byPath.delete(path);\n }\n }\n\n unlinked(path: string): void {\n for (const [held, node] of [...this.byPath]) {\n if (!within(held, path)) continue;\n node.orphaned = true;\n this.byPath.delete(held);\n }\n }\n\n renamed(from: string, to: string): void {\n if (from === to) return;\n const moved: VfsNode[] = [];\n for (const [p, node] of this.byPath) {\n if (within(p, from)) moved.push(node);\n else if (within(p, to)) {\n node.orphaned = true;\n this.byPath.delete(p);\n }\n }\n for (const node of moved) {\n this.byPath.delete(node.path);\n node.renamedTo(to + node.path.slice(from.length));\n this.byPath.set(node.path, node);\n }\n }\n}\n\nexport async function present(fs: VfsFileFs, path: string, follow = false): Promise<boolean> {\n const look = (follow ? undefined : fs.lstat) ?? fs.stat;\n try {\n await (look ? look.call(fs, path) : fs.readFileBuffer(path));\n return true;\n } catch (err) {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return false;\n throw err;\n }\n}\n\nconst MAX_LINKS = 40;\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nasync function linkOf(fs: VfsFileFs, path: string): Promise<string | undefined> {\n return fs.readlink?.(path).catch(() => undefined);\n}\n\ninterface Budget {\n hops: number;\n}\n\nasync function realDir(fs: VfsFileFs, dir: string, budget: Budget = { hops: 0 }): Promise<string> {\n const queue = dir.split('/').filter(Boolean);\n let at = '/';\n while (queue.length > 0) {\n const part = queue.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n at = parentOf(at);\n continue;\n }\n const next = at === '/' ? `/${part}` : `${at}/${part}`;\n const link = await linkOf(fs, next);\n if (link === undefined) {\n at = next;\n continue;\n }\n if (budget.hops >= MAX_LINKS) throw fsError('ELOOP', dir);\n budget.hops++;\n queue.unshift(...link.split('/').filter(Boolean));\n if (link.startsWith('/')) at = '/';\n }\n return at;\n}\n\nfunction errCode(err: unknown): unknown {\n return (err as { code?: unknown } | null)?.code;\n}\n\nfunction joinName(dir: string, name: string): string {\n return dir === '/' ? `/${name}` : `${dir}/${name}`;\n}\n\nasync function realTarget(fs: VfsFileFs, path: string): Promise<string> {\n const budget: Budget = { hops: 0 };\n let dir = await realDir(fs, parentOf(path), budget);\n let name = path.slice(path.lastIndexOf('/') + 1);\n for (;;) {\n const link = await linkOf(fs, joinName(dir, name));\n if (link === undefined) break;\n if (budget.hops >= MAX_LINKS) throw fsError('ELOOP', path);\n budget.hops++;\n const target = link.startsWith('/') ? link : joinName(dir, link);\n dir = await realDir(fs, parentOf(target), budget);\n name = target.slice(target.lastIndexOf('/') + 1);\n }\n return joinName(dir, name);\n}\n\nasync function targetDir(fs: VfsFileFs, path: string): Promise<string> {\n return parentOf(await realTarget(fs, path).catch(() => path));\n}\n\nexport async function refuseReadonly(\n fs: VfsFileFs,\n path: string,\n flags: number,\n opts: { create?: boolean; truncate?: boolean } = {}\n): Promise<void> {\n const writes = (flags & O_ACCMODE) !== 0 || opts.truncate === true;\n if ((!writes && !opts.create) || !fs.stat) return;\n const stat = (p: string) =>\n fs.stat?.(p).catch((err: unknown) => {\n const code = (err as { code?: unknown } | null)?.code;\n if (isMissing(err) || typeof code !== 'string') return undefined;\n throw err;\n });\n const own = await stat(path);\n if (own && !writes) return;\n const st = own ?? (await stat(await targetDir(fs, path)));\n if (st?.readonly) throw new KernelError('EROFS');\n}\n\nexport function keepingOpen(fs: KernelFs, nodes: VfsNodes): KernelFs {\n return {\n ...fs,\n async rm(path, options) {\n const at = await nodes.entryKey(fs.resolvePath('/', path));\n await nodes.unlinking(at);\n await fs.rm(path, options);\n nodes.unlinked(at);\n },\n async rename(from, to) {\n const a = await nodes.entryKey(fs.resolvePath('/', from));\n const b = await nodes.entryKey(fs.resolvePath('/', to));\n return nodes.onEntry(b, async () => {\n await nodes.unlinking(b);\n await fs.rename(from, to);\n nodes.renamed(a, b);\n });\n },\n writeFile: (path, content) =>\n nodes.onEntry(fs.resolvePath('/', path), () => fs.writeFile(path, content)),\n createExclusive: async (path) =>\n nodes.createExclusive(await nodes.entryKey(fs.resolvePath('/', path))),\n symlink: (target, path) =>\n nodes.onEntry(fs.resolvePath('/', path), () => fs.symlink(target, path)),\n mkdir: (path, options) =>\n nodes.onEntry(fs.resolvePath('/', path), () => fs.mkdir(path, options)),\n };\n}\n\nexport function vfsFile(fs: VfsFileFs, opts: VfsFileOptions, nodes?: VfsNodes): OpenFile {\n const access = opts.flags & O_ACCMODE;\n const readable = access !== O_WRONLY;\n const writable = access === O_WRONLY || access === O_RDWR;\n\n const node =\n !nodes || opts.orphan\n ? new VfsNode(fs, opts.path, opts.contents, opts.orphan === true, opts.dirty === true)\n : opts.contents !== undefined\n ? nodes.adopt(opts.path, opts.contents, opts.dirty === true, writable)\n : nodes.open(opts.path, opts.pin, writable);\n\n let openError: { err: unknown } | undefined;\n const atOpen = (op: () => Promise<void>): void => {\n void node.serial(op).catch((err: unknown) => {\n openError ??= { err };\n });\n };\n if (opts.create) atOpen(() => node.materialize());\n if (opts.truncate) atOpen(() => node.truncate(0));\n const takeOpenError = (): void => {\n if (!openError) return;\n const { err } = openError;\n openError = undefined;\n throw err;\n };\n let offset = opts.position;\n const serial = <T>(op: () => Promise<T>) =>\n node.serial(() => {\n takeOpenError();\n return op();\n });\n\n return new OpenFile({\n read: readable\n ? (max) =>\n serial(async () => {\n const out = await node.pread(max, offset);\n offset += out.length;\n return out;\n })\n : undefined,\n write: writable\n ? (bytes) =>\n serial(async () => {\n if (opts.flags & O_APPEND) offset = await node.size();\n offset += await node.pwrite(bytes, offset);\n return bytes.length;\n })\n : undefined,\n seek: (to, whence) =>\n serial(async () => {\n let base = 0;\n if (whence === SEEK_CUR) base = offset;\n else if (whence === SEEK_END) base = await node.size();\n else if (whence !== SEEK_SET) throw new KernelError('EINVAL');\n if (base + to < 0) throw new KernelError('EINVAL');\n offset = base + to;\n return offset;\n }),\n pread: (max, at) =>\n serial(() => {\n if (!readable) throw new KernelError('EBADF');\n return node.pread(max, at);\n }),\n pwrite: (bytes, at) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.pwrite(bytes, at);\n }),\n resize: (size) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.truncate(size);\n }),\n stat: () =>\n serial(async () => ({\n path: node.path,\n size: await node.size(),\n ...(node.orphaned ? { orphan: true as const } : {}),\n })),\n flush: () => serial(() => node.flush()),\n\n close: () =>\n node.serial(async () => {\n try {\n takeOpenError();\n await node.flush();\n } finally {\n nodes?.closed(node, writable);\n }\n }),\n });\n}\n", "import type { MountCall } from '../mount/syscall.ts';\nimport type { LinkRecord } from '../process/wasi/wasix-linker.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n type ChildForker,\n type ChildSpawner,\n type ChildStdio,\n ChildTable,\n type InheritedSlot,\n SpawnError,\n} from './children.ts';\nimport {\n type FdTable,\n type HeldMeta,\n heldFile,\n KernelError,\n type KernelFdKind,\n kernelFdKind,\n type OpenFile,\n openPipe,\n pollFile,\n} from './fd-table.ts';\nimport { AsyncOps, HOST_OPS, type HostSyscall, hostSyscall, type LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport { HTTP_OPS, type HttpHandles, type HttpSyscall } from './net/http-syscalls.ts';\nimport { NO_TRANSPORT } from './net/network.ts';\nimport { Resolver } from './net/resolver.ts';\nimport { Routes } from './net/routes.ts';\nimport type { MountLine, ProcessListing } from './proc-info.ts';\nimport type { ForkState } from './protocol.ts';\nimport { PTY_OPS, type PtySyscall, type PtyTable, ptySyscall } from './pty.ts';\nimport { selectFds } from './select.ts';\nimport { type DefaultAction, defaultAction, isSignal, SIG, sigbit } from './signals.ts';\nimport { KernelSocket, LoopbackNet } from './socket.ts';\nimport { SOCKET_OPS, type SocketSyscall, socketSyscall } from './socket-syscalls.ts';\nimport type { KernelTty, Termios } from './tty.ts';\nimport {\n present,\n refuseReadonly,\n type VersionPin,\n type VfsFileFs,\n VfsNodes,\n vfsFile,\n} from './vfs-file.ts';\n\nfunction aborted(signal: AbortSignal): Promise<never> {\n return new Promise<never>((_, reject) => {\n signal.addEventListener('abort', () => reject(new KernelError('EINTR')), { once: true });\n });\n}\n\nexport type WasmSyscall =\n | {\n op: 'fd-read';\n fd: number;\n max: number;\n\n nonblock?: boolean;\n\n peek?: boolean;\n }\n | { op: 'fd-write'; fd: number; body: Uint8Array; nonblock?: boolean }\n | { op: 'fd-close'; fd: number }\n | { op: 'fd-pipe' }\n | { op: 'fd-poll'; fd: number }\n | {\n op: 'fd-open-vfs';\n path: string;\n flags: number;\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n\n exclusive?: boolean;\n\n existing?: boolean;\n\n pin?: VersionPin;\n }\n | { op: 'fd-pread'; fd: number; offset: number; max: number }\n | { op: 'fd-pwrite'; fd: number; offset: number; body: Uint8Array }\n | { op: 'fd-resize'; fd: number; size: number }\n | { op: 'fd-vfs-stat'; fd: number }\n | { op: 'fd-path-flush'; path: string }\n | { op: 'fd-path-unlinking'; path: string }\n | { op: 'fd-path-unlinked'; path: string }\n | { op: 'fd-path-renamed'; from: string; to: string }\n | { op: 'fd-seek'; fd: number; offset: number; whence: number }\n | { op: 'fd-select'; read: number[]; write: number[]; timeoutMs: number }\n | { op: 'fd-info'; fd: number }\n | { op: 'fd-dup'; fd: number; min?: number }\n | { op: 'fd-reserve'; fd?: number; min?: number; meta?: HeldMeta }\n | { op: 'fd-meta'; fd: number; meta: HeldMeta }\n | { op: 'fd-setfl'; fd: number; flags: number }\n | { op: 'fd-cloexec'; fd: number; on: boolean }\n | { op: 'fd-list' }\n | { op: 'dl-log'; append?: LinkRecord; from: number }\n | {\n op: 'proc-alarm';\n sig: number;\n ms: number;\n firstMs?: number;\n repeat: boolean;\n\n timer?: number;\n }\n | { op: 'fd-renumber'; from: number; to: number; keep?: boolean }\n | { op: 'proc-umask'; mask?: number }\n | {\n op: 'fd-promote';\n fd: number;\n share?: number;\n path?: string;\n flags?: number;\n position?: number;\n contents?: Uint8Array;\n orphan?: boolean;\n\n dirty?: boolean;\n\n pin?: VersionPin;\n }\n | { op: 'fd-open-tty'; name?: string }\n | { op: 'fd-tty-names' }\n | { op: 'tty-get'; fd: number }\n | { op: 'tty-set'; fd: number; termios: Termios }\n | { op: 'tty-winsz'; fd: number }\n | { op: 'fd-flush'; fd: number }\n | {\n op: 'proc-spawn';\n file: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n stdio: ChildStdio[];\n\n inherit?: InheritedSlot[];\n\n exec?: boolean;\n }\n | {\n op: 'proc-wait';\n pid: number;\n nohang: boolean;\n\n untraced?: boolean;\n continued?: boolean;\n }\n | { op: 'proc-captured'; pid: number; slot: number }\n | { op: 'proc-fork'; state: ForkState }\n | { op: 'proc-kill'; pid: number; sig: number }\n | { op: 'proc-list' }\n | { op: 'mount-list' }\n | ({ op: 'mount' } & MountCall)\n | { op: 'umount'; target: string; flags: number }\n | { op: 'proc-exec'; pid: number }\n | { op: 'proc-identity' }\n | { op: 'proc-setpgid'; pid: number; pgid: number }\n | { op: 'proc-getpgid'; pid: number }\n | { op: 'proc-getsid'; pid: number }\n | { op: 'proc-setsid' }\n | { op: 'tty-pgrp-get'; fd: number }\n | { op: 'tty-pgrp-set'; fd: number; pgrp: number }\n | { op: 'sig-mask'; caught: number; ignored: number; defaults?: number }\n | { op: 'sig-pause' }\n | SocketSyscall\n | HttpSyscall\n | PtySyscall\n | HostSyscall;\n\ntype FdSyscall = Extract<WasmSyscall, { op: `fd-${string}` }>;\n\ntype JobSyscall = Extract<\n WasmSyscall,\n { op: 'proc-setpgid' | 'proc-getpgid' | 'proc-getsid' | 'proc-setsid' }\n>;\n\nconst JOB_OPS: ReadonlySet<string> = new Set([\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n]);\n\nfunction isJobSyscall(req: WasmSyscall): req is JobSyscall {\n return JOB_OPS.has(req.op);\n}\n\nfunction isHttpSyscall(req: WasmSyscall): req is HttpSyscall {\n return req.op.startsWith('net-');\n}\n\nfunction isSocketSyscall(req: WasmSyscall): req is SocketSyscall {\n return req.op.startsWith('sock-');\n}\n\nfunction isHostSyscall(req: { op: string }): req is HostSyscall {\n return (HOST_OPS as readonly string[]).includes(req.op);\n}\n\nfunction isPtySyscall(req: WasmSyscall): req is PtySyscall {\n return req.op.startsWith('pty-');\n}\n\ntype VfsSyscall = Extract<\n FdSyscall,\n {\n op:\n | 'fd-pread'\n | 'fd-pwrite'\n | 'fd-resize'\n | 'fd-vfs-stat'\n | 'fd-path-flush'\n | 'fd-path-unlinking'\n | 'fd-path-unlinked'\n | 'fd-path-renamed';\n }\n>;\n\nfunction isVfsSyscall(req: FdSyscall): req is VfsSyscall {\n return (\n req.op.startsWith('fd-path-') ||\n req.op === 'fd-pread' ||\n req.op === 'fd-pwrite' ||\n req.op === 'fd-resize' ||\n req.op === 'fd-vfs-stat'\n );\n}\n\nfunction isFdSyscall(req: WasmSyscall): req is FdSyscall {\n return req.op.startsWith('fd-');\n}\n\nfunction isTtySyscall(req: WasmSyscall): req is TtySyscall {\n return req.op.startsWith('tty-');\n}\n\nexport interface FdInfo {\n tty: boolean;\n kind: KernelFdKind;\n meta?: HeldMeta;\n flags?: number;\n cloexec?: true;\n\n name?: string;\n}\n\nconst SYSCALL_OPS: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-pipe',\n 'fd-poll',\n 'fd-open-vfs',\n 'fd-seek',\n 'fd-pread',\n 'fd-pwrite',\n 'fd-resize',\n 'fd-vfs-stat',\n 'fd-path-flush',\n 'fd-path-unlinking',\n 'fd-path-unlinked',\n 'fd-path-renamed',\n 'fd-select',\n 'fd-info',\n 'fd-dup',\n 'fd-reserve',\n 'fd-meta',\n 'fd-setfl',\n 'fd-cloexec',\n 'fd-list',\n 'proc-alarm',\n 'proc-umask',\n 'dl-log',\n 'fd-renumber',\n 'fd-promote',\n 'fd-open-tty',\n 'fd-tty-names',\n 'tty-get',\n 'tty-set',\n 'tty-winsz',\n 'fd-flush',\n 'proc-spawn',\n 'proc-wait',\n 'proc-captured',\n 'proc-fork',\n 'proc-kill',\n 'proc-list',\n 'mount-list',\n 'mount',\n 'umount',\n 'proc-exec',\n 'proc-identity',\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n 'tty-pgrp-get',\n 'tty-pgrp-set',\n 'sig-mask',\n 'sig-pause',\n ...SOCKET_OPS,\n ...HTTP_OPS,\n ...PTY_OPS,\n ...HOST_OPS,\n]);\n\ntype TtySyscall = Extract<WasmSyscall, { op: `tty-${string}` }>;\n\nexport function isWasmSyscall(req: object): req is WasmSyscall {\n const op = (req as { op?: unknown }).op;\n return typeof op === 'string' && SYSCALL_OPS.has(op);\n}\n\nconst MAX_READ = 1024 * 1024;\n\nexport const DEFAULT_UMASK = 0o022;\n\nconst DYING: SyncFsResult = { ok: false, errno: 'EINTR', message: 'the process is being killed' };\n\nconst HOSTS_ONLY = new Resolver({ routes: new Routes() });\n\nexport interface WasmProcessOptions {\n ignored?: number;\n\n umask?: number;\n\n identity?: () => Promise<{ pid: number; ppid: number }>;\n\n onSyscall?: (req: WasmSyscall) => void;\n\n spawner?: ChildSpawner;\n\n forker?: ChildForker;\n\n fs: VfsFileFs;\n\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n\n writesBack?: (pid: number) => boolean;\n\n processes?: () => ProcessListing;\n\n openFiles?: Set<VfsNodes>;\n\n nodes?: VfsNodes;\n\n mounts?: () => MountLine[];\n\n mount?: (call: MountCall, signal: AbortSignal) => Promise<unknown>;\n\n umount?: (target: string, flags: number) => Promise<void>;\n\n onPending?: (sig: number) => void;\n\n onTimer?: (which: number) => void;\n\n onAsync?: () => void;\n\n hasPending?: () => boolean;\n\n pendingBits?: () => number;\n\n raise?: (sig: number) => void;\n\n onReap?: (pid: number) => void;\n\n jobs?: JobTable;\n\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n\n locks?: LockTable;\n\n resolver?: Resolver;\n}\n\nexport type StateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport type SignalOutcome = DefaultAction | 'deliver' | 'forward';\n\nexport class WasmProcess {\n private exited = false;\n private readonly children: ChildTable;\n\n private caught = 0;\n private ignored = 0;\n private inherited = 0;\n\n private interrupt = new AbortController();\n\n private dying = false;\n\n umask = DEFAULT_UMASK;\n\n private execChild: number | undefined;\n\n execTermsig: number | undefined;\n\n private stopped = 0;\n\n private stops = 0;\n private resumed: Promise<void> = Promise.resolve();\n private wake: (() => void) | undefined;\n private readonly stateListeners: StateListener[] = [];\n\n private net: LoopbackNet | undefined;\n\n private readonly nodes: VfsNodes;\n\n readonly pid: number;\n\n readonly fds: FdTable;\n\n private readonly options: WasmProcessOptions;\n\n constructor(\n pid: number,\n\n fds: FdTable,\n\n options: WasmProcessOptions\n ) {\n this.pid = pid;\n\n this.fds = fds;\n\n this.options = options;\n this.inherited = options.ignored ?? 0;\n this.umask = options.umask ?? DEFAULT_UMASK;\n this.children = new ChildTable(fds, options.spawner, options.forker);\n this.nodes = options.nodes ?? new VfsNodes(options.fs);\n if (!options.nodes) options.openFiles?.add(this.nodes);\n this.children.onChildState = () => this.signal(SIG.CHLD);\n this.children.onReap = options.onReap;\n }\n\n private ignores(bit: number): boolean {\n return ((this.ignored | (this.inherited & ~this.caught)) & bit) !== 0;\n }\n\n inheritable(fork = false): number {\n return ((fork ? 0 : this.ignored) | this.inherited) & ~this.caught;\n }\n\n signal(sig: number): SignalOutcome {\n if (this.execChild !== undefined) {\n void Promise.resolve(this.options.kill?.(this.execChild, sig)).catch(() => undefined);\n if (sig !== SIG.KILL) return 'forward';\n if (!this.options.writesBack?.(this.execChild)) return 'terminate';\n this.wake?.();\n return 'forward';\n }\n if (sig === SIG.KILL) return 'terminate';\n\n if (sig === SIG.CONT) this.cont();\n if (sig === SIG.STOP) return this.stop(sig);\n const bit = sigbit(sig);\n if (this.ignores(bit)) return 'ignore';\n if (!(this.caught & bit)) {\n const action = defaultAction(sig);\n return action === 'stop' ? this.stop(sig) : action;\n }\n if (((this.options.pendingBits?.() ?? 0) & bit) !== 0 && defaultAction(sig) === 'terminate') {\n return 'terminate';\n }\n this.options.onPending?.(sig);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n return 'deliver';\n }\n\n onState(listener: StateListener): void {\n this.stateListeners.push(listener);\n }\n\n private stop(sig: number): 'stop' {\n if (this.stopped) return 'stop';\n this.stopped = sig;\n this.stops++;\n this.resumed = new Promise((resolve) => (this.wake = resolve));\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n for (const listener of this.stateListeners) listener('stopped', sig);\n return 'stop';\n }\n\n private cont(): void {\n if (!this.stopped) return;\n this.stopped = 0;\n this.wake?.();\n for (const listener of this.stateListeners) listener('continued', SIG.CONT);\n }\n\n async syscall(req: WasmSyscall, cancelled?: AbortSignal): Promise<SyncFsResult> {\n this.options.onSyscall?.(req);\n for (;;) {\n await this.resumed;\n if (this.dying) return DYING;\n const stops = this.stops;\n const result = await this.dispatch(req, cancelled);\n if (this.dying) return DYING;\n\n const restart = !result.ok && result.errno === 'EINTR' && this.stops !== stops;\n if (restart && !this.options.hasPending?.()) continue;\n\n await this.resumed;\n return result;\n }\n }\n\n setUmask(mask?: number): number {\n const old = this.umask;\n if (mask !== undefined) this.umask = mask & 0o777;\n return old;\n }\n\n die(): void {\n if (this.dying) return;\n this.dying = true;\n this.interrupt.abort();\n this.wake?.();\n }\n\n private async dispatch(req: WasmSyscall, cancelled?: AbortSignal): Promise<SyncFsResult> {\n try {\n if (isFdSyscall(req)) return await this.fdSyscall(req, cancelled);\n if (isTtySyscall(req)) return this.ttySyscall(req);\n if (isJobSyscall(req)) return this.jobSyscall(req);\n if (isSocketSyscall(req)) return await this.socketSyscall(req);\n if (isHttpSyscall(req)) return await this.httpSyscall(req);\n if (isHostSyscall(req)) {\n return await hostSyscall(req, {\n pid: this.pid,\n locks: this.options.locks,\n ops: this.asyncOps,\n blocking: () => this.blockingSignal(),\n valid: (inner) => isWasmSyscall(inner) && !isHostSyscall(inner),\n });\n }\n if (isPtySyscall(req)) {\n const { ptys, jobs } = this.options;\n return ptySyscall(req, { pid: this.pid, fds: this.fds, ptys, jobs });\n }\n return await this.procSyscall(req);\n } catch (e) {\n if (e instanceof KernelError || e instanceof SpawnError) {\n return { ok: false, errno: e.code, message: e.code };\n }\n const code = (e as { code?: unknown } | null)?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message: code };\n }\n throw e;\n }\n }\n\n private blockingSignal(): AbortSignal {\n if (this.options.hasPending?.()) throw new KernelError('EINTR');\n return this.interrupt.signal;\n }\n\n private async read(req: Extract<WasmSyscall, { op: 'fd-read' }>): Promise<Uint8Array> {\n const file = this.fds.get(req.fd).file;\n const read = req.peek ? file.peek : file.read;\n if (!read) throw new KernelError(req.peek && file.read ? 'EOPNOTSUPP' : 'EBADF');\n if (file.tty) this.checkForeground(file.tty);\n\n if (req.max <= 0) return new Uint8Array(0);\n const ready = pollFile(file).readable;\n if (!ready && req.nonblock) throw new KernelError('EAGAIN');\n const signal = ready ? this.interrupt.signal : this.blockingSignal();\n return read.call(file, Math.max(0, Math.min(req.max, MAX_READ)), signal);\n }\n\n private async write(fd: number, body: Uint8Array, nonblock = false): Promise<number> {\n const file = this.fds.get(fd).file;\n if (!file.write) throw new KernelError('EBADF');\n if (!pollFile(file).writable) {\n if (nonblock) throw new KernelError('EAGAIN');\n return file.write(body, this.blockingSignal());\n }\n\n if (nonblock) return file.write(body, AbortSignal.abort());\n\n return file.write(\n body,\n this.options.hasPending?.() ? AbortSignal.abort() : this.interrupt.signal\n );\n }\n\n private async openVfs(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): Promise<number> {\n await refuseReadonly(this.options.fs, req.path, req.flags, req);\n const fd = this.fds.install(heldFile(), 3);\n try {\n const nodes = this.nodes;\n const path = req.orphan\n ? req.path\n : req.exclusive\n ? await nodes.entryKey(req.path)\n : req.create\n ? await nodes.targetKey(req.path)\n : await this.keptOr(await nodes.targetKey(req.path));\n const open = { ...req, path };\n if (req.exclusive) {\n await nodes.createExclusive(path);\n this.fds.installAt(fd, this.openVfsFile(open));\n } else if (req.create) {\n await nodes.onEntry(path, async () => {\n this.fds.installAt(fd, this.openVfsFile(open));\n await this.fds.get(fd).file.stat?.();\n });\n } else {\n this.fds.installAt(fd, this.openVfsFile(open));\n }\n if (req.existing && !(await present(this.options.fs, path, true))) {\n throw new KernelError('ENOENT');\n }\n } catch (err) {\n await Promise.resolve(this.fds.close(fd));\n throw err;\n }\n return fd;\n }\n\n private openVfsFile(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): OpenFile {\n return vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags,\n position: req.position,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.truncate ? { truncate: true } : {}),\n ...(req.create ? { create: true } : {}),\n ...(req.pin ? { pin: req.pin } : {}),\n },\n this.nodes\n );\n }\n\n private async fdSyscall(req: FdSyscall, cancelled?: AbortSignal): Promise<SyncFsResult> {\n if (isVfsSyscall(req)) return this.vfsSyscall(req);\n switch (req.op) {\n case 'fd-read':\n return { ok: true, kind: 'bytes', bytes: await this.read(req) };\n case 'fd-write':\n return { ok: true, kind: 'json', json: await this.write(req.fd, req.body, req.nonblock) };\n case 'fd-close':\n this.options.locks?.closed(this.pid, req.fd);\n await Promise.resolve(this.fds.close(req.fd));\n return { ok: true, kind: 'void' };\n case 'fd-pipe': {\n const pipe = openPipe();\n const read = this.fds.install(pipe.read, 3);\n let write: number;\n try {\n write = this.fds.install(pipe.write, 3);\n } catch (e) {\n await Promise.resolve(this.fds.close(read));\n throw e;\n }\n return { ok: true, kind: 'json', json: [read, write] };\n }\n case 'fd-poll':\n return { ok: true, kind: 'json', json: pollFile(this.fds.get(req.fd).file) };\n case 'fd-open-vfs':\n return { ok: true, kind: 'json', json: await this.openVfs(req) };\n case 'fd-info':\n return { ok: true, kind: 'json', json: this.fdInfo(req.fd) };\n case 'fd-list':\n return {\n ok: true,\n kind: 'json',\n json: this.fds.numbers().map((fd) => ({ fd, ...this.fdInfo(fd) })),\n };\n case 'fd-meta': {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n const cloexec = this.fds.closesOnExec(req.fd);\n this.fds.installAt(req.fd, heldFile(req.meta));\n if (cloexec) this.fds.setCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n }\n case 'fd-setfl':\n this.fds.setStatusFlags(req.fd, req.flags);\n return { ok: true, kind: 'void' };\n case 'fd-cloexec':\n if (req.on) this.fds.setCloseOnExec(req.fd);\n else this.fds.clearCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n case 'fd-dup':\n return { ok: true, kind: 'json', json: this.fds.dup(req.fd, req.min ?? 3) };\n case 'fd-reserve':\n return { ok: true, kind: 'json', json: this.reserve(req.fd, req.min, req.meta) };\n case 'fd-promote':\n await this.promote(req);\n return { ok: true, kind: 'void' };\n case 'fd-renumber':\n if (req.from !== req.to) {\n this.fds.dup2(req.from, req.to);\n if (!req.keep) await Promise.resolve(this.fds.close(req.from));\n }\n return { ok: true, kind: 'void' };\n case 'fd-open-tty': {\n const tty =\n req.name === undefined\n ? this.controllingTerminal()\n : this.options.jobs?.terminalNamed(req.name);\n if (!tty) throw new KernelError('ENXIO');\n return { ok: true, kind: 'json', json: this.fds.install(tty.file(), 3) };\n }\n case 'fd-tty-names':\n return { ok: true, kind: 'json', json: this.options.jobs?.terminalNames() ?? [] };\n case 'fd-select': {\n const { read, write, timeoutMs } = req;\n const blocking = this.blockingSignal();\n const signal = cancelled ? AbortSignal.any([blocking, cancelled]) : blocking;\n const selected = await selectFds(this.fds, read, write, timeoutMs, signal);\n return { ok: true, kind: 'json', json: selected };\n }\n case 'fd-seek': {\n const file = this.fds.get(req.fd).file;\n if (!file.seek) throw new KernelError('ESPIPE');\n return { ok: true, kind: 'json', json: await file.seek(req.offset, req.whence) };\n }\n case 'fd-flush': {\n const file = this.fds.get(req.fd).file;\n if (file.flush) await file.flush();\n return { ok: true, kind: 'void' };\n }\n }\n }\n\n private async vfsSyscall(req: VfsSyscall): Promise<SyncFsResult> {\n if ('path' in req || 'from' in req) {\n const nodes = this.nodes;\n if (req.op === 'fd-path-flush') {\n await nodes.flush(await nodes.targetKey(req.path).catch(() => req.path));\n } else if (req.op === 'fd-path-unlinking')\n await nodes.unlinking(await nodes.entryKey(req.path));\n else if (req.op === 'fd-path-unlinked') nodes.unlinked(await nodes.entryKey(req.path));\n else if (req.op === 'fd-path-renamed') {\n nodes.renamed(await nodes.entryKey(req.from), await nodes.entryKey(req.to));\n }\n return { ok: true, kind: 'void' };\n }\n const file = this.fds.get(req.fd).file;\n if (!file.pread || !file.pwrite || !file.resize || !file.stat) throw new KernelError('ESPIPE');\n switch (req.op) {\n case 'fd-pread':\n return {\n ok: true,\n kind: 'bytes',\n bytes: await file.pread(Math.min(req.max, MAX_READ), req.offset),\n };\n case 'fd-pwrite':\n return { ok: true, kind: 'json', json: await file.pwrite(req.body, req.offset) };\n case 'fd-resize':\n await file.resize(req.size);\n return { ok: true, kind: 'void' };\n case 'fd-vfs-stat':\n return { ok: true, kind: 'json', json: await file.stat() };\n }\n }\n\n keptPath?: (path: string) => string | undefined;\n\n private async keptOr(path: string): Promise<string> {\n const kept = this.keptPath?.(path);\n return kept !== undefined && !(await present(this.options.fs, path, true)) ? kept : path;\n }\n\n private async promote(req: Extract<WasmSyscall, { op: 'fd-promote' }>): Promise<void> {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n if (req.share !== undefined) {\n this.fds.dup2(req.share, req.fd);\n return;\n }\n if (req.path === undefined) throw new KernelError('EINVAL');\n const path = req.orphan ? req.path : await this.keptOr(await this.nodes.targetKey(req.path));\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n const file = vfsFile(\n this.options.fs,\n {\n path,\n flags: req.flags ?? 0,\n position: req.position ?? 0,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.dirty ? { dirty: true } : {}),\n ...(req.pin ? { pin: req.pin } : {}),\n },\n this.nodes\n );\n this.fds.installAt(req.fd, file);\n }\n\n private reserve(fd: number | undefined, min = 3, meta?: HeldMeta): number {\n if (fd === undefined) return this.fds.install(heldFile(meta), Math.max(3, min));\n if (this.fds.has(fd)) throw new KernelError('EBADF');\n this.fds.installAt(fd, heldFile(meta));\n return fd;\n }\n\n private fdInfo(fd: number): FdInfo {\n const file = this.fds.get(fd).file;\n const flags = this.fds.statusFlags(fd);\n return {\n tty: file.tty !== undefined,\n kind: file instanceof KernelSocket ? 'socket' : kernelFdKind(file),\n ...(file.heldMeta ? { meta: file.heldMeta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(this.fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(file.tty?.name ? { name: file.tty.name } : file.pty ? { name: '/dev/ptmx' } : {}),\n };\n }\n\n private ttySyscall(req: TtySyscall): SyncFsResult {\n const tty = this.tty(req.fd);\n const jobs = this.options.jobs;\n switch (req.op) {\n case 'tty-get':\n return { ok: true, kind: 'json', json: tty.tcgets() };\n case 'tty-set':\n tty.tcsets(req.termios);\n return { ok: true, kind: 'void' };\n case 'tty-winsz':\n return { ok: true, kind: 'json', json: tty.winsize() };\n case 'tty-pgrp-get':\n return { ok: true, kind: 'json', json: jobs ? jobs.tcgetpgrp(tty, this.sid()) : this.pid };\n case 'tty-pgrp-set':\n if (jobs) jobs.tcsetpgrp(this.pid, tty, req.pgrp);\n else if (req.pgrp !== this.pid) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n }\n }\n\n private checkForeground(tty: KernelTty): void {\n const jobs = this.options.jobs;\n if (!jobs) return;\n const session = jobs.controllingTerminal(this.pid);\n if (session !== undefined && session !== tty) return;\n const pgid = this.pgid();\n if (jobs.tcgetpgrp(tty, this.sid()) === pgid) return;\n if (this.ignores(sigbit(SIG.TTIN))) throw new KernelError('EIO');\n jobs.killGroup(pgid, SIG.TTIN);\n throw new KernelError('EINTR');\n }\n\n private waitGroup(pid: number): ((child: number) => boolean) | undefined {\n const jobs = this.options.jobs;\n if (!jobs || pid > 0 || pid === -1) return undefined;\n const group = pid === 0 ? this.pgid() : -pid;\n\n return (child) => (jobs.pgidOf(child) ?? this.pgid()) === group;\n }\n\n private pgid(): number {\n return this.options.jobs?.getpgid(this.pid, 0) ?? this.pid;\n }\n\n private sid(): number {\n return this.options.jobs?.getsid(this.pid, 0) ?? this.pid;\n }\n\n private controllingTerminal(): KernelTty | undefined {\n const session = this.options.jobs?.controllingTerminal(this.pid);\n return session === undefined ? this.fds.stdioTerminal() : (session ?? undefined);\n }\n\n private jobSyscall(req: JobSyscall): SyncFsResult {\n const jobs = this.options.jobs;\n const self = (pid: number): number => {\n if (pid !== 0 && pid !== this.pid) throw new KernelError('ESRCH');\n return this.pid;\n };\n switch (req.op) {\n case 'proc-setpgid':\n if (jobs) jobs.setpgid(this.pid, req.pid, req.pgid);\n else if (self(req.pid) !== (req.pgid || this.pid)) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n case 'proc-getpgid':\n return { ok: true, kind: 'json', json: jobs?.getpgid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-getsid':\n return { ok: true, kind: 'json', json: jobs?.getsid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-setsid':\n if (!jobs) throw new KernelError('EPERM');\n return { ok: true, kind: 'json', json: jobs.setsid(this.pid) };\n }\n }\n\n private httpSyscall(req: HttpSyscall): Promise<SyncFsResult> {\n const http = this.options.http;\n if (!http) return Promise.resolve({ ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT });\n return http.syscall(req);\n }\n\n private socketSyscall(req: SocketSyscall): Promise<SyncFsResult> {\n this.net ??= this.options.net ?? new LoopbackNet();\n const resolver = this.options.resolver ?? HOSTS_ONLY;\n return socketSyscall(req, {\n fds: this.fds,\n net: this.net,\n blocking: () => this.blockingSignal(),\n resolve: (name, family, blocking) => resolver.resolve(name, family, blocking),\n });\n }\n\n private tty(fd: number): KernelTty {\n const file = this.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n }\n\n private async procSyscall(\n req: Exclude<\n WasmSyscall,\n FdSyscall | TtySyscall | JobSyscall | SocketSyscall | HttpSyscall | PtySyscall | HostSyscall\n >\n ): Promise<SyncFsResult> {\n switch (req.op) {\n case 'proc-fork':\n return { ok: true, kind: 'json', json: await this.children.fork(req.state) };\n case 'proc-spawn': {\n const { file, argv, env, cwd, stdio, inherit, exec } = req;\n const spawned = { file, argv, env, cwd, ...(exec ? { exec } : {}) };\n const pid = await this.children.spawn(spawned, stdio, inherit);\n return { ok: true, kind: 'json', json: pid };\n }\n case 'proc-wait': {\n const signal = req.nohang ? this.interrupt.signal : this.blockingSignal();\n const flags = {\n untraced: req.untraced,\n continued: req.continued,\n inGroup: this.waitGroup(req.pid),\n };\n const waited = await this.children.wait(req.pid, req.nohang, signal, flags);\n return { ok: true, kind: 'json', json: waited };\n }\n case 'proc-identity':\n return { ok: true, kind: 'json', json: (await this.options.identity?.()) ?? null };\n case 'proc-exec': {\n this.execChild = req.pid;\n this.options.jobs?.exec(this.pid, req.pid);\n\n this.children.watch(req.pid, (state, sig) =>\n state === 'stopped' ? this.stop(sig) : this.cont()\n );\n\n await this.fds.closeAll();\n try {\n const waited = await this.children.wait(req.pid, false);\n const termsig = waited[1] & 0x7f;\n if (termsig) this.execTermsig = termsig;\n return { ok: true, kind: 'json', json: waited };\n } finally {\n this.execChild = undefined;\n }\n }\n case 'proc-kill':\n if (req.sig !== 0 && !isSignal(req.sig)) throw new KernelError('EINVAL');\n\n if (!(await this.options.kill?.(req.pid === 0 ? -this.pgid() : req.pid, req.sig))) {\n throw new KernelError('ESRCH');\n }\n return { ok: true, kind: 'void' };\n case 'proc-list':\n return {\n ok: true,\n kind: 'json',\n json: this.options.processes?.() ?? { boot: 0, processes: [] },\n };\n case 'mount-list':\n return { ok: true, kind: 'json', json: this.options.mounts?.() ?? [] };\n case 'mount':\n case 'umount':\n return this.mountSyscall(req);\n case 'proc-alarm':\n this.setAlarm(req.sig, req.firstMs ?? req.ms, req.repeat ? req.ms : 0, req.timer);\n return { ok: true, kind: 'void' };\n case 'proc-umask':\n return { ok: true, kind: 'json', json: this.setUmask(req.mask) };\n case 'dl-log':\n if (req.append) this.dlLog.push(req.append);\n return { ok: true, kind: 'json', json: this.dlLog.slice(req.from) };\n case 'sig-mask':\n this.caught = req.caught;\n this.ignored = req.ignored;\n this.inherited &= ~(req.defaults ?? 0);\n return { ok: true, kind: 'void' };\n case 'sig-pause':\n return this.pause();\n case 'proc-captured':\n return { ok: true, kind: 'bytes', bytes: this.children.captured(req.pid, req.slot) };\n }\n }\n\n private async mountSyscall(\n req: Extract<WasmSyscall, { op: 'mount' | 'umount' }>\n ): Promise<SyncFsResult> {\n const { mount, umount } = this.options;\n if (!mount || !umount) throw new KernelError('ENOSYS');\n try {\n if (req.op === 'umount') await umount(req.target, req.flags);\n else {\n const { source, target, type, flags, data } = req;\n const signal = this.blockingSignal();\n await Promise.race([mount({ source, target, type, flags, data }, signal), aborted(signal)]);\n }\n } catch (err) {\n const code = (err as { code?: unknown } | null)?.code;\n if (typeof code !== 'string') throw err;\n return { ok: false, errno: code, message: (err as Error).message };\n }\n return { ok: true, kind: 'void' };\n }\n\n private pause(): Promise<never> {\n return aborted(this.blockingSignal());\n }\n\n private alarm: ReturnType<typeof setTimeout> | undefined;\n private readonly dlLog: LinkRecord[] = [];\n private readonly asyncOps = new AsyncOps(\n (req, cancelled) => this.syscall(req as WasmSyscall, cancelled),\n () => this.options.onAsync?.()\n );\n private alarmEvery: ReturnType<typeof setInterval> | undefined;\n\n private setAlarm(sig: number, first: number, every: number, timer?: number): void {\n if (!isSignal(sig)) throw new KernelError('EINVAL');\n this.clearAlarm();\n if (first <= 0) return;\n const fire =\n timer === undefined ? () => this.options.raise?.(sig) : () => this.timerExpired(timer);\n this.alarm = setTimeout(() => {\n this.alarm = undefined;\n fire();\n if (every > 0) this.alarmEvery = setInterval(fire, every);\n }, first);\n }\n\n private timerExpired(which: number): void {\n this.options.onTimer?.(which);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n }\n\n private clearAlarm(): void {\n clearTimeout(this.alarm);\n clearInterval(this.alarmEvery);\n this.alarm = undefined;\n this.alarmEvery = undefined;\n }\n\n async exit(): Promise<void> {\n if (this.exited) return;\n this.exited = true;\n this.die();\n this.clearAlarm();\n this.interrupt.abort();\n this.options.locks?.release(this.pid);\n this.asyncOps.close();\n for (const pid of this.children.pids()) this.options.onReap?.(pid);\n await this.fds.closeAll();\n if (!this.options.nodes) this.options.openFiles?.delete(this.nodes);\n await this.options.http?.closeAll();\n }\n}\n", "import type { ForeignResults, ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport type { DeviceMeta, KernelFdKind } from './fd-table.ts';\n\nexport const WASM_PROCESS_INIT = 'wasm-process-init';\nexport const WASM_PROCESS_EXIT = 'wasm-process-exit';\nexport const WASM_PROCESS_ERROR = 'wasm-process-error';\nexport const WASM_THREAD_SPAWN = 'wasm-thread-spawn';\nexport const WASM_THREAD_INIT = 'wasm-thread-init';\nexport const WASM_THREAD_EXIT = 'wasm-thread-exit';\nexport const WASM_MAX_THREADS = 256;\nexport const WASM_DEFAULT_THREADS = 64;\n\nexport interface WasmProgram {\n abi?: 'emscripten' | 'wasi';\n glue: string;\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n names?: string;\n imports?: string;\n preopenRoot?: boolean;\n}\n\nexport interface JsProgram {\n abi: 'js';\n glue: string;\n path: string;\n}\n\nexport type Program = WasmProgram | JsProgram;\n\nexport interface ForkState {\n memory: Uint8Array;\n currData: number;\n forkSp: number;\n callStackNames: Array<[number, string]>;\n ppid: number;\n streams?: ForkStream[];\n cwd?: string;\n wasi?: WasiForkState;\n}\n\nexport interface KernelStreamEntry {\n fd: number;\n kernel: number;\n kind: KernelFdKind;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport type ForkStream = KernelStreamEntry | { fd: number; path: string; flags: number };\n\nexport interface InheritedFd {\n fd: number;\n kind: KernelFdKind;\n device?: DeviceMeta;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport interface WasmProcessInitMsg {\n type: typeof WASM_PROCESS_INIT;\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n sab: SharedArrayBuffer;\n ppid?: number;\n umask?: number;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface JsLane {\n sab: SharedArrayBuffer;\n port: MessagePort;\n}\n\nexport type JsProcessInitMsg = Omit<WasmProcessInitMsg, 'program' | 'fork'> & {\n program: JsProgram;\n lane?: JsLane;\n};\n\nexport type ProcessInitMsg = WasmProcessInitMsg | JsProcessInitMsg;\n\nexport interface WasmProcessExitMsg {\n type: typeof WASM_PROCESS_EXIT;\n code: number;\n}\n\nexport interface WasmProcessErrorMsg {\n type: typeof WASM_PROCESS_ERROR;\n message: string;\n}\n\nexport interface WasmThread {\n tid: number;\n arg: number;\n memory: WebAssembly.Memory;\n ids: SharedArrayBuffer;\n modules?: Record<string, WebAssembly.Module>;\n}\n\nexport interface WasmThreadSpawnMsg {\n type: typeof WASM_THREAD_SPAWN;\n thread: WasmThread;\n}\n\nexport interface WasmThreadInitMsg extends Omit<WasmProcessInitMsg, 'type' | 'fork' | 'fds'> {\n type: typeof WASM_THREAD_INIT;\n thread: WasmThread;\n}\n\nexport interface WasmThreadExitMsg {\n type: typeof WASM_THREAD_EXIT;\n}\n", "import type { PathGate } from '../fs/unlinked.ts';\nimport { HeldPaths } from '../mount/mount-fs.ts';\nimport { dispatchSyncFs } from '../realm/sync-fs-dispatch.ts';\nimport {\n mintSyncFsToken,\n revokeSyncFsToken,\n type SyncFsTokenEntry,\n} from '../realm/sync-fs-token-registry.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n attachSyncSabResponder,\n type SyncSabDispatchRequest,\n} from '../realm/sync-sab-responder.ts';\nimport {\n SAB_DEFAULT_WINDOW_BYTES,\n SAB_HEADER_BYTES,\n SAB_HEADER_I32,\n SAB_I_ASYNC,\n SAB_I_KILLED,\n SAB_I_MEMORY,\n SAB_I_SIGNALS,\n SAB_I_STOP,\n SAB_I_TIMERS,\n} from '../realm/sync-sab-wire.ts';\nimport type { ChildForker, ChildSpawner } from './children.ts';\nimport { type FdTable, kernelFdKind, type OpenFile } from './fd-table.ts';\nimport type { LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport type { HttpHandles } from './net/http-syscalls.ts';\nimport type { Resolver } from './net/resolver.ts';\nimport type { MountLine, ProcessListing } from './proc-info.ts';\nimport {\n isWasmSyscall,\n type StateListener,\n WasmProcess,\n type WasmProcessOptions,\n type WasmSyscall,\n} from './process.ts';\nimport {\n type ForkState,\n type InheritedFd,\n type JsLane,\n type ProcessInitMsg,\n type Program,\n WASM_MAX_THREADS,\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n WASM_THREAD_EXIT,\n WASM_THREAD_INIT,\n WASM_THREAD_SPAWN,\n type WasmThread,\n type WasmThreadInitMsg,\n} from './protocol.ts';\nimport type { PtyTable } from './pty.ts';\nimport { SIG, sigbit } from './signals.ts';\nimport { KernelSocket, type LoopbackNet } from './socket.ts';\nimport type { VfsNodes } from './vfs-file.ts';\n\nexport interface WasmWorkerLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n terminate(): void;\n}\n\nexport interface SpawnWasmOptions {\n pid: number;\n ignored?: number;\n umask?: number;\n identity?: () => Promise<{ pid: number; ppid: number }>;\n onSyscall?: (req: WasmSyscall) => void;\n program: Program;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n fs: SyncFsTokenEntry['fs'];\n createWorker: () => WasmWorkerLike;\n onError?: (message: string) => void;\n spawner?: ChildSpawner;\n forker?: ChildForker;\n fork?: ForkState;\n ppid?: number;\n\n shownPid?: number;\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n writesBack?: (pid: number) => boolean;\n processes?: () => ProcessListing;\n openFiles?: Set<VfsNodes>;\n nodes?: VfsNodes;\n statfs?: (path: string) => Promise<{ quota: number; usage: number } | undefined>;\n mounts?: () => MountLine[];\n mount?: WasmProcessOptions['mount'];\n umount?: WasmProcessOptions['umount'];\n held?: Set<HeldPaths>;\n unlinkGate?: PathGate;\n jobs?: JobTable;\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n locks?: LockTable;\n onReap?: (pid: number) => void;\n resolver?: Resolver;\n}\n\nexport interface WasmProcessHandle {\n pid: number;\n exited: Promise<number>;\n kill(code?: number): void;\n signal(sig: number): void;\n termsig(): number | undefined;\n onState(listener: StateListener): void;\n memory(): number;\n ignoredSignals(fork?: boolean): number;\n umask?(): number;\n writesBack(): boolean;\n}\n\nconst CRASHED = 70;\nexport const KILL_GRACE_MS = 2000;\n\nconst descIds = new WeakMap<OpenFile, number>();\nlet nextDescId = 1;\n\nfunction descId(file: OpenFile): number {\n const id = descIds.get(file) ?? nextDescId++;\n descIds.set(file, id);\n return id;\n}\n\nexport function inheritedFds(fds: FdTable): InheritedFd[] {\n return fds\n .numbers()\n .filter((fd) => fd > 2 && !fds.get(fd).file.held)\n .map((fd): InheritedFd => {\n const open = fds.get(fd);\n const flags = fds.statusFlags(fd);\n const kind = open.file instanceof KernelSocket ? 'socket' : kernelFdKind(open.file);\n const meta = open.file.heldMeta;\n return {\n fd,\n kind,\n ...(kind === 'device' && meta && 'device' in meta ? { device: meta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(kind === 'stream' ? { desc: descId(open) } : {}),\n };\n });\n}\n\ninterface WorkerSays {\n type?: string;\n code?: unknown;\n message?: unknown;\n thread?: WasmThread;\n}\n\nclass Dying {\n ending: { code: number; sig: number } | undefined;\n private timer: ReturnType<typeof setTimeout> | undefined;\n private busy = 0;\n private finish: (() => void) | undefined;\n\n start(code: number, sig: number, header: Int32Array, process: WasmProcess, finish: () => void) {\n if (this.ending) return;\n this.ending = { code, sig };\n this.finish = finish;\n this.arm();\n Atomics.store(header, SAB_I_KILLED, code);\n process.die();\n }\n\n async serving<T>(work: () => Promise<T>): Promise<T> {\n this.busy++;\n clearTimeout(this.timer);\n try {\n return await work();\n } finally {\n this.busy--;\n this.arm();\n }\n }\n\n private arm(): void {\n clearTimeout(this.timer);\n if (this.busy === 0 && this.finish) this.timer = setTimeout(this.finish, KILL_GRACE_MS);\n }\n\n clear(): void {\n clearTimeout(this.timer);\n }\n\n status(reported: unknown): [number, number | undefined] {\n if (this.ending) return [this.ending.code, this.ending.sig];\n return [typeof reported === 'number' ? reported : CRASHED, undefined];\n }\n}\n\nfunction notifiers(header: Int32Array): { onPending(sig: number): void; onAsync(): void } {\n return {\n onPending(sig) {\n Atomics.or(header, SAB_I_SIGNALS, sigbit(sig));\n Atomics.notify(header, SAB_I_SIGNALS);\n },\n onAsync() {\n Atomics.add(header, SAB_I_ASYNC, 1);\n Atomics.notify(header, SAB_I_ASYNC);\n },\n };\n}\n\nfunction publishStops(process: WasmProcess, header: Int32Array): void {\n process.onState((state) => {\n Atomics.store(header, SAB_I_STOP, state === 'stopped' ? 1 : 0);\n Atomics.notify(header, SAB_I_STOP);\n });\n}\n\nfunction transferOf(opts: SpawnWasmOptions, lane: JsLane | undefined): Transferable[] {\n const transfer: Transferable[] = opts.fork ? [opts.fork.memory.buffer as ArrayBuffer] : [];\n return lane ? [...transfer, lane.port] : transfer;\n}\n\nfunction openLane(\n token: string,\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>\n): { lane: JsLane; dispose(): void } {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const { port1, port2 } = new MessageChannel();\n const responder = attachSyncSabResponder(port1, sab, token, { dispatch });\n port1.start();\n return {\n lane: { sab, port: port2 },\n dispose() {\n responder.dispose();\n port1.close();\n },\n };\n}\n\nfunction processInit(\n opts: SpawnWasmOptions,\n sab: SharedArrayBuffer,\n umask: number,\n lane: JsLane | undefined\n): ProcessInitMsg {\n const base = {\n type: WASM_PROCESS_INIT,\n pid: opts.shownPid ?? opts.pid,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab,\n umask,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n } as const;\n if (opts.program.abi === 'js') {\n return {\n ...base,\n program: opts.program,\n fds: inheritedFds(opts.fds),\n lane,\n };\n }\n return {\n ...base,\n program: opts.program,\n ...(opts.fork ? { fork: opts.fork } : { fds: inheritedFds(opts.fds) }),\n };\n}\n\nfunction inherited(opts: SpawnWasmOptions): { ignored?: number; umask?: number } {\n return {\n ...(opts.ignored ? { ignored: opts.ignored } : {}),\n ...(opts.umask !== undefined ? { umask: opts.umask } : {}),\n };\n}\n\nfunction holdingToken(opts: SpawnWasmOptions, holds: HeldPaths): string {\n return mintSyncFsToken({\n fs: opts.fs,\n cwd: opts.cwd,\n ...(opts.statfs ? { statfs: opts.statfs } : {}),\n hold: (path, on, open, real) => holds.hold(path, on, open, real),\n unlinked: (path) => holds.keptAt(path),\n gate: (path, op) =>\n opts.unlinkGate && holds.holding(path) ? opts.unlinkGate.run(holds.keyOf(path), op) : op(),\n own: (path, op) => holds.own(path, op),\n revoked: (path) => holds.isRevoked(path),\n renamed: (from, to) => holds.renamed(from, to),\n });\n}\n\nexport function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const header = new Int32Array(sab, 0, SAB_HEADER_I32);\n const process = new WasmProcess(opts.pid, opts.fds, {\n ...inherited(opts),\n ...(opts.identity ? { identity: opts.identity } : {}),\n ...(opts.onSyscall ? { onSyscall: opts.onSyscall } : {}),\n spawner: opts.spawner,\n forker: opts.forker,\n fs: opts.fs,\n kill: opts.kill,\n ...(opts.writesBack ? { writesBack: opts.writesBack } : {}),\n processes: opts.processes,\n openFiles: opts.openFiles,\n ...(opts.nodes ? { nodes: opts.nodes } : {}),\n mounts: opts.mounts,\n ...(opts.mount ? { mount: opts.mount } : {}),\n ...(opts.umount ? { umount: opts.umount } : {}),\n jobs: opts.jobs,\n ptys: opts.ptys,\n net: opts.net,\n http: opts.http,\n locks: opts.locks,\n onReap: opts.onReap,\n resolver: opts.resolver,\n ...notifiers(header),\n onTimer: (which) => void Atomics.or(header, SAB_I_TIMERS, 1 << which),\n hasPending: () =>\n Atomics.load(header, SAB_I_SIGNALS) !== 0 || Atomics.load(header, SAB_I_TIMERS) !== 0,\n raise: (sig) => signal(sig),\n ...(opts.program.abi === 'wasi' || opts.program.abi === 'js'\n ? { pendingBits: () => Atomics.load(header, SAB_I_SIGNALS) }\n : {}),\n });\n publishStops(process, header);\n const holds = new HeldPaths();\n opts.held?.add(holds);\n const token = holdingToken(opts, holds);\n process.keptPath = (path) => holds.keptAt(path)?.hidden;\n const worker = opts.createWorker();\n const dying = new Dying();\n const dispatch = (req: SyncSabDispatchRequest): Promise<SyncFsResult> =>\n dying.serving(() => (isWasmSyscall(req) ? process.syscall(req) : dispatchSyncFs(req)));\n const responder = attachSyncSabResponder(worker, sab, token, { dispatch });\n const lane = opts.program.abi === 'js' ? openLane(token, dispatch) : undefined;\n\n const { promise: exited, resolve: settle } = Promise.withResolvers<number>();\n let done = false;\n let endedBy: number | undefined;\n\n const finish = (code: number, sig?: number): void => {\n if (done) return;\n done = true;\n dying.clear();\n endedBy = sig ?? process.execTermsig;\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n for (const tid of [...threads.keys()]) endThread(tid);\n responder.dispose();\n lane?.dispose();\n revokeSyncFsToken(token);\n opts.held?.delete(holds);\n worker.terminate();\n void process.exit().then(\n () => settle(code),\n () => settle(code)\n );\n };\n\n const handle = (data: WorkerSays | undefined): void => {\n if (data?.type === WASM_PROCESS_EXIT) {\n finish(...dying.status(data.code));\n } else if (data?.type === WASM_PROCESS_ERROR) {\n if (!dying.ending) opts.onError?.(String(data.message));\n finish(...dying.status(CRASHED));\n } else if (data?.type === WASM_THREAD_SPAWN && data.thread) {\n spawnThread(data.thread);\n }\n };\n const onMessage = (event: MessageEvent): void => handle(event.data as WorkerSays | undefined);\n const onError = (event: MessageEvent): void => {\n event.preventDefault();\n opts.onError?.(String((event as unknown as ErrorEvent).message ?? 'worker error'));\n finish(CRASHED);\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n\n const threads = new Map<number, () => void>();\n const endThread = (tid: number): void => {\n const end = threads.get(tid);\n threads.delete(tid);\n end?.();\n };\n const spawnThread = (thread: WasmThread): void => {\n const { program } = opts;\n if (done || program.abi === 'js') return;\n if (threads.size >= WASM_MAX_THREADS - 1) {\n opts.onError?.(`more than ${WASM_MAX_THREADS} threads`);\n finish(CRASHED);\n return;\n }\n const tsab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const tw = opts.createWorker();\n const tresponder = attachSyncSabResponder(tw, tsab, token, { dispatch });\n const onThreadMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerSays | undefined;\n if (data?.type === WASM_THREAD_EXIT) endThread(thread.tid);\n else handle(data);\n };\n tw.addEventListener('message', onThreadMessage);\n tw.addEventListener('error', onError);\n threads.set(thread.tid, () => {\n tw.removeEventListener('message', onThreadMessage);\n tw.removeEventListener('error', onError);\n tresponder.dispose();\n tw.terminate();\n });\n const tinit: WasmThreadInitMsg = {\n type: WASM_THREAD_INIT,\n pid: opts.shownPid ?? opts.pid,\n program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab: tsab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n thread,\n };\n tw.postMessage(tinit);\n };\n\n worker.postMessage(\n processInit(opts, sab, process.umask, lane?.lane),\n transferOf(opts, lane?.lane)\n );\n\n const signal = (sig: number): void => {\n if (process.signal(sig) !== 'terminate') return;\n const code = sig === SIG.KILL ? 137 : 128 + sig;\n if (opts.program.abi !== 'wasi' || done) finish(code, sig);\n else dying.start(code, sig, header, process, () => finish(code, sig));\n };\n const kill = (code = 137): void =>\n finish(code, code > 128 && code < 160 ? code - 128 : undefined);\n return {\n pid: opts.pid,\n exited,\n kill,\n signal,\n termsig: () => endedBy,\n onState: (listener) => process.onState(listener),\n memory: () => Atomics.load(header, SAB_I_MEMORY) * 65536,\n ignoredSignals: (fork) => process.inheritable(fork),\n umask: () => process.umask,\n writesBack: () => opts.program.abi === 'wasi' && !done,\n };\n}\n", "import { KernelError } from './fd-table.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport interface JobMember {\n pid: number;\n pgid: number;\n sid: number;\n\n signal(sig: number): void;\n\n execParent?: number;\n\n ppid?: number;\n\n execed?: boolean;\n\n shownAs?: number;\n}\n\nexport class JobTable {\n private readonly members = new Map<number, JobMember>();\n private readonly foreground = new Map<KernelTty, number>();\n\n private readonly terminals = new Map<number, KernelTty>();\n\n add(\n pid: number,\n parentPid: number | undefined,\n signal: (sig: number) => void,\n terminal?: KernelTty\n ): JobMember {\n const parent = parentPid === undefined ? undefined : this.members.get(parentPid);\n if (!parent && terminal) this.terminals.set(pid, terminal);\n const member: JobMember = {\n pid,\n ppid: parent?.pid,\n pgid: parent?.pgid ?? pid,\n sid: parent?.sid ?? pid,\n signal,\n };\n this.members.set(pid, member);\n return member;\n }\n\n list(): JobMember[] {\n return [...this.members.values()];\n }\n\n remove(pid: number): void {\n this.members.delete(pid);\n }\n\n exec(pid: number, child: number, adopt = false): void {\n const member = this.members.get(child);\n if (member && adopt) member.shownAs = this.shown(pid);\n if (member) member.execParent = pid;\n const execer = this.members.get(pid);\n if (execer) execer.execed = true;\n }\n\n shown(pid: number): number {\n let member = this.members.get(pid);\n for (let up = member; up; up = this.members.get(up.execParent ?? -1)) member = up;\n return member?.pid ?? pid;\n }\n\n shownParent(pid: number): number | undefined {\n const parent = this.members.get(this.shown(pid))?.ppid;\n return parent === undefined ? undefined : this.shown(parent);\n }\n\n sessionOf(pgid: number): number | undefined {\n for (const member of this.members.values()) if (member.pgid === pgid) return member.sid;\n return undefined;\n }\n\n join(pid: number, pgid: number): void {\n const sid = this.sessionOf(pgid);\n if (sid === undefined) throw new KernelError('ESRCH');\n const member = this.member(pid);\n member.pgid = pgid;\n member.sid = sid;\n }\n\n pgidOf(pid: number): number | undefined {\n return this.members.get(pid)?.pgid;\n }\n\n private member(pid: number): JobMember {\n const member = this.members.get(pid);\n if (!member) throw new KernelError('ESRCH');\n return member;\n }\n\n private idOf(pid: number): number {\n return this.members.get(pid)?.shownAs ?? pid;\n }\n\n private byId(id: number): JobMember {\n for (const member of this.members.values()) if (member.shownAs === id) return member;\n return this.member(id);\n }\n\n setpgid(caller: number, pid: number, pgid: number): void {\n const me = this.idOf(caller);\n const target = this.byId(pid || me);\n const id = this.idOf(target.pid);\n const group = pgid || id;\n if (group < 0) throw new KernelError('EINVAL');\n const self = this.member(caller);\n if (id !== me) {\n if (target.ppid === undefined || this.idOf(target.ppid) !== me) {\n throw new KernelError('ESRCH');\n }\n if (target.execed) throw new KernelError('EACCES');\n }\n if (target.sid !== self.sid) throw new KernelError('EPERM');\n if (id === target.sid) throw new KernelError('EPERM');\n\n const exists = [...this.members.values()].some((m) => m.pgid === group && m.sid === target.sid);\n if (group !== id && !exists) throw new KernelError('EPERM');\n target.pgid = group;\n }\n\n getpgid(caller: number, pid: number): number {\n return this.byId(pid || this.idOf(caller)).pgid;\n }\n\n getsid(caller: number, pid: number): number {\n return this.byId(pid || this.idOf(caller)).sid;\n }\n\n setsid(pid: number): number {\n const member = this.member(pid);\n const id = this.idOf(pid);\n if (member.pgid === id) throw new KernelError('EPERM');\n member.sid = id;\n member.pgid = id;\n this.terminals.delete(id);\n return id;\n }\n\n terminalNamed(name: string): KernelTty | undefined {\n return this.knownTerminals().find((tty) => tty.name === name);\n }\n\n terminalNames(): string[] {\n return this.knownTerminals().flatMap((tty) => (tty.name ? [tty.name] : []));\n }\n\n private knownTerminals(): KernelTty[] {\n return [...new Set([...this.terminals.values(), ...this.foreground.keys()])];\n }\n\n controllingTerminal(pid: number): KernelTty | null | undefined {\n const member = this.members.get(pid);\n return member && (this.terminals.get(member.sid) ?? null);\n }\n\n acquireTerminal(pid: number, tty: KernelTty): boolean {\n const member = this.members.get(pid);\n const id = this.idOf(pid);\n if (!member || member.sid !== id || this.terminals.has(id)) return false;\n if ([...this.terminals.values()].includes(tty)) return false;\n this.terminals.set(id, tty);\n this.foreground.set(tty, member.pgid);\n return true;\n }\n\n killGroup(pgid: number, sig: number): boolean {\n const targets = [...this.members.values()].filter((m) => m.pgid === pgid);\n const pids = new Set(targets.map((m) => m.pid));\n if (sig !== 0) {\n for (const m of targets)\n if (m.execParent === undefined || !pids.has(m.execParent)) m.signal(sig);\n }\n return targets.length > 0;\n }\n\n tcgetpgrp(tty: KernelTty, fallback: number): number {\n return this.foreground.get(tty) ?? fallback;\n }\n\n tcsetpgrp(caller: number, tty: KernelTty, pgid: number): void {\n const self = this.member(caller);\n const inSession = [...this.members.values()].some((m) => m.pgid === pgid && m.sid === self.sid);\n if (!inSession) throw new KernelError('EPERM');\n this.foreground.set(tty, pgid);\n }\n\n signalOwnedForeground(tty: KernelTty, sig: number): void {\n const pgid = this.foreground.get(tty);\n if (pgid !== undefined) this.killGroup(pgid, sig);\n }\n\n signalForeground(tty: KernelTty, fallback: number, sig: number): void {\n this.killGroup(this.tcgetpgrp(tty, fallback), sig);\n }\n}\n", "const SETUP_OPS = new Set([\n 'proc-list',\n 'proc-identity',\n 'fd-info',\n 'sig-mask',\n 'proc-setpgid',\n 'tty-pgrp-set',\n 'proc-exec',\n 'proc-spawn',\n]);\n\nexport const SETTLE_MS = 2000;\n\nconst KEY_SIGNALS = new Set([2, 3, 20]);\n\ninterface Held {\n pgid: number;\n send: () => void;\n copy?: boolean;\n}\n\nexport class SettlingChildren {\n private readonly children = new Map<\n number,\n { ppid: number; execer?: number; timer?: ReturnType<typeof setTimeout> }\n >();\n private held: Held[] = [];\n private parked: Held[] = [];\n private readonly pgidOf: (pid: number) => number | undefined;\n private readonly settleMs: number;\n\n constructor(pgidOf: (pid: number) => number | undefined, settleMs = SETTLE_MS) {\n this.pgidOf = pgidOf;\n this.settleMs = settleMs;\n }\n\n started(pid: number, ppid: number): void {\n const parent = this.children.get(ppid);\n this.children.set(pid, parent ? { ppid: parent.ppid, execer: ppid } : { ppid });\n const group = this.pgidOf(ppid);\n for (const p of this.parked) if (p.pgid === group) this.held.push({ ...p, copy: true });\n this.parked = this.parked.filter((p) => p.pgid !== group);\n }\n\n reading(pgid: number): void {\n this.parked = this.parked.filter((p) => p.pgid !== pgid);\n this.held = this.held.filter((h) => !(h.copy && h.pgid === pgid));\n }\n\n syscall(pid: number, op: string): void {\n const child = this.children.get(pid);\n if (!child) return;\n if (!SETUP_OPS.has(op)) {\n this.settled(pid);\n return;\n }\n child.timer ??= setTimeout(() => this.settled(pid), this.settleMs);\n }\n\n settled(pid: number): void {\n const child = this.children.get(pid);\n if (!child) return;\n clearTimeout(child.timer);\n this.children.delete(pid);\n if (child.execer !== undefined) this.settled(child.execer);\n const ready = this.held.filter((h) => !this.blocking(h.pgid));\n this.held = this.held.filter((h) => this.blocking(h.pgid));\n for (const h of ready) h.send();\n }\n\n deliver(sig: number, pgid: number, send: () => void, foreground?: () => number): void {\n if (!KEY_SIGNALS.has(sig)) {\n send();\n } else if (this.blocking(pgid)) {\n this.held.push({ pgid, send });\n } else if (foreground) {\n send();\n const moved = () => {\n if (foreground() !== pgid) send();\n };\n this.parked.push({ pgid, send: moved });\n } else {\n send();\n }\n }\n\n private blocking(pgid: number): boolean {\n for (const { ppid } of this.children.values()) if (this.pgidOf(ppid) === pgid) return true;\n return false;\n }\n}\n", "import {\n DRIVER_PROTOCOL,\n type DriverAttr,\n type DriverCapabilities,\n type DriverEntry,\n type DriverRequest,\n type DriverStatfs,\n driverVersionError,\n type KernelDriverHello,\n type MountRequestInfo,\n} from './protocol.ts';\n\nexport type {\n DriverAttr,\n DriverCapabilities,\n DriverEntry,\n DriverStatfs,\n MountRequestInfo,\n} from './protocol.ts';\n\nexport interface OpenFlags {\n write: boolean;\n create: boolean;\n truncate: boolean;\n exclusive: boolean;\n ifMatch?: string;\n}\n\nexport interface FilesystemHandlers {\n mount?(\n info: MountRequestInfo\n ): Promise<DriverCapabilities | undefined> | DriverCapabilities | undefined;\n getattr(path: string): Promise<DriverAttr>;\n readdir(path: string): Promise<DriverEntry[]>;\n open(path: string, flags: OpenFlags): Promise<number>;\n read(fh: number, offset: number, size: number): Promise<Uint8Array>;\n write(fh: number, offset: number, bytes: Uint8Array): Promise<void>;\n release(fh: number): Promise<void>;\n mkdir(path: string): Promise<void>;\n rmdir(path: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink?(target: string, path: string): Promise<void>;\n readlink?(path: string): Promise<string>;\n setattr?(path: string, attr: { mode?: number; mtime?: number; size?: number }): Promise<void>;\n statfs?(): Promise<DriverStatfs>;\n}\n\nexport interface DriverPort {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n}\n\nexport interface ServedFilesystem {\n invalidate(paths: string[] | true): void;\n}\n\nexport function fsError(code: string, message = code): Error & { code: string } {\n return Object.assign(new Error(message), { code });\n}\n\nasync function dispatch(h: FilesystemHandlers, req: DriverRequest): Promise<unknown> {\n switch (req.op) {\n case 'getattr':\n return h.getattr(req.path);\n case 'readdir':\n return h.readdir(req.path);\n case 'open':\n return h.open(req.path, {\n write: req.write,\n create: req.create,\n truncate: req.truncate,\n exclusive: req.exclusive,\n ...(req.ifMatch !== undefined ? { ifMatch: req.ifMatch } : {}),\n });\n case 'read':\n return h.read(req.fh, req.offset, req.size);\n case 'write':\n return h.write(req.fh, req.offset, req.bytes);\n case 'release':\n return h.release(req.fh);\n case 'mkdir':\n return h.mkdir(req.path);\n case 'rmdir':\n return h.rmdir(req.path);\n case 'unlink':\n return h.unlink(req.path);\n case 'rename':\n return h.rename(req.from, req.to);\n case 'symlink':\n if (!h.symlink) throw fsError('EPERM', 'this file system has no symlinks');\n return h.symlink(req.target, req.path);\n case 'readlink':\n if (!h.readlink) throw fsError('EINVAL', `${req.path} is not a symlink`);\n return h.readlink(req.path);\n case 'setattr':\n return h.setattr?.(req.path, {\n ...(req.mode !== undefined ? { mode: req.mode } : {}),\n ...(req.mtime !== undefined ? { mtime: req.mtime } : {}),\n ...(req.size !== undefined ? { size: req.size } : {}),\n });\n case 'statfs':\n return h.statfs?.() ?? null;\n default:\n throw fsError('ENOSYS', `unknown driver op ${(req as { op: string }).op}`);\n }\n}\n\nexport function serveFilesystem(\n port: DriverPort,\n handlers: FilesystemHandlers,\n capabilities: DriverCapabilities = {},\n options: { owned?: boolean } = {}\n): ServedFilesystem {\n let open = false;\n const reply = (message: object, transfer: Transferable[] = []) =>\n port.postMessage(message, transfer);\n async function hello(message: KernelDriverHello): Promise<void> {\n const refused = driverVersionError(message.protocol);\n if (refused) {\n reply({ hello: { protocol: DRIVER_PROTOCOL, error: refused, errno: 'EPROTO' } });\n return;\n }\n try {\n const refined = await handlers.mount?.(message.mount);\n open = true;\n reply({\n hello: { protocol: DRIVER_PROTOCOL, capabilities: { ...capabilities, ...refined } },\n });\n } catch (err) {\n const code = (err as { code?: unknown })?.code;\n reply({\n hello: {\n protocol: DRIVER_PROTOCOL,\n error: err instanceof Error ? err.message : String(err),\n errno: typeof code === 'string' ? code : 'EIO',\n },\n });\n }\n }\n port.addEventListener('message', (event) => {\n const data = event.data as { hello?: KernelDriverHello } & DriverRequest;\n if (data.hello) {\n void hello(data.hello);\n return;\n }\n if (!open) return;\n dispatch(handlers, data).then(\n (result) => {\n if (result instanceof Uint8Array) {\n const whole = result.byteOffset === 0 && result.byteLength === result.buffer.byteLength;\n const bytes = options.owned && whole ? result : result.slice();\n reply({ id: data.id, result: bytes }, [bytes.buffer]);\n } else reply({ id: data.id, result: result ?? null });\n },\n (err: unknown) => {\n const code = (err as { code?: unknown })?.code;\n reply({\n id: data.id,\n errno: typeof code === 'string' ? code : 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n );\n });\n port.start?.();\n return { invalidate: (paths) => reply({ invalidate: paths }) };\n}\n", "import { type FilesystemHandlers, fsError } from './driver.ts';\nimport type { DriverAttr, DriverStatfs } from './protocol.ts';\n\nexport type MediumHandlers = Required<Omit<FilesystemHandlers, 'mount' | 'statfs'>> &\n Pick<FilesystemHandlers, 'statfs'>;\n\nexport interface MediumSlot<K> {\n readonly handlers: FilesystemHandlers;\n present(): boolean;\n insert(key: K, handlers: MediumHandlers): void;\n eject(): void;\n}\n\nconst EMPTY_ROOT: DriverAttr = { kind: 'directory', size: 0, mtime: 0, mode: 0o40755 };\n\nexport const absent = () => fsError('ENOMEDIUM', 'No medium found');\n\nexport function mediumSlot<K>(\n lost: (err: unknown, key: K) => Promise<boolean>,\n onLost: (key: K) => void\n): MediumSlot<K> {\n let current: { key: K; handlers: MediumHandlers } | undefined;\n function wrap<A extends unknown[], R>(\n pick: (h: MediumHandlers) => (...args: A) => Promise<R>\n ): (...args: A) => Promise<R> {\n return async (...args) => {\n const medium = current;\n if (!medium) throw absent();\n try {\n return await pick(medium.handlers)(...args);\n } catch (err) {\n if (!(await lost(err, medium.key))) throw err;\n if (current === medium) {\n current = undefined;\n onLost(medium.key);\n }\n throw absent();\n }\n };\n }\n const getattr = wrap((h) => h.getattr);\n const readdir = wrap((h) => h.readdir);\n const statfs = wrap((h) => async () => (await h.statfs?.()) ?? null);\n return {\n handlers: {\n getattr: (path) => (current || path !== '/' ? getattr(path) : Promise.resolve(EMPTY_ROOT)),\n readdir: (path) => (current || path !== '/' ? readdir(path) : Promise.resolve([])),\n open: wrap((h) => h.open),\n read: wrap((h) => h.read),\n write: wrap((h) => h.write),\n release: wrap((h) => h.release),\n mkdir: wrap((h) => h.mkdir),\n rmdir: wrap((h) => h.rmdir),\n unlink: wrap((h) => h.unlink),\n rename: wrap((h) => h.rename),\n symlink: wrap((h) => h.symlink),\n readlink: wrap((h) => h.readlink),\n setattr: wrap((h) => h.setattr),\n statfs: () => (current ? statfs() : Promise.resolve(null)) as Promise<DriverStatfs>,\n },\n present: () => current !== undefined,\n insert(key, handlers) {\n current = { key, handlers };\n },\n eject() {\n current = undefined;\n },\n };\n}\n", "import { OpfsFs, type WriteSession } from '../fs/opfs.ts';\nimport type { FsStat, KernelFs } from '../fs/types.ts';\nimport { type FilesystemHandlers, fsError, type OpenFlags } from './driver.ts';\nimport { mediumSlot } from './medium.ts';\nimport type { DriverAttr, DriverCapabilities, DriverEntry } from './protocol.ts';\n\nexport const FSA_CAPABILITIES: DriverCapabilities = {\n listingStats: true,\n ranges: true,\n sessions: true,\n};\n\nexport interface PermissionHandle {\n queryPermission?(descriptor: { mode: 'read' | 'readwrite' }): Promise<PermissionState>;\n requestPermission?(descriptor: { mode: 'read' | 'readwrite' }): Promise<PermissionState>;\n}\n\nexport type MediumHandle = FileSystemDirectoryHandle & PermissionHandle;\n\ntype Handlers = Required<Omit<FilesystemHandlers, 'mount' | 'statfs'>>;\n\nexport type SessionFs = KernelFs & Pick<OpfsFs, 'writeSession' | 'pread'>;\n\ninterface Opened {\n path: string;\n session?: Promise<WriteSession>;\n}\n\nconst codeOf = (err: unknown) => (err as { code?: unknown } | null)?.code;\nconst denied = (err: unknown) =>\n codeOf(err) === 'EACCES' || (err as { name?: unknown } | null)?.name === 'NotAllowedError';\n\nfunction attrOf(st: FsStat): DriverAttr {\n return {\n kind: st.isDirectory ? 'directory' : st.isSymbolicLink ? 'symlink' : 'file',\n size: st.size,\n mtime: st.mtime.getTime(),\n mode: st.mode,\n ino: st.ino,\n };\n}\n\nexport function kernelFsHandlers(fs: SessionFs): Handlers {\n const handles = new Map<number, Opened>();\n let nextFh = 0;\n const handle = (fh: number): Opened => {\n const found = handles.get(fh);\n if (!found) throw fsError('EBADF', `handle ${fh}`);\n return found;\n };\n async function existing(path: string): Promise<FsStat | undefined> {\n try {\n return await fs.stat(path);\n } catch (err) {\n if (codeOf(err) === 'ENOENT') return undefined;\n throw err;\n }\n }\n return {\n getattr: async (path) => attrOf(await fs.lstat(path)),\n readdir: async (path) =>\n (await fs.readdirStat(path)).flatMap(([name, st]): DriverEntry[] => {\n if (!st) return [];\n const attr = attrOf(st);\n return [{ name, kind: attr.kind, attr }];\n }),\n async open(path: string, flags: OpenFlags) {\n const st = await existing(path);\n if (st && flags.exclusive) throw fsError('EEXIST', path);\n if (st?.isDirectory && flags.write) throw fsError('EISDIR', path);\n if (!st && !flags.create) throw fsError('ENOENT', path);\n if (!st || flags.truncate) await fs.writeFile(path, new Uint8Array(0));\n handles.set(++nextFh, { path });\n return nextFh;\n },\n read: async (fh, offset, size) => fs.pread(handle(fh).path, offset, size),\n async write(fh, offset, bytes) {\n const h = handle(fh);\n h.session ??= fs.writeSession(h.path, false);\n await (await h.session).write(offset, bytes);\n },\n async release(fh) {\n const h = handle(fh);\n handles.delete(fh);\n if (h.session !== undefined) await (await h.session).close();\n },\n mkdir: (path) => fs.mkdir(path),\n async rmdir(path) {\n if (!(await fs.lstat(path)).isDirectory) throw fsError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw fsError('ENOTEMPTY', path);\n await fs.rm(path);\n },\n async unlink(path) {\n if ((await fs.lstat(path)).isDirectory) throw fsError('EISDIR', path);\n await fs.rm(path);\n },\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n async setattr(path, change) {\n if (change.size !== undefined) {\n const open = [...handles.values()].find(\n (h) => h.path === path && h.session !== undefined\n )?.session;\n if (open !== undefined) await (await open).truncate(change.size);\n else await fs.truncate?.(path, change.size);\n }\n if (change.mode !== undefined) await fs.chmod(path, change.mode);\n if (change.mtime !== undefined) {\n await fs.utimes(path, new Date(change.mtime), new Date(change.mtime));\n }\n },\n };\n}\n\nexport interface Medium {\n readonly handlers: FilesystemHandlers;\n present(): boolean;\n insert(handle: MediumHandle): void;\n eject(): void;\n}\n\nexport function granted(handle: PermissionHandle): Promise<boolean> {\n if (!handle.queryPermission) return Promise.resolve(true);\n return handle.queryPermission({ mode: 'readwrite' }).then(\n (state) => state === 'granted',\n () => false\n );\n}\n\nexport function removableMedium(\n onLost: (handle: MediumHandle) => void,\n open: (handle: MediumHandle) => SessionFs = (handle) => new OpfsFs(handle)\n): Medium {\n const slot = mediumSlot<MediumHandle>(\n async (err, handle) => denied(err) && !(await granted(handle)),\n onLost\n );\n return {\n handlers: slot.handlers,\n present: slot.present,\n insert: (handle) => slot.insert(handle, kernelFsHandlers(open(handle))),\n eject: slot.eject,\n };\n}\n", "import { normalizePath } from '../fs/types.ts';\nimport { errnoError } from './connection.ts';\nimport { type MountSpec, parseSize } from './mount-fs.ts';\n\nexport const MS_RDONLY = 1;\nconst MS_MGC_MSK = 0xffff0000;\nconst MS_MGC_VAL = 0xc0ed0000;\n\nconst IGNORED_FLAGS =\n 2 | 4 | 8 | 16 | 128 | 1024 | 2048 | 32768 | (1 << 21) | (1 << 24) | (1 << 25);\n\nexport const MNT_FORCE = 1;\nexport const MNT_DETACH = 2;\nconst UMOUNT_NOFOLLOW = 8;\n\nconst GENERIC = new Set([\n 'defaults',\n 'async',\n 'sync',\n 'dirsync',\n 'atime',\n 'noatime',\n 'diratime',\n 'nodiratime',\n 'relatime',\n 'norelatime',\n 'strictatime',\n 'nostrictatime',\n 'lazytime',\n 'nolazytime',\n 'suid',\n 'nosuid',\n 'dev',\n 'nodev',\n 'exec',\n 'noexec',\n 'auto',\n 'noauto',\n 'user',\n 'nouser',\n 'users',\n 'nofail',\n '_netdev',\n 'silent',\n 'loud',\n]);\n\nexport interface MountCall {\n source: string;\n target: string;\n type: string;\n flags: number;\n data: string;\n}\n\nexport interface ProcessMountRequest {\n op: 'mount' | 'umount';\n pid: number;\n target: string;\n type?: string;\n source?: string;\n options?: Record<string, string>;\n}\n\nexport type ProcessMountPolicy =\n | boolean\n | ((req: ProcessMountRequest) => boolean | Promise<boolean>);\n\nexport function parseMountOptions(data: string): Record<string, string> {\n const options: Record<string, string> = {};\n for (const raw of data.split(',')) {\n const item = raw.trim();\n if (!item || GENERIC.has(item)) continue;\n if (item === 'rw') {\n delete options.ro;\n continue;\n }\n const eq = item.indexOf('=');\n if (eq === 0) throw errnoError('EINVAL', `bad mount option ${item}`);\n if (eq < 0) options[item] = '';\n else options[item.slice(0, eq)] = item.slice(eq + 1);\n }\n if (options.maxfile !== undefined) parseSize(options.maxfile);\n return options;\n}\n\nexport function refusedTarget(target: string): void {\n const at = normalizePath(target);\n const kernel = at === '/' || [`/proc`, `/dev`].some((k) => at === k || at.startsWith(`${k}/`));\n if (kernel) throw errnoError('EBUSY', `${at} belongs to the kernel`);\n}\n\nfunction absolute(target: string): string {\n if (!target) throw errnoError('ENOENT', 'no mount point');\n if (!target.startsWith('/')) throw errnoError('EINVAL', `not an absolute path: ${target}`);\n return normalizePath(target);\n}\n\nexport function mountCall(call: MountCall): MountSpec {\n let flags = call.flags >>> 0;\n if ((flags & MS_MGC_MSK) >>> 0 === MS_MGC_VAL) flags &= ~MS_MGC_MSK;\n if (flags & ~(MS_RDONLY | IGNORED_FLAGS)) {\n throw errnoError('EINVAL', `unsupported mount flags ${flags.toString(16)}`);\n }\n if (!call.type) throw errnoError('EINVAL', 'no file system type');\n const target = absolute(call.target);\n refusedTarget(target);\n const options = parseMountOptions(call.data);\n if (flags & MS_RDONLY) options.ro = '';\n return { type: call.type, source: call.source || 'none', target, options };\n}\n\nexport function umountCall(target: string, flags: number): { target: string; detach: boolean } {\n const known = MNT_FORCE | MNT_DETACH | UMOUNT_NOFOLLOW;\n if ((flags >>> 0) & ~known) throw errnoError('EINVAL', `unsupported umount flags ${flags}`);\n const at = absolute(target);\n refusedTarget(at);\n return { target: at, detach: (flags & (MNT_FORCE | MNT_DETACH)) !== 0 };\n}\n", "import type { MountEntry, MountSpec } from './mount-fs.ts';\nimport { parseMountOptions } from './syscall.ts';\n\nexport const FSTAB_PATH = '/etc/fstab';\n\nexport const FSTAB_RETRIES = [1000, 4000, 16000];\n\nconst FINAL = new Set(['EINVAL', 'EBUSY', 'EPERM', 'EACCES']);\n\nexport interface FstabLine {\n line: number;\n spec: MountSpec;\n invalid?: Error;\n}\n\nexport interface FstabResult {\n line: number;\n target: string;\n entry?: MountEntry;\n code?: string;\n error?: string;\n}\n\nfunction unescape(field: string): string {\n return field.replace(/\\\\([0-7]{3})/g, (_, octal: string) =>\n String.fromCharCode(Number.parseInt(octal, 8))\n );\n}\n\nexport function parseFstab(text: string): FstabLine[] {\n const lines: FstabLine[] = [];\n text.split('\\n').forEach((raw, index) => {\n const content = raw.replace(/#.*$/, '').trim();\n if (!content) return;\n const [source, target, type, options = 'defaults'] = content.split(/\\s+/).map(unescape);\n if (source === undefined || target === undefined || type === undefined) return;\n if (options.split(',').includes('noauto')) return;\n const spec = { source, target, type, options: {} };\n try {\n lines.push({ line: index + 1, spec: { ...spec, options: parseMountOptions(options) } });\n } catch (err) {\n lines.push({ line: index + 1, spec, invalid: err as Error });\n }\n });\n return lines;\n}\n\nfunction codeOf(err: unknown): string {\n const code = (err as { code?: unknown } | null)?.code;\n return typeof code === 'string' ? code : 'EIO';\n}\n\nfunction wait(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', done, { once: true });\n });\n}\n\nexport async function mountFstab(\n lines: readonly FstabLine[],\n mount: (spec: MountSpec) => Promise<MountEntry>,\n signal: AbortSignal,\n retries: readonly number[] = FSTAB_RETRIES,\n discard: (entry: MountEntry) => void = () => {},\n settled: (line: FstabLine, result: FstabResult) => void = () => {}\n): Promise<FstabResult[]> {\n return Promise.all(\n lines.map(async (each) => {\n const result = await mountLine(each, mount, signal, retries, discard);\n settled(each, result);\n return result;\n })\n );\n}\n\nasync function mountLine(\n { line, spec, invalid }: FstabLine,\n mount: (spec: MountSpec) => Promise<MountEntry>,\n signal: AbortSignal,\n retries: readonly number[],\n discard: (entry: MountEntry) => void\n): Promise<FstabResult> {\n let failed: unknown = invalid;\n for (let attempt = 0; !invalid && attempt <= retries.length && !signal.aborted; attempt++) {\n try {\n const entry = await mount(spec);\n if (!signal.aborted) return { line, target: spec.target, entry };\n discard(entry);\n failed = Object.assign(new Error('the kernel stopped'), { code: 'ECANCELED' });\n break;\n } catch (err) {\n failed = err;\n if (FINAL.has(codeOf(err)) || attempt === retries.length) break;\n await wait(retries[attempt] as number, signal);\n }\n }\n const code = codeOf(failed);\n return { line, target: spec.target, code, error: String((failed as Error)?.message ?? code) };\n}\n", "import { type FilesystemHandlers, fsError, type OpenFlags, serveFilesystem } from './driver.ts';\nimport { type MediumHandlers, mediumSlot } from './medium.ts';\nimport type { MountSpec, OpenedDriver } from './mount-fs.ts';\nimport type { DriverAttr, DriverCapabilities, DriverEntry, DriverStatfs } from './protocol.ts';\n\nexport interface HostfsGrant {\n url: string;\n token: string;\n readonly?: boolean;\n capabilities?: DriverCapabilities;\n}\n\nexport type HostfsGrantHook = (\n source: string,\n options: { readonly: boolean }\n) => Promise<HostfsGrant>;\n\nexport type FetchLike = (url: string, init: RequestInit) => Promise<Response>;\n\nexport interface HostfsEvent {\n paths?: string[];\n all?: boolean;\n ping?: number;\n}\n\nexport const HOSTFS_IO = 16 * 1024 * 1024;\n\nconst codeOf = (err: unknown) => (err as { code?: unknown } | null)?.code;\n\nexport const unreachable = (err: unknown) => codeOf(err) === 'ENOTCONN';\n\nfunction rel(path: string): string {\n return path.replace(/^\\/+/, '');\n}\n\nexport class HostfsClient {\n private grant: HostfsGrant;\n private readonly regrant: () => Promise<HostfsGrant>;\n private readonly fetch: FetchLike;\n\n constructor(grant: HostfsGrant, regrant: () => Promise<HostfsGrant>, fetch: FetchLike) {\n this.grant = grant;\n this.regrant = regrant;\n this.fetch = fetch;\n }\n\n get capabilities(): DriverCapabilities {\n return this.grant.capabilities ?? {};\n }\n\n get token(): string {\n return this.grant.token;\n }\n\n get maxIo(): number {\n return this.capabilities.maxIo ?? HOSTFS_IO;\n }\n\n private async send(\n path: string,\n init: RequestInit,\n handle = false,\n retried = false\n ): Promise<Response> {\n let response: Response;\n try {\n response = await this.fetch(`${this.grant.url}${path}`, {\n ...init,\n credentials: 'omit',\n headers: {\n ...(init.headers as Record<string, string>),\n 'X-Hostfs-Token': this.grant.token,\n },\n });\n } catch (err) {\n throw fsError('ENOTCONN', `the host proxy is unreachable: ${(err as Error).message}`);\n }\n if (response.ok) return response;\n if (response.headers.get('X-Proxy-Error')) {\n await response.body?.cancel();\n if (retried || response.status !== 403) {\n throw fsError('EACCES', `the host proxy refused this folder (${response.status})`);\n }\n this.grant = await this.regrant();\n if (handle)\n throw fsError('ESTALE', 'the folder was granted again, so its open files are gone');\n return this.send(path, init, false, true);\n }\n const errno = response.headers.get('X-Hostfs-Errno') ?? 'EIO';\n const body = (await response.json().catch(() => ({}))) as { message?: unknown };\n throw fsError(errno, typeof body.message === 'string' ? body.message : errno);\n }\n\n async call<T>(op: string, body: Record<string, unknown> = {}, handle = false): Promise<T> {\n const response = await this.send(\n '/api/hostfs',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ op, ...body }),\n },\n handle\n );\n return (await response.json()) as T;\n }\n\n async read(fh: number, offset: number, size: number, ifMatch?: string): Promise<Uint8Array> {\n const response = await this.send(\n '/api/hostfs',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: 'read', fh, offset, size, ...(ifMatch ? { ifMatch } : {}) }),\n },\n true\n );\n return new Uint8Array(await response.arrayBuffer());\n }\n\n async write(fh: number, offset: number, bytes: Uint8Array): Promise<void> {\n const response = await this.send(\n '/api/hostfs/write',\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Hostfs-Request': JSON.stringify({ fh, offset }),\n },\n body: bytes as BodyInit,\n },\n true\n );\n await response.body?.cancel();\n }\n\n async watch(\n signal: AbortSignal,\n onEvent: (event: HostfsEvent) => void,\n onOpen: () => void = () => undefined\n ): Promise<void> {\n const response = await this.send('/api/hostfs/watch', { method: 'POST', signal });\n onOpen();\n const reader = (response.body as ReadableStream<Uint8Array>).getReader();\n const decoder = new TextDecoder();\n let buffered = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) return;\n buffered += decoder.decode(value, { stream: true });\n let end = buffered.indexOf('\\n');\n while (end >= 0) {\n const line = buffered.slice(0, end).trim();\n buffered = buffered.slice(end + 1);\n if (line) onEvent(JSON.parse(line) as HostfsEvent);\n end = buffered.indexOf('\\n');\n }\n }\n } catch (err) {\n if (signal.aborted) return;\n throw fsError('ENOTCONN', `the host proxy's watch broke: ${(err as Error).message}`);\n } finally {\n reader.releaseLock();\n }\n }\n}\n\ninterface Remote {\n client: HostfsClient;\n token: string;\n fh: number;\n etag: string | undefined;\n restore: { path: string; mode: number } | undefined;\n}\n\nexport function hostfsHandlers(current: () => HostfsClient): MediumHandlers {\n const handles = new Map<number, Remote>();\n let nextFh = 0;\n const fresh = (remote: Remote): Remote => {\n if (remote.client.token === remote.token) return remote;\n throw fsError('ESTALE', 'the folder was granted again, so this open file is gone');\n };\n const live = (fh: number): Remote => {\n const remote = handles.get(fh);\n if (!remote) throw fsError('EBADF', `handle ${fh}`);\n return fresh(remote);\n };\n const call = <T>(op: string, body: Record<string, unknown> = {}) => current().call<T>(op, body);\n async function writable(client: HostfsClient, path: string, flags: OpenFlags) {\n const { ifMatch: _, ...asked } = flags;\n const opening = () =>\n client.call<{ fh: number; attr?: DriverAttr }>('open', { path: rel(path), ...asked });\n try {\n return { opened: await opening(), restore: undefined };\n } catch (err) {\n if (!flags.write || codeOf(err) !== 'EACCES') throw err;\n const mode = (await client.call<DriverAttr>('stat', { path: rel(path) })).mode ?? 0;\n if (mode & 0o200) throw err;\n const restore = { path: rel(path), mode };\n await client.call('setattr', { path: rel(path), mode: mode | 0o200 });\n const opened = await opening().catch(async (again: unknown) => {\n await client.call('setattr', restore);\n throw again;\n });\n return { opened, restore };\n }\n }\n const handlers: MediumHandlers = {\n getattr: async (path) => await call<DriverAttr>('stat', { path: rel(path) }),\n async readdir(path) {\n const { entries } = await call<{ entries: Array<{ name: string; attr: DriverAttr }> }>(\n 'list',\n { path: rel(path) }\n );\n return entries.map(({ name, attr }): DriverEntry => ({ name, kind: attr.kind, attr }));\n },\n async open(path: string, flags: OpenFlags) {\n const client = current();\n const token = client.token;\n const { opened, restore } = await writable(client, path, flags);\n if (flags.ifMatch !== undefined && opened.attr?.etag !== flags.ifMatch) {\n await client.call('release', { fh: opened.fh }, true);\n throw fsError('ESTALE', `${path} changed on the host while it was being read`);\n }\n handles.set(++nextFh, {\n client,\n token,\n fh: opened.fh,\n etag: flags.write ? undefined : opened.attr?.etag,\n restore,\n });\n return nextFh;\n },\n async read(fh, offset, size) {\n const remote = live(fh);\n return remote.client.read(\n remote.fh,\n offset,\n Math.min(size, remote.client.maxIo),\n remote.etag\n );\n },\n async write(fh, offset, bytes) {\n const remote = live(fh);\n const most = remote.client.maxIo;\n for (let at = 0; at < bytes.length; at += most) {\n await remote.client.write(remote.fh, offset + at, bytes.subarray(at, at + most));\n }\n },\n async release(fh) {\n const remote = handles.get(fh);\n if (!remote) throw fsError('EBADF', `handle ${fh}`);\n handles.delete(fh);\n try {\n await fresh(remote).client.call('release', { fh: remote.fh }, true);\n } finally {\n if (remote.restore) await current().call('setattr', remote.restore);\n }\n },\n mkdir: async (path) => void (await call('mkdir', { path: rel(path) })),\n rmdir: async (path) => void (await call('rmdir', { path: rel(path) })),\n unlink: async (path) => void (await call('unlink', { path: rel(path) })),\n rename: async (from, to) => void (await call('rename', { from: rel(from), to: rel(to) })),\n symlink: async (target, path) => void (await call('symlink', { target, path: rel(path) })),\n readlink: async (path) =>\n (await call<{ target: string }>('readlink', { path: rel(path) })).target,\n async setattr(path, { size, ...change }) {\n if (size !== undefined && !current().capabilities.ranges) await resize(handlers, path, size);\n else if (size !== undefined) change = { ...change, size } as typeof change;\n if (Object.keys(change).length > 0) await call('setattr', { path: rel(path), ...change });\n },\n statfs: () => call<DriverStatfs>('statfs'),\n };\n return handlers;\n}\n\nconst KEEP: OpenFlags = { write: false, create: false, truncate: false, exclusive: false };\n\nasync function resize(h: FilesystemHandlers, path: string, size: number): Promise<void> {\n const was = (await h.getattr(path)).size;\n if (size === was) return;\n const kept: Uint8Array[] = [];\n if (size < was && size > 0) {\n const fh = await h.open(path, KEEP);\n try {\n for (let at = 0; at < size; ) {\n const bytes = await h.read(fh, at, size - at);\n if (bytes.length === 0) break;\n kept.push(bytes);\n at += bytes.length;\n }\n } finally {\n await h.release(fh);\n }\n }\n const fh = await h.open(path, { ...KEEP, write: true, truncate: size < was });\n try {\n if (size > was) await h.write(fh, size - 1, new Uint8Array(1));\n let at = 0;\n for (const bytes of kept) {\n await h.write(fh, at, bytes);\n at += bytes.length;\n }\n } finally {\n await h.release(fh);\n }\n}\n\nexport interface WatchLoop {\n connect(): Promise<HostfsClient>;\n up(client: HostfsClient): void;\n event(event: HostfsEvent): void;\n down(): void;\n silenceMs?: number;\n backoffMs?: [number, number];\n connectMs?: number;\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', done);\n });\n}\n\nexport interface Watching {\n ready: Promise<void>;\n kick(): void;\n}\n\nexport function keepWatching(loop: WatchLoop, signal: AbortSignal): Watching {\n const silenceMs = loop.silenceMs ?? 45_000;\n const [first, most] = loop.backoffMs ?? [1000, 30_000];\n const ready = Promise.withResolvers<void>();\n const capped = setTimeout(ready.resolve, loop.connectMs ?? 15_000);\n const uncap = () => clearTimeout(capped);\n void ready.promise.then(uncap);\n signal.addEventListener('abort', uncap, { once: true });\n let wait = first;\n let up = false;\n let current: AbortController | undefined;\n async function session(): Promise<boolean> {\n const session = new AbortController();\n current = session;\n const stop = () => session.abort();\n signal.addEventListener('abort', stop);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const quiet = () => {\n clearTimeout(timer);\n timer = setTimeout(stop, silenceMs);\n };\n let opened = false;\n try {\n const client = await loop.connect();\n quiet();\n await client.watch(\n session.signal,\n (event) => {\n quiet();\n if (!event.ping) loop.event(event);\n },\n () => {\n quiet();\n opened = true;\n up = true;\n loop.up(client);\n ready.resolve();\n }\n );\n return opened;\n } catch {\n return opened;\n } finally {\n clearTimeout(timer);\n signal.removeEventListener('abort', stop);\n }\n }\n void (async () => {\n while (!signal.aborted) {\n const began = Date.now();\n const opened = await session();\n if (signal.aborted) return;\n if (opened && Date.now() - began >= first) {\n wait = first;\n continue;\n }\n if (!opened && up) {\n up = false;\n loop.down();\n }\n ready.resolve();\n await sleep(wait, signal);\n wait = Math.min(wait * 2, most);\n }\n })();\n return { ready: ready.promise, kick: () => current?.abort() };\n}\n\nexport function invalidation(event: HostfsEvent): string[] | true {\n return event.paths ?? true;\n}\n\nexport interface HostfsTiming {\n silenceMs?: number;\n backoffMs?: [number, number];\n connectMs?: number;\n}\n\nexport async function openHostfs(\n spec: MountSpec,\n hook: HostfsGrantHook,\n fetch: FetchLike,\n timing: HostfsTiming = {}\n): Promise<OpenedDriver> {\n const readonly = spec.options?.ro !== undefined;\n const { port1, port2 } = new MessageChannel();\n const slot = mediumSlot<HostfsClient>(\n async (err) => unreachable(err),\n () => watching.kick()\n );\n const stop = new AbortController();\n const grant = () => hook(spec.source, { readonly });\n let active: HostfsClient | undefined;\n const handlers = hostfsHandlers(() => active as HostfsClient);\n const ranged = () => (active?.capabilities.ranges === true ? { ranges: true } : {});\n const served = serveFilesystem(\n port2,\n { ...slot.handlers, mount: ranged },\n {\n symlinks: true,\n chmod: true,\n listingStats: true,\n maxIo: HOSTFS_IO,\n ...(readonly ? { readonly: true } : {}),\n }\n );\n const watching = keepWatching(\n {\n connect: async () => new HostfsClient(await grant(), grant, fetch),\n up(client) {\n active = client;\n slot.insert(client, handlers);\n served.invalidate(true);\n },\n event: (event) => served.invalidate(invalidation(event)),\n down() {\n slot.eject();\n served.invalidate(true);\n },\n ...timing,\n },\n stop.signal\n );\n await watching.ready;\n return {\n port: port1,\n present: slot.present,\n dispose() {\n stop.abort();\n port1.close();\n port2.close();\n },\n };\n}\n", "import type { MediumHandle } from './fsa.ts';\n\nexport interface MediaStore {\n get(id: string): Promise<MediumHandle | undefined>;\n put(id: string, handle: MediumHandle): Promise<void>;\n}\n\nexport const MEDIA_STORE = 'handles';\n\nexport function memoryMedia(): MediaStore {\n const handles = new Map<string, MediumHandle>();\n return {\n get: async (id) => handles.get(id),\n put: async (id, handle) => void handles.set(id, handle),\n };\n}\n\nfunction settle<T>(request: IDBRequest, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(value());\n request.onerror = () => reject(request.error);\n });\n}\n\nexport function openMedia(name: string, factory: IDBFactory): Promise<MediaStore> {\n const request = factory.open(name, 1);\n request.onupgradeneeded = () => request.result.createObjectStore(MEDIA_STORE);\n return settle(request, () => {\n const db = request.result;\n const store = (mode: IDBTransactionMode) =>\n db.transaction(MEDIA_STORE, mode).objectStore(MEDIA_STORE);\n return {\n get: (id) => {\n const got = store('readonly').get(id);\n return settle(got, () => got.result as MediumHandle | undefined);\n },\n put: (id, handle) => settle(store('readwrite').put(handle, id), () => undefined),\n } satisfies MediaStore;\n });\n}\n", "export const CHUNK = 1024 * 1024;\n\nexport class ChunkedBytes {\n private chunks: Array<Uint8Array | undefined> = [];\n size = 0;\n\n read(offset: number, length: number): Uint8Array {\n const end = Math.min(this.size, offset + length);\n if (end <= offset) return new Uint8Array(0);\n const out = new Uint8Array(end - offset);\n for (let at = offset; at < end; ) {\n const index = Math.floor(at / CHUNK);\n const from = at - index * CHUNK;\n const n = Math.min(CHUNK - from, end - at);\n const chunk = this.chunks[index];\n if (chunk) out.set(chunk.subarray(from, Math.min(from + n, chunk.length)), at - offset);\n at += n;\n }\n return out;\n }\n\n write(offset: number, bytes: Uint8Array, owned = false): void {\n const whole = owned && bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength;\n for (let done = 0; done < bytes.length; ) {\n const at = offset + done;\n const index = Math.floor(at / CHUNK);\n const from = at - index * CHUNK;\n const n = Math.min(CHUNK - from, bytes.length - done);\n if (whole && n === CHUNK && bytes.length === CHUNK) this.chunks[index] = bytes;\n else this.room(index, from + n).set(bytes.subarray(done, done + n), from);\n done += n;\n }\n this.size = Math.max(this.size, offset + bytes.length);\n }\n\n truncate(size: number): void {\n if (size < this.size) {\n const keep = Math.ceil(size / CHUNK);\n this.chunks.length = Math.min(this.chunks.length, keep);\n const tail = this.chunks[keep - 1];\n const from = size - (keep - 1) * CHUNK;\n if (tail && from < tail.length) tail.fill(0, from);\n }\n this.size = size;\n }\n\n private room(index: number, need: number): Uint8Array {\n const chunk = this.chunks[index];\n if (chunk && chunk.length >= need) return chunk;\n const grown = new Uint8Array(Math.min(CHUNK, Math.max(need, (chunk?.length ?? 0) * 2)));\n if (chunk) grown.set(chunk);\n this.chunks[index] = grown;\n return grown;\n }\n}\n", "import { ChunkedBytes } from './chunked.ts';\nimport { type FilesystemHandlers, fsError, type OpenFlags } from './driver.ts';\nimport type { DriverAttr, DriverEntry } from './protocol.ts';\n\ninterface Node {\n kind: DriverAttr['kind'];\n ino: number;\n mode: number;\n mtime: number;\n data: ChunkedBytes;\n target: string;\n children: Map<string, Node>;\n}\n\ninterface Handle {\n node: Node;\n write: boolean;\n}\n\nexport function tmpfs(): FilesystemHandlers {\n let inodes = 0;\n const make = (kind: Node['kind'], mode: number): Node => ({\n kind,\n ino: ++inodes,\n mode,\n mtime: Date.now(),\n data: new ChunkedBytes(),\n target: '',\n children: new Map(),\n });\n const root = make('directory', 0o40755);\n const handles = new Map<number, Handle>();\n let nextFh = 0;\n\n const parts = (path: string) => path.split('/').filter(Boolean);\n function find(path: string): Node {\n let node = root;\n for (const name of parts(path)) {\n if (node.kind !== 'directory') throw fsError('ENOTDIR', path);\n const next = node.children.get(name);\n if (!next) throw fsError('ENOENT', path);\n node = next;\n }\n return node;\n }\n function parent(path: string): { dir: Node; name: string } {\n const names = parts(path);\n const name = names.pop();\n if (name === undefined) throw fsError('EBUSY', 'the root of a mount');\n const dir = find(`/${names.join('/')}`);\n if (dir.kind !== 'directory') throw fsError('ENOTDIR', path);\n return { dir, name };\n }\n const attr = (node: Node): DriverAttr => ({\n kind: node.kind,\n size:\n node.kind === 'file' ? node.data.size : node.kind === 'symlink' ? node.target.length : 4096,\n mtime: node.mtime,\n mode: node.mode,\n ino: node.ino,\n });\n const handle = (fh: number): Handle => {\n const found = handles.get(fh);\n if (!found) throw fsError('EBADF', `handle ${fh}`);\n return found;\n };\n function opened(path: string, flags: OpenFlags): Node {\n const { dir, name } = parent(path);\n const existing = dir.children.get(name);\n if (existing && flags.exclusive) throw fsError('EEXIST', path);\n if (existing?.kind === 'directory' && flags.write) throw fsError('EISDIR', path);\n if (existing) return existing;\n if (!flags.create) throw fsError('ENOENT', path);\n const node = make('file', 0o100644);\n dir.children.set(name, node);\n dir.mtime = Date.now();\n return node;\n }\n\n return {\n async getattr(path) {\n return attr(find(path));\n },\n async readdir(path) {\n const dir = find(path);\n if (dir.kind !== 'directory') throw fsError('ENOTDIR', path);\n return [...dir.children].map(\n ([name, node]): DriverEntry => ({ name, kind: node.kind, attr: attr(node) })\n );\n },\n async open(path, flags) {\n const node = opened(path, flags);\n if (flags.truncate && node.kind === 'file') {\n node.data.truncate(0);\n node.mtime = Date.now();\n }\n handles.set(++nextFh, { node, write: flags.write });\n return nextFh;\n },\n async read(fh, offset, size) {\n return handle(fh).node.data.read(offset, size);\n },\n async write(fh, offset, bytes) {\n const h = handle(fh);\n if (!h.write) throw fsError('EBADF', `handle ${fh} is read-only`);\n h.node.data.write(offset, bytes, true);\n h.node.mtime = Date.now();\n },\n async release(fh) {\n handle(fh);\n handles.delete(fh);\n },\n async mkdir(path) {\n const { dir, name } = parent(path);\n if (dir.children.has(name)) throw fsError('EEXIST', path);\n dir.children.set(name, make('directory', 0o40755));\n dir.mtime = Date.now();\n },\n async rmdir(path) {\n const { dir, name } = parent(path);\n const node = dir.children.get(name);\n if (!node) throw fsError('ENOENT', path);\n if (node.kind !== 'directory') throw fsError('ENOTDIR', path);\n if (node.children.size > 0) throw fsError('ENOTEMPTY', path);\n dir.children.delete(name);\n dir.mtime = Date.now();\n },\n async unlink(path) {\n const { dir, name } = parent(path);\n const node = dir.children.get(name);\n if (!node) throw fsError('ENOENT', path);\n if (node.kind === 'directory') throw fsError('EISDIR', path);\n dir.children.delete(name);\n dir.mtime = Date.now();\n },\n async rename(from, to) {\n const a = `/${parts(from).join('/')}`;\n const b = `/${parts(to).join('/')}`;\n if (b !== a && b.startsWith(`${a}/`)) throw fsError('EINVAL', `${to} is inside ${from}`);\n const source = parent(from);\n const node = source.dir.children.get(source.name);\n if (!node) throw fsError('ENOENT', from);\n const target = parent(to);\n const replaced = target.dir.children.get(target.name);\n if (replaced === node) return;\n if (\n replaced?.kind === 'directory' &&\n (node.kind !== 'directory' || replaced.children.size > 0)\n ) {\n throw fsError(node.kind === 'directory' ? 'ENOTEMPTY' : 'EISDIR', to);\n }\n source.dir.children.delete(source.name);\n target.dir.children.set(target.name, node);\n source.dir.mtime = Date.now();\n target.dir.mtime = source.dir.mtime;\n },\n async symlink(target, path) {\n const { dir, name } = parent(path);\n if (dir.children.has(name)) throw fsError('EEXIST', path);\n const node = make('symlink', 0o120777);\n node.target = target;\n dir.children.set(name, node);\n dir.mtime = Date.now();\n },\n async readlink(path) {\n const node = find(path);\n if (node.kind !== 'symlink') throw fsError('EINVAL', path);\n return node.target;\n },\n async setattr(path, change) {\n const node = find(path);\n if (change.mode !== undefined) node.mode = (node.mode & ~0o7777) | (change.mode & 0o7777);\n if (change.size !== undefined) {\n if (node.kind !== 'file')\n throw fsError(node.kind === 'directory' ? 'EISDIR' : 'EINVAL', path);\n node.data.truncate(change.size);\n node.mtime = Date.now();\n }\n if (change.mtime !== undefined) node.mtime = change.mtime;\n },\n async statfs() {\n return { bsize: 4096, blocks: 262144, bfree: 262144 };\n },\n };\n}\n", "export interface ImportedMemory {\n module: string;\n name: string;\n initial: number;\n maximum?: number;\n shared: boolean;\n}\n\nexport function importedMemory(bytes: Uint8Array): ImportedMemory | undefined {\n let at = 8;\n const u32 = (): number => {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = bytes[at++];\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n };\n const name = (): string => {\n const len = u32();\n const s = new TextDecoder().decode(bytes.subarray(at, at + len));\n at += len;\n return s;\n };\n const limits = () => {\n const flags = bytes[at++];\n const initial = u32();\n const maximum = flags & 1 ? u32() : undefined;\n return { initial, maximum, shared: (flags & 2) !== 0 };\n };\n while (at < bytes.length) {\n const id = bytes[at++];\n const size = u32();\n const end = at + size;\n if (id !== 2) {\n at = end;\n continue;\n }\n const count = u32();\n for (let i = 0; i < count; i++) {\n const module = name();\n const field = name();\n const kind = bytes[at++];\n if (kind === 0) u32();\n else if (kind === 1) {\n at++;\n limits();\n } else if (kind === 2) {\n const l = limits();\n return { module, name: field, ...l };\n } else if (kind === 3) at += 2;\n else if (kind === 4) {\n at++;\n u32();\n }\n }\n return undefined;\n }\n return undefined;\n}\n\nexport const RESERVED_NAMESPACES: ReadonlySet<string> = new Set([\n 'wasi_snapshot_preview1',\n 'wasix_32v1',\n 'wasi',\n 'env',\n]);\n\nexport type ForeignResult = 'none' | 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport type ForeignResults = Record<string, Record<string, ForeignResult>>;\n\nconst RESULTS: Readonly<Record<number, ForeignResult>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nfunction resultOf(results: number[]): ForeignResult {\n if (results.length === 0) return 'none';\n return (results.length === 1 && RESULTS[results[0]]) || 'other';\n}\n\nclass Reader {\n at = 8;\n readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n }\n\n byte(): number {\n return this.bytes[this.at++];\n }\n\n u32(): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = this.byte();\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n }\n\n name(): string {\n const len = this.u32();\n const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + len));\n this.at += len;\n return s;\n }\n\n valtype(): number {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.u32();\n return code;\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\nfunction readTypes(r: Reader): ForeignResult[] | undefined {\n const types: ForeignResult[] = [];\n for (let i = r.u32(); i > 0; i--) {\n if (r.byte() !== 0x60) return undefined;\n for (let n = r.u32(); n > 0; n--) r.valtype();\n const results: number[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n types.push(resultOf(results));\n }\n return types;\n}\n\nfunction skipImport(r: Reader, kind: number): void {\n if (kind === 1) {\n r.valtype();\n r.limits();\n } else if (kind === 2) r.limits();\n else if (kind === 3) {\n r.valtype();\n r.byte();\n } else {\n r.byte();\n r.u32();\n }\n}\n\nfunction readImports(r: Reader, types: ForeignResult[]): ForeignResults {\n const foreign: ForeignResults = {};\n for (let i = r.u32(); i > 0; i--) {\n const module = r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind !== 0) skipImport(r, kind);\n else {\n const type = types[r.u32()] ?? 'other';\n if (!RESERVED_NAMESPACES.has(module)) (foreign[module] ??= {})[field] = type;\n }\n }\n return foreign;\n}\n\nexport function foreignImports(bytes: Uint8Array): ForeignResults | undefined {\n const r = new Reader(bytes);\n let types: ForeignResult[] | undefined = [];\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n if (id === 1) types = readTypes(r);\n if (!types) return undefined;\n if (id === 2) return readImports(r, types);\n r.at = end;\n }\n return {};\n}\n", "import { enableCdp } from './cdp/facade.ts';\nimport { CdpHosts } from './cdp/hosts.ts';\nimport type { CdpHook } from './cdp/types.ts';\nimport { serveClient } from './client/serve-client.ts';\nimport {\n type Abi,\n binfmtOf,\n type Command,\n pnpmGlobalRoots,\n scanBinfmts,\n scanCommands,\n scanFilesystems,\n} from './commands.ts';\n\nexport const PNPM_HOME = '/home/.local/share/pnpm';\n\nimport { followLinks, withCommandDirs } from './fs/commands.ts';\nimport type { KernelFs } from './fs/types.ts';\nimport { fsError, normalizePath } from './fs/types.ts';\nimport { UnlinkedKeeper, type UnlinkOwner, webLocks } from './fs/unlinked.ts';\nimport { FsWatchers } from './fs/watch.ts';\nimport {\n type ChildForker,\n type ChildHandle,\n type ChildSpawner,\n SpawnError,\n} from './kernel/children.ts';\nimport { bytesSource, deviceFile, FdTable, sinkFile } from './kernel/fd-table.ts';\nimport { spawnWasmProcess, type WasmProcessHandle, type WasmWorkerLike } from './kernel/host.ts';\nimport { LockTable } from './kernel/host-ops.ts';\nimport { type JobMember, JobTable } from './kernel/jobs.ts';\nimport { HttpHandles } from './kernel/net/http-syscalls.ts';\nimport { DEFAULT_HOSTNAME, isHostname } from './kernel/net/loopback-names.ts';\nimport {\n enableNetwork,\n kernelCa,\n kernelTlsEngine,\n memoryCaStore,\n missingTransport,\n networkEnv,\n packageTlsEngine,\n writeCaFile,\n} from './kernel/net/network.ts';\nimport type { CaStore, RealmCa } from './kernel/net/realm-ca.ts';\nimport { Resolver } from './kernel/net/resolver.ts';\nimport { Routes, type RouteTable } from './kernel/net/routes.ts';\nimport type { RealmTransport } from './kernel/net/transport.ts';\nimport type { NetworkUplink } from './kernel/net/uplink.ts';\nimport type { ProcessInfo } from './kernel/proc-info.ts';\nimport { DEFAULT_UMASK } from './kernel/process.ts';\nimport type { ForkState, Program } from './kernel/protocol.ts';\nimport { PtyTable } from './kernel/pty.ts';\nimport { SettlingChildren } from './kernel/settling.ts';\nimport { LoopbackNet } from './kernel/socket.ts';\nimport { KernelTty } from './kernel/tty.ts';\nimport { keepingOpen, VfsNodes } from './kernel/vfs-file.ts';\nimport { type ServedFilesystem, serveFilesystem } from './mount/driver.ts';\nimport {\n FSA_CAPABILITIES,\n granted,\n type Medium,\n type MediumHandle,\n removableMedium,\n} from './mount/fsa.ts';\nimport {\n FSTAB_PATH,\n FSTAB_RETRIES,\n type FstabResult,\n mountFstab,\n parseFstab,\n} from './mount/fstab.ts';\nimport {\n type FetchLike,\n type HostfsGrantHook,\n type HostfsTiming,\n openHostfs,\n} from './mount/hostfs.ts';\nimport { type MediaStore, memoryMedia } from './mount/media.ts';\nimport {\n HeldSet,\n heldUnder,\n type MountEntry,\n type MountSpec,\n MountTable,\n type OpenedDriver,\n} from './mount/mount-fs.ts';\nimport {\n type MountCall,\n mountCall,\n type ProcessMountPolicy,\n type ProcessMountRequest,\n umountCall,\n} from './mount/syscall.ts';\nimport { tmpfs } from './mount/tmpfs.ts';\nimport {\n type ForeignResults,\n foreignImports,\n type ImportedMemory,\n importedMemory,\n} from './process/wasi/wasi-module.ts';\n\nexport interface LauncherOptions {\n unlinkOwner?: UnlinkOwner;\n fs: KernelFs;\n createWorker: () => WasmWorkerLike;\n modules?: string;\n env?: Record<string, string>;\n transport?: RealmTransport;\n caStore?: CaStore;\n createDriverWorker?: () => WasmWorkerLike;\n media?: MediaStore;\n onMountPending?: (pending: PendingMedium) => void;\n hostfs?: HostfsGrantHook;\n hostfsFetch?: FetchLike;\n hostfsTiming?: HostfsTiming;\n processMounts?: ProcessMountPolicy;\n fstabRetries?: readonly number[];\n cdp?: CdpHook;\n uplink?: NetworkUplink;\n hostname?: string;\n}\n\nexport interface PendingMedium {\n target: string;\n source: string;\n handle?: MediumHandle;\n}\n\ninterface Removable {\n id: string;\n medium: Medium;\n served: ServedFilesystem;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n onStarted?: (pid: number) => void;\n collect?: boolean;\n pgid?: number;\n}\n\nexport interface TerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n onData: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalSession {\n pid: number;\n exited: Promise<number>;\n write(bytes: Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(sig: number): void;\n close(): void;\n}\n\nexport interface RunResult {\n status: number;\n stdout: Uint8Array;\n stderr: Uint8Array;\n}\n\ninterface Target {\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n prefix?: string[];\n env?: Record<string, string>;\n unset?: string[];\n imports?: string;\n preopenRoot?: boolean;\n}\n\ninterface Compiled {\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n}\n\ninterface Planned {\n target: Target;\n args: string[];\n}\n\ninterface StartRequest {\n program: Program;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n report: (message: string) => void;\n ppid?: number;\n fork?: ForkState;\n exec?: boolean;\n pgid?: number;\n ignored?: number;\n umask?: number;\n decided?: Promise<boolean>;\n}\n\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst PACKAGE_ROOT = /^(.*\\/node_modules\\/(?:@[^/]+\\/)?[^/]+)\\//;\nconst ENV_REFERENCE = /\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\nconst WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d];\nconst SHEBANG_MAX = 256;\nconst MAX_INTERPRETERS = 4;\nconst NOT_FOUND = 127;\nconst DECIDE_MS = 100;\nconst INIT_PID = 1;\nconst SHARED_DIRS = ['/tmp', '/home'];\nconst encoder = new TextEncoder();\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction modulePath(glue: string): string {\n return glue.endsWith('.js') ? `${glue.slice(0, -3)}.wasm` : `${glue}.wasm`;\n}\n\nfunction isWasm(bytes: Uint8Array): boolean {\n return WASM_MAGIC.every((b, i) => bytes[i] === b);\n}\n\nfunction shebang(head: Uint8Array): string[] | undefined {\n if (head[0] !== 0x23 || head[1] !== 0x21) return undefined;\n return new TextDecoder()\n .decode(head.subarray(0, SHEBANG_MAX))\n .slice(2)\n .split('\\n')[0]\n .trim()\n .split(/[ \\t]+/);\n}\n\nfunction interpreter(head: Uint8Array): string {\n const words = shebang(head);\n if (!words) return 'node';\n if (baseName(words[0]) === 'env') words.shift();\n if (words[0] === '-S') words.shift();\n return baseName(words[0] ?? '');\n}\n\nexport function expandDefaults(\n defaults: Readonly<Record<string, string>> | undefined,\n env: Readonly<Record<string, string>>\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaults ?? {})) {\n let missing = false;\n const expanded = value.replace(ENV_REFERENCE, (_, name: string) => {\n const set = Object.hasOwn(env, name) ? env[name] : undefined;\n if (set === undefined) missing = true;\n return set ?? '';\n });\n if (!missing) out[key] = expanded;\n }\n return out;\n}\n\nfunction targetOf(command: Command): Target {\n return {\n abi: command.abi,\n glue: command.glue,\n wasm: command.wasm,\n argv0: command.argv0,\n ...(command.args ? { prefix: command.args } : {}),\n ...(command.env ? { env: command.env } : {}),\n ...(command.unset ? { unset: command.unset } : {}),\n ...(command.imports ? { imports: command.imports } : {}),\n ...(command.preopenRoot ? { preopenRoot: true } : {}),\n };\n}\n\nfunction withScriptEnv(target: Target, command: Command | undefined): Target {\n if (!command) return target;\n return {\n ...target,\n env: { ...target.env, ...command.env },\n unset: [\n ...(target.unset ?? []).filter((key) => !Object.hasOwn(command.env ?? {}, key)),\n ...(command.unset ?? []),\n ],\n };\n}\n\nfunction childHandle(handle: WasmProcessHandle): ChildHandle {\n return {\n pid: handle.pid,\n exited: handle.exited,\n termsig: handle.termsig,\n onState: (listener) => handle.onState(listener),\n };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, chunk) => n + chunk.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class Launcher {\n readonly fs: KernelFs;\n private readonly base: KernelFs;\n private readonly createWorker: () => WasmWorkerLike;\n private readonly modulesDir: string;\n private readonly env: Record<string, string>;\n private catalog: Promise<Map<string, Command>> | undefined;\n private binfmts: Promise<Map<string, string>> | undefined;\n private readonly warned = new Set<string>();\n private readonly compiled = new Map<string, Promise<Compiled>>();\n private readonly processes = new Map<number, WasmProcessHandle>();\n private readonly zombies = new Set<number>();\n private readonly orphans = new Set<number>();\n private readonly described = new Map<number, Pick<ProcessInfo, 'argv' | 'tty' | 'started'>>();\n private readonly jobs = new JobTable();\n private readonly locks = new LockTable();\n private readonly settling = new SettlingChildren((pid) => this.jobs.pgidOf(pid));\n private readonly ptys = new PtyTable(\n (tty, sig) => this.keySignal(tty, 0, sig, () => this.jobs.signalOwnedForeground(tty, sig)),\n (tty) => this.settling.reading(this.jobs.tcgetpgrp(tty, 0))\n );\n readonly net = new LoopbackNet();\n readonly cdp: CdpHosts;\n private readonly ca: () => Promise<RealmCa>;\n readonly transport: RealmTransport;\n readonly uplink: NetworkUplink | undefined;\n readonly routes: Routes;\n readonly resolver: Resolver;\n readonly hostname: string;\n readonly watchers = new FsWatchers();\n private readonly pnpmHome: string;\n readonly mounts: MountTable;\n private readonly createDriverWorker: (() => WasmWorkerLike) | undefined;\n private readonly media: MediaStore;\n private readonly onMountPending: ((pending: PendingMedium) => void) | undefined;\n private readonly removable = new Map<string, Removable>();\n private readonly hostfs: Pick<LauncherOptions, 'hostfs' | 'hostfsFetch' | 'hostfsTiming'>;\n private readonly fstabRetries: readonly number[];\n private readonly inserted = new Map<string, MediumHandle>();\n private readonly openFiles = new Set<VfsNodes>();\n private readonly deciding = new Map<number, Set<(byParent: boolean) => void>>();\n readonly identities = { asked: 0, timedOut: 0 };\n private readonly nodes: VfsNodes;\n private readonly unlinked: UnlinkedKeeper;\n private readonly held = new HeldSet((path) => this.released(path));\n private readonly processMounts: ProcessMountPolicy;\n private readonly booting = new AbortController();\n fstab: Promise<FstabResult[]> = Promise.resolve([]);\n private nextPid = 1000;\n readonly boot = Date.now();\n private terminals = 0;\n\n constructor(options: LauncherOptions) {\n this.mounts = new MountTable({\n open: (type, spec) => this.driver(type, spec),\n busy: (target) =>\n [...this.openFiles].some((nodes) => nodes.holds(target)) || heldUnder(this.held, target),\n changed: this.watchers.changed.bind(this.watchers),\n });\n this.base = this.watchers.wrap(this.mounts.wrap(options.fs));\n this.createWorker = options.createWorker;\n this.createDriverWorker = options.createDriverWorker;\n this.media = options.media ?? memoryMedia();\n this.onMountPending = options.onMountPending;\n this.hostfs = options;\n this.fstabRetries = options.fstabRetries ?? FSTAB_RETRIES;\n this.processMounts = options.processMounts ?? true;\n this.pnpmHome = options.env?.PNPM_HOME ?? PNPM_HOME;\n this.modulesDir = options.modules ?? '/node_modules';\n this.cdp = new CdpHosts(options.cdp);\n const hostname = options.hostname ?? DEFAULT_HOSTNAME;\n if (!isHostname(hostname)) throw new Error(`not a host name: ${String(hostname)}`);\n this.hostname = hostname;\n this.env = { ...networkEnv(hostname), SLICC_CDP_URL: this.cdp.url, ...options.env };\n this.ca = kernelCa(options.caStore ?? memoryCaStore());\n this.transport = options.transport ?? missingTransport();\n this.uplink = options.uplink;\n this.routes = new Routes(options.uplink?.traits.ipv6 === true);\n if (options.uplink?.routes) this.routes.set(options.uplink.routes);\n this.resolver = new Resolver({ uplink: options.uplink, routes: this.routes, hostname });\n if (options.uplink) this.net.useUplink({ uplink: options.uplink, routes: this.routes });\n enableNetwork(this.net, {\n transport: this.transport,\n engine: kernelTlsEngine(packageTlsEngine(options.fs, this.modulesDir)),\n ca: this.ca,\n });\n enableCdp(this.net, this.cdp);\n const fs = withCommandDirs(this.base, async () => new Set((await this.commands()).keys()));\n this.nodes = new VfsNodes(fs, (path) => this.released(path));\n this.nodes.keepsOnDisk = true;\n this.openFiles.add(this.nodes);\n const holders = [this.held, [this.nodes]];\n this.unlinked = new UnlinkedKeeper(\n fs,\n { [Symbol.iterator]: () => holders.flatMap((set) => [...set]).values() },\n (path) => this.mountRoot(path),\n {\n locks: webLocks(),\n busy: (path) => [...this.openFiles].some((nodes) => nodes.holds(path)),\n owner: options.unlinkOwner,\n }\n );\n this.fs = this.unlinked.wrap(keepingOpen(fs, this.nodes));\n void this.unlinked.sweep('/');\n this.watchers.watch([this.modulesDir, this.pnpmHome], { recursive: true }, () => {\n this.catalog = undefined;\n this.binfmts = undefined;\n });\n }\n\n setRoutes(table: RouteTable): void {\n this.routes.set(table);\n }\n\n commands(): Promise<Map<string, Command>> {\n this.catalog ??= this.roots().then((roots) => scanCommands(this.base, roots));\n return this.catalog;\n }\n\n private interpreters(): Promise<Map<string, string>> {\n this.binfmts ??= this.roots().then((roots) =>\n scanBinfmts(this.base, roots, (message) => {\n if (this.warned.has(message)) return;\n this.warned.add(message);\n console.warn(message);\n })\n );\n return this.binfmts;\n }\n\n private async roots(): Promise<string[]> {\n return [this.modulesDir, ...(await pnpmGlobalRoots(this.base, this.pnpmHome))];\n }\n\n async resolve(file: string, argv0: string, cwd: string): Promise<Target | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name !== undefined) {\n const command = (await this.commands()).get(name);\n return command && !command.script ? targetOf(command) : undefined;\n }\n const path = this.fs.resolvePath(cwd, file);\n const glue = await followLinks(this.base, path);\n const linked = COMMAND.exec(glue)?.[1];\n if (linked !== undefined) {\n const target = await this.resolve(`/bin/${linked}`, argv0, cwd);\n const byPath = !COMMAND.test(path) && (await this.commands()).get(linked)?.argv0Path === true;\n return target && byPath ? { ...target, argv0: path } : target;\n }\n const head = await this.head(glue);\n if (!head) return undefined;\n if (isWasm(head)) {\n return {\n abi: 'wasi',\n glue,\n wasm: glue,\n argv0: baseName(argv0 || file).replace(/\\.wasm$/, ''),\n };\n }\n if (interpreter(head) !== 'node') return undefined;\n const wasm = modulePath(glue);\n if (!(await this.base.exists(wasm))) return undefined;\n return { abi: 'emscripten', glue, wasm, argv0: baseName(argv0 || file) };\n }\n\n private async head(path: string): Promise<Uint8Array | undefined> {\n try {\n return (await this.base.readFileBuffer(path)).subarray(0, SHEBANG_MAX);\n } catch {\n return undefined;\n }\n }\n\n private async scriptCommand(file: string): Promise<Command | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name === undefined) return undefined;\n const command = (await this.commands()).get(name);\n return command?.script ? command : undefined;\n }\n\n private async interpreted(\n file: string,\n argv: string[],\n cwd: string,\n depth = 0\n ): Promise<Planned | undefined> {\n const command = await this.scriptCommand(file);\n const script = command?.script ?? this.fs.resolvePath(cwd, file);\n const head = await this.head(script);\n if (!head) return undefined;\n const binfmt = isWasm(head) ? undefined : binfmtOf(await this.interpreters(), script);\n const words = shebang(head) ?? (binfmt ? [binfmt] : undefined);\n if (!words) return undefined;\n if (baseName(words[0]) === 'env') words.shift();\n const [interp, ...rest] = words;\n const arg = rest.join(' ');\n const passed = [...(arg ? [arg] : []), command ? script : file, ...argv.slice(1)];\n const found = interp ? await this.resolve(interp, interp, cwd) : undefined;\n if (!found) {\n if (!interp || depth >= MAX_INTERPRETERS || !(await this.scriptCommand(interp))) {\n return undefined;\n }\n const inner = await this.interpreted(interp, [interp, ...passed], cwd, depth + 1);\n return inner && { ...inner, target: withScriptEnv(inner.target, command) };\n }\n const target = withScriptEnv(found, command);\n return { target, args: [...(target.prefix ?? []), ...passed] };\n }\n\n private async plan(file: string, argv: string[], cwd: string): Promise<Planned | undefined> {\n const direct = await this.resolve(file, argv[0] ?? file, cwd);\n if (direct) return { target: direct, args: [...(direct.prefix ?? []), ...argv.slice(1)] };\n return this.interpreted(file, argv, cwd);\n }\n\n private async unrunnable(file: string, cwd: string): Promise<'ENOEXEC' | 'ENOENT'> {\n const path = this.fs.resolvePath(cwd, file);\n const head = await this.base.readFileBuffer(path).catch(() => null);\n if (!head || (head[0] === 0x23 && head[1] === 0x21)) return 'ENOENT';\n return binfmtOf(await this.interpreters(), path) ? 'ENOENT' : 'ENOEXEC';\n }\n\n private module(path: string): Promise<Compiled> {\n return this.base.stat(path).then((st) => {\n const key = `${path}:${st.size}:${st.mtime.getTime()}`;\n let module = this.compiled.get(key);\n if (!module) {\n module = this.base.readFileBuffer(path).then(async (bytes) => {\n const memory = importedMemory(bytes);\n const foreign = foreignImports(bytes);\n const compiled = await WebAssembly.compile(bytes as BufferSource);\n return {\n module: compiled,\n ...(memory ? { memory } : {}),\n foreign,\n };\n });\n this.compiled.set(key, module);\n module.catch(() => this.compiled.delete(key));\n }\n return module;\n });\n }\n\n private async names(path: string, module: WebAssembly.Module): Promise<string | undefined> {\n if (WebAssembly.Module.customSections(module, 'name').length > 0) return undefined;\n const beside = `${path}.names`;\n if (await this.base.exists(beside)) return beside;\n const root = PACKAGE_ROOT.exec(path)?.[1];\n if (root === undefined) return undefined;\n const optional = `${root}-names${beside.slice(root.length)}`;\n return (await this.base.exists(optional)) ? optional : undefined;\n }\n\n private async program(target: Target, env: Record<string, string>): Promise<Program> {\n if (target.abi === 'js') {\n return { abi: 'js', glue: await this.base.readFile(target.wasm), path: target.wasm };\n }\n if (target.abi !== 'wasi') {\n const [glue, { module }] = await Promise.all([\n this.base.readFile(target.glue),\n this.module(target.wasm),\n ]);\n return { glue, module };\n }\n const { module, memory, foreign } = await this.module(target.wasm);\n const names =\n env.SLICC_WASM_BACKTRACE === '1' ? await this.names(target.wasm, module) : undefined;\n const imports = target.imports ? await this.base.readFile(target.imports) : undefined;\n return {\n abi: 'wasi',\n glue: '',\n module,\n ...(memory ? { memory } : {}),\n foreign,\n ...(names ? { names } : {}),\n ...(imports !== undefined ? { imports } : {}),\n ...(target.preopenRoot ? { preopenRoot: true } : {}),\n };\n }\n\n private async launch(\n planned: Planned,\n req: Omit<StartRequest, 'program' | 'argv0' | 'args'>\n ): Promise<WasmProcessHandle> {\n const { target, args } = planned;\n const seen = { ...req.env, HOSTNAME: this.hostname, cwd: req.cwd };\n const env = { ...expandDefaults(target.env, seen), ...req.env };\n for (const key of target.unset ?? []) delete env[key];\n env.HOSTNAME = this.hostname;\n let program: Program;\n try {\n program = await this.program(target, env);\n } catch (err) {\n await req.fds.closeAll();\n throw err;\n }\n return this.start({ ...req, program, argv0: target.argv0, args, env });\n }\n\n groupSession(pgid: number): number | undefined {\n return this.jobs.sessionOf(pgid);\n }\n\n private start(req: StartRequest): WasmProcessHandle {\n if (req.pgid !== undefined && this.jobs.sessionOf(req.pgid) === undefined) {\n throw fsError('ESRCH', `no process group ${req.pgid}`);\n }\n const pid = this.nextPid++;\n const terminal = req.fds.stdioTerminal();\n const decided = req.decided ?? Promise.resolve(true);\n const count = (byParent: boolean) => {\n this.identities.asked++;\n if (!byParent) this.identities.timedOut++;\n };\n let asked: Promise<void> | undefined;\n const handle = spawnWasmProcess({\n pid,\n identity: async () => {\n await (asked ??= decided.then(count));\n return this.identityOf(pid);\n },\n onSyscall: (call) => {\n this.decide(pid);\n this.settling.syscall(pid, call.op);\n },\n ...(req.ignored ? { ignored: req.ignored } : {}),\n ...(req.umask !== undefined ? { umask: req.umask } : {}),\n program: req.program,\n argv0: req.argv0,\n args: req.args,\n env: req.env,\n cwd: req.cwd,\n fds: req.fds,\n fs: this.fs,\n createWorker: this.createWorker,\n onError: req.report,\n spawner: this.spawner(pid, req.report),\n forker: this.forker(pid, req),\n kill: (target, sig) => this.kill(target, sig),\n writesBack: (target) => this.processes.get(target)?.writesBack() === true,\n processes: () => ({ boot: this.boot, processes: this.list() }),\n openFiles: this.openFiles,\n nodes: this.nodes,\n held: this.held,\n unlinkGate: this.unlinked.gate,\n statfs: (path) => this.mounts.statfs(path),\n mounts: () => this.mounts.list(),\n mount: (call, signal) => this.processMount(pid, call, signal),\n umount: (target, flags) => this.processUmount(pid, target, flags),\n jobs: this.jobs,\n ptys: this.ptys,\n net: this.net,\n http: new HttpHandles(this.transport),\n locks: this.locks,\n resolver: this.resolver,\n onReap: (child) => this.reaped(child),\n ...(req.fork ? { fork: req.fork } : {}),\n ...this.shownIds(req),\n });\n this.processes.set(pid, handle);\n if (req.ppid !== undefined) this.settling.started(pid, req.ppid);\n this.jobs.add(pid, req.ppid, (sig) => handle.signal(sig), terminal);\n if (req.exec && req.ppid !== undefined) this.jobs.exec(req.ppid, pid, true);\n if (req.pgid !== undefined) this.jobs.join(pid, req.pgid);\n this.described.set(pid, {\n argv: [req.argv0, ...req.args],\n tty: terminal?.name ?? null,\n started: Date.now(),\n });\n void handle.exited.then(() => {\n this.processes.delete(pid);\n this.settling.settled(pid);\n if (req.ppid === undefined || this.orphans.delete(pid)) this.forget(pid);\n else this.zombies.add(pid);\n });\n return handle;\n }\n\n private shownIds(req: StartRequest): { ppid?: number; shownPid?: number } {\n if (req.ppid === undefined) return {};\n if (!req.exec) return { ppid: this.jobs.shown(req.ppid) };\n const ppid = this.jobs.shownParent(req.ppid);\n return { shownPid: this.jobs.shown(req.ppid), ...(ppid !== undefined ? { ppid } : {}) };\n }\n\n private forget(pid: number): void {\n this.jobs.remove(pid);\n this.described.delete(pid);\n }\n\n private reaped(pid: number): void {\n if (this.zombies.delete(pid)) this.forget(pid);\n else this.orphans.add(pid);\n }\n\n list(): ProcessInfo[] {\n const members = new Map(this.jobs.list().map((member) => [member.pid, member]));\n const rootOf = (member: JobMember): JobMember => {\n let root = member;\n for (let up = members.get(root.execParent ?? -1); up; up = members.get(up.execParent ?? -1)) {\n root = up;\n }\n return root;\n };\n const shown = (pid: number | undefined): number => {\n const member = pid === undefined ? undefined : members.get(pid);\n const root = member && rootOf(member).pid;\n return root !== undefined && this.running(root) ? root : INIT_PID;\n };\n const listed: ProcessInfo[] = [];\n for (const member of members.values()) {\n const described = this.described.get(member.pid);\n if (member.execed || !described) continue;\n const root = rootOf(member);\n listed.push({\n pid: root.pid,\n tid: member.pid,\n ppid: shown(root.ppid),\n pgid: member.pgid,\n sid: member.sid,\n ...described,\n started: (this.described.get(root.pid) ?? described).started,\n state: this.processes.has(member.pid) ? 'S' : 'Z',\n memory: this.processes.get(member.pid)?.memory() ?? 0,\n umask: this.umaskOf(member.pid),\n });\n }\n return listed;\n }\n\n private spawner(ppid: number, report: (message: string) => void): ChildSpawner {\n return async (req, fds) => {\n const planned = await this.plan(req.file, req.argv, req.cwd);\n if (!planned) {\n await fds.closeAll();\n throw new SpawnError(await this.unrunnable(req.file, req.cwd));\n }\n const exec = req.exec ? { exec: true } : {};\n const deciding = req.exec ? undefined : this.undecided(ppid);\n const handle = await this.launch(planned, {\n ...(deciding ? { decided: deciding.promise } : {}),\n env: req.env,\n cwd: req.cwd,\n fds,\n report,\n ppid,\n ignored: this.ignoredBy(ppid),\n umask: this.umaskOf(ppid),\n ...exec,\n });\n deciding?.attach();\n return childHandle(handle);\n };\n }\n\n private undecided(ppid: number) {\n const decided = Promise.withResolvers<boolean>();\n return {\n promise: decided.promise,\n attach: () => {\n const timer = setTimeout(() => decided.resolve(false), DECIDE_MS);\n void decided.promise.then(() => clearTimeout(timer));\n const waiting = this.deciding.get(ppid) ?? new Set();\n waiting.add(decided.resolve);\n this.deciding.set(ppid, waiting);\n },\n };\n }\n\n private identityOf(pid: number): { pid: number; ppid: number } {\n const parent = this.jobs.shownParent(pid);\n const alive = parent !== undefined && this.running(parent);\n return { pid: this.jobs.shown(pid), ppid: alive ? parent : INIT_PID };\n }\n\n private running(shown: number): boolean {\n return this.jobs\n .list()\n .some((member) => !this.zombies.has(member.pid) && this.jobs.shown(member.pid) === shown);\n }\n\n private decide(ppid: number): void {\n const waiting = this.deciding.get(ppid);\n if (!waiting) return;\n this.deciding.delete(ppid);\n setTimeout(() => {\n for (const resolve of waiting) resolve(true);\n }, 0);\n }\n\n private forker(ppid: number, parent: StartRequest): ChildForker {\n const { exec: _exec, ...image } = parent;\n return async (state, fds) =>\n childHandle(\n this.start({\n ...image,\n cwd: state.cwd ?? parent.cwd,\n fds,\n ppid,\n fork: state,\n ignored: this.ignoredBy(ppid, true),\n umask: this.umaskOf(ppid),\n })\n );\n }\n\n private keySignal(tty: KernelTty, fallback: number, sig: number, send: () => void): void {\n const pgid = this.jobs.tcgetpgrp(tty, fallback);\n const foreground = () => this.jobs.tcgetpgrp(tty, fallback);\n this.settling.deliver(sig, pgid, send, tty.reading ? undefined : foreground);\n }\n\n private umaskOf(pid: number): number {\n return this.processes.get(pid)?.umask?.() ?? DEFAULT_UMASK;\n }\n\n private released(path: string): void {\n const at = normalizePath(path);\n this.unlinked.closed(at);\n const open = [...this.openFiles].some((nodes) => nodes.writes(at)) || heldUnder(this.held, at);\n if (!open) void this.mounts.commit(at).catch(() => undefined);\n }\n\n private ignoredBy(pid: number, fork = false): number {\n return this.processes.get(pid)?.ignoredSignals(fork) ?? 0;\n }\n\n kill(pid: number, sig: number): boolean {\n if (pid < 0) return this.jobs.killGroup(-pid, sig);\n const handle = this.processes.get(pid);\n if (!handle) return false;\n if (sig !== 0) handle.signal(sig);\n return true;\n }\n\n private async driver(type: string, spec: MountSpec): Promise<OpenedDriver> {\n if (type === 'fsa') return this.fsaDriver(spec);\n if (type === 'hostfs') {\n const { hostfs, hostfsFetch, hostfsTiming } = this.hostfs;\n if (!hostfs)\n throw fsError('ENODEV', 'this kernel has no hostfs hook (createKernel({ hostfs }))');\n return openHostfs(\n spec,\n hostfs,\n hostfsFetch ?? ((url, init) => fetch(url, init)),\n hostfsTiming\n );\n }\n if (type === 'tmpfs') {\n const { port1, port2 } = new MessageChannel();\n serveFilesystem(\n port2,\n tmpfs(),\n { symlinks: true, chmod: true, linkTimes: true, ranges: true, attrTtl: 0 },\n { owned: true }\n );\n return {\n port: port1,\n dispose: () => {\n port1.close();\n port2.close();\n },\n };\n }\n const module = (await scanFilesystems(this.base, await this.roots())).get(type);\n if (!module) throw fsError('ENODEV', `unknown file system type ${type}`);\n if (!this.createDriverWorker)\n throw fsError('ENODEV', `this kernel cannot start ${type} drivers`);\n const code = await this.base.readFile(module);\n const worker = this.createDriverWorker();\n const driver = new MessageChannel();\n const client = new MessageChannel();\n const served = serveClient(client.port1, {\n launcher: async () => this,\n scope: 'transport',\n });\n worker.postMessage({ code, driver: driver.port2, client: client.port2 }, [\n driver.port2,\n client.port2,\n ]);\n return {\n port: driver.port1,\n dispose: () => {\n worker.terminate();\n served.detach();\n driver.port1.close();\n },\n onCrash: (listener) =>\n worker.addEventListener('error', (event) => {\n (event as { preventDefault?: () => void }).preventDefault?.();\n listener(new Error(String((event as { message?: unknown }).message)));\n }),\n };\n }\n\n private async fsaDriver(spec: MountSpec): Promise<OpenedDriver> {\n const { target, source } = spec;\n const ask = (handle?: MediumHandle) =>\n this.onMountPending?.({ target, source, ...(handle ? { handle } : {}) });\n const { port1, port2 } = new MessageChannel();\n const medium = removableMedium((handle) => {\n served.invalidate(true);\n ask(handle);\n });\n const served = serveFilesystem(port2, medium.handlers, FSA_CAPABILITIES);\n const id = source.slice('fsa:'.length);\n this.removable.set(target, { id, medium, served });\n const stored = this.inserted.get(id) ?? (await this.media.get(id));\n if (stored && (await granted(stored))) medium.insert(stored);\n else ask(stored);\n return {\n port: port1,\n present: () => medium.present(),\n dispose: () => {\n this.removable.delete(target);\n port1.close();\n port2.close();\n },\n };\n }\n\n async mount(spec: MountSpec): Promise<MountEntry> {\n const fsa = spec.type === 'fsa' && !spec.source.startsWith('fsa:');\n const entry = await this.mounts.mount(\n fsa ? { ...spec, source: `fsa:${crypto.randomUUID()}` } : spec,\n this.fs\n );\n void this.unlinked.sweep(entry.target);\n return entry;\n }\n\n private mountRoot(path: string): string {\n let root = '/';\n for (const { target } of this.mounts.list()) {\n if (target.length > root.length && (path === target || path.startsWith(`${target}/`))) {\n root = target;\n }\n }\n return root;\n }\n\n async insert(target: string, handle: MediumHandle, source?: string): Promise<void> {\n const at = normalizePath(target);\n const slot = this.removable.get(at);\n if (!slot) throw fsError('EINVAL', `${at} is not a removable mount`);\n if (source !== undefined && source !== `fsa:${slot.id}`) {\n throw fsError('EINVAL', `${at} is no longer the drive ${source}`);\n }\n if (!(await granted(handle))) throw fsError('EACCES', `${at}: no permission for this folder`);\n this.inserted.set(slot.id, handle);\n await this.media.put(slot.id, handle);\n slot.medium.insert(handle);\n slot.served.invalidate(true);\n void this.unlinked.sweep(at);\n }\n\n umount(target: string, detach = false): void {\n const at = normalizePath(target);\n this.mounts.umount(at, detach);\n if (!detach) return;\n for (const nodes of this.openFiles) nodes.revoke(at);\n for (const holds of this.held) holds.revoke(at);\n }\n\n unmountAll(): void {\n this.booting.abort();\n const targets = this.mounts.list().map((m) => m.target);\n for (const target of targets.sort((a, b) => b.length - a.length)) this.umount(target, true);\n }\n\n private async permit(req: ProcessMountRequest): Promise<void> {\n const policy = this.processMounts;\n const allowed = typeof policy === 'function' ? await policy(req) : policy;\n if (!allowed) throw fsError('EPERM', `process ${req.pid} may not ${req.op} ${req.target}`);\n }\n\n private async processMount(pid: number, call: MountCall, signal: AbortSignal): Promise<void> {\n const spec = mountCall(call);\n await this.permit({ op: 'mount', pid, ...spec, options: { ...spec.options } });\n const entry = await this.mount(spec);\n if (signal.aborted) this.umount(entry.target, true);\n }\n\n private async processUmount(pid: number, target: string, flags: number): Promise<void> {\n const call = umountCall(target, flags);\n for (;;) {\n const mounted = this.mounts.mounted(call.target);\n await this.permit({\n op: 'umount',\n pid,\n target: call.target,\n ...(mounted ? { type: mounted.type, source: mounted.source } : {}),\n });\n if (this.mounts.mounted(call.target) === mounted) break;\n }\n this.umount(call.target, call.detach);\n }\n\n async prepare(): Promise<void> {\n for (const dir of SHARED_DIRS) await this.base.mkdir(dir, { recursive: true });\n await writeCaFile(this.base, this.ca).catch(() => undefined);\n this.fstab = this.mountFstab();\n }\n\n private async mountFstab(): Promise<FstabResult[]> {\n const text = await this.base.readFile(FSTAB_PATH).catch(() => '');\n const lines = parseFstab(text);\n for (const { spec } of lines) this.mounts.note(spec, 'pending');\n return mountFstab(\n lines,\n (spec) =>\n this.mount(spec).catch((err: unknown) => {\n this.mounts.note(spec, 'pending', (err as Error)?.message ?? String(err));\n throw err;\n }),\n this.booting.signal,\n this.fstabRetries,\n (entry) => this.umount(entry.target, true),\n ({ spec }, result) => {\n if (!result.code || result.code === 'ECANCELED' || this.booting.signal.aborted) {\n this.mounts.unnote(spec.target);\n } else this.mounts.note(spec, 'failed', result.error);\n }\n );\n }\n\n private environment(cwd: string, extra: Record<string, string> | undefined) {\n return {\n PATH: `/usr/bin:/bin:${this.pnpmHome}/bin`,\n HOME: '/home',\n PNPM_HOME: this.pnpmHome,\n ...this.env,\n PWD: cwd,\n ...extra,\n };\n }\n\n private async starting(argv: string[], dir: string | undefined) {\n this.catalog = undefined;\n this.binfmts = undefined;\n const cwd = this.fs.resolvePath('/', dir ?? '/');\n const [file = ''] = argv;\n await this.base.mkdir(cwd, { recursive: true });\n return { cwd, file, planned: await this.plan(file, argv, cwd) };\n }\n\n async openTerminal(argv: string[], options: TerminalOptions): Promise<TerminalSession> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n if (!planned) throw new Error(`${file}: command not found`);\n let leader = 0;\n const tty: KernelTty = new KernelTty(\n { write: (bytes) => options.onData(bytes.slice()) },\n (sig) => this.keySignal(tty, leader, sig, () => this.jobs.signalForeground(tty, leader, sig))\n );\n tty.onRead = () => this.settling.reading(this.jobs.tcgetpgrp(tty, leader));\n tty.name = `/dev/tty${++this.terminals}`;\n tty.setSize(options.cols ?? 80, options.rows ?? 24);\n const fds = new FdTable();\n const stdio = tty.file();\n fds.installAt(0, stdio);\n fds.installAt(1, stdio.retain());\n fds.installAt(2, stdio.retain());\n const env = this.environment(cwd, {\n TERM: 'xterm-256color',\n COLORTERM: 'truecolor',\n ...options.env,\n });\n const report = (message: string) => options.onData(encoder.encode(`${message}\\r\\n`));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n leader = handle.pid;\n void handle.exited.then(() => tty.hangup());\n return {\n pid: handle.pid,\n exited: handle.exited,\n write: (bytes) => tty.receive(bytes),\n resize: (cols, rows) => tty.resize(cols, rows),\n signal: (sig) => this.jobs.signalForeground(tty, leader, sig),\n close: () => {\n tty.signalHangup();\n tty.hangup();\n },\n };\n }\n\n async run(argv: string[], options: RunOptions = {}): Promise<RunResult> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n const env = this.environment(cwd, options.env);\n const out: Uint8Array[] = [];\n const err: Uint8Array[] = [];\n const keep = options.collect !== false;\n const collect =\n (chunks: Uint8Array[], tee?: (bytes: Uint8Array) => void) => (bytes: Uint8Array) => {\n if (keep) chunks.push(bytes);\n tee?.(bytes);\n };\n const stdout = collect(out, options.onStdout);\n const stderr = collect(err, options.onStderr);\n const report = (message: string) => stderr(encoder.encode(`${message}\\n`));\n if (!planned) {\n report(`${file}: command not found`);\n return { status: NOT_FOUND, stdout: concat(out), stderr: concat(err) };\n }\n const fds = new FdTable();\n fds.installAt(0, options.stdin ? bytesSource(options.stdin) : deviceFile('null'));\n fds.installAt(1, sinkFile(stdout));\n fds.installAt(2, sinkFile(stderr));\n const group = options.pgid !== undefined ? { pgid: options.pgid } : {};\n const handle = await this.launch(planned, { env, cwd, fds, report, ...group });\n options.onStarted?.(handle.pid);\n const status = await handle.exited;\n return { status, stdout: concat(out), stderr: concat(err) };\n }\n}\n\nexport type { ProcessInfo, ProcessListing } from './kernel/proc-info.ts';\n", "type Handle = MemoryFile | MemoryDirectory;\n\nconst fail = (name: string): never => {\n throw new DOMException(name, name);\n};\n\nfunction valid(name: string): void {\n if (name === '' || name === '.' || name === '..' || name.includes('/')) {\n throw new TypeError(`invalid name: ${name}`);\n }\n}\n\nconst CHUNK = 1024 * 1024;\n\nfunction bytesOf(data: unknown): Promise<Uint8Array> | Uint8Array {\n if (typeof data === 'string') return new TextEncoder().encode(data);\n if (data instanceof Blob) return data.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n return new Uint8Array(data as ArrayBuffer);\n}\n\ninterface WriteParams {\n type: 'write' | 'seek' | 'truncate';\n data?: unknown;\n position?: number;\n size?: number;\n}\n\nconst isParams = (data: unknown): data is WriteParams =>\n ['write', 'seek', 'truncate'].includes((data as { type?: unknown } | null)?.type as string) &&\n !(data instanceof Blob);\n\nclass Chunks {\n blobs: Blob[];\n size: number;\n\n constructor(blobs: Blob[] = [], size = 0) {\n this.blobs = blobs;\n this.size = size;\n }\n\n private pad(index: number, length: number): void {\n const blob = this.blobs[index] ?? new Blob([]);\n if (blob.size < length)\n this.blobs[index] = new Blob([blob, new Uint8Array(length - blob.size)]);\n }\n\n private grow(end: number): void {\n if (end <= this.size) return;\n const last = Math.floor((end - 1) / CHUNK);\n for (let i = 0; i < last; i++) this.pad(i, CHUNK);\n this.pad(last, end - last * CHUNK);\n this.size = end;\n }\n\n async write(at: number, bytes: Uint8Array): Promise<void> {\n if (bytes.length === 0) return;\n const first = Math.floor(at / CHUNK);\n for (let i = 0; i < first; i++) this.pad(i, CHUNK);\n for (let done = 0; done < bytes.length; ) {\n const index = Math.floor((at + done) / CHUNK);\n const from = at + done - index * CHUNK;\n const n = Math.min(CHUNK - from, bytes.length - done);\n const view = bytes.subarray(done, done + n);\n const part = (\n view.buffer instanceof ArrayBuffer ? view : view.slice()\n ) as Uint8Array<ArrayBuffer>;\n const old = this.blobs[index];\n if (from === 0 && n >= (old?.size ?? 0)) this.blobs[index] = new Blob([part]);\n else {\n const merged = new Uint8Array(Math.max(old?.size ?? 0, from + n));\n if (old) merged.set(new Uint8Array(await old.arrayBuffer()));\n merged.set(part, from);\n this.blobs[index] = new Blob([merged]);\n }\n done += n;\n }\n this.size = Math.max(this.size, at + bytes.length);\n }\n\n truncate(size: number): void {\n if (size >= this.size) {\n this.grow(size);\n return;\n }\n const keep = Math.ceil(size / CHUNK);\n this.blobs.length = keep;\n if (keep > 0)\n this.blobs[keep - 1] = (this.blobs[keep - 1] as Blob).slice(0, size - (keep - 1) * CHUNK);\n this.size = size;\n }\n}\n\nclass MemoryFile {\n readonly kind = 'file';\n name: string;\n parent: MemoryDirectory;\n data = new Chunks();\n lastModified = Date.now();\n\n constructor(name: string, parent: MemoryDirectory) {\n this.name = name;\n this.parent = parent;\n }\n\n async getFile(): Promise<File> {\n return new File(this.data.blobs, this.name, { lastModified: this.lastModified });\n }\n\n async createWritable({ keepExistingData = false } = {}) {\n const next = keepExistingData ? new Chunks([...this.data.blobs], this.data.size) : new Chunks();\n let position = 0;\n const put = async (data: unknown) => {\n const bytes = await bytesOf(data);\n await next.write(position, bytes);\n position += bytes.length;\n };\n return {\n write: async (data: unknown) => {\n if (!isParams(data)) return put(data);\n if (data.type === 'truncate') return next.truncate(data.size ?? 0);\n position = data.position ?? position;\n if (data.type === 'write') await put(data.data);\n },\n seek: async (at: number) => {\n position = at;\n },\n truncate: async (size: number) => next.truncate(size),\n close: async () => {\n this.data = next;\n this.lastModified = Date.now();\n },\n abort: async () => {},\n };\n }\n\n async move(parent: MemoryDirectory, name: string): Promise<void> {\n valid(name);\n if (parent.children.get(name)?.kind === 'directory') fail('InvalidModificationError');\n this.parent.children.delete(this.name);\n this.name = name;\n this.parent = parent;\n parent.children.set(name, this);\n }\n}\n\nclass MemoryDirectory {\n readonly kind = 'directory';\n name: string;\n parent: MemoryDirectory | null;\n readonly children = new Map<string, Handle>();\n removed = false;\n\n constructor(name: string, parent: MemoryDirectory | null) {\n this.name = name;\n this.parent = parent;\n }\n\n private present(): void {\n if (this.removed) fail('NotFoundError');\n }\n\n async getDirectoryHandle(name: string, { create = false } = {}): Promise<MemoryDirectory> {\n this.present();\n valid(name);\n const found = this.children.get(name);\n if (found?.kind === 'file') fail('TypeMismatchError');\n if (found) return found as MemoryDirectory;\n if (!create) fail('NotFoundError');\n const dir = new MemoryDirectory(name, this);\n this.children.set(name, dir);\n return dir;\n }\n\n async getFileHandle(name: string, { create = false } = {}): Promise<MemoryFile> {\n this.present();\n valid(name);\n const found = this.children.get(name);\n if (found?.kind === 'directory') fail('TypeMismatchError');\n if (found) return found as MemoryFile;\n if (!create) fail('NotFoundError');\n const file = new MemoryFile(name, this);\n this.children.set(name, file);\n return file;\n }\n\n async removeEntry(name: string, { recursive = false } = {}): Promise<void> {\n this.present();\n valid(name);\n const found = this.children.get(name);\n if (!found) return fail('NotFoundError');\n if (found.kind === 'directory' && found.children.size > 0 && !recursive) {\n fail('InvalidModificationError');\n }\n this.children.delete(name);\n if (found.kind === 'directory') found.remove();\n }\n\n async resolve(handle: Handle): Promise<string[] | null> {\n const names: string[] = [];\n for (let at: Handle | null = handle; at !== this; at = at.parent) {\n if (!at || (at.kind === 'directory' && at.removed)) return null;\n names.unshift(at.name);\n }\n return names;\n }\n\n remove(): void {\n this.removed = true;\n for (const child of this.children.values()) if (child.kind === 'directory') child.remove();\n }\n\n async *keys(): AsyncGenerator<string> {\n this.present();\n for (const name of [...this.children.keys()]) yield name;\n }\n\n async *values(): AsyncGenerator<Handle> {\n for (const handle of [...this.children.values()]) yield handle;\n }\n\n async *entries(): AsyncGenerator<[string, Handle]> {\n for (const entry of [...this.children]) yield entry;\n }\n\n async move(parent: MemoryDirectory, name: string): Promise<void> {\n valid(name);\n if (parent.children.has(name)) fail('InvalidModificationError');\n this.parent?.children.delete(this.name);\n this.name = name;\n this.parent = parent;\n parent.children.set(name, this);\n }\n}\n\nexport function memoryRoot(): FileSystemDirectoryHandle {\n return new MemoryDirectory('', null) as unknown as FileSystemDirectoryHandle;\n}\n\nexport function isMemoryRoot(handle: FileSystemDirectoryHandle): boolean {\n return (handle as unknown) instanceof MemoryDirectory;\n}\n", "import type {\n HeaderList,\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n RealmTransportTraits,\n RealmWebSocket,\n RealmWebSocketMessage,\n RealmWebSocketRequest,\n} from './transport.ts';\nimport { MessageQueue, payloadSize } from './ws-queue.ts';\n\nexport type TransportCall =\n | {\n net: 'fetch';\n nid: number;\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { net: 'read'; nid: number }\n | { net: 'cancel'; nid: number }\n | { net: 'ws-open'; nid: number; url: string; protocols: string[]; headers: HeaderList }\n | { net: 'ws-send'; nid: number; data: RealmWebSocketMessage }\n | { net: 'ws-close'; nid: number; code?: number; reason?: string }\n | { net: 'ws-consumed'; nid: number; n: number };\n\nexport type TransportReply =\n | { net: 'head'; nid: number; status: number; statusText: string; headers: HeaderList }\n | { net: 'chunk'; nid: number; bytes: Uint8Array }\n | { net: 'end'; nid: number }\n | { net: 'error'; nid: number; message: string; status?: number; code?: string }\n | { net: 'ws-opened'; nid: number; protocol: string }\n | { net: 'ws-message'; nid: number; data: RealmWebSocketMessage }\n | { net: 'ws-acked'; nid: number; n: number }\n | { net: 'ws-closed'; nid: number; code: number; reason: string };\n\nexport interface TransportPort {\n postMessage(message: TransportCall): void;\n}\n\nexport class TransportError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, status?: number, code?: string) {\n super(message);\n this.status = status;\n this.code = code;\n }\n}\n\ninterface Waiter {\n resolve(reply: TransportReply): void;\n reject(error: Error): void;\n}\n\nexport class RemoteTransport implements RealmTransport {\n readonly traits: RealmTransportTraits;\n\n private readonly port: TransportPort;\n\n private readonly waiting = new Map<number, Waiter>();\n\n private nextId = 0;\n\n private readonly sockets = new Map<number, { queue: MessageQueue; acked(n: number): void }>();\n\n private failure: Error | undefined;\n\n constructor(port: TransportPort, traits: RealmTransportTraits) {\n this.port = port;\n this.traits = traits;\n }\n\n receive(reply: TransportReply): void {\n const socket = this.sockets.get(reply.nid);\n if (socket && this.toSocket(reply, socket)) return;\n const waiter = this.waiting.get(reply.nid);\n if (!waiter) return;\n this.waiting.delete(reply.nid);\n if (reply.net === 'error') {\n waiter.reject(new TransportError(reply.message, reply.status, reply.code));\n } else waiter.resolve(reply);\n }\n\n private toSocket(\n reply: TransportReply,\n socket: { queue: MessageQueue; acked(n: number): void }\n ): boolean {\n if (reply.net === 'ws-message') socket.queue.push(reply.data);\n else if (reply.net === 'ws-acked') socket.acked(reply.n);\n else if (reply.net === 'ws-closed') {\n this.sockets.delete(reply.nid);\n socket.queue.end({ code: reply.code, reason: reply.reason });\n } else return false;\n return true;\n }\n\n fail(error: Error): void {\n this.failure = error;\n for (const waiter of this.waiting.values()) waiter.reject(error);\n this.waiting.clear();\n for (const socket of this.sockets.values())\n socket.queue.end({ code: 1011, reason: error.message });\n this.sockets.clear();\n }\n\n private ask(call: TransportCall): Promise<TransportReply> {\n if (this.failure) return Promise.reject(this.failure);\n return new Promise((resolve, reject) => {\n this.waiting.set(call.nid, { resolve, reject });\n this.port.postMessage(call);\n });\n }\n\n private cancel(nid: number): void {\n const waiter = this.waiting.get(nid);\n this.waiting.delete(nid);\n waiter?.reject(new TransportError('the request was cancelled'));\n this.port.postMessage({ net: 'cancel', nid });\n }\n\n async fetch(request: RealmTransportRequest): Promise<RealmTransportResponse> {\n const nid = ++this.nextId;\n const { signal } = request;\n signal.throwIfAborted();\n let finished = false;\n const abort = () => {\n finished = true;\n this.cancel(nid);\n };\n signal.addEventListener('abort', abort, { once: true });\n const finish = () => {\n if (finished) return;\n finished = true;\n signal.removeEventListener('abort', abort);\n };\n let head: TransportReply;\n try {\n head = await this.ask({\n net: 'fetch',\n nid,\n url: request.url,\n method: request.method,\n headers: request.headers,\n ...(request.body ? { body: request.body } : {}),\n });\n } catch (e) {\n finish();\n throw e;\n }\n const { status, statusText, headers } = head as Extract<TransportReply, { net: 'head' }>;\n const read = async (): Promise<Uint8Array | undefined> => {\n if (finished) return undefined;\n const reply = await this.ask({ net: 'read', nid }).catch((e: unknown) => {\n finish();\n throw e;\n });\n if (reply.net === 'chunk') return reply.bytes;\n finish();\n return undefined;\n };\n const cancel = async () => {\n if (finished) return;\n finish();\n this.cancel(nid);\n };\n return {\n status,\n statusText,\n headers,\n cancel,\n body: {\n [Symbol.asyncIterator]: () => ({\n next: async () => {\n const bytes = await read();\n return bytes ? { value: bytes, done: false } : { value: undefined, done: true };\n },\n return: async () => {\n await cancel();\n return { value: undefined, done: true };\n },\n }),\n },\n };\n }\n\n async websocket(request: RealmWebSocketRequest): Promise<RealmWebSocket> {\n const nid = ++this.nextId;\n const { signal } = request;\n signal.throwIfAborted();\n const abort = () => this.cancel(nid);\n signal.addEventListener('abort', abort, { once: true });\n let opened: TransportReply;\n try {\n opened = await this.ask({\n net: 'ws-open',\n nid,\n url: request.url,\n protocols: request.protocols,\n headers: request.headers,\n });\n } finally {\n signal.removeEventListener('abort', abort);\n }\n const close = (code?: number, reason?: string) =>\n this.port.postMessage({ net: 'ws-close', nid, code, reason });\n const queue = new MessageQueue(\n () => close(1000, 'a message is too big'),\n Number.POSITIVE_INFINITY,\n (n) => this.port.postMessage({ net: 'ws-consumed', nid, n })\n );\n let unacked = 0;\n this.sockets.set(nid, { queue, acked: (n) => void (unacked -= n) });\n return {\n protocol: (opened as Extract<TransportReply, { net: 'ws-opened' }>).protocol,\n get buffered() {\n return unacked;\n },\n send: (data) => {\n unacked += payloadSize(data);\n this.port.postMessage({ net: 'ws-send', nid, data });\n },\n messages: queue,\n close,\n closed: queue.closed,\n };\n }\n}\n", "import { portCdpHook } from './cdp/port.ts';\nimport type { CdpHook } from './cdp/types.ts';\nimport { type LockManagerLike, locksOf } from './client/protocol.ts';\nimport { type ServedClient, serveClient } from './client/serve-client.ts';\nimport { META_DB, type MetaStore } from './fs/meta.ts';\nimport { OpfsFs } from './fs/opfs.ts';\nimport { dialSocket, serveSocket } from './kernel/dial.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { CA_DB, caStore } from './kernel/net/network.ts';\nimport { RemoteTransport, type TransportReply } from './kernel/net/remote-transport.ts';\nimport type { RouteTable } from './kernel/net/routes.ts';\nimport type { RealmTransportTraits } from './kernel/net/transport.ts';\nimport { RemoteUplink, type UplinkReply, type UplinkTraits } from './kernel/net/uplink.ts';\nimport { SIG } from './kernel/signals.ts';\nimport {\n Launcher,\n type RunOptions,\n type TerminalOptions,\n type TerminalSession,\n} from './launcher.ts';\nimport type { MediumHandle } from './mount/fsa.ts';\nimport type { HostfsGrant, HostfsGrantHook } from './mount/hostfs.ts';\nimport type { MediaStore } from './mount/media.ts';\nimport type { MountSpec } from './mount/mount-fs.ts';\nimport type { ProcessMountRequest } from './mount/syscall.ts';\n\nexport interface KernelPort {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface InitRequest {\n id: number;\n op: 'init';\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n metadata?: string | false;\n media?: string | false;\n ca?: string | false;\n transport?: RealmTransportTraits;\n uplink?: { traits: UplinkTraits; routes?: RouteTable };\n hostfs?: boolean;\n hostname?: string;\n processMounts?: boolean | 'ask';\n cdp?: boolean;\n}\n\nexport interface RunRequest {\n id: number;\n op: 'run';\n argv: string[];\n options: Omit<RunOptions, 'onStdout' | 'onStderr'>;\n}\n\nexport interface OpenTerminalRequest {\n id: number;\n op: 'open-terminal';\n argv: string[];\n options: Omit<TerminalOptions, 'onData'>;\n}\n\nexport type TerminalAction =\n | { action: 'write'; bytes: Uint8Array }\n | { action: 'resize'; cols: number; rows: number }\n | { action: 'signal'; signal: string }\n | { action: 'close' };\n\nexport type TerminalRequest = { id: number; op: 'terminal'; terminal: number } & TerminalAction;\n\nexport interface ConnectRequest {\n id: number;\n op: 'connect';\n}\n\nexport interface RoutesRequest {\n id: number;\n op: 'routes';\n routes: RouteTable;\n}\n\nexport type MountRequest =\n | { id: number; op: 'mount'; spec: MountSpec }\n | { id: number; op: 'umount'; target: string }\n | { id: number; op: 'mounts' }\n | { id: number; op: 'insert'; target: string; source?: string; handle: MediumHandle };\n\nexport interface DialRequest {\n id: number;\n op: 'dial';\n port: number;\n host?: string;\n}\n\nexport type KernelRequest =\n | InitRequest\n | RunRequest\n | OpenTerminalRequest\n | TerminalRequest\n | ConnectRequest\n | MountRequest\n | DialRequest\n | RoutesRequest;\n\ntype WithoutId<T> = T extends unknown ? Omit<T, 'id'> : never;\n\nexport type KernelCall = WithoutId<KernelRequest>;\n\nexport async function inOpfs(deps: ServeDeps, root: FileSystemDirectoryHandle): Promise<boolean> {\n if (deps.syncAccess !== true) return false;\n const opfs = await deps.storage().catch(() => undefined);\n return (await opfs?.resolve(root).catch(() => null)) != null;\n}\n\nexport interface ServeDeps {\n storage: () => Promise<FileSystemDirectoryHandle>;\n syncAccess?: boolean;\n createWorker: () => WasmWorkerLike;\n createDriverWorker?: () => WasmWorkerLike;\n metadata?: (name: string) => Promise<MetaStore>;\n media?: (name: string) => Promise<MediaStore>;\n locks?: LockManagerLike | null;\n}\n\nexport function signalNumber(name: string): number {\n const key = name.slice(3);\n if (!name.startsWith('SIG') || !Object.hasOwn(SIG, key))\n throw new Error(`unknown signal ${name}`);\n return (SIG as Record<string, number>)[key];\n}\n\nfunction act(session: TerminalSession, req: TerminalAction): void {\n if (req.action === 'write') session.write(req.bytes);\n else if (req.action === 'resize') session.resize(req.cols, req.rows);\n else if (req.action === 'signal') session.signal(signalNumber(req.signal));\n else session.close();\n}\n\nfunction dirsChannel(name: string | false): string | undefined {\n return name === false ? undefined : `slicc-kernel-dirs:${name}`;\n}\n\nfunction caDb(req: InitRequest): string | false {\n const name = req.ca ?? (req.metadata ? `${req.metadata}-ca` : CA_DB);\n const taken = [req.metadata ?? META_DB, req.media ?? `${req.metadata ?? META_DB}:media`];\n if (name !== false && taken.includes(name)) {\n throw new Error(`the CA cannot share the IndexedDB database ${name}`);\n }\n return name;\n}\n\nasync function stores(\n deps: ServeDeps,\n name: string | false,\n media: string | false | undefined\n): Promise<{ meta?: MetaStore | undefined; media?: MediaStore | undefined }> {\n const handles = media ?? (name === false ? false : `${name}:media`);\n if (handles !== false && handles === name) {\n throw new Error(`media and metadata cannot share the IndexedDB database ${name}`);\n }\n return {\n ...(name === false ? {} : { meta: await deps.metadata?.(name) }),\n ...(handles === false ? {} : { media: await deps.media?.(handles) }),\n };\n}\n\nfunction cdpOption(req: InitRequest, port: KernelPort): { cdp?: CdpHook } {\n if (!req.cdp) return {};\n return {\n cdp: portCdpHook((request, cdp) =>\n port.postMessage({ cdpOpen: request, port: cdp }, [cdp as unknown as MessagePort])\n ),\n };\n}\n\nfunction remotes(\n port: KernelPort,\n req: InitRequest\n): { transport?: RemoteTransport; uplink?: RemoteUplink } {\n return {\n ...(req.transport ? { transport: new RemoteTransport(port, req.transport) } : {}),\n ...(req.uplink ? { uplink: new RemoteUplink(port, req.uplink.traits, req.uplink.routes) } : {}),\n };\n}\n\nfunction answered(\n data: { net?: unknown; uplink?: unknown },\n remote: RemoteTransport | undefined,\n uplink: RemoteUplink | undefined\n): boolean {\n if (data.net !== undefined) remote?.receive(data as TransportReply);\n else if (typeof data.uplink === 'string') uplink?.receive(data as UplinkReply);\n else return false;\n return true;\n}\n\nexport interface GrantReply {\n id: number;\n grant?: HostfsGrant;\n error?: string;\n}\n\nexport function serveKernel(port: KernelPort, deps: ServeDeps): void {\n let launcher: Promise<Launcher> | undefined;\n let remote: RemoteTransport | undefined;\n let uplink: RemoteUplink | undefined;\n const terminals = new Map<number, TerminalSession>();\n const reply = (id: number, body: object, transfer?: Transferable[]) =>\n port.postMessage({ id, ...body }, transfer);\n const clients = new Set<ServedClient>();\n\n const locks = deps.locks === null ? undefined : (deps.locks ?? locksOf());\n let holding: Promise<string> | undefined;\n\n function holdLock(locks: LockManagerLike): Promise<string> {\n holding ??= new Promise<string>((resolve) => {\n const name = `slicc-kernel:${crypto.randomUUID()}`;\n void locks.request(name, () => {\n resolve(name);\n return new Promise(() => {});\n });\n });\n return holding;\n }\n\n async function connect(): Promise<MessagePort> {\n await ready();\n const { port1, port2 } = new MessageChannel();\n const held = locks ? await holdLock(locks) : undefined;\n const served = serveClient(port1, {\n launcher: ready,\n signal: signalNumber,\n ...(locks ? { locks } : {}),\n ...(held ? { lock: held } : {}),\n });\n clients.add(served);\n void served.closed.then(() => clients.delete(served));\n return port2;\n }\n\n async function dial(req: DialRequest): Promise<MessagePort> {\n const socket = dialSocket((await ready()).net, req.port, req.host);\n const { port1, port2 } = new MessageChannel();\n serveSocket(socket, port1);\n return port2;\n }\n\n async function ready(): Promise<Launcher> {\n if (!launcher) throw new Error('the kernel is not initialized');\n return launcher;\n }\n\n async function terminal(req: OpenTerminalRequest): Promise<number> {\n const onData = (bytes: Uint8Array) => reply(req.id, { fd: 1, bytes });\n const session = await (await ready()).openTerminal(req.argv, { ...req.options, onData });\n terminals.set(req.id, session);\n reply(req.id, { started: session.pid });\n try {\n return await session.exited;\n } finally {\n terminals.delete(req.id);\n }\n }\n\n async function init(req: InitRequest): Promise<boolean> {\n launcher = (req.root ? Promise.resolve(req.root) : deps.storage()).then(async (root) => {\n const name = req.metadata ?? META_DB;\n const { meta, media } = await stores(deps, name, req.media);\n const net = remotes(port, req);\n ({ transport: remote, uplink } = net);\n const ranged = await inOpfs(deps, root);\n const fs = new OpfsFs(root, meta, dirsChannel(name), { ranged });\n await fs.reconcile();\n const started = new Launcher({\n fs,\n createWorker: deps.createWorker,\n ...(deps.createDriverWorker ? { createDriverWorker: deps.createDriverWorker } : {}),\n ...(req.modules ? { modules: req.modules } : {}),\n ...(req.env ? { env: req.env } : {}),\n ...(req.hostname !== undefined ? { hostname: req.hostname } : {}),\n ...net,\n ...(media ? { media } : {}),\n onMountPending: (medium) => port.postMessage({ medium }),\n ...(req.hostfs ? { hostfs: askGrant } : {}),\n ...cdpOption(req, port),\n ...mountPolicy(req.processMounts),\n caStore: caStore(deps.metadata ? caDb(req) : false),\n });\n await started.prepare();\n return started;\n });\n await launcher;\n return true;\n }\n\n async function mountOp(req: MountRequest): Promise<unknown> {\n const l = await ready();\n if (req.op === 'mount') return l.mount(req.spec);\n if (req.op === 'umount') return l.umount(req.target);\n if (req.op === 'insert') return l.insert(req.target, req.handle, req.source);\n return l.mounts.list();\n }\n\n async function handle(req: KernelRequest): Promise<unknown> {\n if (req.op === 'init') return init(req);\n if (req.op === 'open-terminal') return terminal(req);\n if (req.op === 'connect') return connect();\n if (req.op === 'routes') {\n (await ready()).setRoutes(req.routes);\n return true;\n }\n if (req.op === 'dial') return dial(req);\n if (req.op === 'mount' || req.op === 'umount' || req.op === 'mounts' || req.op === 'insert')\n return mountOp(req);\n if (req.op === 'terminal') {\n const session = terminals.get(req.terminal);\n if (!session) throw new Error(`no terminal ${req.terminal}`);\n act(session, req);\n return true;\n }\n return (await ready()).run(req.argv, {\n ...req.options,\n onStdout: (bytes) => reply(req.id, { fd: 1, bytes }),\n onStderr: (bytes) => reply(req.id, { fd: 2, bytes }),\n });\n }\n\n const grants = new Map<number, PromiseWithResolvers<HostfsGrant>>();\n let nextGrant = 0;\n const askGrant: HostfsGrantHook = (source, options) => {\n const id = ++nextGrant;\n const waiting = Promise.withResolvers<HostfsGrant>();\n grants.set(id, waiting);\n port.postMessage({ hostfs: { id, source, ...options } });\n return waiting.promise;\n };\n function granted({ id, grant, error }: GrantReply): void {\n const waiting = grants.get(id);\n if (!waiting) return;\n grants.delete(id);\n if (grant) waiting.resolve(grant);\n else waiting.reject(Object.assign(new Error(error ?? 'no grant'), { code: 'EACCES' }));\n }\n\n const policies = new Map<number, (allowed: boolean) => void>();\n let nextPolicy = 0;\n const askPolicy = (req: ProcessMountRequest) =>\n new Promise<boolean>((resolve) => {\n const id = ++nextPolicy;\n policies.set(id, resolve);\n port.postMessage({ mountPolicy: { id, req } });\n });\n\n const mountPolicy = (policy: InitRequest['processMounts']) =>\n policy === undefined ? {} : { processMounts: policy === 'ask' ? askPolicy : policy };\n\n port.addEventListener('message', (event) => {\n const grant = (event.data as { hostfsGrant?: GrantReply }).hostfsGrant;\n if (grant) return granted(grant);\n const answer = (event.data as { mountAllowed?: { id: number; allowed: boolean } }).mountAllowed;\n if (answer) {\n policies.get(answer.id)?.(answer.allowed);\n policies.delete(answer.id);\n return;\n }\n if (answered(event.data, remote, uplink)) return;\n const req = event.data as KernelRequest;\n handle(req).then(\n (result) => reply(req.id, { result }, result instanceof MessagePort ? [result] : undefined),\n (err) => reply(req.id, { error: err instanceof Error ? err.message : String(err) })\n );\n });\n}\n", "export interface DialledSocket {\n readable: ReadableStream<Uint8Array>;\n writable: WritableStream<Uint8Array>;\n close(): void;\n}\n\nexport interface DialOptions {\n port: number;\n host?: string;\n}\n\ninterface StreamPort {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close(): void;\n}\n\ntype DialMessage = Uint8Array | { end: true } | { ack: true } | { error: string };\n\nexport interface DialHandle extends DialledSocket {\n fail(error: Error): void;\n}\n\nexport function errorWithCode(message: string): Error & { code?: string } {\n const code = /^E[A-Z]+/.exec(message)?.[0];\n return Object.assign(new Error(message), code ? { code } : {});\n}\n\nexport function dialStream(port: StreamPort, onClose?: () => void): DialHandle {\n let closed = false;\n let reader: ReadableStreamDefaultController<Uint8Array> | undefined;\n const acks: Array<{ resolve: () => void; reject: (error: Error) => void }> = [];\n const readable = new ReadableStream<Uint8Array>({\n start(controller) {\n reader = controller;\n },\n pull() {\n if (!closed) port.postMessage({ more: true });\n },\n cancel() {\n reader = undefined;\n close();\n },\n });\n const finish = (fail?: Error) => {\n const controller = reader;\n reader = undefined;\n for (const ack of acks.splice(0)) {\n if (fail) ack.reject(fail);\n else ack.resolve();\n }\n if (!controller) return;\n if (fail) controller.error(fail);\n else controller.close();\n };\n function shut(): void {\n if (closed) return;\n closed = true;\n port.close();\n onClose?.();\n }\n function close(): void {\n if (!closed) port.postMessage({ close: true });\n shut();\n finish();\n }\n port.addEventListener('message', ({ data }: MessageEvent<DialMessage>) => {\n if (data instanceof Uint8Array) reader?.enqueue(data);\n else if ('ack' in data) acks.shift()?.resolve();\n else if ('end' in data) finish();\n else finish(errorWithCode(data.error));\n });\n port.start?.();\n const writable = new WritableStream<Uint8Array>({\n write(chunk) {\n if (closed) throw errorWithCode('EPIPE: the connection is closed');\n const copy = chunk.slice();\n const acked = new Promise<void>((resolve, reject) => acks.push({ resolve, reject }));\n port.postMessage(copy, [copy.buffer]);\n return acked;\n },\n close() {\n if (!closed) port.postMessage({ end: true });\n },\n abort() {\n close();\n },\n });\n const fail = (error: Error) => {\n shut();\n finish(error);\n };\n return { readable, writable, close, fail };\n}\n", "import { type DialledSocket, type DialOptions, errorWithCode } from './dial-stream.ts';\n\nexport interface LoopbackFetchOptions extends DialOptions {\n signal?: AbortSignal;\n}\n\nconst OWN_HEADERS = new Set(['host', 'connection', 'content-length', 'transfer-encoding']);\nconst encoder = new TextEncoder();\nconst latin1 = new TextDecoder('latin1');\n\nclass ByteSource {\n private buffered = new Uint8Array(0);\n private readonly reader: ReadableStreamDefaultReader<Uint8Array>;\n\n constructor(reader: ReadableStreamDefaultReader<Uint8Array>) {\n this.reader = reader;\n }\n\n private async more(): Promise<boolean> {\n const { done, value } = await this.reader.read();\n if (done) return false;\n const joined = new Uint8Array(this.buffered.length + value.length);\n joined.set(this.buffered);\n joined.set(value, this.buffered.length);\n this.buffered = joined;\n return true;\n }\n\n async until(marker: string): Promise<Uint8Array | undefined> {\n const needle = encoder.encode(marker);\n for (;;) {\n const at = indexOf(this.buffered, needle);\n if (at >= 0) return this.take(at + needle.length);\n if (!(await this.more())) return undefined;\n }\n }\n\n async some(max: number): Promise<Uint8Array | undefined> {\n if (this.buffered.length === 0 && !(await this.more())) return undefined;\n return this.take(Math.min(max, this.buffered.length));\n }\n\n async exactly(count: number): Promise<Uint8Array | undefined> {\n while (this.buffered.length < count) if (!(await this.more())) return undefined;\n return this.take(count);\n }\n\n private take(count: number): Uint8Array {\n const out = this.buffered.slice(0, count);\n this.buffered = this.buffered.slice(count);\n return out;\n }\n}\n\nfunction indexOf(haystack: Uint8Array, needle: Uint8Array): number {\n outer: for (let i = 0; i + needle.length <= haystack.length; i++) {\n for (let j = 0; j < needle.length; j++) if (haystack[i + j] !== needle[j]) continue outer;\n return i;\n }\n return -1;\n}\n\ninterface ResponseHead {\n status: number;\n statusText: string;\n headers: Array<[string, string]>;\n}\n\nfunction parseHead(bytes: Uint8Array): ResponseHead {\n const [statusLine = '', ...lines] = latin1.decode(bytes).split('\\r\\n');\n const match = /^HTTP\\/1\\.[01] (\\d{3})(?: (.*))?$/.exec(statusLine);\n if (!match) throw errorWithCode(`EPROTO: not an HTTP/1.x response: ${statusLine.slice(0, 80)}`);\n const headers: Array<[string, string]> = [];\n for (const line of lines) {\n const colon = line.indexOf(':');\n if (colon > 0) headers.push([line.slice(0, colon).trim(), line.slice(colon + 1).trim()]);\n }\n return { status: Number(match[1]), statusText: match[2] ?? '', headers };\n}\n\nfunction header(head: ResponseHead, name: string): string | undefined {\n return head.headers.find(([key]) => key.toLowerCase() === name)?.[1];\n}\n\nasync function* chunked(source: ByteSource): AsyncGenerator<Uint8Array> {\n for (;;) {\n const line = await source.until('\\r\\n');\n if (!line) throw errorWithCode('EPROTO: the chunked body ended early');\n const size = Number.parseInt(latin1.decode(line).trim().split(';')[0] ?? '', 16);\n if (!Number.isFinite(size)) throw errorWithCode('EPROTO: a malformed chunk size');\n if (size === 0) return;\n const data = await source.exactly(size);\n if (!data || !(await source.exactly(2))) throw errorWithCode('EPROTO: a chunk ended early');\n yield data;\n }\n}\n\nasync function* counted(source: ByteSource, length: number): AsyncGenerator<Uint8Array> {\n let left = length;\n while (left > 0) {\n const data = await source.some(left);\n if (!data) throw errorWithCode('EPROTO: the body ended early');\n left -= data.length;\n yield data;\n }\n}\n\nasync function* untilClose(source: ByteSource): AsyncGenerator<Uint8Array> {\n for (let data = await source.some(65536); data; data = await source.some(65536)) yield data;\n}\n\nfunction bodyOf(source: ByteSource, head: ResponseHead, method: string) {\n if (method === 'HEAD' || head.status === 204 || head.status === 304) return undefined;\n if (header(head, 'transfer-encoding')?.toLowerCase().includes('chunked')) return chunked(source);\n const length = header(head, 'content-length');\n if (length === undefined) return untilClose(source);\n const size = Number(length);\n if (!/^\\d+$/.test(length.trim()) || !Number.isSafeInteger(size)) {\n throw errorWithCode(`EPROTO: a malformed Content-Length: ${length}`);\n }\n return counted(source, size);\n}\n\nfunction stream(chunks: AsyncGenerator<Uint8Array>, socket: DialledSocket, signal?: AbortSignal) {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n signal?.addEventListener('abort', () => controller.error(signal.reason), { once: true });\n },\n async pull(controller) {\n try {\n const next = await chunks.next();\n if (next.done) {\n controller.close();\n socket.close();\n } else controller.enqueue(next.value);\n } catch (err) {\n controller.error(err);\n socket.close();\n }\n },\n cancel() {\n socket.close();\n },\n });\n}\n\nasync function requestBytes(request: Request): Promise<Uint8Array> {\n const url = new URL(request.url);\n const body = request.body ? new Uint8Array(await request.arrayBuffer()) : undefined;\n const lines = [`${request.method} ${url.pathname}${url.search} HTTP/1.1`, `Host: ${url.host}`];\n request.headers.forEach((value, name) => {\n if (!OWN_HEADERS.has(name)) lines.push(`${name}: ${value}`);\n });\n if (body) lines.push(`Content-Length: ${body.length}`);\n lines.push('Connection: close', '', '');\n const head = encoder.encode(lines.join('\\r\\n'));\n const out = new Uint8Array(head.length + (body?.length ?? 0));\n out.set(head);\n if (body) out.set(body, head.length);\n return out;\n}\n\nexport async function loopbackFetch(\n dial: (options: DialOptions) => Promise<DialledSocket>,\n input: RequestInfo | URL,\n options: LoopbackFetchOptions\n): Promise<Response> {\n options.signal?.throwIfAborted();\n const request = input instanceof Request ? input : new Request(input);\n const bytes = await requestBytes(request);\n const socket = await dial({\n port: options.port,\n ...(options.host ? { host: options.host } : {}),\n });\n options.signal?.addEventListener('abort', () => socket.close(), { once: true });\n try {\n const writer = socket.writable.getWriter();\n await writer.write(bytes);\n writer.releaseLock();\n const source = new ByteSource(socket.readable.getReader());\n let head: ResponseHead;\n do {\n const raw = await source.until('\\r\\n\\r\\n');\n if (!raw) throw errorWithCode('ECONNRESET: the connection closed before a response');\n head = parseHead(raw);\n } while (head.status >= 100 && head.status < 200);\n const chunks = bodyOf(source, head, request.method);\n if (!chunks) socket.close();\n return new Response(chunks ? stream(chunks, socket, options.signal) : null, {\n status: head.status,\n statusText: head.statusText,\n headers: head.headers,\n });\n } catch (err) {\n socket.close();\n throw err;\n }\n}\n", "import { type CdpOpen, serveCdpPort } from '../cdp/port.ts';\nimport type { CdpHook } from '../cdp/types.ts';\nimport type { FsStat } from '../fs/types.ts';\nimport type { WatchChange } from '../fs/watch.ts';\nimport { RemoteTransport, type TransportReply } from '../kernel/net/remote-transport.ts';\nimport type {\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n} from '../kernel/net/transport.ts';\nimport type { MountEntry, MountSpec } from '../mount/mount-fs.ts';\nimport { type DialledSocket, type DialOptions, dialStream } from './dial-stream.ts';\nimport { type LoopbackFetchOptions, loopbackFetch } from './loopback-fetch.ts';\nimport {\n type ClientCall,\n type ClientReply,\n type FsMethod,\n type KernelHello,\n type LockManagerLike,\n locksOf,\n type MessagePortLike,\n PROTOCOL,\n type ProcessEntry,\n type TerminalAction,\n versionError,\n} from './protocol.ts';\n\nexport type { WatchChange } from '../fs/watch.ts';\nexport type { ProcessEntry } from './protocol.ts';\n\nexport class KernelGoneError extends Error {\n constructor(message = 'the slicc-kernel this client was attached to is gone') {\n super(message);\n this.name = 'KernelGoneError';\n }\n}\n\nexport class KernelCallError extends Error {\n readonly code: string | undefined;\n\n constructor(message: string, code?: string) {\n super(message);\n this.name = 'KernelCallError';\n this.code = code;\n }\n}\n\nexport interface AttachOptions {\n timeoutMs?: number;\n locks?: LockManagerLike | null;\n}\n\nexport interface SpawnOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: string | Uint8Array;\n group?: 'new';\n pgid?: number;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n}\n\nexport interface SpawnedProcess {\n readonly pid: number;\n readonly pgid: number;\n readonly exited: Promise<number>;\n signal(name?: string): Promise<void>;\n}\n\nexport interface ClientRunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: string | Uint8Array;\n onStdout?: (text: string) => void;\n onStderr?: (text: string) => void;\n}\n\nexport interface ClientRunResult {\n pid: number;\n status: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface ClientTerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n onData?: (bytes: Uint8Array) => void;\n}\n\nexport interface ClientTerminal {\n readonly pid: number;\n readonly exited: Promise<number>;\n onData: ((bytes: Uint8Array) => void) | null;\n write(data: string | Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(name: string): void;\n close(): void;\n}\n\nexport interface ClientFs {\n readFile(path: string): Promise<Uint8Array>;\n readText(path: string): Promise<string>;\n writeFile(path: string, data: string | Uint8Array): Promise<void>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n mkdir(path: string): Promise<void>;\n rm(path: string, options?: { force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n realpath(path: string): Promise<string>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n exists(path: string): Promise<boolean>;\n watch(\n paths: string[],\n options: { recursive?: boolean },\n onChange: (change: WatchChange) => void\n ): Promise<{ close(): void }>;\n}\n\nexport type ClientFetchRequest = Omit<RealmTransportRequest, 'signal'> & { signal?: AbortSignal };\n\nexport interface KernelClient {\n readonly protocol: readonly [number, number];\n readonly transport: RealmTransport;\n readonly closed: Promise<Error>;\n spawn(argv: string[], options?: SpawnOptions): Promise<SpawnedProcess>;\n run(argv: string[], options?: ClientRunOptions): Promise<ClientRunResult>;\n openTerminal(argv: string[], options?: ClientTerminalOptions): Promise<ClientTerminal>;\n ps(): Promise<ProcessEntry[]>;\n mount(spec: MountSpec): Promise<MountEntry>;\n umount(target: string): Promise<void>;\n mounts(): Promise<MountEntry[]>;\n kill(pid: number, signal?: string): Promise<void>;\n fetch(request: ClientFetchRequest): Promise<RealmTransportResponse>;\n dial(options: DialOptions): Promise<DialledSocket>;\n loopbackFetch(input: RequestInfo | URL, options: LoopbackFetchOptions): Promise<Response>;\n readonly fs: ClientFs;\n serveCdp(hook: CdpHook, options?: { runtime?: string }): Promise<{ close(): void }>;\n close(options?: { kill?: boolean }): Promise<void>;\n}\n\ninterface Pending {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n output?: (fd: 1 | 2, bytes: Uint8Array) => void;\n started?: (pid: number) => void;\n}\n\ntype Handlers = Omit<Pending, 'resolve' | 'reject'>;\n\nconst encoder = new TextEncoder();\nconst bytesOf = (data: string | Uint8Array) =>\n typeof data === 'string' ? encoder.encode(data) : data;\n\nconst UNAVAILABLE = {\n manualRedirects: false,\n encodedBodies: false,\n maxRequestBody: 0,\n unavailable: true,\n} as const;\n\nasync function holdLock(\n locks: LockManagerLike | undefined\n): Promise<{ name?: string; release(): void }> {\n if (!locks) return { release() {} };\n const name = `slicc-kernel-client:${crypto.randomUUID()}`;\n const granted = Promise.withResolvers<void>();\n const held = Promise.withResolvers<void>();\n void locks.request(name, () => {\n granted.resolve();\n return held.promise;\n });\n await granted.promise;\n return { name, release: () => held.resolve() };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\n\nclass Channel {\n readonly greeted = Promise.withResolvers<KernelHello>();\n readonly ended = Promise.withResolvers<Error>();\n remote: RemoteTransport | undefined;\n failure: Error | undefined;\n private readonly pending = new Map<number, Pending>();\n readonly watching = new Map<number, (change: WatchChange) => void>();\n readonly cdpHooks = new Map<number, CdpHook>();\n private readonly cdpOpen = new Set<() => void>();\n protocol: readonly [number, number] = PROTOCOL;\n private nextId = 0;\n private readonly port: MessagePortLike;\n private readonly release: () => void;\n\n constructor(port: MessagePortLike, release: () => void) {\n this.port = port;\n this.release = release;\n this.greeted.promise.catch(() => undefined);\n port.addEventListener('message', (event) => this.receive(event.data));\n port.addEventListener('close', () => this.end(new KernelGoneError()));\n port.start?.();\n }\n\n post(message: object): void {\n if (!this.failure) this.port.postMessage(message);\n }\n\n end(error: Error): void {\n if (this.failure) return;\n this.failure = error;\n this.greeted.reject(error);\n this.remote?.fail(error);\n for (const close of [...this.cdpOpen]) close();\n this.cdpOpen.clear();\n for (const call of this.pending.values()) call.reject(error);\n this.pending.clear();\n this.release();\n this.port.close?.();\n this.ended.resolve(error);\n }\n\n request(call: ClientCall, handlers: Handlers = {}): { id: number; done: Promise<unknown> } {\n const id = ++this.nextId;\n const { failure } = this;\n if (failure) return { id, done: Promise.reject(failure) };\n const done = new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, ...handlers });\n this.port.postMessage({ ...call, id });\n });\n return { id, done };\n }\n\n call(call: ClientCall): Promise<unknown> {\n return this.request(call).done;\n }\n\n private receive(data: {\n hello?: KernelHello;\n net?: unknown;\n bye?: string;\n watch?: number;\n change?: WatchChange;\n cdpOpen?: CdpOpen['cdpOpen'];\n port?: CdpOpen['port'];\n }): void {\n if (data.cdpOpen && data.port) {\n this.openCdp(data as CdpOpen);\n return;\n }\n if (data.watch !== undefined) {\n this.watching.get(data.watch)?.(data.change as WatchChange);\n return;\n }\n if (data.bye !== undefined) {\n this.end(new KernelGoneError(data.bye));\n return;\n }\n if (data.hello) {\n this.greeted.resolve(data.hello);\n return;\n }\n if (data.net !== undefined) {\n this.remote?.receive(data as TransportReply);\n return;\n }\n const reply = data as ClientReply;\n const call = this.pending.get(reply.id);\n if (!call) return;\n if (reply.fd !== undefined) {\n call.output?.(reply.fd, reply.bytes as Uint8Array);\n return;\n }\n if (reply.started !== undefined) {\n call.started?.(reply.started);\n return;\n }\n this.pending.delete(reply.id);\n if (reply.error !== undefined) call.reject(new KernelCallError(reply.error, reply.code));\n else call.resolve(reply.result);\n }\n\n private openCdp({ cdpOpen: { registration, ...request }, port }: CdpOpen): void {\n const hook = registration === undefined ? undefined : this.cdpHooks.get(registration);\n if (!hook || this.failure) {\n port.postMessage({ error: 'this client no longer serves CDP' });\n port.close();\n return;\n }\n const close = serveCdpPort(port, hook, request, () => this.cdpOpen.delete(close));\n this.cdpOpen.add(close);\n }\n}\n\nasync function serveCdpOn(\n channel: Channel,\n hook: CdpHook,\n options: { runtime?: string }\n): Promise<{ close(): void }> {\n await since(channel, 5, 'CDP serving', async () => {});\n const req = {\n op: 'serve-cdp' as const,\n ...(options.runtime ? { runtime: options.runtime } : {}),\n };\n const { id, done } = channel.request(req);\n channel.cdpHooks.set(id, hook);\n try {\n await done;\n } catch (error) {\n channel.cdpHooks.delete(id);\n throw error;\n }\n return {\n close: () => {\n if (!channel.cdpHooks.delete(id)) return;\n void channel.call({ op: 'unserve-cdp', registration: id }).catch(() => undefined);\n },\n };\n}\n\nasync function dialOn(channel: Channel, { port, host }: DialOptions): Promise<DialledSocket> {\n const req = { op: 'dial' as const, port, ...(host ? { host } : {}) };\n return dialStream((await since(channel, 4, 'dial', () => channel.call(req))) as MessagePort);\n}\n\nasync function spawnOn(\n channel: Channel,\n argv: string[],\n opts: SpawnOptions\n): Promise<SpawnedProcess> {\n const { onStdout, onStderr, stdin, group: _, ...rest } = opts;\n if (opts.pgid !== undefined)\n await since(channel, 3, 'spawn into a process group', async () => {});\n const started = Promise.withResolvers<number>();\n const options = { ...rest, ...(stdin !== undefined ? { stdin: bytesOf(stdin) } : {}) };\n const { done } = channel.request(\n { op: 'spawn', argv, options },\n {\n output: (fd, bytes) => (fd === 1 ? onStdout : onStderr)?.(bytes),\n started: started.resolve,\n }\n );\n done.catch(started.reject);\n const pid = await started.promise;\n const pgid = opts.pgid ?? pid;\n return {\n pid,\n pgid,\n exited: done as Promise<number>,\n signal: async (name = 'SIGTERM') =>\n void (await channel.call({ op: 'kill', pid: -pgid, signal: name })),\n };\n}\n\nasync function runOn(\n channel: Channel,\n argv: string[],\n opts: ClientRunOptions\n): Promise<ClientRunResult> {\n const { onStdout, onStderr, ...rest } = opts;\n const chunks: Record<1 | 2, Uint8Array[]> = { 1: [], 2: [] };\n const live = { 1: new TextDecoder(), 2: new TextDecoder() };\n const tee = (fd: 1 | 2, on?: (text: string) => void) => (bytes: Uint8Array) => {\n chunks[fd].push(bytes);\n on?.(live[fd].decode(bytes, { stream: true }));\n };\n const child = await spawnOn(channel, argv, {\n ...rest,\n onStdout: tee(1, onStdout),\n onStderr: tee(2, onStderr),\n });\n const status = await child.exited;\n const text = (fd: 1 | 2) => new TextDecoder().decode(concat(chunks[fd]));\n return { pid: child.pid, status, stdout: text(1), stderr: text(2) };\n}\n\nasync function terminalOn(\n channel: Channel,\n argv: string[],\n opts: ClientTerminalOptions\n): Promise<ClientTerminal> {\n const { onData, ...options } = opts;\n let listener = onData ?? null;\n const backlog: Uint8Array[] = [];\n const started = Promise.withResolvers<number>();\n const { id, done } = channel.request(\n { op: 'open-terminal', argv, options },\n {\n output: (_fd, bytes) => (listener ? listener(bytes) : backlog.push(bytes)),\n started: started.resolve,\n }\n );\n done.catch(started.reject);\n const pid = await started.promise;\n const send = (action: TerminalAction) =>\n void channel.call({ op: 'terminal', terminal: id, ...action }).catch(() => undefined);\n return {\n pid,\n exited: done as Promise<number>,\n get onData() {\n return listener;\n },\n set onData(next) {\n listener = next;\n if (next) for (const bytes of backlog.splice(0)) next(bytes);\n },\n write: (data) => send({ action: 'write', bytes: bytesOf(data) }),\n resize: (cols, rows) => send({ action: 'resize', cols, rows }),\n signal: (name) => send({ action: 'signal', signal: name }),\n close: () => send({ action: 'close' }),\n };\n}\n\nfunction fsOn(channel: Channel): ClientFs {\n const fs = (method: FsMethod, ...args: unknown[]) => channel.call({ op: 'fs', method, args });\n const done = async (method: FsMethod, ...args: unknown[]) => void (await fs(method, ...args));\n return {\n readFile: (path) => fs('readFile', path) as Promise<Uint8Array>,\n readText: async (path) => new TextDecoder().decode((await fs('readFile', path)) as Uint8Array),\n writeFile: (path, data) => done('writeFile', path, data),\n stat: (path) => fs('stat', path) as Promise<FsStat>,\n lstat: (path) => fs('lstat', path) as Promise<FsStat>,\n readdir: (path) => fs('readdir', path) as Promise<string[]>,\n mkdir: (path) => done('mkdir', path),\n rm: (path, o = {}) => done('rm', path, o.force === true),\n rename: (from, to) => done('rename', from, to),\n realpath: (path) => fs('realpath', path) as Promise<string>,\n symlink: (target, path) => done('symlink', target, path),\n readlink: (path) => fs('readlink', path) as Promise<string>,\n exists: (path) => fs('exists', path) as Promise<boolean>,\n async watch(paths, options, onChange) {\n if (channel.protocol[1] < 1) {\n throw new KernelCallError(\n `this kernel speaks protocol ${channel.protocol.join('.')}, which has no watch`,\n 'ENOSYS'\n );\n }\n const { id, done } = channel.request({\n op: 'watch',\n paths,\n recursive: options.recursive === true,\n });\n channel.watching.set(id, onChange);\n try {\n await done;\n } catch (error) {\n channel.watching.delete(id);\n throw error;\n }\n return {\n close: () => {\n if (!channel.watching.delete(id)) return;\n void channel.call({ op: 'unwatch', watch: id }).catch(() => undefined);\n },\n };\n },\n };\n}\n\nfunction since(channel: Channel, minor: number, what: string, run: () => Promise<unknown>) {\n if (channel.protocol[1] < minor) {\n return Promise.reject(\n new KernelCallError(\n `this kernel speaks protocol ${channel.protocol.join('.')}, which has no ${what}`,\n 'ENOSYS'\n )\n );\n }\n return run();\n}\n\nasync function greet(\n channel: Channel,\n lock: string | undefined,\n timeoutMs: number\n): Promise<KernelHello> {\n channel.post({ hello: { protocol: PROTOCOL, ...(lock ? { lock } : {}) } });\n const timer = setTimeout(\n () =>\n channel.end(\n new KernelGoneError(`no slicc-kernel answered on this port within ${timeoutMs} ms`)\n ),\n timeoutMs\n );\n let hello: KernelHello;\n try {\n hello = await channel.greeted.promise;\n } finally {\n clearTimeout(timer);\n }\n const refused = hello.error ?? versionError(hello.protocol);\n if (refused) {\n const error = new Error(refused);\n channel.end(error);\n throw error;\n }\n return hello;\n}\n\nexport async function attachKernel(\n port: MessagePortLike,\n options: AttachOptions = {}\n): Promise<KernelClient> {\n const locks = options.locks === null ? undefined : (options.locks ?? locksOf());\n const own = await holdLock(locks);\n const channel = new Channel(port, own.release);\n const hello = await greet(channel, own.name, options.timeoutMs ?? 10_000);\n channel.protocol = hello.protocol;\n if (hello.lock && locks) void locks.request(hello.lock, () => channel.end(new KernelGoneError()));\n const transport = new RemoteTransport(\n { postMessage: (call) => channel.post(call) },\n hello.traits ?? UNAVAILABLE\n );\n channel.remote = transport;\n return {\n protocol: hello.protocol,\n transport,\n closed: channel.ended.promise,\n spawn: (argv, opts = {}) => spawnOn(channel, argv, opts),\n run: (argv, opts = {}) => runOn(channel, argv, opts),\n openTerminal: (argv, opts = {}) => terminalOn(channel, argv, opts),\n ps: () => channel.call({ op: 'ps' }) as Promise<ProcessEntry[]>,\n mount: (spec) =>\n since(channel, 2, 'mount', () => channel.call({ op: 'mount', spec })) as Promise<MountEntry>,\n umount: async (target) =>\n void (await since(channel, 2, 'umount', () => channel.call({ op: 'umount', target }))),\n mounts: () =>\n since(channel, 2, 'mounts', () => channel.call({ op: 'mounts' })) as Promise<MountEntry[]>,\n kill: async (pid, signal = 'SIGTERM') => void (await channel.call({ op: 'kill', pid, signal })),\n fetch: (req) => {\n const { signal, ...rest } = req;\n return transport.fetch({ ...rest, signal: signal ?? new AbortController().signal });\n },\n dial: (options) => dialOn(channel, options),\n loopbackFetch: (input, options) => loopbackFetch((o) => dialOn(channel, o), input, options),\n fs: fsOn(channel),\n serveCdp: (hook, options = {}) => serveCdpOn(channel, hook, options),\n async close(o = {}) {\n if (channel.failure) return;\n await channel\n .call({ op: 'detach', ...(o.kill ? { kill: true } : {}) })\n .catch(() => undefined);\n channel.end(new KernelGoneError('this client is closed'));\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["MessageChannel", "done", "opened", "chunk", "name", "link", "wait", "name", "CHUNK", "granted", "message", "chunk", "message", "name", "name", "headers", "fail", "name", "message", "MAX_LINKS", "name", "parentOf", "done", "name", "parentOf", "MAX_LINKS", "link", "time", "length", "children", "moved", "ctimeMs", "within", "parentOf", "name", "done", "message", "chunk", "name", "length", "chunks", "message", "name", "length", "accept", "CLOSE_WAIT_MS", "done", "message", "accept", "rel", "name", "S_IFDIR", "S_IFREG", "MAX_LINKS", "missing", "children", "name", "under", "parentOf", "run", "ranged", "fail", "concat", "chunks", "chunk", "done", "message", "MAX_LINKS", "within", "
|
|
3
|
+
"sources": ["../src/node.ts", "../src/cdp/port.ts", "../src/fs/types.ts", "../src/kernel/pipe.ts", "../src/kernel/fd-table.ts", "../src/process/wasi/wasi-abi.ts", "../src/process/wasi-errno.ts", "../src/kernel/net/uplink-socket.ts", "../src/kernel/socket.ts", "../src/kernel/dial.ts", "../src/kernel/signals.ts", "../src/body-idle.ts", "../src/kernel/net/ws-queue.ts", "../src/websocket-transport.ts", "../src/transport.ts", "../src/client/protocol.ts", "../src/client/serve-client.ts", "../src/fs/meta.ts", "../src/fs/opfs.ts", "../src/fs/unlinked.ts", "../src/kernel/net/http1.ts", "../src/cdp/types.ts", "../src/cdp/websocket.ts", "../src/cdp/facade.ts", "../src/cdp/hosts.ts", "../src/commands.ts", "../src/fs/commands.ts", "../src/fs/physical-path.ts", "../src/fs/watch.ts", "../src/kernel/children.ts", "../src/mount/protocol.ts", "../src/mount/connection.ts", "../src/mount/mount-fs.ts", "../src/realm/sync-fs-token-registry.ts", "../src/realm/sync-fs-wire.ts", "../src/realm/sync-fs-dispatch.ts", "../src/realm/sync-sab-wire.ts", "../src/realm/sync-sab-responder.ts", "../src/kernel/host-ops.ts", "../src/kernel/net/loopback-names.ts", "../src/kernel/net/proxy-service.ts", "../src/kernel/net/x509.ts", "../src/kernel/net/realm-ca.ts", "../src/kernel/net/tls-engine.ts", "../src/kernel/net/tls-tunnel.ts", "../src/kernel/net/network.ts", "../src/kernel/net/http-syscalls.ts", "../src/kernel/net/routes.ts", "../src/kernel/net/uplink.ts", "../src/kernel/net/resolver.ts", "../src/kernel/tty.ts", "../src/kernel/pty.ts", "../src/kernel/select.ts", "../src/kernel/socket-syscalls.ts", "../src/fs/pages.ts", "../src/fs/ranged.ts", "../src/kernel/vfs-file.ts", "../src/kernel/process.ts", "../src/kernel/protocol.ts", "../src/kernel/host.ts", "../src/kernel/jobs.ts", "../src/kernel/settling.ts", "../src/mount/driver.ts", "../src/mount/medium.ts", "../src/mount/fsa.ts", "../src/mount/syscall.ts", "../src/mount/fstab.ts", "../src/mount/hostfs.ts", "../src/mount/media.ts", "../src/mount/chunked.ts", "../src/mount/tmpfs.ts", "../src/process/wasi/wasi-module.ts", "../src/launcher.ts", "../src/node/memory-root.ts", "../src/kernel/net/remote-transport.ts", "../src/serve.ts", "../src/client/dial-stream.ts", "../src/client/loopback-fetch.ts", "../src/client/attach.ts"],
|
|
4
|
+
"sourcesContent": ["import { MessageChannel, type MessagePort, Worker } from 'node:worker_threads';\nimport type { CdpHook } from './cdp/types.ts';\nimport type { MessagePortLike } from './client/protocol.ts';\nimport { type ServedClient, serveClient } from './client/serve-client.ts';\nimport { OpfsFs } from './fs/opfs.ts';\nimport { pidOwner } from './fs/unlinked.ts';\nimport type { RunOptions, RunResult, Terminal, TerminalOptions } from './index.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport type { RouteTable } from './kernel/net/routes.ts';\nimport type { NetworkUplink } from './kernel/net/uplink.ts';\nimport { Launcher } from './launcher.ts';\nimport type { FetchLike, HostfsGrantHook } from './mount/hostfs.ts';\nimport type { MountEntry, MountSpec } from './mount/mount-fs.ts';\nimport type { ProcessMountPolicy } from './mount/syscall.ts';\nimport { isMemoryRoot, memoryRoot } from './node/memory-root.ts';\nimport { signalNumber } from './serve.ts';\nimport { fetchTransport, type NetworkTransport } from './transport.ts';\n\nexport type { CdpConnection, CdpHook, CdpRequest } from './cdp/types.ts';\nexport {\n type AttachOptions,\n attachKernel,\n type ClientFetchRequest,\n type ClientFs,\n type ClientRunOptions,\n type ClientRunResult,\n type ClientTerminal,\n type ClientTerminalOptions,\n KernelCallError,\n type KernelClient,\n KernelGoneError,\n type ProcessEntry,\n type SpawnedProcess,\n type SpawnOptions,\n type WatchChange,\n} from './client/attach.ts';\nexport type {\n NetworkUplink,\n ResolveAnswer,\n ResolveFamily,\n RouteTable,\n RunOptions,\n RunResult,\n Terminal,\n TerminalOptions,\n TerminalSignal,\n} from './index.ts';\nexport type { MountEntry, MountSpec } from './mount/mount-fs.ts';\nexport { fetchTransport, type NetworkTransport } from './transport.ts';\nexport { memoryRoot };\n\nexport interface NodeKernelOptions {\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n network?: { transport?: NetworkTransport; uplink?: NetworkUplink };\n worker?: string | URL;\n driverWorker?: string | URL;\n processMounts?: ProcessMountPolicy;\n fstabRetries?: readonly number[];\n hostfs?: HostfsGrantHook;\n hostfsFetch?: FetchLike;\n hostfsOrigin?: string;\n cdp?: CdpHook;\n hostname?: string;\n}\n\nexport interface NodeKernel {\n readonly root: FileSystemDirectoryHandle;\n run(argv: string[], options?: RunOptions): Promise<RunResult>;\n openTerminal(argv: string[], options?: TerminalOptions): Promise<Terminal>;\n writeFile(path: string, data: string | Uint8Array): Promise<void>;\n readFile(path: string): Promise<Uint8Array>;\n connect(): Promise<MessagePort>;\n setRoutes(routes: RouteTable): Promise<void>;\n mount(spec: MountSpec): Promise<MountEntry>;\n umount(target: string): Promise<void>;\n mounts(): Promise<MountEntry[]>;\n terminate(): void;\n}\n\nfunction hostfsFetchOf(options: NodeKernelOptions): { hostfsFetch?: FetchLike } {\n const { hostfsFetch, hostfsOrigin } = options;\n if (hostfsOrigin === undefined) return hostfsFetch ? { hostfsFetch } : {};\n const base: FetchLike = hostfsFetch ?? ((url, init) => fetch(url, init));\n return {\n hostfsFetch: (url, init) => {\n const headers = new Headers(init.headers);\n headers.set('Origin', hostfsOrigin);\n return base(url, { ...init, headers });\n },\n };\n}\n\nexport function nodeTransport(): NetworkTransport {\n const transport = fetchTransport({ webSocket: true, webSocketHeaders: true });\n return { ...transport, traits: { ...transport.traits, crossOrigin: 'any' } };\n}\n\nconst TERMINATED = 'the kernel is terminated';\n\nfunction nodeWorker(file: string | URL, live: Set<() => void>, closed: boolean): WasmWorkerLike {\n const errors = new Set<(event: MessageEvent) => void>();\n const messages = new Map<(event: MessageEvent) => void, (data: unknown) => void>();\n const fail = (message: string) => {\n for (const handler of [...errors]) {\n handler({ message, preventDefault() {} } as unknown as MessageEvent);\n }\n };\n const worker = closed ? undefined : new Worker(file);\n if (worker) {\n const kill = () => {\n void worker.terminate();\n fail(TERMINATED);\n };\n live.add(kill);\n worker.once('exit', () => live.delete(kill));\n worker.on('error', (err) => fail(String(err)));\n } else {\n setTimeout(() => fail(TERMINATED), 0);\n }\n return {\n postMessage: (message, transfer) => worker?.postMessage(message, transfer as never),\n addEventListener(type, handler) {\n if (type === 'error') {\n errors.add(handler);\n return;\n }\n const listener = (data: unknown) => handler({ data } as MessageEvent);\n messages.set(handler, listener);\n worker?.on('message', listener);\n },\n removeEventListener(type, handler) {\n errors.delete(handler);\n const listener = messages.get(handler);\n if (listener) worker?.off('message', listener);\n },\n terminate: () => void worker?.terminate(),\n };\n}\n\nfunction textOf(on: ((text: string) => void) | undefined) {\n if (!on) return undefined;\n const decoder = new TextDecoder();\n return (bytes: Uint8Array) => on(decoder.decode(bytes, { stream: true }));\n}\n\nexport async function createNodeKernel(options: NodeKernelOptions = {}): Promise<NodeKernel> {\n const root = options.root ?? memoryRoot();\n const fs = new OpfsFs(root, undefined, undefined, { ranged: isMemoryRoot(root) });\n await fs.reconcile();\n const live = new Set<() => void>();\n const pending = new Set<(err: Error) => void>();\n const clients = new Set<ServedClient>();\n let terminated = false;\n const file = options.worker ?? new URL('./node-process-worker.js', import.meta.url);\n const transport = options.network?.transport;\n const launcher = new Launcher({\n fs,\n unlinkOwner: pidOwner(process),\n createWorker: () => nodeWorker(file, live, terminated),\n createDriverWorker: () =>\n nodeWorker(\n options.driverWorker ?? new URL('./node-driver-worker.js', import.meta.url),\n live,\n terminated\n ),\n ...(options.modules ? { modules: options.modules } : {}),\n ...(options.env ? { env: options.env } : {}),\n ...(transport ? { transport } : {}),\n ...(options.network?.uplink ? { uplink: options.network.uplink } : {}),\n ...(options.processMounts !== undefined ? { processMounts: options.processMounts } : {}),\n ...(options.fstabRetries ? { fstabRetries: options.fstabRetries } : {}),\n ...(options.hostfs ? { hostfs: options.hostfs } : {}),\n ...hostfsFetchOf(options),\n ...(options.cdp ? { cdp: options.cdp } : {}),\n ...(options.hostname !== undefined ? { hostname: options.hostname } : {}),\n });\n await launcher.prepare();\n const guard = <T>(work: () => Promise<T>): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n if (terminated) return reject(new Error(TERMINATED));\n pending.add(reject);\n work()\n .then(resolve, reject)\n .finally(() => pending.delete(reject));\n });\n const decoder = new TextDecoder();\n return {\n root,\n async run(argv, opts = {}) {\n const { stdin, onStdout, onStderr, ...rest } = opts;\n const onOut = textOf(onStdout);\n const onErr = textOf(onStderr);\n const result = await guard(() =>\n launcher.run(argv, {\n ...rest,\n ...(stdin !== undefined\n ? { stdin: typeof stdin === 'string' ? new TextEncoder().encode(stdin) : stdin }\n : {}),\n ...(onOut ? { onStdout: onOut } : {}),\n ...(onErr ? { onStderr: onErr } : {}),\n })\n );\n return {\n status: result.status,\n stdout: decoder.decode(result.stdout),\n stderr: decoder.decode(result.stderr),\n };\n },\n async openTerminal(argv, opts = {}) {\n const { onData, ...rest } = opts;\n let listener = onData ?? null;\n const backlog: Uint8Array[] = [];\n const session = await guard(() =>\n launcher.openTerminal(argv, {\n ...rest,\n onData: (bytes) => (listener ? listener(bytes) : backlog.push(bytes)),\n })\n );\n return {\n pid: session.pid,\n exited: guard(() => session.exited),\n get onData() {\n return listener;\n },\n set onData(next) {\n listener = next;\n if (next) for (const bytes of backlog.splice(0)) next(bytes);\n },\n write: (data) =>\n session.write(typeof data === 'string' ? new TextEncoder().encode(data) : data),\n resize: (cols, rows) => session.resize(cols, rows),\n signal: (name) => session.signal(signalNumber(name)),\n close: () => session.close(),\n };\n },\n async writeFile(path, data) {\n const parent = path.slice(0, path.lastIndexOf('/')) || '/';\n await launcher.fs.mkdir(parent, { recursive: true });\n await launcher.fs.writeFile(path, data);\n },\n readFile: async (path) => launcher.fs.readFileBuffer(path),\n mount: (spec) => guard(() => launcher.mount(spec)),\n umount: (target) => guard(async () => launcher.umount(target)),\n mounts: async () => launcher.mounts.list(),\n setRoutes: (routes) => guard(async () => launcher.setRoutes(routes)),\n async connect() {\n if (terminated) throw new Error(TERMINATED);\n const { port1, port2 } = new MessageChannel();\n const served = serveClient(port1 as unknown as MessagePortLike, {\n launcher: async () => launcher,\n signal: signalNumber,\n });\n clients.add(served);\n void served.closed.then(() => clients.delete(served));\n return port2;\n },\n terminate() {\n terminated = true;\n for (const client of [...clients]) client.detach();\n for (const reject of [...pending]) reject(new Error(TERMINATED));\n for (const kill of [...live]) kill();\n launcher.cdp.close();\n launcher.unmountAll();\n },\n };\n}\n", "import type { CdpConnection, CdpHook, CdpRequest } from './types.ts';\n\nexport interface CdpPortLike {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close(): void;\n}\n\nexport type CdpWire = { open: true } | { error: string } | { m: string } | { close: string | null };\n\nexport interface CdpOpen {\n cdpOpen: CdpRequest & { registration?: number };\n port: CdpPortLike;\n}\n\nexport function serveCdpPort(\n port: CdpPortLike,\n hook: CdpHook,\n request: CdpRequest,\n onDone?: () => void\n): () => void {\n let conn: CdpConnection | undefined;\n let done = false;\n const end = () => {\n done = true;\n port.close();\n onDone?.();\n };\n const finish = (reason: string | null) => {\n if (done) return;\n port.postMessage({ close: reason });\n end();\n };\n port.addEventListener('message', ({ data }: MessageEvent<{ m?: string; close?: true }>) => {\n if (data.m !== undefined) conn?.send(data.m);\n else if (data.close && !done) {\n end();\n conn?.close();\n }\n });\n port.start?.();\n new Promise<CdpConnection>((resolve) => resolve(hook(request))).then(\n (opened) => {\n conn = opened;\n if (done) return opened.close();\n opened.onmessage = (m) => {\n if (!done) port.postMessage({ m });\n };\n opened.onclose = (reason) => finish(reason ?? null);\n port.postMessage({ open: true });\n },\n (e: unknown) => {\n if (done) return;\n port.postMessage({ error: e instanceof Error ? e.message : String(e) });\n end();\n }\n );\n return () => {\n if (done) return;\n conn?.close();\n finish('the CDP host is gone');\n };\n}\n\nexport function portCdpHook(\n ask: (request: CdpRequest, port: CdpPortLike) => void,\n gone?: Promise<unknown>\n): CdpHook {\n return (request) =>\n new Promise((resolve, reject) => {\n const { port1, port2 } = new MessageChannel();\n let closed = false;\n const conn: CdpConnection = {\n send: (m) => {\n if (!closed) port1.postMessage({ m });\n },\n onmessage: null,\n onclose: null,\n close: () => {\n if (closed) return;\n closed = true;\n port1.postMessage({ close: true });\n port1.close();\n },\n };\n port1.addEventListener('message', ({ data }: MessageEvent<CdpWire>) => {\n if ('m' in data) conn.onmessage?.(data.m);\n else if ('open' in data) resolve(conn);\n else if ('error' in data) {\n closed = true;\n port1.close();\n reject(new Error(data.error));\n } else if (!closed) {\n closed = true;\n port1.close();\n conn.onclose?.(data.close ?? undefined);\n }\n });\n port1.start();\n void gone?.then(() => {\n if (closed) return;\n closed = true;\n port1.close();\n reject(new Error('the CDP host is gone'));\n conn.onclose?.('the CDP host is gone');\n });\n ask(request, port2 as unknown as CdpPortLike);\n });\n}\n", "export interface FsStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtime: Date;\n atime: Date;\n ctime: Date;\n ino: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n version?: string;\n}\n\nexport interface KernelFs {\n resolvePath(base: string, path: string): string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array | string): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n readdirStat(path: string): Promise<Array<[string, FsStat | null]>>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n rm(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n realpath?(path: string, follow: boolean): Promise<string>;\n createExclusive?(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n utimes(path: string, atime: Date, mtime: Date): Promise<void>;\n lutimes?(path: string, atime: Date, mtime: Date): Promise<void>;\n pread?(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate?(path: string, size: number): Promise<void>;\n}\n\nexport type RangedOps = Required<Pick<KernelFs, 'pread' | 'pwrite' | 'truncate'>>;\n\nexport function rangedOps(fs: Partial<RangedOps>): RangedOps | undefined {\n const { pread, pwrite, truncate } = fs;\n if (!pread || !pwrite || !truncate) return undefined;\n return { pread: pread.bind(fs), pwrite: pwrite.bind(fs), truncate: truncate.bind(fs) };\n}\n\nexport async function lutimesOf(\n fs: KernelFs,\n path: string,\n atime: Date,\n mtime: Date\n): Promise<void> {\n if (fs.lutimes) return fs.lutimes(path, atime, mtime);\n if ((await fs.lstat(path)).isSymbolicLink) throw fsError('EOPNOTSUPP', path);\n return fs.utimes(path, atime, mtime);\n}\n\nexport function fsError(code: string, path: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${path}`), { code });\n}\n\nexport function normalizePath(path: string): string {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return `/${parts.join('/')}`;\n}\n\nexport function resolvePath(base: string, path: string): string {\n return normalizePath(path.startsWith('/') ? path : `${base}/${path}`);\n}\n\nexport function inodeOf(path: string): number {\n let h1 = 0xdeadbeef;\n let h2 = 0x41c6ce57;\n for (let i = 0; i < path.length; i++) {\n const c = path.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 2654435761);\n h2 = Math.imul(h2 ^ c, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0) || 1;\n}\n", "export const PIPE_CAPACITY = 64 * 1024;\n\nexport class PipeError extends Error {\n readonly code: 'EPIPE' | 'EINTR';\n\n constructor(code: 'EPIPE' | 'EINTR') {\n super(code);\n this.code = code;\n }\n}\n\nexport class KernelPipe {\n private chunks: Uint8Array[] = [];\n private size = 0;\n private readers = 0;\n private writers = 0;\n private waiters: Array<() => void> = [];\n\n readonly capacity: number;\n\n constructor(capacity: number = PIPE_CAPACITY) {\n this.capacity = capacity;\n }\n\n get buffered(): number {\n return this.size;\n }\n\n get readReady(): boolean {\n return this.size > 0 || this.writers === 0;\n }\n\n get writeReady(): boolean {\n return this.size < this.capacity || this.readers === 0;\n }\n\n get writersGone(): boolean {\n return this.writers === 0;\n }\n\n get readersGone(): boolean {\n return this.readers === 0;\n }\n\n openRead(): void {\n this.readers += 1;\n }\n\n openWrite(): void {\n this.writers += 1;\n }\n\n closeRead(): void {\n if (this.readers > 0) this.readers -= 1;\n if (this.readers === 0) {\n this.chunks = [];\n this.size = 0;\n }\n this.wake();\n }\n\n closeWrite(): void {\n if (this.writers > 0) this.writers -= 1;\n this.wake();\n }\n\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = this.take(Math.min(max, this.size));\n this.wake();\n return out;\n }\n\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.size === 0) {\n if (this.writers === 0) return new Uint8Array(0);\n await this.changed(signal);\n }\n const out = new Uint8Array(Math.min(max, this.size));\n let filled = 0;\n for (const chunk of this.chunks) {\n if (filled === out.length) break;\n const count = Math.min(chunk.length, out.length - filled);\n out.set(chunk.subarray(0, count), filled);\n filled += count;\n }\n return out;\n }\n\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n let offset = 0;\n while (offset < bytes.length) {\n if (this.readers === 0) throw new PipeError('EPIPE');\n const room = this.capacity - this.size;\n if (room === 0) {\n try {\n await this.changed(signal);\n } catch (e) {\n if (offset > 0) return offset;\n throw e;\n }\n continue;\n }\n const n = Math.min(room, bytes.length - offset);\n this.chunks.push(bytes.slice(offset, offset + n));\n this.size += n;\n offset += n;\n this.wake();\n }\n return bytes.length;\n }\n\n private take(n: number): Uint8Array {\n const out = new Uint8Array(n);\n let filled = 0;\n while (filled < n) {\n const head = this.chunks[0];\n const count = Math.min(head.length, n - filled);\n out.set(head.subarray(0, count), filled);\n filled += count;\n if (count === head.length) this.chunks.shift();\n else this.chunks[0] = head.subarray(count);\n }\n this.size -= n;\n return out;\n }\n\n changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new PipeError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new PipeError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import { KernelPipe, type PipeError } from './pipe.ts';\nimport type { PtyPair } from './pty.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport type KernelErrno =\n | 'EBADF'\n | 'EPIPE'\n | 'EMFILE'\n | 'EINVAL'\n | 'ENOENT'\n | 'ENOEXEC'\n | 'ECHILD'\n | 'ENOSYS'\n | 'ESPIPE'\n | 'ENOSPC'\n | 'EINTR'\n | 'ESRCH'\n | 'ENOTTY'\n | 'ENXIO'\n | 'EPERM'\n | 'EIO'\n | 'EACCES'\n | 'EAGAIN'\n | 'ENOTSOCK'\n | 'EAFNOSUPPORT'\n | 'EPROTONOSUPPORT'\n | 'EOPNOTSUPP'\n | 'EADDRINUSE'\n | 'EADDRNOTAVAIL'\n | 'ENETUNREACH'\n | 'ECONNREFUSED'\n | 'EINPROGRESS'\n | 'EISCONN'\n | 'ENOTCONN'\n | 'EROFS'\n | 'EFBIG'\n | 'EALREADY'\n | 'ETIMEDOUT'\n | 'ECONNABORTED'\n | 'EHOSTUNREACH'\n | 'ECONNRESET';\n\nexport class KernelError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport interface PollState {\n readable: boolean;\n\n writable: boolean;\n\n hangup: boolean;\n}\n\nexport interface KernelFile {\n read?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n peek?(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n\n write?(bytes: Uint8Array, signal?: AbortSignal): Promise<number>;\n\n close(): void | Promise<void>;\n\n poll?(): PollState;\n\n changed?(signal?: AbortSignal): Promise<void>;\n\n seek?(offset: number, whence: number): Promise<number>;\n\n flush?(): Promise<void>;\n\n pread?(max: number, at: number): Promise<Uint8Array>;\n pwrite?(bytes: Uint8Array, at: number): Promise<number>;\n\n resize?(size: number): Promise<void>;\n\n stat?(): Promise<{ path: string; size: number; orphan?: true }>;\n\n tty?: KernelTty;\n\n pty?: PtyPair;\n\n stat?(): Promise<{ size: number; path: string; orphan?: true }>;\n held?: true;\n\n heldMeta?: HeldMeta;\n}\n\nexport type HeldMeta = { dir: string; preopen?: string; twin?: number } | DeviceMeta;\n\nexport interface DeviceMeta {\n device: KernelDevice;\n access?: DeviceAccess;\n}\n\nexport type DeviceAccess = 'read' | 'write';\n\nexport type KernelDevice = 'null' | 'zero' | 'full' | 'urandom';\n\nexport function pollFile(file: KernelFile): PollState {\n return file.poll?.() ?? { readable: !!file.read, writable: !!file.write, hangup: false };\n}\n\nexport class OpenFile {\n private refs = 1;\n\n readonly file: KernelFile;\n\n constructor(file: KernelFile) {\n this.file = file;\n }\n\n retain(): this {\n this.refs += 1;\n return this;\n }\n\n release(): void | Promise<void> {\n this.refs -= 1;\n if (this.refs === 0) return this.file.close();\n }\n}\n\nexport function openPipe(capacity?: number): { read: OpenFile; write: OpenFile } {\n const pipe = new KernelPipe(capacity);\n pipe.openRead();\n pipe.openWrite();\n return {\n read: new OpenFile({\n read: async (max, signal) => {\n try {\n return await pipe.read(max, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeRead(),\n poll: () => ({ readable: pipe.readReady, writable: false, hangup: pipe.writersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n write: new OpenFile({\n write: async (bytes, signal) => {\n try {\n return await pipe.write(bytes, signal);\n } catch (e) {\n throw new KernelError((e as PipeError).code);\n }\n },\n close: () => pipe.closeWrite(),\n poll: () => ({ readable: false, writable: pipe.writeReady, hangup: pipe.readersGone }),\n changed: (signal) => pipe.changed(signal),\n }),\n };\n}\n\nexport function bytesSource(data: Uint8Array): OpenFile {\n let offset = 0;\n return new OpenFile({\n read: async (max) => {\n const out = data.subarray(offset, offset + max);\n offset += out.length;\n return out;\n },\n close: () => {},\n });\n}\n\nexport function sinkFile(onData: (bytes: Uint8Array) => void): OpenFile {\n return new OpenFile({\n write: async (bytes) => {\n onData(bytes.slice());\n return bytes.length;\n },\n close: () => {},\n });\n}\n\nexport function nullFile(): OpenFile {\n return new OpenFile({\n read: async () => new Uint8Array(0),\n write: async (bytes) => bytes.length,\n close: () => {},\n });\n}\n\nfunction written(device: KernelDevice, bytes: Uint8Array): number {\n if (device === 'full' && bytes.length > 0) throw new KernelError('ENOSPC');\n return bytes.length;\n}\n\nexport function deviceFile(device: KernelDevice, access?: DeviceAccess): OpenFile {\n const read = async (max: number): Promise<Uint8Array> => {\n if (device === 'null') return new Uint8Array(0);\n const out = new Uint8Array(max);\n if (device === 'urandom') {\n for (let at = 0; at < max; at += 65536) {\n crypto.getRandomValues(out.subarray(at, Math.min(max, at + 65536)));\n }\n }\n return out;\n };\n return new OpenFile({\n ...(access !== 'write' ? { read } : {}),\n ...(access !== 'read' ? { write: async (bytes: Uint8Array) => written(device, bytes) } : {}),\n seek: async () => 0,\n heldMeta: { device, ...(access ? { access } : {}) },\n close: () => {},\n });\n}\n\nexport function heldFile(meta?: HeldMeta): OpenFile {\n return new OpenFile({ held: true, ...(meta ? { heldMeta: meta } : {}), close: () => {} });\n}\n\nexport type KernelFdKind = 'tty' | 'stream' | 'file' | 'socket' | 'held' | 'device';\n\nexport function kernelFdKind(file: KernelFile): Exclude<KernelFdKind, 'socket'> {\n if (file.held) return 'held';\n if (file.heldMeta && 'device' in file.heldMeta) return 'device';\n if (file.tty) return 'tty';\n return file.seek ? 'file' : 'stream';\n}\n\nexport class FdTable {\n static readonly MAX_FDS = 1024;\n private fds = new Map<number, OpenFile>();\n private readonly cloexec = new Set<number>();\n\n private readonly status = new Map<number, number>();\n\n get(fd: number): OpenFile {\n const file = this.fds.get(fd);\n if (!file) throw new KernelError('EBADF');\n return file;\n }\n\n stdioTerminal(): KernelTty | undefined {\n for (const fd of [0, 1, 2]) {\n const tty = this.fds.get(fd)?.file.tty;\n if (tty) return tty;\n }\n return undefined;\n }\n\n numbers(): number[] {\n return [...this.fds.keys()].sort((a, b) => a - b);\n }\n\n has(fd: number): boolean {\n return this.fds.has(fd);\n }\n\n setCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.add(fd);\n }\n\n clearCloseOnExec(fd: number): void {\n this.get(fd);\n this.cloexec.delete(fd);\n }\n\n closesOnExec(fd: number): boolean {\n return this.cloexec.has(fd);\n }\n\n setStatusFlags(fd: number, flags: number): void {\n this.get(fd);\n this.status.set(fd, flags);\n }\n\n statusFlags(fd: number): number | undefined {\n return this.status.get(fd);\n }\n\n install(file: OpenFile, min = 0): number {\n for (let fd = min; fd < FdTable.MAX_FDS; fd++) {\n if (!this.fds.has(fd)) {\n this.fds.set(fd, file);\n return fd;\n }\n }\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EMFILE');\n }\n\n installAt(fd: number, file: OpenFile): void {\n if (fd < 0 || fd >= FdTable.MAX_FDS) {\n void Promise.resolve(file.release()).catch(() => undefined);\n throw new KernelError('EBADF');\n }\n const previous = this.fds.get(fd);\n this.fds.set(fd, file);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n void Promise.resolve(previous?.release()).catch(() => undefined);\n }\n\n dup(fd: number, min = 0): number {\n return this.install(this.get(fd).retain(), min);\n }\n\n dup2(oldFd: number, newFd: number): number {\n const file = this.get(oldFd);\n if (oldFd !== newFd) this.installAt(newFd, file.retain());\n return newFd;\n }\n\n close(fd: number): void | Promise<void> {\n const file = this.get(fd);\n this.fds.delete(fd);\n this.cloexec.delete(fd);\n this.status.delete(fd);\n return file.release();\n }\n\n fork(): FdTable {\n const child = new FdTable();\n for (const [fd, file] of this.fds) child.fds.set(fd, file.retain());\n for (const fd of this.cloexec) child.cloexec.add(fd);\n for (const [fd, flags] of this.status) child.status.set(fd, flags);\n return child;\n }\n\n async closeAll(): Promise<void> {\n const files = [...this.fds.values()];\n this.fds.clear();\n this.cloexec.clear();\n this.status.clear();\n await Promise.allSettled(files.map((file) => Promise.resolve().then(() => file.release())));\n }\n}\n", "export const E = {\n SUCCESS: 0,\n '2BIG': 1,\n ACCES: 2,\n ADDRINUSE: 3,\n ADDRNOTAVAIL: 4,\n AFNOSUPPORT: 5,\n AGAIN: 6,\n ALREADY: 7,\n BADF: 8,\n BADMSG: 9,\n BUSY: 10,\n CANCELED: 11,\n CHILD: 12,\n CONNABORTED: 13,\n CONNREFUSED: 14,\n CONNRESET: 15,\n DEADLK: 16,\n DESTADDRREQ: 17,\n DOM: 18,\n DQUOT: 19,\n EXIST: 20,\n FAULT: 21,\n FBIG: 22,\n HOSTUNREACH: 23,\n IDRM: 24,\n ILSEQ: 25,\n INPROGRESS: 26,\n INTR: 27,\n INVAL: 28,\n IO: 29,\n ISCONN: 30,\n ISDIR: 31,\n LOOP: 32,\n MFILE: 33,\n MLINK: 34,\n MSGSIZE: 35,\n MULTIHOP: 36,\n NAMETOOLONG: 37,\n NETDOWN: 38,\n NETRESET: 39,\n NETUNREACH: 40,\n NFILE: 41,\n NOBUFS: 42,\n NODEV: 43,\n NOENT: 44,\n NOEXEC: 45,\n NOLCK: 46,\n NOLINK: 47,\n NOMEM: 48,\n NOMSG: 49,\n NOPROTOOPT: 50,\n NOSPC: 51,\n NOSYS: 52,\n NOTCONN: 53,\n NOTDIR: 54,\n NOTEMPTY: 55,\n NOTRECOVERABLE: 56,\n NOTSOCK: 57,\n NOTSUP: 58,\n NOTTY: 59,\n NXIO: 60,\n OVERFLOW: 61,\n OWNERDEAD: 62,\n PERM: 63,\n PIPE: 64,\n PROTO: 65,\n PROTONOSUPPORT: 66,\n PROTOTYPE: 67,\n RANGE: 68,\n ROFS: 69,\n SPIPE: 70,\n SRCH: 71,\n STALE: 72,\n TIMEDOUT: 73,\n TXTBSY: 74,\n XDEV: 75,\n NOTCAPABLE: 76,\n} as const;\n\nexport function wasiErrnoOf(code: string | undefined): number {\n if (!code) return E.IO;\n const name = code.startsWith('E') ? code.slice(1) : code;\n if (name === 'OPNOTSUPP') return E.NOTSUP;\n if (name === 'WOULDBLOCK') return E.AGAIN;\n if (name === 'NOMEDIUM') return E.NODEV;\n return (E as Record<string, number>)[name] ?? E.IO;\n}\n\nexport const FILETYPE = {\n UNKNOWN: 0,\n BLOCK_DEVICE: 1,\n CHARACTER_DEVICE: 2,\n DIRECTORY: 3,\n REGULAR_FILE: 4,\n SOCKET_DGRAM: 5,\n SOCKET_STREAM: 6,\n SYMBOLIC_LINK: 7,\n} as const;\n\nexport const RIGHTS = {\n FD_DATASYNC: 1n << 0n,\n FD_READ: 1n << 1n,\n FD_SEEK: 1n << 2n,\n FD_FDSTAT_SET_FLAGS: 1n << 3n,\n FD_SYNC: 1n << 4n,\n FD_TELL: 1n << 5n,\n FD_WRITE: 1n << 6n,\n\n ALL: (1n << 30n) - 1n,\n} as const;\n\nexport const OFLAGS = { CREAT: 1, DIRECTORY: 2, EXCL: 4, TRUNC: 8 } as const;\nexport const FDFLAGS = { APPEND: 1, DSYNC: 2, NONBLOCK: 4, RSYNC: 8, SYNC: 16 } as const;\nexport const LOOKUP_SYMLINK_FOLLOW = 1;\nexport const WHENCE = { SET: 0, CUR: 1, END: 2 } as const;\nexport const CLOCK = { REALTIME: 0, MONOTONIC: 1, PROCESS_CPUTIME: 2, THREAD_CPUTIME: 3 } as const;\nexport const FSTFLAGS = { ATIM: 1, ATIM_NOW: 2, MTIM: 4, MTIM_NOW: 8 } as const;\nexport const EVENTTYPE = { CLOCK: 0, FD_READ: 1, FD_WRITE: 2 } as const;\nexport const SUBCLOCK_ABSTIME = 1;\n\nexport const EVENT_FD_READWRITE_HANGUP = 1;\n\nexport const RIFLAGS = { PEEK: 1, WAITALL: 2 } as const;\n\nexport const SDFLAGS = { RD: 1, WR: 2 } as const;\nexport const PREOPENTYPE_DIR = 0;\n\nexport const SIZE = {\n FILESTAT: 64,\n FDSTAT: 24,\n DIRENT: 24,\n SUBSCRIPTION: 48,\n EVENT: 32,\n} as const;\n\nexport const WASI_SIGNAL_TO_POSIX: Readonly<Record<number, number>> = Object.fromEntries(\n Array.from({ length: 30 }, (_, i) => [i + 1, i + 1 < 16 ? i + 1 : i + 2])\n);\n", "import { E } from './wasi/wasi-abi.ts';\n\nconst WASI_ERRNO: Readonly<Partial<Record<string, number>>> = {\n ...Object.fromEntries(Object.entries(E).map(([name, errno]) => [`E${name}`, errno])),\n EWOULDBLOCK: E.AGAIN,\n ENOTSUP: 138,\n EOPNOTSUPP: 138,\n ENOMEDIUM: 148,\n};\n\nexport function wasiErrno(code: string): number {\n return WASI_ERRNO[code] ?? E.IO;\n}\n", "import { KernelPipe } from '../pipe.ts';\nimport type { UplinkConn } from './uplink.ts';\n\nconst CHUNK = 64 * 1024;\n\nexport interface UplinkLink {\n rx: KernelPipe;\n tx: KernelPipe;\n}\n\nexport function hostPort(text: string): { host: string; port: number } | undefined {\n const match = /^\\[?([^\\]]*?)\\]?:(\\d{1,5})$/.exec(text);\n const port = Number(match?.[2]);\n const host = match?.[1];\n if (!host || port > 65535) return undefined;\n return { host, port };\n}\n\nasync function inbound(conn: UplinkConn, rx: KernelPipe): Promise<void> {\n for (;;) {\n while (!rx.writeReady) await rx.changed();\n if (rx.readersGone) return;\n const bytes = await conn.read();\n if (!bytes) return;\n await rx.write(bytes);\n }\n}\n\nasync function outbound(conn: UplinkConn, tx: KernelPipe): Promise<void> {\n for (;;) {\n const bytes = await tx.read(CHUNK);\n if (bytes.length === 0) {\n conn.closeWrite();\n return;\n }\n for (let at = 0; at < bytes.length; ) {\n const n = await conn.write(bytes.subarray(at));\n if (!(n > 0)) throw new Error('the uplink wrote nothing');\n at += n;\n }\n }\n}\n\nasync function released(rx: KernelPipe, tx: KernelPipe): Promise<void> {\n while (!(rx.readersGone && tx.writersGone)) await Promise.race([rx.changed(), tx.changed()]);\n}\n\nexport function uplinkLink(conn: UplinkConn, onReset: () => void): UplinkLink {\n const rx = new KernelPipe();\n const tx = new KernelPipe();\n for (const pipe of [rx, tx]) {\n pipe.openRead();\n pipe.openWrite();\n }\n let open = true;\n const close = () => {\n if (!open) return;\n open = false;\n conn.close();\n };\n void inbound(conn, rx)\n .catch(() => {\n onReset();\n close();\n tx.closeRead();\n })\n .finally(() => rx.closeWrite());\n void outbound(conn, tx)\n .catch(close)\n .finally(() => tx.closeRead());\n void released(rx, tx).then(close);\n return { rx, tx };\n}\n", "import { wasiErrno } from '../process/wasi-errno.ts';\nimport { type KernelErrno, KernelError, type KernelFile, type PollState } from './fd-table.ts';\nimport type { Routes } from './net/routes.ts';\nimport type { NetworkUplink, UplinkConn } from './net/uplink.ts';\nimport { hostPort, uplinkLink } from './net/uplink-socket.ts';\nimport { KernelPipe, PIPE_CAPACITY, PipeError } from './pipe.ts';\nexport type SockAddr =\n | {\n family: 'inet';\n host: string;\n port: number;\n }\n | {\n family: 'unix';\n path: string;\n };\nexport type SocketDomain = SockAddr['family'];\nconst SOMAXCONN = 4096;\nconst EPHEMERAL_FIRST = 32768;\nconst EPHEMERAL_LAST = 60999;\nconst SOL_SOCKET = 1;\nconst SO_TYPE = 3;\nconst SO_ERROR = 4;\nconst SO_SNDBUF = 7;\nconst SO_RCVBUF = 8;\nconst SO_ACCEPTCONN = 30;\nconst SO_DOMAIN = 39;\nconst SOCK_STREAM = 1;\nconst AF_UNIX = 1;\nconst AF_INET = 2;\nexport const SHUT_RD = 0;\nexport const SHUT_WR = 1;\nexport const SHUT_RDWR = 2;\nexport const DIAL_TIMEOUT_MS = 30_000;\nconst DIAL_ERRORS: readonly KernelErrno[] = [\n 'ECONNREFUSED',\n 'ENETUNREACH',\n 'EHOSTUNREACH',\n 'ETIMEDOUT',\n 'ECONNRESET',\n];\nexport interface UplinkRoute {\n uplink: NetworkUplink;\n routes: Routes;\n timeoutMs?: number;\n}\nfunction dialError(e: unknown, timedOut: boolean, closed: boolean): KernelError {\n if (timedOut) return new KernelError('ETIMEDOUT');\n if (closed) return new KernelError('ECONNABORTED');\n const code = (e as { code?: unknown } | null)?.code;\n const known = DIAL_ERRORS.find((errno) => errno === code);\n return new KernelError(known ?? 'EHOSTUNREACH');\n}\nfunction isLoopback(host: string): boolean {\n return /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host);\n}\nasync function pipeCall<T>(op: () => Promise<T>): Promise<T> {\n try {\n return await op();\n } catch (e) {\n if (e instanceof PipeError) throw new KernelError(e.code);\n throw e;\n }\n}\nclass Changes {\n private waiters: Array<() => void> = [];\n wait(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\ninterface Link {\n rx: KernelPipe;\n tx: KernelPipe;\n}\nfunction link(a: KernelSocket, b: KernelSocket): void {\n const ab = new KernelPipe();\n const ba = new KernelPipe();\n for (const pipe of [ab, ba]) {\n pipe.openRead();\n pipe.openWrite();\n }\n a.attach({ rx: ba, tx: ab });\n b.attach({ rx: ab, tx: ba });\n}\nexport class KernelSocket implements KernelFile {\n private readonly net: LoopbackNet;\n readonly domain: SocketDomain;\n private state: 'open' | 'connecting' | 'listening' | 'connected' | 'closed' = 'open';\n private dialing: AbortController | undefined;\n private failed: string | undefined;\n private reset = false;\n local: SockAddr | undefined;\n peer: SockAddr | undefined;\n private link: Link | undefined;\n private readShut = false;\n private writeShut = false;\n private readonly queue: KernelSocket[] = [];\n private backlog = 0;\n private boundAt: SockAddr | undefined;\n private readonly changes = new Changes();\n private readonly options = new Map<string, number>();\n constructor(net: LoopbackNet, domain: SocketDomain) {\n this.net = net;\n this.domain = domain;\n }\n attach(link: Link): void {\n this.link = link;\n this.state = 'connected';\n this.changes.wake();\n }\n get listening(): boolean {\n return this.state === 'listening';\n }\n private connection(): Link {\n if (!this.link || this.state !== 'connected') throw new KernelError('ENOTCONN');\n return this.link;\n }\n async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n const bytes = await pipeCall(() => rx.read(max, signal));\n if (bytes.length === 0 && this.reset) throw new KernelError('ECONNRESET');\n return bytes;\n }\n async peek(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n const { rx } = this.connection();\n if (this.readShut || max <= 0) return new Uint8Array(0);\n const bytes = await pipeCall(() => rx.peek(max, signal));\n if (bytes.length === 0 && this.reset) throw new KernelError('ECONNRESET');\n return bytes;\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n const { tx } = this.connection();\n if (this.writeShut) throw new KernelError('EPIPE');\n return pipeCall(() => tx.write(bytes, signal));\n }\n poll(): PollState {\n if (this.state === 'listening') {\n return { readable: this.queue.length > 0, writable: false, hangup: false };\n }\n if (this.state === 'connecting') return { readable: false, writable: false, hangup: false };\n if (this.failed) return { readable: true, writable: true, hangup: true };\n if (this.state !== 'connected' || !this.link) {\n return { readable: false, writable: false, hangup: true };\n }\n const { rx, tx } = this.link;\n return {\n readable: this.readShut || rx.readReady,\n writable: this.writeShut || tx.writeReady,\n hangup: rx.writersGone && tx.readersGone,\n };\n }\n changed(signal?: AbortSignal): Promise<void> {\n const own = this.changes.wait(signal);\n if (this.state !== 'connected' || !this.link) return own;\n const waits = [own, this.link.rx.changed(signal), this.link.tx.changed(signal)];\n for (const wait of waits) wait.catch(() => undefined);\n return pipeCall(() => Promise.race(waits));\n }\n bind(addr: SockAddr): void {\n if (this.state !== 'open' || this.local) throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n this.local = this.net.bind(this, addr);\n this.boundAt = this.local;\n }\n listen(backlog: number): void {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state !== 'open' && this.state !== 'listening') throw new KernelError('EINVAL');\n if (!this.local) {\n if (this.domain === 'unix') throw new KernelError('EINVAL');\n this.bind({ family: 'inet', host: '0.0.0.0', port: 0 });\n }\n this.backlog = Math.min(Math.max(backlog, 1), SOMAXCONN);\n this.state = 'listening';\n }\n async accept(signal?: AbortSignal, nonblock = false): Promise<KernelSocket> {\n for (;;) {\n if (this.state !== 'listening') throw new KernelError('EINVAL');\n const next = this.queue.shift();\n if (next) return next;\n if (nonblock) throw new KernelError('EAGAIN');\n await this.changes.wait(signal);\n }\n }\n offer(server: KernelSocket): boolean {\n if (this.state !== 'listening' || this.queue.length >= this.backlog) return false;\n this.queue.push(server);\n this.changes.wake();\n return true;\n }\n connect(addr: SockAddr, viaUplink = true): Promise<void> | undefined {\n if (this.state === 'connected') throw new KernelError('EISCONN');\n if (this.state === 'connecting') throw new KernelError('EALREADY');\n if (this.state !== 'open') throw new KernelError('EINVAL');\n if (addr.family !== this.domain) throw new KernelError('EAFNOSUPPORT');\n this.failed = undefined;\n const route = viaUplink && addr.family === 'inet' ? this.net.uplinkFor(addr.host) : undefined;\n if (route) return this.dial(addr as Extract<SockAddr, { family: 'inet' }>, route);\n const target = this.net.target(addr);\n if (!this.local) {\n if (addr.family === 'inet') {\n this.local = this.net.bind(this, { family: 'inet', host: '127.0.0.1', port: 0 });\n this.boundAt = this.local;\n } else this.local = { family: 'unix', path: '' };\n }\n const server = new KernelSocket(this.net, this.domain);\n server.local = addr.family === 'inet' ? { ...addr, host: canonicalHost(addr.host) } : addr;\n server.peer = this.local;\n this.peer = server.local;\n link(this, server);\n if (!target.offer(server)) {\n this.unlink();\n server.close();\n throw new KernelError('ECONNREFUSED');\n }\n return undefined;\n }\n private dial(addr: Extract<SockAddr, { family: 'inet' }>, route: UplinkRoute): Promise<void> {\n this.state = 'connecting';\n const abort = new AbortController();\n this.dialing = abort;\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n abort.abort(new KernelError('ETIMEDOUT'));\n }, route.timeoutMs ?? DIAL_TIMEOUT_MS);\n const abandoned = new Promise<never>((_, reject) => {\n abort.signal.addEventListener('abort', () => reject(abort.signal.reason), { once: true });\n });\n const { host, port } = addr;\n const dialled = new Promise<UplinkConn>((resolve) =>\n resolve(route.uplink.dial({ network: 'tcp', host, port, signal: abort.signal }))\n );\n dialled.then(\n (conn) => abort.signal.aborted && conn.close(),\n () => undefined\n );\n return Promise.race([dialled, abandoned])\n .then(\n (conn) => {\n if (abort.signal.aborted) throw dialError(abort.signal.reason, timedOut, true);\n this.local = { family: 'inet', host: '0.0.0.0', port: 0, ...hostPort(conn.localAddr) };\n this.peer = { ...addr, ...hostPort(conn.remoteAddr) };\n this.dialing = undefined;\n this.attach(\n uplinkLink(conn, () => {\n this.reset = true;\n this.changes.wake();\n })\n );\n },\n (e: unknown) => {\n const error = dialError(e, timedOut, abort.signal.aborted);\n if (this.dialing === abort) {\n this.dialing = undefined;\n this.failed = error.code;\n this.state = 'open';\n this.changes.wake();\n }\n throw error;\n }\n )\n .finally(() => clearTimeout(timer));\n }\n private unlink(): void {\n const link = this.link;\n if (link) {\n link.rx.closeRead();\n link.tx.closeWrite();\n }\n this.link = undefined;\n this.peer = undefined;\n this.state = 'open';\n }\n shutdown(how: number): void {\n const { rx, tx } = this.connection();\n if (how !== SHUT_RD && how !== SHUT_WR && how !== SHUT_RDWR) throw new KernelError('EINVAL');\n if (how !== SHUT_WR && !this.readShut) {\n this.readShut = true;\n rx.closeRead();\n }\n if (how !== SHUT_RD && !this.writeShut) {\n this.writeShut = true;\n tx.closeWrite();\n }\n this.changes.wake();\n }\n getOption(level: number, name: number): number {\n if (level === SOL_SOCKET) {\n switch (name) {\n case SO_TYPE:\n return SOCK_STREAM;\n case SO_ERROR: {\n const failed = this.failed;\n this.failed = undefined;\n return failed ? wasiErrno(failed) : 0;\n }\n case SO_ACCEPTCONN:\n return this.state === 'listening' ? 1 : 0;\n case SO_DOMAIN:\n return this.domain === 'inet' ? AF_INET : AF_UNIX;\n case SO_SNDBUF:\n case SO_RCVBUF:\n return this.options.get(`${level}:${name}`) ?? PIPE_CAPACITY;\n }\n }\n return this.options.get(`${level}:${name}`) ?? 0;\n }\n setOption(level: number, name: number, value: number): void {\n this.options.set(`${level}:${name}`, value);\n }\n close(): void {\n const was = this.state;\n this.state = 'closed';\n this.dialing?.abort(new KernelError('ECONNABORTED'));\n this.dialing = undefined;\n if (was === 'listening') {\n for (const pending of this.queue.splice(0)) pending.close();\n }\n if (this.link) {\n if (!this.readShut) this.link.rx.closeRead();\n if (!this.writeShut) this.link.tx.closeWrite();\n this.readShut = true;\n this.writeShut = true;\n }\n if (this.boundAt) this.net.release(this.boundAt, this);\n this.boundAt = undefined;\n this.changes.wake();\n }\n static pair(net: LoopbackNet, domain: SocketDomain): [KernelSocket, KernelSocket] {\n const a = new KernelSocket(net, domain);\n const b = new KernelSocket(net, domain);\n const name: SockAddr =\n domain === 'inet'\n ? { family: 'inet', host: '127.0.0.1', port: 0 }\n : { family: 'unix', path: '' };\n a.local = b.local = a.peer = b.peer = name;\n link(a, b);\n return [a, b];\n }\n}\nfunction canonicalHost(host: string): string {\n return host === '0.0.0.0' ? '127.0.0.1' : host;\n}\nfunction keyOf(addr: SockAddr): string {\n return addr.family === 'inet' ? `inet:${addr.port}` : `unix:${addr.path}`;\n}\nexport class LoopbackNet {\n private readonly bound = new Map<string, KernelSocket>();\n private readonly activators = new Map<string, () => void>();\n private readonly internal = new Set<number>();\n private nextEphemeral = EPHEMERAL_FIRST;\n private route: UplinkRoute | undefined;\n useUplink(route: UplinkRoute): void {\n this.route = route;\n }\n uplinkFor(host: string): UplinkRoute | undefined {\n const route = this.route;\n if (!route) return undefined;\n return route.routes.classify(host) === 'uplink' ? route : undefined;\n }\n kernelOnly(port: number, reserve = false): boolean {\n if (reserve) this.internal.add(port);\n return this.internal.has(port);\n }\n activate(addr: SockAddr, start: () => void): void {\n this.activators.set(keyOf(addr), start);\n }\n socket(domain: SocketDomain): KernelSocket {\n return new KernelSocket(this, domain);\n }\n listen(addr: SockAddr, backlog = 128): KernelSocket {\n const socket = this.socket(addr.family);\n socket.bind(addr);\n socket.listen(backlog);\n return socket;\n }\n connect(addr: SockAddr): KernelSocket {\n const socket = this.socket(addr.family);\n void socket.connect(addr, false);\n return socket;\n }\n bind(socket: KernelSocket, addr: SockAddr): SockAddr {\n if (addr.family === 'unix') {\n if (addr.path === '') throw new KernelError('EINVAL');\n } else if (addr.host !== '0.0.0.0' && !isLoopback(addr.host)) {\n throw new KernelError('EADDRNOTAVAIL');\n }\n const named =\n addr.family === 'inet' && addr.port === 0 ? { ...addr, port: this.ephemeral() } : addr;\n const key = keyOf(named);\n if (this.bound.has(key)) throw new KernelError('EADDRINUSE');\n this.bound.set(key, socket);\n return named;\n }\n release(addr: SockAddr, socket: KernelSocket): void {\n const key = keyOf(addr);\n if (this.bound.get(key) === socket) this.bound.delete(key);\n }\n target(addr: SockAddr): KernelSocket {\n if (addr.family === 'inet' && !isLoopback(canonicalHost(addr.host))) {\n throw new KernelError('ENETUNREACH');\n }\n const key = keyOf(addr);\n if (!this.bound.has(key)) this.activators.get(key)?.();\n const socket = this.bound.get(key);\n if (!socket?.listening) throw new KernelError('ECONNREFUSED');\n return socket;\n }\n private ephemeral(): number {\n const span = EPHEMERAL_LAST - EPHEMERAL_FIRST + 1;\n for (let i = 0; i < span; i++) {\n const port = this.nextEphemeral;\n this.nextEphemeral = port === EPHEMERAL_LAST ? EPHEMERAL_FIRST : port + 1;\n if (!this.bound.has(`inet:${port}`)) return port;\n }\n throw new KernelError('EADDRINUSE');\n }\n}\nconst namespaces = new Map<string, LoopbackNet>();\nexport function loopbackNet(owner: string): LoopbackNet {\n let net = namespaces.get(owner);\n if (!net) {\n net = new LoopbackNet();\n namespaces.set(owner, net);\n }\n return net;\n}\nexport function ownerKey(\n owner:\n | {\n kind: string;\n scoopJid?: string;\n }\n | undefined\n): string {\n return owner ? `${owner.kind}:${owner.scoopJid ?? ''}` : 'local';\n}\n", "import { KernelError } from './fd-table.ts';\nimport { type KernelSocket, type LoopbackNet, SHUT_WR } from './socket.ts';\n\nexport interface DialPortLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close(): void;\n}\n\nexport type DialMessage =\n | Uint8Array\n | { end: true }\n | { close: true }\n | { more: true }\n | { ack: true }\n | { error: string };\n\nconst CHUNK = 64 * 1024;\n\nconst LOOPBACK_NAMES = new Set(['127.0.0.1', 'localhost', '::1', '[::1]']);\n\nexport function dialSocket(net: LoopbackNet, port: number, host = '127.0.0.1'): KernelSocket {\n if (!Number.isInteger(port) || port < 1 || port > 65535) throw new KernelError('EINVAL');\n const target = LOOPBACK_NAMES.has(host.toLowerCase()) ? '127.0.0.1' : host;\n if (net.kernelOnly(port)) {\n throw Object.assign(\n new Error(`ECONNREFUSED: port ${port} only takes connections from inside the kernel`),\n {\n code: 'ECONNREFUSED',\n }\n );\n }\n return net.connect({ family: 'inet', host: target, port });\n}\n\nconst codeOf = (err: unknown) => {\n const code = (err as { code?: unknown } | null)?.code;\n return typeof code === 'string' ? code : 'EIO';\n};\n\nexport function serveSocket(\n socket: KernelSocket,\n port: DialPortLike,\n onClose?: () => void\n): () => void {\n let closed = false;\n let writes = Promise.resolve();\n let credit = 0;\n let granted: (() => void) | undefined;\n const send = (message: DialMessage, transfer?: Transferable[]) => {\n if (!closed) port.postMessage(message, transfer);\n };\n const close = (reset = false) => {\n if (closed) return;\n if (reset) send({ error: 'ECONNRESET' });\n closed = true;\n granted?.();\n socket.close();\n port.close();\n onClose?.();\n };\n const write = (data: Uint8Array) => {\n writes = writes.then(async () => {\n if (closed) return;\n try {\n await socket.write(data);\n send({ ack: true });\n } catch (err) {\n send({ error: codeOf(err) });\n }\n });\n };\n port.addEventListener('message', ({ data }: MessageEvent<DialMessage>) => {\n if (data instanceof Uint8Array) write(data);\n else if ('more' in data) {\n credit++;\n granted?.();\n } else if ('end' in data) {\n writes = writes.then(() => {\n if (!closed) socket.shutdown(SHUT_WR);\n });\n } else if ('close' in data) close();\n });\n port.start?.();\n const turn = () =>\n credit > 0 || closed ? Promise.resolve() : new Promise<void>((r) => (granted = r));\n void (async () => {\n try {\n for (;;) {\n await turn();\n if (closed) return;\n const chunk = await socket.read(CHUNK);\n if (chunk.length === 0) break;\n credit--;\n send(chunk, [chunk.buffer as ArrayBuffer]);\n }\n send({ end: true });\n } catch (err) {\n send({ error: codeOf(err) });\n }\n })();\n return () => close(true);\n}\n", "export const SIG = {\n HUP: 1,\n INT: 2,\n QUIT: 3,\n ILL: 4,\n TRAP: 5,\n ABRT: 6,\n BUS: 7,\n FPE: 8,\n KILL: 9,\n USR1: 10,\n SEGV: 11,\n USR2: 12,\n PIPE: 13,\n ALRM: 14,\n TERM: 15,\n STKFLT: 16,\n CHLD: 17,\n CONT: 18,\n STOP: 19,\n TSTP: 20,\n TTIN: 21,\n TTOU: 22,\n URG: 23,\n XCPU: 24,\n XFSZ: 25,\n VTALRM: 26,\n PROF: 27,\n WINCH: 28,\n POLL: 29,\n PWR: 30,\n SYS: 31,\n} as const;\n\nexport type DefaultAction = 'terminate' | 'ignore' | 'stop' | 'continue';\n\nconst IGNORED_BY_DEFAULT: ReadonlySet<number> = new Set([SIG.CHLD, SIG.URG, SIG.WINCH]);\nconst STOPPING: ReadonlySet<number> = new Set([SIG.STOP, SIG.TSTP, SIG.TTIN, SIG.TTOU]);\n\nexport function defaultAction(sig: number): DefaultAction {\n if (sig === SIG.CONT) return 'continue';\n if (STOPPING.has(sig)) return 'stop';\n return IGNORED_BY_DEFAULT.has(sig) ? 'ignore' : 'terminate';\n}\n\nexport function isSignal(sig: number): boolean {\n return Number.isInteger(sig) && sig >= 1 && sig <= 31;\n}\n\nexport function sigbit(sig: number): number {\n return 1 << sig;\n}\n\nexport function signalsIn(mask: number): number[] {\n const out: number[] = [];\n for (let sig = 1; sig <= 31; sig++) if (mask & sigbit(sig)) out.push(sig);\n return out;\n}\n\nexport const SIGNAL_BY_NAME: Readonly<\n Record<'SIGINT' | 'SIGTERM' | 'SIGKILL' | 'SIGSTOP' | 'SIGCONT', number>\n> = {\n SIGINT: SIG.INT,\n SIGTERM: SIG.TERM,\n SIGKILL: SIG.KILL,\n SIGSTOP: SIG.STOP,\n SIGCONT: SIG.CONT,\n};\n", "export const BODY_IDLE_MS = 5 * 60 * 1000;\n\nexport function idleFailure(ms: number): Error {\n return Object.assign(new Error(`the response body sent no data for ${ms} ms`), {\n code: 'ETIMEDOUT',\n });\n}\n\nexport async function readWithin<T>(\n reader: ReadableStreamDefaultReader<T>,\n ms: number\n): Promise<ReadableStreamReadResult<T>> {\n if (!(ms > 0 && ms < Number.POSITIVE_INFINITY)) return reader.read();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const idle = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(idleFailure(ms)), ms);\n });\n try {\n return await Promise.race([reader.read(), idle]);\n } finally {\n clearTimeout(timer);\n }\n}\n", "import type { RealmWebSocketClose, RealmWebSocketMessage } from './transport.ts';\n\nexport const INBOUND_LIMIT = 16 * 1024 * 1024;\nexport const MESSAGE_LIMIT = 64 * 1024 * 1024;\nexport const TOO_BIG = 1009;\n\nexport function payloadSize(message: RealmWebSocketMessage): number {\n return typeof message === 'string' ? new TextEncoder().encode(message).length : message.length;\n}\n\nexport class MessageQueue implements AsyncIterable<RealmWebSocketMessage> {\n private readonly items: RealmWebSocketMessage[] = [];\n private readonly limit: number;\n private waiter: (() => void) | undefined;\n private size = 0;\n private ended = false;\n private readonly overflow: () => void;\n private readonly taken: ((n: number) => void) | undefined;\n readonly closed: Promise<RealmWebSocketClose>;\n private settle!: (close: RealmWebSocketClose) => void;\n\n constructor(overflow: () => void, limit = INBOUND_LIMIT, taken?: (n: number) => void) {\n this.overflow = overflow;\n this.limit = limit;\n this.taken = taken;\n this.closed = new Promise((resolve) => {\n this.settle = resolve;\n });\n }\n\n push(message: RealmWebSocketMessage): void {\n if (this.ended) return;\n const size = payloadSize(message);\n const huge = size > MESSAGE_LIMIT;\n if (huge || (this.items.length > 0 && this.size + size > this.limit)) {\n const reason = huge\n ? `a message is over ${MESSAGE_LIMIT} bytes`\n : `over ${this.limit} bytes of messages are waiting`;\n this.end({ code: TOO_BIG, reason });\n this.overflow();\n return;\n }\n this.size += size;\n this.items.push(message);\n this.wake();\n }\n\n end(close: RealmWebSocketClose): void {\n if (this.ended) return;\n this.ended = true;\n this.settle(close);\n this.wake();\n }\n\n private wake(): void {\n const waiter = this.waiter;\n this.waiter = undefined;\n waiter?.();\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<RealmWebSocketMessage> {\n for (;;) {\n const next = this.items.shift();\n if (next !== undefined) {\n const n = payloadSize(next);\n this.size -= n;\n this.taken?.(n);\n yield next;\n continue;\n }\n if (this.ended) return;\n await new Promise<void>((resolve) => {\n this.waiter = resolve;\n });\n }\n }\n}\n", "import type {\n HeaderList,\n RealmWebSocket,\n RealmWebSocketMessage,\n RealmWebSocketRequest,\n} from './kernel/net/transport.ts';\nimport { MessageQueue } from './kernel/net/ws-queue.ts';\n\nexport interface WebSocketLike {\n binaryType: string;\n readonly protocol: string;\n readonly bufferedAmount: number;\n send(data: string | ArrayBufferView): void;\n close(code?: number, reason?: string): void;\n addEventListener(type: string, listener: (event: never) => void): void;\n}\n\nexport type WebSocketConstructor = new (url: string, init?: unknown) => WebSocketLike;\n\nconst SENT_HEADERS_DROP = new Set([\n 'host',\n 'connection',\n 'upgrade',\n 'sec-websocket-key',\n 'sec-websocket-version',\n 'sec-websocket-extensions',\n 'sec-websocket-protocol',\n]);\n\nfunction headerRecord(headers: HeaderList): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [name, value] of headers) {\n if (!SENT_HEADERS_DROP.has(name.toLowerCase())) out[name] = value;\n }\n return out;\n}\n\nexport function sendableClose(code?: number): number {\n return code === 1000 || (code !== undefined && code >= 3000 && code <= 4999) ? code : 1000;\n}\n\nfunction blockedReason(url: string, e: unknown): string {\n const name = (e as { name?: unknown } | null)?.name;\n if (name === 'SecurityError' && url.startsWith('ws:')) {\n return `${url}: ws:// is blocked from an https page; use wss:// or slicc-node`;\n }\n return `${url}: ${e instanceof Error ? e.message : String(e)}`;\n}\n\nexport function openWebSocket(\n Socket: WebSocketConstructor,\n request: RealmWebSocketRequest,\n withHeaders: boolean\n): Promise<RealmWebSocket> {\n const { url, protocols, signal } = request;\n signal.throwIfAborted();\n let socket: WebSocketLike;\n try {\n socket = withHeaders\n ? new Socket(url, { protocols, headers: headerRecord(request.headers) })\n : new Socket(url, protocols);\n } catch (e) {\n return Promise.reject(Object.assign(new Error(blockedReason(url, e)), { status: 502 }));\n }\n socket.binaryType = 'arraybuffer';\n const queue = new MessageQueue(() => socket.close(1000, 'too many waiting messages'));\n return new Promise((resolve, reject) => {\n let open = false;\n const abort = () => {\n socket.close(1000, 'aborted');\n reject(signal.reason);\n };\n signal.addEventListener('abort', abort, { once: true });\n socket.addEventListener('open', () => {\n open = true;\n signal.removeEventListener('abort', abort);\n resolve({\n protocol: socket.protocol,\n get buffered() {\n return socket.bufferedAmount;\n },\n send: (data: RealmWebSocketMessage) => socket.send(data),\n messages: queue,\n close: (code?: number, reason?: string) => socket.close(sendableClose(code), reason),\n closed: queue.closed,\n });\n });\n socket.addEventListener('message', (event: { data: string | ArrayBuffer }) => {\n queue.push(typeof event.data === 'string' ? event.data : new Uint8Array(event.data));\n });\n socket.addEventListener('close', (event: { code: number; reason: string }) => {\n queue.end({ code: event.code, reason: event.reason });\n if (open) return;\n signal.removeEventListener('abort', abort);\n reject(\n Object.assign(new Error(`${url}: the WebSocket closed (${event.code}) before it opened`), {\n status: 502,\n })\n );\n });\n });\n}\n", "import { BODY_IDLE_MS, readWithin } from './body-idle.ts';\nimport type { TransportCall, TransportReply } from './kernel/net/remote-transport.ts';\nimport type {\n HeaderList,\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n RealmTransportTraits,\n RealmWebSocket,\n RealmWebSocketRequest,\n} from './kernel/net/transport.ts';\nimport { INBOUND_LIMIT, MESSAGE_LIMIT, payloadSize } from './kernel/net/ws-queue.ts';\nimport { openWebSocket, type WebSocketConstructor } from './websocket-transport.ts';\n\nexport type {\n HeaderList,\n RealmTransport as NetworkTransport,\n RealmTransportRequest as NetworkRequest,\n RealmTransportResponse as NetworkResponse,\n RealmTransportTraits as NetworkTraits,\n RealmWebSocket as NetworkWebSocket,\n RealmWebSocketRequest as NetworkWebSocketRequest,\n};\n\nexport interface FetchTransportOptions {\n fetch?: typeof globalThis.fetch;\n maxRequestBody?: number;\n hint?: string;\n bodyIdleMs?: number;\n webSocket?: boolean | WebSocketConstructor;\n webSocketHeaders?: boolean;\n}\n\nexport const SEND_BUFFER = 1024 * 1024;\nconst CLOSE_WAIT_MS = 5000;\n\nconst NO_WEBSOCKET =\n 'WebSocket not supported by this transport (fetchTransport needs { webSocket: true })';\n\nconst MAX_REQUEST_BODY = 64 * 1024 * 1024;\n\nfunction joinHeaders(headers: HeaderList): Headers {\n const out = new Headers();\n for (const [name, value] of headers) {\n try {\n out.append(name, value);\n } catch {}\n }\n return out;\n}\n\nasync function* chunks(\n body: ReadableStream<Uint8Array> | null,\n idleMs: number\n): AsyncGenerator<Uint8Array> {\n if (!body) return;\n const reader = body.getReader();\n try {\n for (\n let next = await readWithin(reader, idleMs);\n !next.done;\n next = await readWithin(reader, idleMs)\n ) {\n if (next.value.byteLength > 0) yield next.value;\n }\n } finally {\n await reader.cancel().catch(() => undefined);\n }\n}\n\nexport function fetchTransport(options: FetchTransportOptions = {}): RealmTransport {\n const send = options.fetch ?? globalThis.fetch.bind(globalThis);\n const Socket =\n options.webSocket === true\n ? (globalThis as { WebSocket?: WebSocketConstructor }).WebSocket\n : options.webSocket || undefined;\n const headers = options.webSocketHeaders === true;\n return {\n traits: {\n manualRedirects: false,\n encodedBodies: false,\n maxRequestBody: options.maxRequestBody ?? MAX_REQUEST_BODY,\n crossOrigin: 'cors',\n ...(Socket ? { websocket: true as const } : {}),\n },\n ...(Socket ? { websocket: (request) => openWebSocket(Socket, request, headers) } : {}),\n async fetch(request: RealmTransportRequest): Promise<RealmTransportResponse> {\n let response: Response;\n try {\n response = await send(request.url, {\n method: request.method,\n headers: joinHeaders(request.headers),\n ...(request.body ? { body: request.body as BodyInit } : {}),\n signal: request.signal,\n redirect: 'follow',\n credentials: 'omit',\n mode: 'cors',\n });\n } catch (e) {\n if (request.signal.aborted) throw e;\n throw Object.assign(\n new Error(\n `fetch ${request.url} failed (unreachable, or not allowed by CORS)${options.hint ? `: ${options.hint}` : ''}`\n ),\n { status: 502 }\n );\n }\n const headers: Array<[string, string]> = [];\n response.headers.forEach((value, name) => {\n headers.push([name, value]);\n });\n const body = chunks(response.body, options.bodyIdleMs ?? BODY_IDLE_MS);\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n cancel: async () => {\n await body.return(undefined);\n await response.body?.cancel().catch(() => undefined);\n },\n };\n },\n };\n}\n\nexport interface TransportPeer {\n postMessage(message: TransportReply, transfer?: Transferable[]): void;\n}\n\nexport interface TransportServer {\n answer(call: TransportCall): void;\n close(): void;\n}\n\ninterface Flow {\n inflight: number;\n closing: boolean;\n deadline(): void;\n wake?: () => void;\n}\n\nexport function serveTransport(\n peer: TransportPeer,\n transport: RealmTransport,\n { closeWaitMs = CLOSE_WAIT_MS }: { closeWaitMs?: number } = {}\n): TransportServer {\n const open = new Map<\n number,\n { abort: AbortController; body?: AsyncIterator<Uint8Array>; response?: RealmTransportResponse }\n >();\n const fail = (nid: number, e: unknown) => {\n open.delete(nid);\n const { status, code } = e as { status?: unknown; code?: unknown };\n peer.postMessage({\n net: 'error',\n nid,\n message: e instanceof Error ? e.message : String(e),\n ...(typeof status === 'number' ? { status } : {}),\n ...(typeof code === 'string' ? { code } : {}),\n });\n };\n const start = async (call: Extract<TransportCall, { net: 'fetch' }>) => {\n const abort = new AbortController();\n const entry: { abort: AbortController; body?: AsyncIterator<Uint8Array> } = { abort };\n open.set(call.nid, entry);\n try {\n const response = await transport.fetch({\n url: call.url,\n method: call.method,\n headers: call.headers,\n ...(call.body ? { body: call.body } : {}),\n signal: abort.signal,\n });\n if (!open.has(call.nid)) {\n await response.cancel();\n return;\n }\n open.set(call.nid, { abort, body: response.body[Symbol.asyncIterator](), response });\n peer.postMessage({\n net: 'head',\n nid: call.nid,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n } catch (e) {\n fail(call.nid, e);\n }\n };\n const sockets = new Map<number, RealmWebSocket>();\n const credit = new Map<number, Flow>();\n const refill = (nid: number, n: number, closing = false) => {\n const flow = credit.get(nid);\n if (!flow) return;\n flow.inflight -= n;\n if (closing && !flow.closing) {\n flow.closing = true;\n flow.deadline();\n }\n flow.wake?.();\n };\n const openSocket = async (call: Extract<TransportCall, { net: 'ws-open' }>) => {\n const abort = new AbortController();\n open.set(call.nid, { abort });\n try {\n if (!transport.websocket) throw new Error(NO_WEBSOCKET);\n const socket = await transport.websocket({\n url: call.url,\n protocols: call.protocols,\n headers: call.headers,\n signal: abort.signal,\n });\n if (!open.delete(call.nid)) {\n socket.close(1000, 'cancelled');\n return;\n }\n sockets.set(call.nid, socket);\n peer.postMessage({ net: 'ws-opened', nid: call.nid, protocol: socket.protocol });\n void relay(call.nid, socket);\n } catch (e) {\n fail(call.nid, e);\n }\n };\n const relay = async (nid: number, socket: RealmWebSocket) => {\n let ending: { code: number; reason: string };\n let late!: () => void;\n const unanswered = new Promise<'late'>((resolve) => {\n late = () => resolve('late');\n });\n const flow: Flow = {\n inflight: 0,\n closing: false,\n deadline: () =>\n AbortSignal.timeout(closeWaitMs).addEventListener('abort', late, { once: true }),\n };\n credit.set(nid, flow);\n const timedOut = { code: 1006, reason: 'the far end did not answer the close' };\n let oversize = false;\n try {\n const messages = socket.messages[Symbol.asyncIterator]();\n for (;;) {\n const next = await Promise.race([messages.next(), unanswered]);\n if (next === 'late' || next.done) break;\n const data = next.value;\n if (flow.closing) continue;\n if (payloadSize(data) > MESSAGE_LIMIT) {\n oversize = true;\n break;\n }\n if (typeof data === 'string') peer.postMessage({ net: 'ws-message', nid, data });\n else {\n const bytes = data.slice();\n peer.postMessage({ net: 'ws-message', nid, data: bytes }, [bytes.buffer]);\n }\n flow.inflight += payloadSize(data);\n while (flow.inflight > INBOUND_LIMIT && !flow.closing) {\n await new Promise<void>((resolve) => {\n flow.wake = resolve;\n });\n }\n }\n if (oversize) socket.close(1000, 'a message is too big');\n ending = oversize\n ? { code: 1009, reason: `a message is over ${MESSAGE_LIMIT} bytes` }\n : await Promise.race([socket.closed, unanswered.then(() => timedOut)]);\n } catch (e) {\n socket.close(1000, 'the relay failed');\n ending = { code: 1011, reason: e instanceof Error ? e.message : String(e) };\n }\n sockets.delete(nid);\n credit.delete(nid);\n peer.postMessage({ net: 'ws-closed', nid, ...ending });\n };\n const sendOn = async (call: Extract<TransportCall, { net: 'ws-send' }>) => {\n const socket = sockets.get(call.nid);\n if (!socket) return;\n socket.send(call.data);\n while (socket.buffered > SEND_BUFFER && sockets.has(call.nid)) {\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n peer.postMessage({ net: 'ws-acked', nid: call.nid, n: payloadSize(call.data) });\n };\n const read = async (nid: number) => {\n const body = open.get(nid)?.body;\n if (!body) return;\n try {\n const next = await body.next();\n if (next.done) {\n open.delete(nid);\n peer.postMessage({ net: 'end', nid });\n } else {\n const bytes = next.value.slice();\n peer.postMessage({ net: 'chunk', nid, bytes }, [bytes.buffer]);\n }\n } catch (e) {\n fail(nid, e);\n }\n };\n const drop = (nid: number) => {\n sockets.get(nid)?.close(1000, 'cancelled');\n refill(nid, 0, true);\n const entry = open.get(nid);\n open.delete(nid);\n entry?.abort.abort();\n void entry?.response?.cancel().catch(() => undefined);\n };\n return {\n answer(call) {\n if (call.net === 'fetch') void start(call);\n else if (call.net === 'read') void read(call.nid);\n else if (call.net === 'ws-open') void openSocket(call);\n else if (call.net === 'ws-send') void sendOn(call);\n else if (call.net === 'ws-close') {\n sockets.get(call.nid)?.close(call.code, call.reason);\n refill(call.nid, 0, true);\n } else if (call.net === 'ws-consumed') refill(call.nid, call.n);\n else drop(call.nid);\n },\n close() {\n for (const nid of [...open.keys(), ...sockets.keys()]) drop(nid);\n },\n };\n}\n", "import type { WatchChange } from '../fs/watch.ts';\nimport type { TransportCall, TransportReply } from '../kernel/net/remote-transport.ts';\nimport type { RealmTransportTraits } from '../kernel/net/transport.ts';\nimport type { MountSpec } from '../mount/mount-fs.ts';\n\nexport const PROTOCOL: readonly [number, number] = [1, 7];\n\nexport interface ClientHello {\n protocol: readonly [number, number];\n lock?: string;\n}\n\nexport interface KernelHello {\n protocol: readonly [number, number];\n lock?: string;\n traits?: RealmTransportTraits;\n error?: string;\n}\n\nexport interface SpawnRequestOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n pgid?: number;\n}\n\nexport interface TerminalRequestOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n}\n\nexport type TerminalAction =\n | { action: 'write'; bytes: Uint8Array }\n | { action: 'resize'; cols: number; rows: number }\n | { action: 'signal'; signal: string }\n | { action: 'close' };\n\nexport const FS_METHODS = [\n 'readFile',\n 'writeFile',\n 'stat',\n 'lstat',\n 'readdir',\n 'mkdir',\n 'rm',\n 'rename',\n 'realpath',\n 'symlink',\n 'readlink',\n 'exists',\n] as const;\n\nexport type FsMethod = (typeof FS_METHODS)[number];\n\nexport type ClientCall =\n | { op: 'spawn'; argv: string[]; options: SpawnRequestOptions }\n | { op: 'open-terminal'; argv: string[]; options: TerminalRequestOptions }\n | ({ op: 'terminal'; terminal: number } & TerminalAction)\n | { op: 'kill'; pid: number; signal: string }\n | { op: 'ps' }\n | { op: 'fs'; method: FsMethod; args: unknown[] }\n | { op: 'watch'; paths: string[]; recursive: boolean }\n | { op: 'unwatch'; watch: number }\n | { op: 'mount'; spec: MountSpec }\n | { op: 'umount'; target: string }\n | { op: 'mounts' }\n | { op: 'dial'; port: number; host?: string }\n | { op: 'serve-cdp'; runtime?: string }\n | { op: 'unserve-cdp'; registration: number }\n | { op: 'detach'; kill?: boolean };\n\nexport type ClientRequest = ClientCall & { id: number };\n\nexport interface ClientReply {\n id: number;\n result?: unknown;\n error?: string;\n code?: string;\n fd?: 1 | 2;\n bytes?: Uint8Array;\n started?: number;\n}\n\nexport type ClientMessage = { hello: ClientHello } | ClientRequest | TransportCall;\n\nexport interface WatchEvent {\n watch: number;\n change: WatchChange;\n}\n\nexport type KernelMessage = { hello: KernelHello } | ClientReply | WatchEvent | TransportReply;\n\nexport interface ProcessEntry {\n pid: number;\n ppid: number;\n pgid: number;\n sid: number;\n argv: string[];\n tty: string | null;\n started: number;\n state: 'S' | 'Z';\n memory: number;\n}\n\nexport interface MessagePortLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'close', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close?(): void;\n}\n\nexport interface LockManagerLike {\n request(name: string, callback: () => Promise<unknown> | unknown): Promise<unknown>;\n}\n\nexport function locksOf(scope: object = globalThis): LockManagerLike | undefined {\n const locks = (scope as { navigator?: { locks?: LockManagerLike } }).navigator?.locks;\n return typeof locks?.request === 'function' ? locks : undefined;\n}\n\nexport function versionError(theirs: unknown): string | undefined {\n const major = Array.isArray(theirs) ? theirs[0] : undefined;\n if (major === PROTOCOL[0]) return undefined;\n const named = typeof major === 'number' ? `${major}.x` : 'without a version';\n return `slicc-kernel client protocol ${named} is not supported: this side speaks ${PROTOCOL.join('.')}`;\n}\n", "import { portCdpHook } from '../cdp/port.ts';\nimport { fsError, type KernelFs } from '../fs/types.ts';\nimport { dialSocket, serveSocket } from '../kernel/dial.ts';\nimport type { TransportCall } from '../kernel/net/remote-transport.ts';\nimport type { RealmTransport } from '../kernel/net/transport.ts';\nimport { SIG } from '../kernel/signals.ts';\nimport type { Launcher, TerminalSession } from '../launcher.ts';\nimport { serveTransport, type TransportServer } from '../transport.ts';\nimport {\n type ClientHello,\n type ClientRequest,\n FS_METHODS,\n type LockManagerLike,\n type MessagePortLike,\n PROTOCOL,\n type ProcessEntry,\n type TerminalAction,\n versionError,\n} from './protocol.ts';\n\nexport interface ClientHost {\n scope?: 'transport';\n launcher: () => Promise<Launcher>;\n transport?: () => RealmTransport;\n locks?: LockManagerLike;\n lock?: string;\n signal?: (name: string) => number;\n}\n\nexport interface ServedClient {\n detach(kill?: boolean): void;\n readonly closed: Promise<void>;\n}\n\ninterface Answer {\n result: unknown;\n transfer?: Transferable[];\n}\n\nconst MAX_LINKS = 40;\n\nfunction act(session: TerminalSession, req: TerminalAction, signal: (name: string) => number) {\n if (req.action === 'write') session.write(req.bytes);\n else if (req.action === 'resize') session.resize(req.cols, req.rows);\n else if (req.action === 'signal') session.signal(signal(req.signal));\n else session.close();\n}\n\nasync function realpath(fs: KernelFs, path: string): Promise<string> {\n let parts = fs.resolvePath('/', path).split('/').filter(Boolean);\n let resolved = '';\n for (let hops = 0; parts.length > 0; ) {\n const [name, ...rest] = parts;\n const next = `${resolved}/${name}`;\n if (!(await fs.lstat(next)).isSymbolicLink) {\n resolved = next;\n parts = rest;\n continue;\n }\n if (++hops > MAX_LINKS) throw fsError('ELOOP', path);\n const target = await fs.readlink(next);\n const base = target.startsWith('/') ? '/' : resolved || '/';\n parts = [...fs.resolvePath(base, target).split('/').filter(Boolean), ...rest];\n resolved = '';\n }\n return resolved || '/';\n}\n\nasync function fsCall(fs: KernelFs, method: string, args: unknown[]): Promise<Answer> {\n const path = (i: number) => fs.resolvePath('/', String(args[i]));\n switch (method) {\n case 'readFile': {\n const bytes = (await fs.readFileBuffer(path(0))).slice();\n return { result: bytes, transfer: [bytes.buffer] };\n }\n case 'writeFile':\n await fs.writeFile(path(0), args[1] as Uint8Array | string);\n return { result: true };\n case 'stat':\n return { result: await fs.stat(path(0)) };\n case 'lstat':\n return { result: await fs.lstat(path(0)) };\n case 'readdir':\n return { result: await fs.readdir(path(0)) };\n case 'mkdir':\n await fs.mkdir(path(0), { recursive: true });\n return { result: true };\n case 'rm':\n await fs.rm(path(0), { recursive: true, force: args[1] === true });\n return { result: true };\n case 'rename':\n await fs.rename(path(0), path(1));\n return { result: true };\n case 'realpath':\n return { result: await realpath(fs, String(args[0])) };\n case 'symlink':\n await fs.symlink(String(args[0]), path(1));\n return { result: true };\n case 'readlink':\n return { result: await fs.readlink(path(0)) };\n default:\n return { result: await fs.exists(path(0)) };\n }\n}\n\nfunction signalOf(host: ClientHost): (name: string) => number {\n return (\n host.signal ??\n ((name) => {\n throw fsError('EINVAL', `this kernel names no signal ${name}`);\n })\n );\n}\n\nfunction dialFor(\n l: Launcher,\n req: Extract<ClientRequest, { op: 'dial' }>,\n open: Map<number, () => void>\n): Answer {\n const socket = dialSocket(l.net, req.port, req.host);\n const { port1, port2 } = new MessageChannel();\n open.set(\n req.id,\n serveSocket(socket, port1, () => open.delete(req.id))\n );\n return { result: port2, transfer: [port2] };\n}\n\nfunction killGroups(host: ClientHost, pgids: number[]): void {\n if (pgids.length === 0) return;\n void host.launcher().then((launcher) => {\n for (const pgid of pgids) launcher.kill(-pgid, SIG.KILL);\n });\n}\n\nfunction joinable(l: Launcher, pgid: number, ours: (sid: number) => boolean): void {\n const sid = l.groupSession(pgid);\n if (sid === undefined) throw fsError('ESRCH', `no process group ${pgid}`);\n if (!ours(sid)) throw fsError('EPERM', `process group ${pgid} is in another session`);\n}\n\nfunction cdpRegistry(\n send: (message: object, transfer: Transferable[]) => void,\n gone: Promise<void>\n) {\n const registered = new Map<number, () => void>();\n const drop = (id: number) => {\n registered.get(id)?.();\n return registered.delete(id);\n };\n return {\n serve(l: Launcher, req: Extract<ClientRequest, { op: 'serve-cdp' }>): number {\n const hook = portCdpHook(\n (request, cdp) =>\n send({ cdpOpen: { ...request, registration: req.id }, port: cdp }, [\n cdp as unknown as Transferable,\n ]),\n gone\n );\n registered.set(req.id, l.cdp.register(hook, req.runtime));\n return req.id;\n },\n drop,\n close: () => {\n for (const id of [...registered.keys()]) drop(id);\n },\n };\n}\n\nfunction watchOp(\n l: Launcher,\n req: Extract<ClientRequest, { op: 'watch' | 'unwatch' }>,\n watches: Map<number, () => void>,\n send: (message: object) => void\n): Answer {\n if (req.op === 'unwatch') {\n watches.get(req.watch)?.();\n watches.delete(req.watch);\n return { result: true };\n }\n const unwatch = l.watchers.watch(req.paths, { recursive: req.recursive }, (change) =>\n send({ watch: req.id, change })\n );\n watches.set(req.id, unwatch);\n return { result: req.id };\n}\n\nexport function serveClient(port: MessagePortLike, host: ClientHost): ServedClient {\n let state: 'new' | 'open' | 'closed' = 'new';\n const terminals = new Map<number, TerminalSession>();\n const groups = new Set<number>();\n const sessions = new Set<number>();\n const watches = new Map<number, () => void>();\n let net: TransportServer | undefined;\n const ended = Promise.withResolvers<void>();\n const send = (message: object, transfer: Transferable[] = []) => {\n if (state !== 'closed') port.postMessage(message, transfer);\n };\n const reply = (id: number, body: object, transfer?: Transferable[]) =>\n send({ id, ...body }, transfer);\n const cdps = cdpRegistry(send, ended.promise);\n\n function detach(kill = false, bye = 'the slicc-kernel detached this client'): void {\n if (state === 'closed') return;\n send({ bye });\n state = 'closed';\n net?.close();\n for (const unwatch of watches.values()) unwatch();\n watches.clear();\n cdps.close();\n for (const session of terminals.values()) session.close();\n terminals.clear();\n if (kill) killGroups(host, [...groups]);\n groups.clear();\n port.close?.();\n ended.resolve();\n }\n\n async function hello(message: ClientHello): Promise<void> {\n const refused = versionError(message.protocol);\n if (refused) {\n send({ hello: { protocol: PROTOCOL, error: refused } });\n detach();\n return;\n }\n const launcher = await host.launcher();\n const transport = host.transport?.() ?? launcher.transport;\n net = serveTransport({ postMessage: (m, t) => send(m, t) }, transport);\n state = 'open';\n if (message.lock && host.locks) void host.locks.request(message.lock, () => detach());\n send({\n hello: {\n protocol: PROTOCOL,\n traits: transport.traits,\n ...(host.lock ? { lock: host.lock } : {}),\n },\n });\n }\n\n async function terminal(req: Extract<ClientRequest, { op: 'open-terminal' }>, l: Launcher) {\n const session = await l.openTerminal(req.argv, {\n ...req.options,\n onData: (bytes) => reply(req.id, { fd: 1, bytes: bytes.slice() }),\n });\n if (state === 'closed') {\n session.close();\n } else {\n terminals.set(req.id, session);\n sessions.add(session.pid);\n reply(req.id, { started: session.pid });\n }\n try {\n return { result: await session.exited };\n } finally {\n terminals.delete(req.id);\n }\n }\n\n async function spawn(req: Extract<ClientRequest, { op: 'spawn' }>, l: Launcher) {\n const out = (fd: 1 | 2) => (bytes: Uint8Array) => reply(req.id, { fd, bytes: bytes.slice() });\n if (req.options.pgid !== undefined) joinable(l, req.options.pgid, (sid) => sessions.has(sid));\n let leader: number | undefined;\n const result = await l.run(req.argv, {\n ...req.options,\n collect: false,\n onStdout: out(1),\n onStderr: out(2),\n onStarted: (pid) => {\n leader = pid;\n if (state === 'closed') return;\n groups.add(req.options.pgid ?? pid);\n if (req.options.pgid === undefined) sessions.add(pid);\n reply(req.id, { started: pid });\n },\n });\n if (leader === undefined) throw fsError('ENOENT', `${req.argv[0] ?? ''}: command not found`);\n if (!l.list().some((p) => p.pgid === leader)) groups.delete(leader);\n return { result: result.status };\n }\n\n async function handle(req: ClientRequest): Promise<Answer> {\n if (host.scope === 'transport' && req.op !== 'detach') {\n throw fsError('EPERM', `${req.op}: this client may only use the network transport`);\n }\n const l = await host.launcher();\n switch (req.op) {\n case 'spawn':\n return spawn(req, l);\n case 'open-terminal':\n return terminal(req, l);\n case 'terminal': {\n const session = terminals.get(req.terminal);\n if (!session) throw new Error(`no terminal ${req.terminal}`);\n act(session, req, signalOf(host));\n return { result: true };\n }\n case 'kill':\n if (!l.kill(req.pid, signalOf(host)(req.signal))) throw fsError('ESRCH', `pid ${req.pid}`);\n return { result: true };\n case 'ps':\n return {\n result: l.list().map(({ tid: _, ...entry }): ProcessEntry => entry),\n };\n case 'fs':\n if (!(FS_METHODS as readonly string[]).includes(req.method)) {\n throw new Error(`unknown file system call ${req.method}`);\n }\n return fsCall(l.fs, req.method, req.args);\n case 'watch':\n case 'unwatch':\n return watchOp(l, req, watches, send);\n case 'mount':\n return { result: await l.mount(req.spec) };\n case 'umount':\n l.umount(req.target);\n return { result: true };\n case 'mounts':\n return { result: l.mounts.list() };\n case 'dial':\n return dialFor(l, req, watches);\n case 'serve-cdp':\n return { result: cdps.serve(l, req) };\n case 'unserve-cdp':\n return { result: cdps.drop(req.registration) };\n case 'detach':\n return { result: true };\n default:\n throw new Error(`unknown op ${(req as { op: string }).op}`);\n }\n }\n\n port.addEventListener('message', (event) => {\n const data = event.data as { hello?: ClientHello; net?: unknown };\n if (state === 'closed') return;\n if (data.hello) {\n if (state === 'new') {\n hello(data.hello).catch((err: unknown) => {\n send({ hello: { protocol: PROTOCOL, error: String((err as Error)?.message ?? err) } });\n detach();\n });\n }\n return;\n }\n if (state !== 'open') return;\n if (data.net !== undefined) {\n net?.answer(data as TransportCall);\n return;\n }\n const req = data as ClientRequest;\n handle(req).then(\n ({ result, transfer }) => {\n reply(req.id, { result }, transfer);\n if (req.op === 'detach') detach(req.kill === true);\n },\n (err: unknown) => {\n const code = (err as { code?: unknown })?.code;\n reply(req.id, {\n error: err instanceof Error ? err.message : String(err),\n ...(typeof code === 'string' ? { code } : {}),\n });\n }\n );\n });\n port.addEventListener('close', () => detach());\n port.start?.();\n return { detach, closed: ended.promise };\n}\n", "export interface MetaEntry {\n path: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n mtimeFor?: number;\n ctimeMs?: number;\n ino?: number;\n link?: string;\n dir?: string;\n}\n\nexport type MetaChange = (entry: MetaEntry | undefined) => MetaEntry | undefined;\n\nexport interface MetaStore {\n get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>>;\n update(path: string, change: MetaChange): Promise<void>;\n move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry): Promise<void>;\n remove(paths: readonly string[]): Promise<void>;\n links(dir: string): Promise<MetaEntry[]>;\n under(path: string): Promise<MetaEntry[]>;\n all(): Promise<MetaEntry[]>;\n}\n\nexport const META_DB = 'slicc-kernel';\nexport const META_VERSION = 1;\nexport const META_STORE = 'entries';\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction moved(entry: MetaEntry, path: string): MetaEntry {\n return entry.link === undefined ? { ...entry, path } : { ...entry, path, dir: parentOf(path) };\n}\n\nfunction under(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport class MemoryMeta implements MetaStore {\n private readonly entries = new Map<string, MetaEntry>();\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n return paths.map((path) => this.entries.get(path));\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n this.set(path, change(this.entries.get(path)));\n }\n\n private set(path: string, entry: MetaEntry | undefined): void {\n if (entry) this.entries.set(path, entry);\n else this.entries.delete(path);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n await this.remove([to]);\n const carried = [...this.entries.values()].filter((entry) => under(entry.path, from));\n for (const entry of carried) this.entries.delete(entry.path);\n for (const entry of carried) {\n const path = to + entry.path.slice(from.length);\n if (path !== to) this.entries.set(path, moved(entry, path));\n }\n this.entries.set(to, moved(root(carried.find((entry) => entry.path === from)), to));\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n for (const key of [...this.entries.keys()]) {\n if (paths.some((path) => under(key, path))) this.entries.delete(key);\n }\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => entry.dir === dir);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n return [...this.entries.values()].filter((entry) => under(entry.path, path));\n }\n\n async all(): Promise<MetaEntry[]> {\n return [...this.entries.values()];\n }\n}\n\nfunction descendants(path: string): IDBKeyRange {\n return IDBKeyRange.bound(`${path}/`, `${path}0`, false, true);\n}\n\nfunction settle<T>(transaction: IDBTransaction, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve(value());\n transaction.onabort = () =>\n reject(transaction.error ?? new Error('metadata transaction aborted'));\n });\n}\n\ninterface Invalidation {\n paths?: readonly string[];\n trees?: readonly string[];\n}\n\nexport class IndexedDbMeta implements MetaStore {\n private readonly db: IDBDatabase;\n private readonly cache = new Map<string, MetaEntry | null>();\n private readonly channel: BroadcastChannel;\n private generation = 0;\n\n constructor(db: IDBDatabase) {\n this.db = db;\n db.onversionchange = () => db.close();\n this.channel = new BroadcastChannel(`slicc-kernel-meta:${db.name}`);\n this.channel.onmessage = ({ data }) => this.drop(data as Invalidation);\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n\n private drop({ paths = [], trees = [] }: Invalidation): void {\n this.generation++;\n for (const path of paths) this.cache.delete(path);\n for (const key of [...this.cache.keys()]) {\n if (trees.some((tree) => under(key, tree))) this.cache.delete(key);\n }\n }\n\n private changed(invalidation: Invalidation): void {\n this.drop(invalidation);\n this.channel.postMessage(invalidation);\n }\n\n private transaction(mode: IDBTransactionMode): [IDBTransaction, IDBObjectStore] {\n const transaction = this.db.transaction(META_STORE, mode);\n return [transaction, transaction.objectStore(META_STORE)];\n }\n\n async get(paths: readonly string[]): Promise<Array<MetaEntry | undefined>> {\n const missing = paths.filter((path) => !this.cache.has(path));\n if (missing.length > 0) {\n const generation = this.generation;\n const [transaction, store] = this.transaction('readonly');\n const found = new Map<string, MetaEntry | null>();\n for (const path of missing) {\n const request = store.get(path);\n request.onsuccess = () => void found.set(path, request.result ?? null);\n }\n await settle(transaction, () => undefined);\n if (generation === this.generation)\n for (const [path, entry] of found) this.cache.set(path, entry);\n return paths.map(\n (path) => (found.has(path) ? found.get(path) : this.cache.get(path)) ?? undefined\n );\n }\n return paths.map((path) => this.cache.get(path) ?? undefined);\n }\n\n async update(path: string, change: MetaChange): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n const request = store.get(path);\n let next: MetaEntry | undefined;\n request.onsuccess = () => {\n next = change(request.result);\n if (next) store.put(next);\n else store.delete(path);\n };\n await settle(transaction, () => undefined);\n this.changed({ paths: [path] });\n this.cache.set(path, next ?? null);\n }\n\n async move(from: string, to: string, root: (entry: MetaEntry | undefined) => MetaEntry) {\n const [transaction, store] = this.transaction('readwrite');\n store.delete(to);\n store.delete(descendants(to));\n const source = store.get(from);\n const below = store.getAll(descendants(from));\n below.onsuccess = () => {\n store.delete(from);\n store.delete(descendants(from));\n for (const entry of below.result as MetaEntry[]) {\n store.put(moved(entry, to + entry.path.slice(from.length)));\n }\n store.put(moved(root(source.result), to));\n };\n await settle(transaction, () => undefined);\n this.changed({ trees: [from, to] });\n }\n\n async remove(paths: readonly string[]): Promise<void> {\n const [transaction, store] = this.transaction('readwrite');\n for (const path of paths) {\n store.delete(path);\n store.delete(descendants(path));\n }\n await settle(transaction, () => undefined);\n this.changed({ trees: paths });\n }\n\n async links(dir: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.index('dir').getAll(dir);\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n\n async under(path: string): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const self = store.get(path);\n const below = store.getAll(descendants(path));\n return settle(transaction, () =>\n [self.result as MetaEntry | undefined, ...(below.result as MetaEntry[])].filter(\n (entry): entry is MetaEntry => entry !== undefined\n )\n );\n }\n\n async all(): Promise<MetaEntry[]> {\n const [transaction, store] = this.transaction('readonly');\n const request = store.getAll();\n return settle(transaction, () => request.result as MetaEntry[]);\n }\n}\n\nexport function openMeta(name: string, factory: IDBFactory): Promise<IndexedDbMeta> {\n return new Promise((resolve, reject) => {\n const request = factory.open(name, META_VERSION);\n request.onupgradeneeded = (event) => {\n if (event.oldVersion < 1) {\n request.result.createObjectStore(META_STORE, { keyPath: 'path' }).createIndex('dir', 'dir');\n }\n };\n request.onsuccess = () => resolve(new IndexedDbMeta(request.result));\n request.onerror = () => reject(request.error);\n });\n}\n", "import { MemoryMeta, type MetaEntry, type MetaStore } from './meta.ts';\nimport { type FsStat, fsError, inodeOf, type KernelFs, resolvePath } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst S_IFLNK = 0o120000;\nconst PERM_MASK = 0o7777;\nconst READ_ATTEMPTS = 3;\nconst MAX_LINKS = 40;\nconst CHECK_MS = 1000;\nconst EXECUTABLE = /\\/node_modules\\/(?:@[^/]+\\/)?[^/]+\\/bin\\//;\n\ntype Handle = FileSystemFileHandle | FileSystemDirectoryHandle;\n\ninterface MovableHandle {\n move?(parent: FileSystemDirectoryHandle, name: string): Promise<void>;\n}\n\ninterface Located {\n path: string;\n handle?: Handle;\n link?: MetaEntry;\n}\n\nconst ERRNO_BY_DOM_ERROR: Readonly<Record<string, string>> = {\n NotFoundError: 'ENOENT',\n TypeMismatchError: 'ENOTDIR',\n InvalidModificationError: 'ENOTEMPTY',\n NoModificationAllowedError: 'EBUSY',\n TypeError: 'EINVAL',\n NotAllowedError: 'EACCES',\n};\n\nfunction translate(err: unknown, path: string): Error {\n if (typeof (err as { code?: unknown })?.code === 'string') return err as Error;\n const name = (err as { name?: unknown })?.name;\n return fsError((typeof name === 'string' && ERRNO_BY_DOM_ERROR[name]) || 'EIO', path);\n}\n\nfunction missing(err: unknown): boolean {\n const code = (err as { code?: unknown })?.code;\n return code === 'ENOENT' || code === 'ENOTDIR';\n}\n\nfunction split(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nfunction baseOf(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction prefixes(path: string): string[] {\n const parts = split(path);\n return parts.map((_, i) => `/${parts.slice(0, i + 1).join('/')}`);\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\ninterface Positioned {\n write(at: number, bytes: Uint8Array): unknown;\n truncate(size: number): unknown;\n}\n\ninterface SyncAccess {\n write(bytes: Uint8Array, options: { at: number }): number;\n truncate(size: number): void;\n flush(): void;\n close(): void;\n}\n\ntype SyncCapable = FileSystemFileHandle & {\n createSyncAccessHandle?(options?: { mode?: string }): Promise<SyncAccess>;\n};\n\nconst LOCKED = new Set(['NotReadableError', 'NoModificationAllowedError', 'InvalidStateError']);\n\nconst SYNC_BACKOFF_MS = [5, 10, 20, 40, 80];\n\nasync function openSync(handle: FileSystemFileHandle): Promise<SyncAccess | undefined> {\n const sync = (handle as SyncCapable).createSyncAccessHandle;\n if (!sync) return undefined;\n for (let attempt = 0; ; attempt++) {\n try {\n return await sync.call(handle, { mode: 'readwrite-unsafe' });\n } catch (err) {\n const delay = SYNC_BACKOFF_MS[attempt];\n if (!LOCKED.has((err as { name?: unknown })?.name as string)) throw err;\n if (delay === undefined) return undefined;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n}\n\nfunction writeAll(access: SyncAccess, at: number, bytes: Uint8Array): void {\n for (let done = 0; done < bytes.length; ) {\n const n = access.write(bytes.subarray(done), { at: at + done });\n if (!(n > 0))\n throw Object.assign(new Error('the file system took no more bytes'), { code: 'ENOSPC' });\n done += n;\n }\n}\n\nasync function positioned(handle: FileSystemFileHandle, op: (io: Positioned) => unknown) {\n const access = await openSync(handle);\n if (access) {\n try {\n op({\n write: (at, bytes) => writeAll(access, at, bytes),\n truncate: (n) => access.truncate(n),\n });\n access.flush();\n } finally {\n access.close();\n }\n return;\n }\n const writable = await handle.createWritable({ keepExistingData: true });\n try {\n await op({\n write: (at, bytes) =>\n writable.write({ type: 'write', position: at, data: bytes as Uint8Array<ArrayBuffer> }),\n truncate: (n) => writable.truncate(n),\n });\n } catch (err) {\n await writable.abort();\n throw err;\n }\n await writable.close();\n}\n\nexport interface WriteSession {\n write(at: number, bytes: Uint8Array): Promise<void>;\n truncate(size: number): Promise<void>;\n close(): Promise<void>;\n}\n\nexport function syncAccessHandles(scope: object = globalThis): boolean {\n const handle = (scope as { FileSystemFileHandle?: { prototype: object } }).FileSystemFileHandle;\n return handle !== undefined && 'createSyncAccessHandle' in handle.prototype;\n}\n\nfunction isHandle(child: Handle | MetaEntry): child is Handle {\n return 'kind' in child;\n}\n\nexport class OpfsFs implements KernelFs {\n private readonly root: FileSystemDirectoryHandle;\n private readonly meta: MetaStore;\n private readonly dirs = new Map<string, FileSystemDirectoryHandle>();\n private readonly checked = new WeakMap<FileSystemDirectoryHandle, number>();\n\n private readonly channel: BroadcastChannel | undefined;\n private readonly ranged: boolean;\n\n constructor(\n root: FileSystemDirectoryHandle,\n meta: MetaStore = new MemoryMeta(),\n channel?: string,\n options: { ranged?: boolean } = {}\n ) {\n this.root = root;\n this.meta = meta;\n this.ranged = options.ranged === true;\n this.channel = channel === undefined ? undefined : new BroadcastChannel(channel);\n if (this.channel) {\n this.channel.onmessage = ({ data }) => {\n for (const path of data as string[]) this.forget(path);\n };\n (this.channel as BroadcastChannel & { unref?: () => void }).unref?.();\n }\n }\n\n private changed(...paths: string[]): void {\n for (const path of paths) this.forget(path);\n this.channel?.postMessage(paths);\n }\n\n resolvePath(base: string, path: string): string {\n return resolvePath(base, path);\n }\n\n private async walk(parts: string[], from: number, start: FileSystemDirectoryHandle) {\n let dir = start;\n for (let at = from; at < parts.length; at++) {\n dir = await dir.getDirectoryHandle(parts[at] as string);\n this.dirs.set(`/${parts.slice(0, at + 1).join('/')}`, dir);\n this.checked.set(dir, performance.now());\n }\n return dir;\n }\n\n private async dir(path: string): Promise<FileSystemDirectoryHandle> {\n const parts = split(path);\n let from = parts.length;\n let cached: FileSystemDirectoryHandle | undefined;\n for (; from > 0 && !cached; from--)\n cached = this.dirs.get(`/${parts.slice(0, from).join('/')}`);\n if (cached) from++;\n const at = `/${parts.slice(0, from).join('/')}`;\n if (cached && !(await this.current(at, cached))) {\n this.forget(at);\n cached = undefined;\n from = 0;\n }\n try {\n return await this.walk(parts, from, cached ?? this.root);\n } catch (err) {\n throw translate(err, path);\n }\n }\n\n private async current(path: string, dir: FileSystemDirectoryHandle): Promise<boolean> {\n if (performance.now() - (this.checked.get(dir) ?? -CHECK_MS) < CHECK_MS) return true;\n const where = await this.root.resolve(dir).catch(() => null);\n if (where === null || `/${where.join('/')}` !== path) return false;\n this.checked.set(dir, performance.now());\n return true;\n }\n\n private forget(path: string): void {\n for (const key of [...this.dirs.keys()]) if (within(key, path)) this.dirs.delete(key);\n }\n\n private async inDir<T>(path: string, op: (dir: FileSystemDirectoryHandle) => Promise<T>) {\n const dir = await this.dir(path);\n try {\n return await op(dir);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'NotFoundError' || (await this.current(path, dir)))\n throw err;\n this.forget(path);\n return op(await this.dir(path));\n }\n }\n\n private async child(\n parent: FileSystemDirectoryHandle,\n name: string,\n kind: 'file' | 'directory'\n ): Promise<Handle> {\n return kind === 'file' ? parent.getFileHandle(name) : parent.getDirectoryHandle(name);\n }\n\n private async parent(path: string): Promise<[string, string]> {\n const parts = split(path);\n const name = parts.pop();\n if (name === undefined) throw fsError('EBUSY', path);\n return [`/${parts.join('/')}`, name];\n }\n\n private async handle(path: string): Promise<Handle> {\n if (split(path).length === 0) return this.root;\n const [dir, name] = await this.parent(path);\n const known = this.dirs.has(path);\n return this.inDir(dir, async (parent): Promise<Handle> => {\n const [first, second] = known\n ? (['directory', 'file'] as const)\n : (['file', 'directory'] as const);\n try {\n return await this.child(parent, name, first);\n } catch (err) {\n if ((err as { name?: unknown })?.name !== 'TypeMismatchError') throw err;\n }\n return this.child(parent, name, second);\n }).catch((err) => {\n throw translate(err, path);\n });\n }\n\n private real(path: string): Promise<boolean> {\n return this.handle(path).then(\n () => true,\n () => false\n );\n }\n\n private async linkAlong(path: string): Promise<MetaEntry | undefined> {\n for (const entry of await this.meta.get(prefixes(path))) {\n if (entry?.link === undefined) continue;\n if (!(await this.real(entry.path)) && (await this.real(parentOf(entry.path)))) return entry;\n }\n return undefined;\n }\n\n private async locate(path: string, follow: boolean): Promise<Located> {\n let current = path;\n for (let hops = 0; hops <= MAX_LINKS; hops++) {\n try {\n return { path: current, handle: await this.handle(current) };\n } catch (err) {\n if (!missing(err)) throw err;\n const link = await this.linkAlong(current);\n if (!link) throw err;\n if (link.path === current && !follow) return { path: current, link };\n const rest = current.slice(link.path.length);\n current = resolvePath(parentOf(link.path), `${link.link}${rest}`);\n }\n }\n throw fsError('ELOOP', path);\n }\n\n private mode(path: string, directory: boolean, meta: MetaEntry | undefined): number {\n const fallback = directory || EXECUTABLE.test(path) ? 0o755 : 0o644;\n return (directory ? S_IFDIR : S_IFREG) | (meta?.mode ?? fallback);\n }\n\n private readonly dirTimes = new Map<string, number>();\n private readonly dirDirty = new Set<string>();\n private dirFlush: Promise<void> | undefined;\n\n private touch(...dirs: string[]): void {\n const now = Date.now();\n for (const dir of dirs) {\n this.dirTimes.set(dir, now);\n this.dirDirty.add(dir);\n }\n this.dirFlush ??= Promise.resolve()\n .then(() => this.flushDirTimes())\n .catch(() => undefined)\n .finally(() => {\n this.dirFlush = undefined;\n });\n }\n\n private async flushDirTimes(): Promise<void> {\n for (const path of this.dirDirty) {\n this.dirDirty.delete(path);\n const ms = this.dirTimes.get(path);\n if (ms === undefined) continue;\n await this.meta.update(path, (entry) => ({\n ...entry,\n path,\n mtimeMs: ms,\n mtimeFor: 0,\n ctimeMs: ms,\n }));\n if (this.dirTimes.get(path) === ms) this.dirTimes.delete(path);\n }\n }\n\n private async statOf(path: string, handle: Handle, meta: MetaEntry | undefined): Promise<FsStat> {\n const directory = handle.kind === 'directory';\n const file = directory ? undefined : await (handle as FileSystemFileHandle).getFile();\n const modified = file?.lastModified ?? 0;\n const touched = directory ? this.dirTimes.get(path) : undefined;\n const kept =\n meta?.mtimeMs !== undefined && meta.mtimeFor === modified ? meta.mtimeMs : modified;\n const mtime = touched ?? kept;\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: file?.size ?? 0,\n mode: this.mode(path, directory, meta),\n mtime: new Date(mtime),\n atime: new Date(meta?.atimeMs ?? mtime),\n ctime: new Date(Math.max(touched ?? meta?.ctimeMs ?? mtime, modified)),\n ino: meta?.ino ?? inodeOf(path),\n ...(this.ranged && !directory ? { ranged: true } : {}),\n };\n }\n\n private linkStat(entry: MetaEntry): FsStat {\n const time = new Date(entry.mtimeMs ?? 0);\n return {\n isFile: false,\n isDirectory: false,\n isSymbolicLink: true,\n size: new TextEncoder().encode(entry.link).length,\n mode: S_IFLNK | 0o777,\n mtime: time,\n atime: entry.atimeMs === undefined ? time : new Date(entry.atimeMs),\n ctime: new Date(entry.ctimeMs ?? 0),\n ino: entry.ino ?? inodeOf(entry.path),\n };\n }\n\n private async describe(found: Located): Promise<FsStat> {\n if (found.link) return this.linkStat(found.link);\n const [meta] = await this.meta.get([found.path]);\n return this.statOf(found.path, found.handle as Handle, meta);\n }\n\n async stat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, true));\n }\n\n async lstat(path: string): Promise<FsStat> {\n return this.describe(await this.locate(path, false));\n }\n\n async exists(path: string): Promise<boolean> {\n return this.locate(path, true).then(\n () => true,\n () => false\n );\n }\n\n private async retrying<T>(path: string, op: () => Promise<T>, locks: boolean): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await op();\n } catch (err) {\n const name = (err as { name?: unknown })?.name;\n const again = name === 'NotReadableError' || (locks && LOCKED.has(name as string));\n if (!again || attempt >= READ_ATTEMPTS) throw translate(err, path);\n await new Promise((resolve) => setTimeout(resolve, attempt * 10));\n }\n }\n }\n\n private async existing(path: string): Promise<FileSystemFileHandle> {\n const handle = (await this.locate(path, true)).handle as Handle;\n if (handle.kind === 'directory') throw fsError('EISDIR', path);\n return handle;\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const handle = await this.existing(path);\n return this.retrying(\n path,\n async () => new Uint8Array(await (await handle.getFile()).arrayBuffer()),\n false\n );\n }\n\n async pread(path: string, offset: number, length: number): Promise<Uint8Array> {\n const handle = await this.existing(path);\n return this.retrying(\n path,\n async () =>\n new Uint8Array(await (await handle.getFile()).slice(offset, offset + length).arrayBuffer()),\n false\n );\n }\n\n async pwrite(path: string, offset: number, bytes: Uint8Array): Promise<void> {\n const handle = (await this.fileFor(path))[0];\n await this.retrying(path, () => positioned(handle, (io) => io.write(offset, bytes)), true);\n }\n\n async truncate(path: string, size: number): Promise<void> {\n const handle = await this.existing(path);\n await this.retrying(path, () => positioned(handle, (io) => io.truncate(size)), true);\n }\n\n async writeSession(path: string, truncate: boolean): Promise<WriteSession> {\n const handle = (await this.fileFor(path))[0];\n const writable = await this.retrying(\n path,\n () => handle.createWritable({ keepExistingData: !truncate }),\n true\n );\n return {\n write: (at, bytes) =>\n writable.write({ type: 'write', position: at, data: bytes as Uint8Array<ArrayBuffer> }),\n truncate: (size) => writable.truncate(size),\n close: () => writable.close(),\n };\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n private async writeTarget(path: string): Promise<[string, boolean]> {\n try {\n return [(await this.locate(path, true)).path, true];\n } catch (err) {\n if (!missing(err)) throw err;\n }\n const [entry] = await this.meta.get([path]);\n const wanted = entry?.link === undefined ? path : resolvePath(parentOf(path), entry.link);\n return [resolvePath((await this.locate(parentOf(wanted), true)).path, baseOf(wanted)), false];\n }\n\n private async fileFor(path: string): Promise<[FileSystemFileHandle, boolean]> {\n const [target, existed] = await this.writeTarget(path);\n const [dir, name] = await this.parent(target);\n try {\n const handle = await this.inDir(dir, (parent) =>\n parent.getFileHandle(name, { create: true })\n );\n if (!existed) this.touch(parentOf(target));\n return [handle, existed];\n } catch (err) {\n const code = (err as { name?: unknown })?.name === 'TypeMismatchError' ? 'EISDIR' : null;\n throw code ? fsError(code, path) : translate(err, path);\n }\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const [file, existed] = await this.fileFor(path);\n if (!existed && content.length === 0) return;\n const writable = await file.createWritable();\n await writable.write(content as FileSystemWriteChunkType);\n await writable.close();\n }\n\n private async listing(path: string): Promise<[string, Array<[string, Handle | MetaEntry]>]> {\n const found = await this.locate(path, true);\n const handle = found.handle as Handle;\n if (handle.kind !== 'directory') throw fsError('ENOTDIR', path);\n const children = new Map<string, Handle | MetaEntry>();\n for await (const child of handle.values()) children.set(child.name, child);\n for (const link of await this.meta.links(found.path)) {\n const name = baseOf(link.path);\n if (!children.has(name)) children.set(name, link);\n }\n return [found.path, [...children].sort(([a], [b]) => (a < b ? -1 : 1))];\n }\n\n async readdir(path: string): Promise<string[]> {\n return (await this.listing(path))[1].map(([name]) => name);\n }\n\n async readdirStat(path: string): Promise<Array<[string, FsStat | null]>> {\n const [dir, children] = await this.listing(path);\n const base = dir === '/' ? '' : dir;\n const metas = await this.meta.get(children.map(([name]) => `${base}/${name}`));\n return Promise.all(\n children.map(async ([name, child], i): Promise<[string, FsStat | null]> => {\n if (!isHandle(child)) return [name, this.linkStat(child)];\n const stat = await this.statOf(`${base}/${name}`, child, metas[i]).catch(() => null);\n return [name, stat];\n })\n );\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n let found: Located | undefined;\n try {\n found = await this.locate(path, true);\n } catch (err) {\n if (!missing(err)) throw err;\n }\n if (found) {\n const directory = found.handle?.kind === 'directory';\n if (options.recursive && directory) return;\n throw fsError(options.recursive ? 'ENOTDIR' : 'EEXIST', path);\n }\n const [entry] = await this.meta.get([path]);\n if (entry?.link !== undefined) throw fsError('EEXIST', path);\n if (options.recursive) await this.mkdir(parentOf(path), options);\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n await parent.handle.getDirectoryHandle(baseOf(path), { create: true });\n this.touch(parent.path);\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n let found: Located;\n try {\n found = await this.locate(path, false);\n } catch (err) {\n const error = translate(err, path) as Error & { code: string };\n if (options.force && error.code === 'ENOENT') return;\n throw error;\n }\n if (found.handle) {\n const [dir, name] = await this.parent(found.path);\n try {\n await this.inDir(dir, (parent) =>\n parent.removeEntry(name, { recursive: options.recursive === true })\n );\n } catch (err) {\n throw translate(err, path);\n }\n this.changed(found.path);\n }\n await this.meta.remove([found.path]);\n this.touch(parentOf(found.path));\n }\n\n async rename(from: string, to: string): Promise<void> {\n if (from === to) return;\n const source = await this.locate(from, false);\n this.forget(source.path);\n const parent = await this.locate(parentOf(to), true);\n const destination = resolvePath(parent.path, baseOf(to));\n const sourceStat = await this.describe(source);\n if (sourceStat.isDirectory && within(destination, source.path)) throw fsError('EINVAL', to);\n const target = await this.locate(destination, false).catch((err) => {\n if (missing(err)) return null;\n throw err;\n });\n const targetStat = target && (await this.describe(target));\n if (targetStat?.isDirectory && !sourceStat.isDirectory) throw fsError('EISDIR', to);\n if (targetStat && !targetStat.isDirectory && sourceStat.isDirectory) {\n throw fsError('ENOTDIR', to);\n }\n if (targetStat?.isDirectory && (await this.readdir(destination)).length > 0) {\n throw fsError('ENOTEMPTY', to);\n }\n const now = Date.now();\n const carry = (entry: MetaEntry | undefined): MetaEntry => ({\n ino: inodeOf(source.path),\n ...entry,\n path: destination,\n ctimeMs: now,\n });\n if (source.link) {\n if (target?.handle) await this.rm(destination);\n await this.meta.move(source.path, destination, carry);\n this.touch(parentOf(source.path), parent.path);\n return;\n }\n const dir = parent.handle as FileSystemDirectoryHandle;\n const name = baseOf(destination);\n const swap = targetStat?.isDirectory === true;\n const staging = swap ? `.${name}.${crypto.randomUUID()}` : name;\n this.forget(destination);\n const timed = await this.explicitTimes(source.path);\n const moved = await this.place(source.handle as Handle, dir, staging);\n if (swap) await this.rm(destination, { recursive: true });\n await this.meta.move(source.path, destination, carry);\n if (!moved) await this.rm(source.path, { recursive: true });\n let copied = !moved;\n if (swap) {\n const staged = await dir.getDirectoryHandle(staging);\n const placed = await this.place(staged, dir, name);\n if (!placed) await dir.removeEntry(staging, { recursive: true });\n copied ||= !placed;\n }\n if (copied) await this.restamp(destination, timed);\n this.changed(source.path, destination);\n this.touch(parentOf(source.path), parent.path);\n }\n\n private async modified(path: string): Promise<number> {\n const handle = await this.handle(path);\n return handle.kind === 'file' ? (await handle.getFile()).lastModified : 0;\n }\n\n private async explicitTimes(path: string): Promise<string[]> {\n const timed: string[] = [];\n for (const entry of await this.meta.under(path)) {\n if (entry.mtimeFor === undefined || entry.link !== undefined) continue;\n const current = await this.modified(entry.path).catch(() => undefined);\n if (current === entry.mtimeFor) timed.push(entry.path.slice(path.length));\n }\n return timed;\n }\n\n private async restamp(path: string, timed: string[]): Promise<void> {\n for (const rest of timed) {\n const mtimeFor = await this.modified(path + rest);\n await this.meta.update(path + rest, (entry) => entry && { ...entry, mtimeFor });\n }\n }\n\n private async place(handle: Handle, dir: FileSystemDirectoryHandle, name: string) {\n const moved = await (handle as Handle & MovableHandle).move?.(dir, name).then(\n () => true,\n () => false\n );\n if (moved) return true;\n try {\n await this.copy(handle, dir, name);\n } catch (err) {\n if (handle.kind === 'directory') await dir.removeEntry(name, { recursive: true });\n throw translate(err, name);\n }\n return false;\n }\n\n private async copy(handle: Handle, dir: FileSystemDirectoryHandle, name: string): Promise<void> {\n if (handle.kind === 'file') {\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await writable.write(await handle.getFile());\n await writable.close();\n return;\n }\n const target = await dir.getDirectoryHandle(name, { create: true });\n for await (const child of handle.values()) await this.copy(child, target, child.name);\n }\n\n async symlink(target: string, path: string): Promise<void> {\n const parent = await this.locate(parentOf(path), true);\n if (parent.handle?.kind !== 'directory') throw fsError('ENOTDIR', path);\n const at = resolvePath(parent.path, baseOf(path));\n if (\n await this.locate(at, false).then(\n () => true,\n (err) => !missing(err)\n )\n ) {\n throw fsError('EEXIST', path);\n }\n const now = Date.now();\n await this.meta.update(at, () => ({\n path: at,\n link: target,\n dir: parent.path,\n ino: inodeOf(at),\n mtimeMs: now,\n ctimeMs: now,\n }));\n this.touch(parent.path);\n }\n\n async realpath(path: string, follow: boolean): Promise<string> {\n return (await this.locate(path, follow)).path;\n }\n\n async readlink(path: string): Promise<string> {\n const found = await this.locate(path, false);\n if (found.link) return found.link.link as string;\n throw fsError('EINVAL', path);\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n const found = await this.locate(path, true);\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n mode: mode & PERM_MASK,\n ctimeMs,\n }));\n }\n\n async utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n await this.setTimes(await this.locate(path, true), atime, mtime);\n }\n\n async lutimes(path: string, atime: Date, mtime: Date): Promise<void> {\n await this.setTimes(await this.locate(path, false), atime, mtime);\n }\n\n private async setTimes(found: Located, atime: Date, mtime: Date): Promise<void> {\n const { link } = found;\n if (link) {\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...link,\n ...entry,\n atimeMs: atime.getTime(),\n mtimeMs: mtime.getTime(),\n ctimeMs,\n }));\n return;\n }\n const handle = found.handle as Handle;\n const file = handle.kind === 'file' ? await handle.getFile() : undefined;\n this.dirTimes.delete(found.path);\n const ctimeMs = Date.now();\n await this.meta.update(found.path, (entry) => ({\n ...entry,\n path: found.path,\n atimeMs: atime.getTime(),\n mtimeMs: mtime.getTime(),\n mtimeFor: file?.lastModified ?? 0,\n ctimeMs,\n }));\n }\n\n async reconcile(): Promise<number> {\n let removed = 0;\n for (const entry of await this.meta.all()) {\n const real = await this.real(entry.path);\n const stale =\n entry.link === undefined ? !real : real || !(await this.real(parentOf(entry.path)));\n if (!stale) continue;\n await this.meta.update(entry.path, () => undefined);\n removed++;\n }\n return removed;\n }\n}\n", "import type { KernelFs } from './types.ts';\n\nexport const UNLINKED_DIR = '.slicc-unlinked';\n\nexport interface KeptFile {\n readonly hidden: string;\n release(): void;\n}\n\nexport interface UnlinkHolder {\n held(): Iterable<string>;\n owns(path: string): boolean;\n isKept(path: string): boolean;\n keep(path: string, file: KeptFile): void;\n unkeep(path: string, file: KeptFile): void;\n}\n\nexport interface UnlinkOwner {\n readonly id: string;\n alive(id: string): boolean;\n}\n\nexport interface UnlinkLocks {\n request(name: string, callback: () => Promise<unknown>): Promise<unknown>;\n query?(): Promise<{ held?: Array<{ name?: string }> }>;\n}\n\nexport function pidOwner(proc: {\n pid: number;\n kill(pid: number, signal: number): unknown;\n}): UnlinkOwner {\n return {\n id: `p${proc.pid}`,\n alive(id) {\n try {\n proc.kill(Number(id.slice(1)), 0);\n return true;\n } catch (err) {\n return (err as { code?: string }).code !== 'ESRCH';\n }\n },\n };\n}\n\nexport function webLocks(): UnlinkLocks | undefined {\n return (globalThis as { navigator?: { locks?: UnlinkLocks } }).navigator?.locks;\n}\n\nconst within = (path: string, target: string) =>\n path === target || target === '/' || path.startsWith(`${target}/`);\n\nconst parentOf = (path: string) => path.slice(0, path.lastIndexOf('/')) || '/';\n\nconst lockName = (instance: string) => `slicc-unlinked:${instance}`;\n\nconst dirOf = (root: string) => (root === '/' ? `/${UNLINKED_DIR}` : `${root}/${UNLINKED_DIR}`);\n\nexport class PathGate {\n private readonly tails = new Map<string, Promise<void>>();\n\n async acquire(path: string): Promise<() => void> {\n const prev = this.tails.get(path) ?? Promise.resolve();\n const { promise, resolve } = Promise.withResolvers<void>();\n const tail = prev.then(() => promise);\n this.tails.set(path, tail);\n await prev;\n return () => {\n resolve();\n if (this.tails.get(path) === tail) this.tails.delete(path);\n };\n }\n\n async run<T>(path: string, op: () => Promise<T>): Promise<T> {\n const release = await this.acquire(path);\n try {\n return await op();\n } finally {\n release();\n }\n }\n}\n\ninterface Pinned {\n moved: Set<string>;\n commit(): void;\n rollback(): Promise<void>;\n}\n\nexport class UnlinkedKeeper {\n private readonly fs: KernelFs;\n private readonly holders: Iterable<UnlinkHolder>;\n private readonly rootOf: (path: string) => string;\n private readonly locks: UnlinkLocks | undefined;\n private readonly busy: (path: string) => boolean;\n private readonly waiting = new Set<string>();\n private readonly owner: UnlinkOwner | undefined;\n private readonly instance: string;\n readonly gate = new PathGate();\n private queue: Promise<unknown> = Promise.resolve();\n private count = 0;\n\n constructor(\n fs: KernelFs,\n holders: Iterable<UnlinkHolder>,\n rootOf: (path: string) => string,\n options: {\n locks?: UnlinkLocks | undefined;\n busy?: (path: string) => boolean;\n owner?: UnlinkOwner | undefined;\n } = {}\n ) {\n const { locks, owner } = options;\n this.fs = fs;\n this.holders = holders;\n this.rootOf = rootOf;\n this.locks = locks;\n this.busy = options.busy ?? (() => false);\n this.owner = owner;\n this.instance = owner ? `${owner.id}~${crypto.randomUUID()}` : crypto.randomUUID();\n void locks?.request(lockName(this.instance), () => new Promise(() => undefined));\n }\n\n private serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n wrap(fs: KernelFs = this.fs): KernelFs {\n const keeper = this;\n const visible = (names: string[]) => names.filter((name) => name !== UNLINKED_DIR);\n return {\n ...fs,\n async rm(path, options) {\n const target = fs.resolvePath('/', path);\n const pinned = await keeper.pin(target);\n if (pinned.moved.has(target)) pinned.commit();\n else await keeper.settle(pinned, () => fs.rm(path, options));\n },\n async rename(from, to) {\n const target = fs.resolvePath('/', to);\n if (target === fs.resolvePath('/', from)) return fs.rename(from, to);\n const pinned = await keeper.pin(target);\n await keeper.settle(pinned, () => fs.rename(from, to));\n },\n readdir: async (path) => visible(await fs.readdir(path)),\n readdirStat: async (path) =>\n (await fs.readdirStat(path)).filter(([name]) => name !== UNLINKED_DIR),\n };\n }\n\n async settle(pinned: Pinned, op: () => Promise<void>): Promise<void> {\n try {\n await op();\n } catch (err) {\n await pinned.rollback();\n throw err;\n }\n pinned.commit();\n }\n\n async pin(target: string): Promise<Pinned> {\n const held = new Map<string, UnlinkHolder[]>();\n for (const holder of this.holders) {\n if (holder.owns(target)) continue;\n for (const path of holder.held()) {\n if (!within(path, target) || holder.isKept(path)) continue;\n held.set(path, [...(held.get(path) ?? []), holder]);\n }\n }\n const paths = [...held.keys()].sort();\n const releases: Array<() => void> = [];\n for (const path of paths) releases.push(await this.gate.acquire(path));\n const hidden = new Map<string, string>();\n for (const path of paths) {\n const at = await this.hide(path);\n if (at !== undefined) hidden.set(path, at);\n }\n const done = () => {\n for (const release of releases) release();\n };\n const files = new Map<string, KeptFile>();\n for (const [path, at] of hidden) {\n const holders = held.get(path) as UnlinkHolder[];\n const file = this.keptFile(at, { refs: holders.length + 1 });\n files.set(path, file);\n for (const holder of holders) holder.keep(path, file);\n }\n return {\n moved: new Set(hidden.keys()),\n commit: () => {\n for (const file of files.values()) file.release();\n done();\n },\n rollback: async () => {\n for (const [path, file] of files) {\n for (const holder of held.get(path) as UnlinkHolder[]) holder.unkeep(path, file);\n await this.serial(async () => {\n await Promise.allSettled([this.fs.rename(file.hidden, path)]);\n await this.tidy(parentOf(file.hidden));\n });\n }\n done();\n },\n };\n }\n\n private keptFile(hidden: string, entry: { refs: number }): KeptFile {\n return {\n hidden,\n release: () => {\n if (--entry.refs === 0) void this.serial(() => this.drop(hidden));\n },\n };\n }\n\n private hide(path: string): Promise<string | undefined> {\n return this.serial(async () => {\n const dir = dirOf(this.rootOf(path));\n const hidden = `${dir}/${this.instance}.${++this.count}`;\n try {\n await this.fs.mkdir(dir, { recursive: true });\n await this.fs.rename(path, hidden);\n return hidden;\n } catch {\n await this.tidy(dir);\n return undefined;\n }\n });\n }\n\n closed(path: string): void {\n if (this.waiting.delete(path)) void this.serial(() => this.drop(path));\n }\n\n private async drop(hidden: string): Promise<void> {\n if (this.busy(hidden)) {\n this.waiting.add(hidden);\n return;\n }\n await this.fs.rm(hidden).catch(() => undefined);\n await this.tidy(parentOf(hidden));\n }\n\n private async tidy(dir: string): Promise<void> {\n const left = await this.fs.readdir(dir).catch(() => [UNLINKED_DIR]);\n if (left.length === 0) await this.fs.rm(dir, { recursive: true }).catch(() => undefined);\n }\n\n sweep(root: string): Promise<void> {\n const query = this.locks?.query?.bind(this.locks);\n const owner = this.owner;\n if (!query && !owner) return Promise.resolve();\n return this.serial(async () => {\n const dir = dirOf(root);\n const names = await this.fs.readdir(dir).catch(() => undefined);\n if (!names) return;\n const held = query && new Set(((await query()).held ?? []).map((lock) => lock.name));\n for (const name of names) {\n const id = name.slice(0, name.lastIndexOf('.'));\n const at = id.indexOf('~');\n const dead =\n id !== this.instance &&\n (at < 0\n ? held !== undefined && !held.has(lockName(id))\n : owner?.alive(id.slice(0, at)) === false);\n if (dead) await this.fs.rm(`${dir}/${name}`, { recursive: true }).catch(() => undefined);\n }\n await this.tidy(dir);\n });\n }\n}\n", "import type { HeaderList } from './transport.ts';\nexport interface ByteSource {\n read(max: number, signal?: AbortSignal): Promise<Uint8Array>;\n}\nexport class HttpError extends Error {\n readonly status: number;\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n}\nconst CR = 13;\nconst LF = 10;\nconst READ_SIZE = 64 * 1024;\nconst TOKEN = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nexport const REASON: Readonly<Record<number, string>> = {\n 100: 'Continue',\n 200: 'OK',\n 400: 'Bad Request',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 413: 'Content Too Large',\n 417: 'Expectation Failed',\n 421: 'Misdirected Request',\n 431: 'Request Header Fields Too Large',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n};\nexport class Incoming {\n private readonly source: ByteSource;\n private buf = new Uint8Array(0);\n private eof = false;\n constructor(source: ByteSource) {\n this.source = source;\n }\n get buffered(): number {\n return this.buf.length;\n }\n private async fill(signal?: AbortSignal): Promise<boolean> {\n if (this.eof) return false;\n const chunk = await this.source.read(READ_SIZE, signal);\n if (chunk.length === 0) {\n this.eof = true;\n return false;\n }\n const next = new Uint8Array(this.buf.length + chunk.length);\n next.set(this.buf);\n next.set(chunk, this.buf.length);\n this.buf = next;\n return true;\n }\n private take(n: number): Uint8Array {\n const out = this.buf.slice(0, n);\n this.buf = this.buf.subarray(n);\n return out;\n }\n async peek(signal?: AbortSignal): Promise<number | undefined> {\n if (this.buf.length === 0) await this.fill(signal);\n return this.buf[0];\n }\n async some(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n if (this.buf.length > 0) return this.take(Math.min(max, this.buf.length));\n if (this.eof) return new Uint8Array(0);\n const chunk = await this.source.read(max, signal);\n if (chunk.length === 0) this.eof = true;\n return chunk;\n }\n async head(limit: number, signal?: AbortSignal): Promise<Uint8Array | null> {\n let from = 0;\n for (;;) {\n const end = headEnd(this.buf, from);\n if (end > 0) {\n if (end > limit) throw new HttpError(431, 'request head too large');\n return this.take(end);\n }\n if (this.buf.length > limit) throw new HttpError(431, 'request head too large');\n from = Math.max(0, this.buf.length - 3);\n if (!(await this.fill(signal))) {\n if (this.buf.length === 0) return null;\n throw new HttpError(400, 'connection closed inside a request head');\n }\n }\n }\n async line(limit: number, signal?: AbortSignal): Promise<string> {\n let from = 0;\n for (;;) {\n const at = this.buf.indexOf(LF, from);\n if (at >= 0) {\n const line = this.take(at + 1);\n const text = latin1(line.subarray(0, line[at - 1] === CR ? at - 1 : at));\n return text;\n }\n if (this.buf.length > limit) throw new HttpError(400, 'line too long');\n from = this.buf.length;\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n }\n async exactly(n: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.buf.length < n) {\n if (!(await this.fill(signal))) throw new HttpError(400, 'connection closed inside a body');\n }\n return this.take(n);\n }\n}\nfunction headEnd(buf: Uint8Array, from: number): number {\n for (let i = from; i < buf.length; i++) {\n if (buf[i] !== LF) continue;\n if (buf[i + 1] === LF) return i + 2;\n if (buf[i + 1] === CR && buf[i + 2] === LF) return i + 3;\n }\n return 0;\n}\nexport function latin1(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n out += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return out;\n}\nexport function latin1Bytes(text: string): Uint8Array {\n const out = new Uint8Array(text.length);\n for (let i = 0; i < text.length; i++) out[i] = text.charCodeAt(i) & 0xff;\n return out;\n}\nexport interface RequestHead {\n method: string;\n target: string;\n minor: number;\n headers: HeaderList;\n}\nexport function parseRequestHead(bytes: Uint8Array): RequestHead {\n const lines = latin1(bytes).split(/\\r?\\n/);\n while (lines.length > 0 && lines[0] === '') lines.shift();\n const match = /^([!#$%&'*+\\-.^_`|~0-9A-Za-z]+) (\\S+) HTTP\\/(\\d)\\.(\\d)$/.exec(lines.shift() ?? '');\n if (!match) throw new HttpError(400, 'malformed request line');\n if (match[3] !== '1') throw new HttpError(505, `HTTP/${match[3]}.${match[4]} is not supported`);\n return {\n method: match[1],\n target: match[2],\n minor: Number(match[4]),\n headers: parseFields(lines),\n };\n}\nfunction parseFields(lines: string[]): HeaderList {\n const headers: Array<readonly [string, string]> = [];\n for (const line of lines) {\n if (line === '') continue;\n if (line.startsWith(' ') || line.startsWith('\\t')) {\n throw new HttpError(400, 'obsolete line folding');\n }\n const colon = line.indexOf(':');\n const name = colon > 0 ? line.slice(0, colon) : '';\n if (!TOKEN.test(name)) throw new HttpError(400, 'malformed header field');\n headers.push([name, line.slice(colon + 1).trim()]);\n }\n return headers;\n}\nexport function fieldValues(headers: HeaderList, name: string): string[] {\n const lower = name.toLowerCase();\n return headers.filter(([n]) => n.toLowerCase() === lower).map(([, v]) => v);\n}\nexport function fieldTokens(headers: HeaderList, name: string): string[] {\n return fieldValues(headers, name)\n .flatMap((v) => v.split(','))\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t !== '');\n}\nexport type BodyFraming =\n | {\n kind: 'none';\n }\n | {\n kind: 'length';\n length: number;\n }\n | {\n kind: 'chunked';\n };\nexport function requestFraming(headers: HeaderList): BodyFraming {\n const codings = fieldTokens(headers, 'transfer-encoding');\n const lengths = fieldValues(headers, 'content-length');\n if (codings.length > 0) {\n if (lengths.length > 0) throw new HttpError(400, 'both Transfer-Encoding and Content-Length');\n if (codings.length !== 1 || codings[0] !== 'chunked') {\n throw new HttpError(501, `unsupported Transfer-Encoding: ${codings.join(', ')}`);\n }\n return { kind: 'chunked' };\n }\n if (lengths.length === 0) return { kind: 'none' };\n const distinct = new Set(lengths.flatMap((v) => v.split(',')).map((v) => v.trim()));\n const [only] = distinct;\n if (distinct.size !== 1 || !/^\\d{1,15}$/.test(only)) {\n throw new HttpError(400, 'invalid Content-Length');\n }\n const length = Number(only);\n return length === 0 ? { kind: 'none' } : { kind: 'length', length };\n}\nconst MAX_CHUNK_LINE = 4096;\nconst MAX_TRAILERS = 64 * 1024;\nexport async function readBody(\n incoming: Incoming,\n framing: BodyFraming,\n cap: number,\n signal?: AbortSignal\n): Promise<Uint8Array | undefined> {\n if (framing.kind === 'none') return undefined;\n if (framing.kind === 'length') {\n if (framing.length > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n return incoming.exactly(framing.length, signal);\n }\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const sizeLine = await incoming.line(MAX_CHUNK_LINE, signal);\n const size = /^([0-9A-Fa-f]{1,12})[ \\t]*(;.*)?$/.exec(sizeLine);\n if (!size) throw new HttpError(400, 'malformed chunk size');\n const n = Number.parseInt(size[1], 16);\n if (n === 0) break;\n total += n;\n if (total > cap) throw new HttpError(413, `request body over ${cap} bytes`);\n chunks.push(await incoming.exactly(n, signal));\n if ((await incoming.line(2, signal)) !== '') throw new HttpError(400, 'malformed chunk');\n }\n let trailers = 0;\n for (let line = await incoming.line(MAX_TRAILERS, signal); line !== ''; ) {\n trailers += line.length;\n if (trailers > MAX_TRAILERS) throw new HttpError(431, 'trailers too large');\n line = await incoming.line(MAX_TRAILERS, signal);\n }\n return concat(chunks, total);\n}\nexport function concat(chunks: Uint8Array[], total = chunks.reduce((n, c) => n + c.length, 0)) {\n const out = new Uint8Array(total);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\nfunction safeValue(value: string): boolean {\n return !/[\\r\\n\\0]/.test(value);\n}\nexport function responseHead(status: number, reason: string, headers: HeaderList): Uint8Array {\n const phrase = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/.test(reason) ? reason : '';\n let head = `HTTP/1.1 ${status} ${phrase}\\r\\n`;\n for (const [name, value] of headers) {\n if (TOKEN.test(name) && safeValue(value)) head += `${name}: ${value}\\r\\n`;\n }\n return latin1Bytes(`${head}\\r\\n`);\n}\nexport function chunk(bytes: Uint8Array): Uint8Array {\n const size = latin1Bytes(`${bytes.length.toString(16)}\\r\\n`);\n const out = new Uint8Array(size.length + bytes.length + 2);\n out.set(size);\n out.set(bytes, size.length);\n out[out.length - 2] = CR;\n out[out.length - 1] = LF;\n return out;\n}\nexport const LAST_CHUNK = latin1Bytes('0\\r\\n\\r\\n');\n", "export interface CdpConnection {\n send(message: string): void;\n onmessage: ((message: string) => void) | null;\n onclose: ((reason?: string) => void) | null;\n close(): void;\n}\n\nexport interface CdpRequest {\n runtime?: string;\n}\n\nexport type CdpHook = (request: CdpRequest) => Promise<CdpConnection>;\n\nexport const CDP_PORT = 9222;\n\nexport const NO_CDP_HOST =\n 'slicc-kernel: no CDP host is attached (createKernel({ cdp }) or client.serveCdp)';\n", "import { concat, HttpError, type Incoming, latin1Bytes } from '../kernel/net/http1.ts';\nimport type { HeaderList } from '../kernel/net/transport.ts';\n\nconst GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';\n\nexport const MAX_MESSAGE = 256 * 1024 * 1024;\n\nexport const CLOSE = {\n normal: 1000,\n protocol: 1002,\n unsupported: 1003,\n invalid: 1007,\n tooBig: 1009,\n error: 1011,\n} as const;\n\nexport const OP_TEXT = 1;\nexport const OP_BINARY = 2;\n\nconst OP = {\n continuation: 0,\n text: OP_TEXT,\n binary: OP_BINARY,\n close: 8,\n ping: 9,\n pong: 10,\n} as const;\n\nexport interface Sink {\n write(bytes: Uint8Array, signal?: AbortSignal): Promise<unknown>;\n}\n\nexport type WsEvent =\n | { kind: 'text'; text: string }\n | { kind: 'ping'; payload: Uint8Array }\n | { kind: 'close'; code: number; reason: string };\n\nexport type WsBinaryEvent = { kind: 'binary'; bytes: Uint8Array };\n\nexport class WsError extends Error {\n readonly code: number;\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport function sendableCode(code: number): boolean {\n if (code >= 3000 && code <= 4999) return true;\n return code >= 1000 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006;\n}\n\nfunction field(headers: HeaderList, name: string): string | undefined {\n return headers.find(([n]) => n.toLowerCase() === name)?.[1];\n}\n\nexport async function acceptKey(headers: HeaderList): Promise<string> {\n const tokens = (name: string) =>\n (field(headers, name) ?? '').split(',').map((t) => t.trim().toLowerCase());\n if (!tokens('upgrade').includes('websocket') || !tokens('connection').includes('upgrade')) {\n throw new HttpError(400, 'expected a WebSocket upgrade');\n }\n if (field(headers, 'sec-websocket-version') !== '13') {\n throw new HttpError(400, 'Sec-WebSocket-Version must be 13');\n }\n const key = field(headers, 'sec-websocket-key') ?? '';\n if (!/^[A-Za-z0-9+/]{22}==$/.test(key)) throw new HttpError(400, 'bad Sec-WebSocket-Key');\n const digest = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(key + GUID));\n return btoa(String.fromCharCode(...new Uint8Array(digest)));\n}\n\nexport function isUpgrade(headers: HeaderList): boolean {\n return (field(headers, 'upgrade') ?? '').toLowerCase().includes('websocket');\n}\n\nexport function frame(opcode: number, payload: Uint8Array): Uint8Array {\n const n = payload.length;\n const size = n < 126 ? 2 : n < 0x10000 ? 4 : 10;\n const out = new Uint8Array(size + n);\n const view = new DataView(out.buffer);\n out[0] = 0x80 | opcode;\n if (n < 126) out[1] = n;\n else if (n < 0x10000) {\n out[1] = 126;\n view.setUint16(2, n);\n } else {\n out[1] = 127;\n view.setBigUint64(2, BigInt(n));\n }\n out.set(payload, size);\n return out;\n}\n\nexport function closeFrame(code: number, reason = ''): Uint8Array {\n let bytes = new TextEncoder().encode(reason);\n if (bytes.length > 123) {\n let end = 123;\n while ((bytes[end] & 0xc0) === 0x80) end--;\n bytes = bytes.subarray(0, end);\n }\n const payload = new Uint8Array(2 + bytes.length);\n new DataView(payload.buffer).setUint16(0, code);\n payload.set(bytes, 2);\n return frame(OP.close, payload);\n}\n\nexport function pongFrame(payload: Uint8Array): Uint8Array {\n return frame(OP.pong, payload);\n}\n\nasync function fill(incoming: Incoming, out: Uint8Array, signal?: AbortSignal): Promise<void> {\n for (let at = 0; at < out.length; ) {\n const piece = await incoming.some(out.length - at, signal);\n if (piece.length === 0) throw new WsError(CLOSE.protocol, 'the connection closed mid-frame');\n out.set(piece, at);\n at += piece.length;\n }\n}\n\nconst fatal = new TextDecoder('utf-8', { fatal: true });\n\nfunction decode(bytes: Uint8Array): string {\n try {\n return fatal.decode(bytes);\n } catch {\n throw new WsError(CLOSE.invalid, 'a text message is not UTF-8');\n }\n}\n\nexport class WsReader<Binary extends boolean = false> {\n private readonly incoming: Incoming;\n private readonly max: number;\n private parts: Uint8Array[] = [];\n private size = 0;\n private continuing = false;\n private binaryMessage = false;\n private readonly binary: Binary | undefined;\n\n constructor(incoming: Incoming, max = MAX_MESSAGE, binary?: Binary) {\n this.incoming = incoming;\n this.max = max;\n this.binary = binary;\n }\n\n async next(\n signal?: AbortSignal\n ): Promise<WsEvent | (Binary extends true ? WsBinaryEvent : never) | null> {\n for (;;) {\n const first = await this.incoming.some(1, signal);\n if (first.length === 0) return null;\n const head = new Uint8Array(2);\n head[0] = first[0];\n await fill(this.incoming, head.subarray(1), signal);\n const fin = (head[0] & 0x80) !== 0;\n const opcode = head[0] & 0x0f;\n if ((head[0] & 0x70) !== 0) throw new WsError(CLOSE.protocol, 'reserved bits are set');\n if ((head[1] & 0x80) === 0) throw new WsError(CLOSE.protocol, 'client frames must be masked');\n const length = await this.length(head[1] & 0x7f, signal);\n const control = opcode >= 8;\n if (control && (length > 125 || !fin)) {\n throw new WsError(CLOSE.protocol, 'a control frame is too long or fragmented');\n }\n if (!control && this.size + length > this.max) {\n throw new WsError(CLOSE.tooBig, `a message is over ${this.max} bytes`);\n }\n const mask = new Uint8Array(4);\n await fill(this.incoming, mask, signal);\n const payload = new Uint8Array(length);\n await fill(this.incoming, payload, signal);\n for (let i = 0; i < length; i++) payload[i] ^= mask[i & 3];\n const event = this.take(opcode, fin, payload);\n if (event) return event as WsEvent | (Binary extends true ? WsBinaryEvent : never);\n }\n }\n\n private data(\n opcode: number,\n fin: boolean,\n payload: Uint8Array\n ): WsEvent | WsBinaryEvent | undefined {\n if ((opcode === OP.continuation) !== this.continuing) {\n throw new WsError(CLOSE.protocol, 'unexpected continuation frame');\n }\n if (opcode !== OP.continuation) this.binaryMessage = opcode === OP.binary;\n this.parts.push(payload);\n this.size += payload.length;\n this.continuing = !fin;\n if (!fin) return undefined;\n const whole = this.parts.length === 1 ? payload : concat(this.parts, this.size);\n this.parts = [];\n this.size = 0;\n return this.binaryMessage\n ? { kind: 'binary', bytes: whole }\n : { kind: 'text', text: decode(whole) };\n }\n\n private async length(short: number, signal?: AbortSignal): Promise<number> {\n if (short < 126) return short;\n const ext = new Uint8Array(short === 126 ? 2 : 8);\n await fill(this.incoming, ext, signal);\n const view = new DataView(ext.buffer);\n if (short === 126) return view.getUint16(0);\n const long = view.getBigUint64(0);\n return long > BigInt(this.max) ? this.max + 1 : Number(long);\n }\n\n private take(\n opcode: number,\n fin: boolean,\n payload: Uint8Array\n ): WsEvent | WsBinaryEvent | undefined {\n switch (opcode) {\n case OP.ping:\n return { kind: 'ping', payload };\n case OP.pong:\n return undefined;\n case OP.close: {\n if (payload.length === 1) throw new WsError(CLOSE.protocol, 'a close frame is malformed');\n const code = payload.length >= 2 ? new DataView(payload.buffer).getUint16(0) : 1005;\n if (payload.length >= 2 && !sendableCode(code)) {\n throw new WsError(CLOSE.protocol, `close code ${code} may not be sent`);\n }\n return { kind: 'close', code, reason: decode(payload.subarray(2)) };\n }\n case OP.binary:\n if (!this.binary) throw new WsError(CLOSE.unsupported, 'CDP messages are text');\n return this.data(opcode, fin, payload);\n case OP.text:\n case OP.continuation:\n return this.data(opcode, fin, payload);\n default:\n throw new WsError(CLOSE.protocol, `unknown opcode ${opcode}`);\n }\n }\n}\n\nexport function switchingHead(accept: string, protocol = ''): Uint8Array {\n const chosen = protocol ? `Sec-WebSocket-Protocol: ${protocol}\\r\\n` : '';\n return latin1Bytes(\n `HTTP/1.1 101 Switching Protocols\\r\\nUpgrade: websocket\\r\\nConnection: Upgrade\\r\\nSec-WebSocket-Accept: ${accept}\\r\\n${chosen}\\r\\n`\n );\n}\n", "import {\n HttpError,\n Incoming,\n latin1Bytes,\n parseRequestHead,\n REASON,\n type RequestHead,\n} from '../kernel/net/http1.ts';\nimport type { KernelSocket, LoopbackNet } from '../kernel/socket.ts';\nimport type { CdpHosts } from './hosts.ts';\nimport { CDP_PORT, type CdpConnection, NO_CDP_HOST } from './types.ts';\nimport {\n acceptKey,\n CLOSE,\n closeFrame,\n frame,\n isUpgrade,\n MAX_MESSAGE,\n OP_TEXT,\n pongFrame,\n switchingHead,\n WsError,\n WsReader,\n} from './websocket.ts';\n\nconst MAX_HEAD = 64 * 1024;\nconst LIST_TIMEOUT = 10000;\n\nconst CLOSE_WAIT_MS = 1000;\n\nexport interface CdpFacadeOptions {\n net: LoopbackNet;\n hosts: CdpHosts;\n port?: number;\n maxMessage?: number;\n closeWaitMs?: number;\n listTimeout?: number;\n}\n\ninterface TargetInfo {\n targetId: string;\n type: string;\n title: string;\n url: string;\n attached?: boolean;\n}\n\nfunction respond(status: number, body: string, type = 'text/plain; charset=utf-8'): Uint8Array {\n const bytes = new TextEncoder().encode(body);\n const head = latin1Bytes(\n `HTTP/1.1 ${status} ${REASON[status]}\\r\\nContent-Type: ${type}\\r\\nContent-Length: ${bytes.length}\\r\\nConnection: close\\r\\n\\r\\n`\n );\n const out = new Uint8Array(head.length + bytes.length);\n out.set(head);\n out.set(bytes, head.length);\n return out;\n}\n\nfunction json(value: unknown): Uint8Array {\n return respond(200, `${JSON.stringify(value, null, 2)}\\n`, 'application/json; charset=UTF-8');\n}\n\nexport class CdpFacade {\n private readonly options: CdpFacadeOptions;\n private readonly listener: KernelSocket;\n private readonly stop = new AbortController();\n private readonly connections = new Set<KernelSocket>();\n readonly closed: Promise<void>;\n\n constructor(options: CdpFacadeOptions) {\n this.options = options;\n this.listener = options.net.listen({\n family: 'inet',\n host: '127.0.0.1',\n port: options.port ?? CDP_PORT,\n });\n this.closed = this.acceptLoop();\n }\n\n close(): void {\n if (this.stop.signal.aborted) return;\n this.stop.abort();\n this.listener.close();\n for (const conn of this.connections) conn.close();\n }\n\n private async acceptLoop(): Promise<void> {\n const served = new Set<Promise<void>>();\n for (;;) {\n let conn: KernelSocket;\n try {\n conn = await this.listener.accept(this.stop.signal);\n } catch {\n break;\n }\n const done = this.serve(conn).finally(() => served.delete(done));\n served.add(done);\n }\n await Promise.allSettled([...served]);\n }\n\n private async serve(conn: KernelSocket): Promise<void> {\n this.connections.add(conn);\n const incoming = new Incoming(conn);\n try {\n const head = await incoming.head(MAX_HEAD, this.stop.signal);\n if (head) await this.route(conn, incoming, parseRequestHead(head));\n } catch (e) {\n if (e instanceof HttpError) await this.write(conn, respond(e.status, `${e.message}\\n`));\n } finally {\n this.connections.delete(conn);\n conn.close();\n }\n }\n\n private async write(conn: KernelSocket, bytes: Uint8Array): Promise<void> {\n try {\n await conn.write(bytes, this.stop.signal);\n } catch {}\n }\n\n private async route(conn: KernelSocket, incoming: Incoming, req: RequestHead): Promise<void> {\n const url = new URL(req.target, 'http://127.0.0.1');\n const runtime = url.searchParams.get('runtime') ?? undefined;\n const host = req.headers.find(([n]) => n.toLowerCase() === 'host')?.[1] ?? '127.0.0.1';\n if (req.method !== 'GET') throw new HttpError(405, `${req.method} is not supported here`);\n const { hosts } = this.options;\n if (url.pathname === hosts.path && isUpgrade(req.headers)) {\n return this.upgrade(conn, incoming, req, runtime);\n }\n const path = url.pathname.replace(/\\/+$/, '');\n if (path !== '/json/version' && path !== '/json/list' && path !== '/json') {\n throw new HttpError(404, 'not found: try /json/version');\n }\n if (!this.options.hosts.available(runtime)) {\n throw new HttpError(503, NO_CDP_HOST);\n }\n if (path === '/json/version') {\n await this.write(\n conn,\n json({\n Browser: 'slicc-kernel',\n 'Protocol-Version': '1.3',\n webSocketDebuggerUrl: `ws://${host}${hosts.path}${url.search}`,\n })\n );\n return;\n }\n await this.write(conn, json(await this.list(runtime)));\n }\n\n private async list(runtime: string | undefined): Promise<unknown[]> {\n const conn = await this.host(runtime);\n try {\n const reply = await new Promise<{ result?: { targetInfos?: TargetInfo[] }; error?: unknown }>(\n (resolve, reject) => {\n const timer = setTimeout(\n () => reject(new HttpError(504, 'the CDP host did not answer Target.getTargets')),\n this.options.listTimeout ?? LIST_TIMEOUT\n );\n conn.onclose = (reason) => {\n clearTimeout(timer);\n reject(new HttpError(502, `the CDP host closed: ${reason ?? 'no reason'}`));\n };\n conn.onmessage = (message) => {\n const parsed = JSON.parse(message) as { id?: number };\n if (parsed.id !== 1) return;\n clearTimeout(timer);\n resolve(parsed as never);\n };\n conn.send(JSON.stringify({ id: 1, method: 'Target.getTargets' }));\n }\n );\n if (!reply.result) {\n throw new HttpError(502, `Target.getTargets failed: ${JSON.stringify(reply.error)}`);\n }\n return (reply.result.targetInfos ?? []).map((t) => ({\n description: '',\n id: t.targetId,\n title: t.title,\n type: t.type,\n url: t.url,\n }));\n } finally {\n conn.close();\n }\n }\n\n private host(runtime: string | undefined): Promise<CdpConnection> {\n return this.options.hosts.connect(runtime ? { runtime } : {});\n }\n\n private async upgrade(\n conn: KernelSocket,\n incoming: Incoming,\n req: RequestHead,\n runtime: string | undefined\n ): Promise<void> {\n const accept = await acceptKey(req.headers);\n const host = await this.host(runtime);\n const limits = {\n max: this.options.maxMessage ?? MAX_MESSAGE,\n closeWaitMs: this.options.closeWaitMs ?? CLOSE_WAIT_MS,\n };\n await new Relay(conn, incoming, host, limits, this.stop.signal)\n .start(switchingHead(accept))\n .finally(() => host.close());\n }\n}\n\nclass Relay {\n private writes: Promise<unknown> = Promise.resolve();\n private ended = false;\n\n private readonly conn: KernelSocket;\n private readonly incoming: Incoming;\n private readonly host: CdpConnection;\n private readonly max: number;\n private readonly closeWaitMs: number;\n private readonly stop: AbortSignal;\n\n constructor(\n conn: KernelSocket,\n incoming: Incoming,\n host: CdpConnection,\n limits: { max: number; closeWaitMs: number },\n stop: AbortSignal\n ) {\n this.conn = conn;\n this.incoming = incoming;\n this.host = host;\n this.max = limits.max;\n this.closeWaitMs = limits.closeWaitMs;\n this.stop = stop;\n }\n\n private send(bytes: Uint8Array): Promise<unknown> {\n this.writes = this.writes.then(() => this.conn.write(bytes, this.stop)).catch(() => undefined);\n return this.writes;\n }\n\n private end(code: number, reason: string): Promise<unknown> {\n if (this.ended) return this.writes;\n this.ended = true;\n return this.send(closeFrame(code, reason));\n }\n\n async start(head: Uint8Array): Promise<void> {\n await this.send(head);\n const hostGone = new Promise<void>((resolve) => {\n this.host.onclose = (reason) => {\n void this.end(reason ? CLOSE.error : CLOSE.normal, reason ?? '').then(() => resolve());\n };\n });\n this.host.onmessage = (message) => {\n if (this.ended) return;\n const bytes = new TextEncoder().encode(message);\n if (bytes.length > this.max)\n void this.end(CLOSE.tooBig, `a message is over ${this.max} bytes`);\n else void this.send(frame(OP_TEXT, bytes));\n };\n const pumping = this.pump();\n await Promise.race([pumping, hostGone]);\n await this.writes;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const waited = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, this.closeWaitMs);\n });\n await Promise.race([pumping, waited]);\n clearTimeout(timer);\n }\n\n private async pump(): Promise<void> {\n const reader = new WsReader(this.incoming, this.max);\n try {\n for (;;) {\n const event = await reader.next(this.stop);\n if (!event) return;\n if (event.kind === 'text') this.host.send(event.text);\n else if (event.kind === 'ping') void this.send(pongFrame(event.payload));\n else {\n await this.end(event.code === 1005 ? CLOSE.normal : event.code, '');\n return;\n }\n }\n } catch (e) {\n if (e instanceof WsError) await this.end(e.code, e.message);\n }\n }\n}\n\nexport function enableCdp(net: LoopbackNet, hosts: CdpHosts): () => CdpFacade | undefined {\n let facade: CdpFacade | undefined;\n net.kernelOnly(CDP_PORT, true);\n net.activate({ family: 'inet', host: '127.0.0.1', port: CDP_PORT }, () => {\n const started = new CdpFacade({ net, hosts });\n facade = started;\n void started.closed.then(() => {\n if (facade === started) facade = undefined;\n });\n });\n return () => facade;\n}\n", "import { HttpError } from '../kernel/net/http1.ts';\nimport {\n CDP_PORT,\n type CdpConnection,\n type CdpHook,\n type CdpRequest,\n NO_CDP_HOST,\n} from './types.ts';\n\ninterface Registration {\n hook: CdpHook;\n runtime: string | undefined;\n open: Set<CdpConnection>;\n}\n\nexport class CdpHosts {\n private readonly embedder: Registration | undefined;\n private readonly clients: Registration[] = [];\n private closed = false;\n readonly path = `/devtools/browser/${crypto.randomUUID()}`;\n readonly url = `ws://127.0.0.1:${CDP_PORT}${this.path}`;\n\n constructor(hook?: CdpHook) {\n this.embedder = hook ? { hook, runtime: undefined, open: new Set() } : undefined;\n }\n\n register(hook: CdpHook, runtime?: string): () => void {\n const entry: Registration = { hook, runtime, open: new Set() };\n this.clients.push(entry);\n return () => {\n const at = this.clients.indexOf(entry);\n if (at >= 0) this.clients.splice(at, 1);\n closeAll(entry);\n };\n }\n\n private pick(runtime: string | undefined): Registration | undefined {\n if (this.closed) return undefined;\n const named = runtime ? this.clients.findLast((c) => c.runtime === runtime) : undefined;\n return named ?? this.embedder ?? this.clients.at(-1);\n }\n\n available(runtime?: string): boolean {\n return this.pick(runtime) !== undefined;\n }\n\n async connect(request: CdpRequest): Promise<CdpConnection> {\n const entry = this.pick(request.runtime);\n if (!entry) throw new HttpError(503, NO_CDP_HOST);\n let conn: CdpConnection;\n try {\n conn = await entry.hook(request.runtime ? { runtime: request.runtime } : {});\n } catch (e) {\n throw new HttpError(502, `CDP host: ${e instanceof Error ? e.message : String(e)}`);\n }\n if (this.closed || !(entry === this.embedder || this.clients.includes(entry))) {\n conn.close();\n throw new HttpError(503, NO_CDP_HOST);\n }\n entry.open.add(conn);\n const close = conn.close.bind(conn);\n conn.close = () => {\n if (entry.open.delete(conn)) close();\n };\n return conn;\n }\n\n close(): void {\n this.closed = true;\n for (const entry of [this.embedder, ...this.clients]) if (entry) closeAll(entry);\n }\n}\n\nfunction closeAll(entry: Registration): void {\n for (const conn of [...entry.open]) {\n conn.close();\n conn.onclose?.('the CDP host is gone');\n }\n}\n", "import type { KernelFs } from './fs/types.ts';\n\nexport type Abi = 'emscripten' | 'wasi' | 'js';\n\nexport interface Command {\n name: string;\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n argv0Path?: boolean;\n preopenRoot?: boolean;\n args?: string[];\n env?: Record<string, string>;\n unset?: string[];\n script?: string;\n imports?: string;\n}\n\ninterface CommandEntry {\n abi?: unknown;\n glue?: unknown;\n wasm?: unknown;\n argv0?: unknown;\n argv0Path?: unknown;\n preopenRoot?: unknown;\n args?: unknown;\n env?: unknown;\n script?: unknown;\n imports?: unknown;\n module?: unknown;\n}\n\ninterface Manifest {\n slicc?: {\n abi?: unknown;\n commands?: unknown;\n env?: unknown;\n filesystems?: unknown;\n binfmt?: unknown;\n };\n}\n\nconst NAME = /^[A-Za-z0-9._+-]+$/;\nconst ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst PACKAGE = /\\$\\{package\\}/g;\n\nfunction inside(pkg: string, rel: unknown): string | undefined {\n if (typeof rel !== 'string' || rel === '') return undefined;\n const clean = rel.replace(/^\\.\\//, '');\n if (clean.startsWith('/') || clean.split('/').includes('..')) return undefined;\n return `${pkg}/${clean}`;\n}\n\ntype ManifestEnv = Record<string, string | null>;\n\nfunction envOf(pkg: string, raw: unknown): ManifestEnv {\n const env: ManifestEnv = {};\n if (!raw || typeof raw !== 'object') return env;\n for (const [key, value] of Object.entries(raw)) {\n if (!ENV_KEY.test(key)) continue;\n if (typeof value === 'string') env[key] = value.replace(PACKAGE, pkg);\n else if (value === null) env[key] = null;\n }\n return env;\n}\n\nfunction envFields(merged: ManifestEnv): { env?: Record<string, string>; unset?: string[] } {\n const env: Record<string, string> = {};\n const unset: string[] = [];\n for (const [key, value] of Object.entries(merged)) {\n if (value === null) unset.push(key);\n else env[key] = value;\n }\n return {\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(unset.length > 0 ? { unset } : {}),\n };\n}\n\nfunction argsOf(pkg: string, raw: unknown): string[] | undefined {\n if (!Array.isArray(raw) || raw.length === 0) return undefined;\n if (!raw.every((arg) => typeof arg === 'string')) return undefined;\n return raw.map((arg) => arg.replace(PACKAGE, pkg));\n}\n\nfunction abiOf(raw: unknown, fallback: Abi): Abi | undefined {\n const abi = raw ?? fallback;\n return abi === 'emscripten' || abi === 'wasi' || abi === 'js' ? abi : undefined;\n}\n\nfunction commandOf(\n pkg: string,\n name: string,\n raw: CommandEntry,\n packageAbi: Abi,\n shared: ManifestEnv\n): Command | undefined {\n const withEnv = envFields({ ...shared, ...envOf(pkg, raw.env) });\n const script = inside(pkg, raw.script);\n if (script) {\n return { name, abi: packageAbi, glue: script, wasm: script, argv0: name, script, ...withEnv };\n }\n const abi = abiOf(raw.abi, packageAbi);\n const argv0 = typeof raw.argv0 === 'string' && raw.argv0 ? raw.argv0 : name;\n const args = argsOf(pkg, raw.args);\n if (abi === 'js') {\n const module = inside(pkg, raw.module);\n if (!module) return undefined;\n return {\n name,\n abi,\n glue: module,\n wasm: module,\n argv0,\n ...(raw.argv0Path === true ? { argv0Path: true } : {}),\n ...(args ? { args } : {}),\n ...withEnv,\n };\n }\n const wasm = inside(pkg, raw.wasm);\n const glue = abi === 'wasi' ? wasm : inside(pkg, raw.glue);\n if (!abi || !glue || !wasm) return undefined;\n const imports = abi === 'wasi' ? inside(pkg, raw.imports) : undefined;\n return {\n name,\n abi,\n glue,\n wasm,\n argv0,\n ...(raw.argv0Path === true ? { argv0Path: true } : {}),\n ...(abi === 'wasi' && raw.preopenRoot === true ? { preopenRoot: true } : {}),\n ...(args ? { args } : {}),\n ...withEnv,\n ...(imports ? { imports } : {}),\n };\n}\n\nexport function commandsOf(pkg: string, manifest: Manifest): Command[] {\n const slicc = manifest.slicc;\n if (!slicc || typeof slicc !== 'object') return [];\n const packageAbi = abiOf(slicc.abi, 'emscripten');\n const entries = slicc.commands;\n if (!packageAbi || !entries || typeof entries !== 'object') return [];\n const shared = envOf(pkg, slicc.env);\n const out: Command[] = [];\n for (const [name, raw] of Object.entries(entries as Record<string, CommandEntry>)) {\n if (!NAME.test(name) || name === '.' || name === '..' || !raw || typeof raw !== 'object') {\n continue;\n }\n const command = commandOf(pkg, name, raw, packageAbi, shared);\n if (command) out.push(command);\n }\n return out;\n}\n\nasync function withPackagePaths(fs: KernelFs, pkg: string, command: Command): Promise<Command> {\n if (!command.env) return command;\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(command.env)) {\n const path = !value.startsWith('/') && value.includes('/') && inside(pkg, value);\n env[key] = path && (await fs.exists(path)) ? path : value;\n }\n return { ...command, env };\n}\n\nasync function packages(fs: KernelFs, modules: string): Promise<string[]> {\n const names = await fs.readdir(modules).catch(() => []);\n const packageNames: string[] = [];\n for (const name of names) {\n if (name.startsWith('.')) continue;\n if (!name.startsWith('@')) {\n packageNames.push(name);\n continue;\n }\n for (const inner of await fs.readdir(`${modules}/${name}`).catch(() => [])) {\n packageNames.push(`${name}/${inner}`);\n }\n }\n packageNames.sort();\n return packageNames.map((name) => `${modules}/${name}`);\n}\n\nexport async function pnpmGlobalRoots(fs: KernelFs, home: string): Promise<string[]> {\n const roots: string[] = [];\n const global = `${home}/global`;\n for (const version of (await fs.readdir(global).catch(() => [])).sort()) {\n for (const group of (await fs.readdir(`${global}/${version}`).catch(() => [])).sort()) {\n const dir = `${global}/${version}/${group}`;\n const st = await fs.lstat(dir).catch(() => undefined);\n if (st?.isDirectory && (await fs.exists(`${dir}/node_modules`)))\n roots.push(`${dir}/node_modules`);\n }\n }\n return roots;\n}\n\nasync function packagesIn(fs: KernelFs, roots: string | string[]): Promise<string[]> {\n const dirs: string[] = [];\n for (const root of typeof roots === 'string' ? [roots] : roots)\n dirs.push(...(await packages(fs, root)));\n return dirs;\n}\n\nexport async function scanCommands(\n fs: KernelFs,\n modules: string | string[]\n): Promise<Map<string, Command>> {\n const found = new Map<string, Command>();\n for (const pkg of await packagesIn(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n for (const command of commandsOf(pkg, manifest)) {\n if (!found.has(command.name))\n found.set(command.name, await withPackagePaths(fs, pkg, command));\n }\n }\n if (!found.has('sh') && found.has('bash')) {\n found.set('sh', { ...(found.get('bash') as Command), name: 'sh', argv0: 'sh' });\n }\n return found;\n}\n\nexport async function scanFilesystems(\n fs: KernelFs,\n modules: string | string[]\n): Promise<Map<string, string>> {\n const found = new Map<string, string>();\n for (const pkg of await packagesIn(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n const declared = manifest.slicc?.filesystems;\n if (!declared || typeof declared !== 'object') continue;\n for (const [type, entry] of Object.entries(declared)) {\n const module = inside(pkg, (entry as { module?: unknown } | null)?.module);\n if (NAME.test(type) && module && !found.has(type)) found.set(type, module);\n }\n }\n return found;\n}\n\nconst SUFFIX = /^\\.[A-Za-z0-9_+-][A-Za-z0-9._+-]*$/;\n\nexport async function scanBinfmts(\n fs: KernelFs,\n modules: string | string[],\n warn: (message: string) => void = () => {}\n): Promise<Map<string, string>> {\n const found = new Map<string, string>();\n const owners = new Map<string, string>();\n for (const pkg of await packagesIn(fs, modules)) {\n let manifest: Manifest;\n try {\n manifest = JSON.parse(await fs.readFile(`${pkg}/package.json`));\n } catch {\n continue;\n }\n const declared = manifest.slicc?.binfmt;\n if (!declared || typeof declared !== 'object') continue;\n for (const [suffix, command] of Object.entries(declared)) {\n if (!SUFFIX.test(suffix) || typeof command !== 'string' || !NAME.test(command)) continue;\n const owner = owners.get(suffix);\n if (owner === undefined) {\n found.set(suffix, command);\n owners.set(suffix, pkg);\n } else if (found.get(suffix) !== command) {\n warn(\n `binfmt ${suffix}: ${owner} maps it to ${found.get(suffix)}, so ${pkg}'s ${command} is ignored`\n );\n }\n }\n }\n return found;\n}\n\nexport function binfmtOf(binfmts: ReadonlyMap<string, string>, path: string): string | undefined {\n const name = path.slice(path.lastIndexOf('/') + 1);\n let best: string | undefined;\n for (const suffix of binfmts.keys()) {\n if (name.length > suffix.length && name.endsWith(suffix)) {\n if (best === undefined || suffix.length > best.length) best = suffix;\n }\n }\n return best === undefined ? undefined : binfmts.get(best);\n}\n", "import { type FsStat, inodeOf, type KernelFs, lutimesOf, rangedOps } from './types.ts';\n\nconst S_IFDIR = 0o040000;\nconst S_IFREG = 0o100000;\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst MAX_LINKS = 40;\n\nfunction missing(err: unknown): boolean {\n return (err as { code?: unknown })?.code === 'ENOENT';\n}\n\nfunction synthetic(directory: boolean, path: string): FsStat {\n const epoch = new Date(0);\n return {\n isFile: !directory,\n isDirectory: directory,\n isSymbolicLink: false,\n size: 0,\n mode: (directory ? S_IFDIR : S_IFREG) | 0o755,\n mtime: epoch,\n atime: epoch,\n ctime: epoch,\n ino: inodeOf(path),\n };\n}\n\nexport async function followLinks(fs: KernelFs, path: string): Promise<string> {\n let current = path;\n for (let hops = 0; hops < MAX_LINKS; hops++) {\n const st = await fs.lstat(current).catch(() => undefined);\n if (!st?.isSymbolicLink) return current;\n const parent = current.slice(0, current.lastIndexOf('/')) || '/';\n current = fs.resolvePath(parent, await fs.readlink(current));\n }\n return current;\n}\n\nexport function withCommandDirs(fs: KernelFs, names: () => Promise<ReadonlySet<string>>): KernelFs {\n async function children(path: string): Promise<string[] | undefined> {\n if (path === '/') return ['bin', 'usr'];\n if (path === '/usr') return ['bin'];\n if (path === '/bin' || path === '/usr/bin') return [...(await names())];\n return undefined;\n }\n\n async function virtual(path: string): Promise<FsStat | undefined> {\n if (path === '/usr' || path === '/bin' || path === '/usr/bin') return synthetic(true, path);\n const name = COMMAND.exec(path)?.[1];\n return name !== undefined && (await names()).has(name) ? synthetic(false, path) : undefined;\n }\n\n async function linked(path: string): Promise<FsStat | undefined> {\n return (await virtual(path)) ?? virtual(await followLinks(fs, path));\n }\n\n async function stat(path: string, real: (path: string) => Promise<FsStat>): Promise<FsStat> {\n try {\n return await real(path);\n } catch (err) {\n const found = missing(err) ? await linked(path) : undefined;\n if (found) return found;\n throw err;\n }\n }\n\n return {\n resolvePath: (base, path) => fs.resolvePath(base, path),\n readFile: (path) => fs.readFile(path),\n async readFileBuffer(path) {\n try {\n return await fs.readFileBuffer(path);\n } catch (err) {\n if (missing(err) && (await linked(path))?.isFile) return new Uint8Array(0);\n throw err;\n }\n },\n writeFile: (path, content) => fs.writeFile(path, content),\n async exists(path) {\n return (await fs.exists(path)) || (await linked(path)) !== undefined;\n },\n stat: (path) => stat(path, (p) => fs.stat(p)),\n lstat: (path) => stat(path, (p) => fs.lstat(p)),\n async readdir(path) {\n const extra = await children(path);\n if (!extra) return fs.readdir(path);\n const real = await fs.readdir(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n return [...new Set([...real, ...extra])].sort();\n },\n async readdirStat(path) {\n const extra = await children(path);\n if (!extra) return fs.readdirStat(path);\n const real = await fs.readdirStat(path).catch((err) => {\n if (missing(err)) return [];\n throw err;\n });\n const seen = new Set(real.map(([name]) => name));\n const base = path === '/' ? '' : path;\n const added = extra.filter((name) => !seen.has(name));\n const virtuals = await Promise.all(\n added.map(\n async (name): Promise<[string, FsStat | null]> => [\n name,\n (await virtual(`${base}/${name}`)) as FsStat,\n ]\n )\n );\n return [...real, ...virtuals].sort(([a], [b]) => (a < b ? -1 : 1));\n },\n mkdir: (path, options) => fs.mkdir(path, options),\n rm: (path, options) => fs.rm(path, options),\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n ...(fs.realpath ? { realpath: fs.realpath.bind(fs) } : {}),\n chmod: (path, mode) => fs.chmod(path, mode),\n utimes: (path, atime, mtime) => fs.utimes(path, atime, mtime),\n lutimes: (path, atime, mtime) => lutimesOf(fs, path, atime, mtime),\n ...(rangedOps(fs) ?? {}),\n };\n}\n", "const MAX_HOPS = 40;\n\ninterface Walk {\n done: string[];\n todo: string[];\n hops: number;\n}\n\nfunction start(path: string): Walk {\n return { done: [], todo: path.split('/').filter((p) => p !== ''), hops: 0 };\n}\n\nfunction next(walk: Walk): string | undefined {\n while (walk.todo.length > 0) {\n const part = walk.todo.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n walk.done.pop();\n continue;\n }\n return part;\n }\n return undefined;\n}\n\nfunction lexical(path: string): string {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) walk.done.push(part);\n return `/${walk.done.join('/')}`;\n}\n\nfunction rest(walk: Walk, part: string): string {\n return lexical(`/${[...walk.done, part, ...walk.todo].join('/')}`);\n}\n\nfunction follow(walk: Walk, target: string): boolean {\n if (++walk.hops > MAX_HOPS) return false;\n if (target.startsWith('/')) walk.done.length = 0;\n walk.todo = [...target.split('/').filter((p) => p !== ''), ...walk.todo];\n return true;\n}\n\nexport interface LinkReader {\n lstat(path: string): { isSymbolicLink?: boolean };\n readlink(path: string): string;\n}\n\nexport function physicalPath(fs: LinkReader, path: string): string {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) {\n const at = `/${[...walk.done, part].join('/')}`;\n let target: string | undefined;\n try {\n target = fs.lstat(at).isSymbolicLink ? fs.readlink(at) : undefined;\n } catch {\n return rest(walk, part);\n }\n if (target === undefined) walk.done.push(part);\n else if (!follow(walk, target)) {\n throw Object.assign(new Error('too many levels of symbolic links'), { code: 'ELOOP' });\n }\n }\n return `/${walk.done.join('/')}`;\n}\n\nexport interface AsyncLinkReader {\n lstat(path: string): Promise<{ isSymbolicLink?: boolean }>;\n readlink(path: string): Promise<string>;\n}\n\nexport async function physicalPathAsync(fs: AsyncLinkReader, path: string): Promise<string> {\n const walk = start(path);\n for (let part = next(walk); part !== undefined; part = next(walk)) {\n const at = `/${[...walk.done, part].join('/')}`;\n let target: string | undefined;\n try {\n target = (await fs.lstat(at)).isSymbolicLink ? await fs.readlink(at) : undefined;\n } catch {\n return rest(walk, part);\n }\n if (target === undefined) walk.done.push(part);\n else if (!follow(walk, target)) return lexical(path);\n }\n return `/${walk.done.join('/')}`;\n}\n", "import { type KernelFs, lutimesOf, normalizePath, rangedOps } from './types.ts';\n\nexport type WatchChange = { paths: string[] } | { overflow: true };\n\nexport interface WatchOptions {\n recursive?: boolean;\n}\n\ninterface Watcher {\n paths: string[];\n recursive: boolean;\n notify: (change: WatchChange) => void;\n pending: Set<string>;\n scheduled: boolean;\n}\n\nexport const WATCH_BATCH_LIMIT = 1000;\n\nconst under = (path: string, dir: string) => dir === '/' || path.startsWith(`${dir}/`);\nconst parentOf = (path: string) => path.slice(0, path.lastIndexOf('/')) || '/';\n\nfunction touches(watcher: Watcher, changed: string): boolean {\n return watcher.paths.some(\n (watched) =>\n changed === watched ||\n under(watched, changed) ||\n (watcher.recursive ? under(changed, watched) : parentOf(changed) === watched)\n );\n}\n\nexport class FsWatchers {\n private readonly watchers = new Set<Watcher>();\n\n watch(paths: string[], options: WatchOptions, notify: (change: WatchChange) => void): () => void {\n const watcher: Watcher = {\n paths: paths.map(normalizePath),\n recursive: options.recursive === true,\n notify,\n pending: new Set(),\n scheduled: false,\n };\n this.watchers.add(watcher);\n return () => {\n this.watchers.delete(watcher);\n };\n }\n\n changed(...paths: string[]): void {\n for (const watcher of this.watchers) {\n for (const path of paths) {\n const changed = normalizePath(path);\n if (touches(watcher, changed)) watcher.pending.add(changed);\n }\n if (watcher.pending.size === 0 || watcher.scheduled) continue;\n watcher.scheduled = true;\n setTimeout(() => this.flush(watcher), 0);\n }\n }\n\n private flush(watcher: Watcher): void {\n watcher.scheduled = false;\n const paths = [...watcher.pending];\n watcher.pending.clear();\n if (!this.watchers.has(watcher)) return;\n watcher.notify(paths.length > WATCH_BATCH_LIMIT ? { overflow: true } : { paths });\n }\n\n wrap(fs: KernelFs): KernelFs {\n const after =\n <A extends unknown[]>(\n run: (...args: A) => Promise<void>,\n changed: (...args: A) => string[]\n ) =>\n async (...args: A) => {\n try {\n await run(...args);\n } finally {\n this.changed(...changed(...args));\n }\n };\n const overrides: Partial<Record<keyof KernelFs, unknown>> = {\n writeFile: after(fs.writeFile.bind(fs), (path) => [path]),\n mkdir: async (path: string, options?: { recursive?: boolean }) => {\n const created: string[] = [];\n if (options?.recursive) {\n const parts = normalizePath(path).split('/').filter(Boolean);\n for (let at = 1; at < parts.length; at++) {\n const ancestor = `/${parts.slice(0, at).join('/')}`;\n if (created.length > 0 || !(await fs.exists(ancestor))) created.push(ancestor);\n }\n }\n try {\n await fs.mkdir(path, options);\n } finally {\n this.changed(...created, path);\n }\n },\n rm: after(fs.rm.bind(fs), (path) => [path]),\n rename: after(fs.rename.bind(fs), (from, to) => [from, to]),\n symlink: after(fs.symlink.bind(fs), (_target, path) => [path]),\n chmod: after(fs.chmod.bind(fs), (path) => [path]),\n utimes: after(fs.utimes.bind(fs), (path) => [path]),\n lutimes: after(\n (path: string, atime: Date, mtime: Date) => lutimesOf(fs, path, atime, mtime),\n (path) => [path]\n ),\n };\n const ranged = rangedOps(fs);\n if (ranged) {\n overrides.pwrite = after(ranged.pwrite, (path) => [path]);\n overrides.truncate = after(ranged.truncate, (path) => [path]);\n }\n return new Proxy(fs, {\n get(target, key, receiver) {\n if (Object.hasOwn(overrides, key)) return overrides[key as keyof KernelFs];\n const value = Reflect.get(target, key, receiver);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n }\n}\n", "import {\n bytesSource,\n type DeviceMeta,\n deviceFile,\n FdTable,\n heldFile,\n type KernelErrno,\n KernelError,\n type OpenFile,\n sinkFile,\n} from './fd-table.ts';\nimport type { ForkState } from './protocol.ts';\n\nexport type ChildStdio =\n | { fd: number }\n | { input: Uint8Array }\n | { capture: true }\n | { none: true }\n | { dir: string }\n | DeviceMeta;\n\nexport type InheritedSlot =\n | { fd: number; kernel: number; flags?: number }\n | ({ fd: number } & DeviceMeta);\n\nexport interface ChildSpawnRequest {\n file: string;\n\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n\n exec?: boolean;\n}\n\nexport interface ChildHandle {\n pid: number;\n\n exited: Promise<number>;\n\n termsig?: () => number | undefined;\n\n onState?: (listener: ChildStateListener) => void;\n}\n\nexport type ChildStateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport interface WaitFlags {\n untraced?: boolean;\n\n continued?: boolean;\n\n inGroup?: (childPid: number) => boolean;\n}\n\nexport class SpawnError extends Error {\n readonly code: KernelErrno;\n\n constructor(code: KernelErrno) {\n super(code);\n this.code = code;\n }\n}\n\nexport type ChildSpawner = (req: ChildSpawnRequest, fds: FdTable) => Promise<ChildHandle>;\n\nexport type ChildForker = (state: ForkState, fds: FdTable) => Promise<ChildHandle>;\n\ninterface Child {\n exited: Promise<number>;\n termsig?: () => number | undefined;\n\n code?: number;\n\n stopReport?: number;\n\n continueReport?: boolean;\n\n captured: Map<number, Uint8Array[]>;\n}\n\nfunction interrupted(signal: AbortSignal | undefined): {\n promise: Promise<never>;\n\n done(): void;\n} {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal?.aborted) fail();\n else signal?.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal?.removeEventListener('abort', fail) };\n}\n\nexport function stoppedStatus(sig: number): number {\n return ((sig & 0xff) << 8) | 0x7f;\n}\n\nexport const CONTINUED_STATUS = 0xffff;\n\nexport function waitStatus(code: number, termsig?: number): number {\n return termsig ? termsig & 0x7f : (code & 0xff) << 8;\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class ChildTable {\n private readonly children = new Map<number, Child>();\n\n private readonly leftovers = new Map<number, Map<number, Uint8Array[]>>();\n\n onChildState?: () => void;\n\n onReap?: (pid: number) => void;\n\n private stateChanged: Array<() => void> = [];\n\n private readonly watchers = new Map<number, ChildStateListener>();\n\n private readonly parentFds: FdTable;\n\n private readonly spawner: ChildSpawner | undefined;\n\n private readonly forker?: ChildForker;\n\n constructor(\n parentFds: FdTable,\n\n spawner: ChildSpawner | undefined,\n\n forker?: ChildForker\n ) {\n this.parentFds = parentFds;\n\n this.spawner = spawner;\n\n this.forker = forker;\n }\n\n async fork(state: ForkState): Promise<number> {\n if (!this.forker) throw new SpawnError('ENOSYS');\n return this.track(state, this.parentFds.fork(), new Map(), this.forker);\n }\n\n async spawn(\n req: ChildSpawnRequest,\n stdio: readonly ChildStdio[],\n inherit: readonly InheritedSlot[] = []\n ): Promise<number> {\n if (!this.spawner) throw new SpawnError('ENOSYS');\n const fds = new FdTable();\n const captured = new Map<number, Uint8Array[]>();\n try {\n for (const [n, slot] of stdio.entries()) fds.installAt(n, this.openSlot(slot, n, captured));\n\n for (const slot of inherit) {\n if (slot.fd <= 2) continue;\n if ('device' in slot) {\n fds.installAt(slot.fd, deviceFile(slot.device, slot.access));\n continue;\n }\n fds.installAt(slot.fd, this.parentFds.get(slot.kernel).retain());\n if (slot.flags !== undefined) fds.setStatusFlags(slot.fd, slot.flags);\n }\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n return this.track(req, fds, captured, this.spawner);\n }\n\n private async track<R>(\n req: R,\n fds: FdTable,\n captured: Map<number, Uint8Array[]>,\n start: (req: R, fds: FdTable) => Promise<ChildHandle>\n ): Promise<number> {\n let handle: ChildHandle;\n try {\n handle = await start(req, fds);\n } catch (e) {\n await fds.closeAll();\n throw e;\n }\n const child: Child = { exited: handle.exited, termsig: handle.termsig, captured };\n void handle.exited.then((code) => {\n child.code = code;\n this.watchers.delete(handle.pid);\n this.onChildState?.();\n });\n handle.onState?.((state, sig) => {\n child.stopReport = state === 'stopped' ? sig : undefined;\n child.continueReport = state === 'continued';\n this.watchers.get(handle.pid)?.(state, sig);\n const waiters = this.stateChanged;\n this.stateChanged = [];\n for (const wake of waiters) wake();\n this.onChildState?.();\n });\n this.children.set(handle.pid, child);\n return handle.pid;\n }\n\n watch(pid: number, listener: ChildStateListener): void {\n if (this.children.has(pid)) this.watchers.set(pid, listener);\n }\n\n private openSlot(slot: ChildStdio, n: number, captured: Map<number, Uint8Array[]>): OpenFile {\n if ('fd' in slot) return this.parentFds.get(slot.fd).retain();\n if ('input' in slot) return bytesSource(slot.input);\n if ('device' in slot) return deviceFile(slot.device, slot.access);\n if ('dir' in slot) return heldFile({ dir: slot.dir });\n if ('capture' in slot) {\n const chunks: Uint8Array[] = [];\n captured.set(n, chunks);\n return sinkFile((bytes) => chunks.push(bytes));\n }\n return deviceFile('null');\n }\n\n async wait(\n pid: number,\n nohang: boolean,\n signal?: AbortSignal,\n flags: WaitFlags = {}\n ): Promise<[number, number]> {\n let interrupt: ReturnType<typeof interrupted> | undefined;\n try {\n for (;;) {\n const candidates = this.candidates(pid, flags);\n if (candidates.length === 0) throw new KernelError('ECHILD');\n const done = candidates.find(([, child]) => child.code !== undefined);\n if (done) return this.reap(done[0], done[1].code as number);\n const changed = this.stateReport(candidates, flags);\n if (changed) return changed;\n if (nohang) return [0, 0];\n interrupt ??= interrupted(signal);\n await this.nextChange(candidates, flags, interrupt.promise);\n }\n } finally {\n interrupt?.done();\n }\n }\n\n private candidates(pid: number, flags: WaitFlags): [number, Child][] {\n const all = [...this.children];\n if (pid > 0) return all.filter(([p]) => p === pid);\n const inGroup = flags.inGroup;\n return pid === -1 || !inGroup ? all : all.filter(([p]) => inGroup(p));\n }\n\n private async nextChange(\n candidates: [number, Child][],\n flags: WaitFlags,\n interrupt: Promise<never>\n ): Promise<void> {\n let wake: (() => void) | undefined;\n const stateChange = new Promise<void>((resolve) => (wake = resolve));\n const watching = flags.untraced || flags.continued;\n if (watching && wake) this.stateChanged.push(wake);\n try {\n await Promise.race([\n ...candidates.map(([, child]) => child.exited),\n ...(watching ? [stateChange] : []),\n interrupt,\n ]);\n } finally {\n this.stateChanged = this.stateChanged.filter((w) => w !== wake);\n }\n }\n\n private stateReport(candidates: [number, Child][], flags: WaitFlags): [number, number] | null {\n for (const [p, child] of candidates) {\n if (flags.untraced && child.stopReport !== undefined) {\n const sig = child.stopReport;\n child.stopReport = undefined;\n return [p, stoppedStatus(sig)];\n }\n if (flags.continued && child.continueReport) {\n child.continueReport = false;\n return [p, CONTINUED_STATUS];\n }\n }\n return null;\n }\n\n private reap(pid: number, code: number): [number, number] {\n const child = this.children.get(pid);\n this.children.delete(pid);\n this.onReap?.(pid);\n if (child && child.captured.size > 0) this.leftovers.set(pid, child.captured);\n return [pid, waitStatus(code, child?.termsig?.())];\n }\n\n pids(): number[] {\n return [...this.children.keys()];\n }\n\n captured(pid: number, slot: number): Uint8Array {\n const slots = this.leftovers.get(pid);\n const chunks = slots?.get(slot);\n if (!slots || !chunks) return new Uint8Array(0);\n slots.delete(slot);\n if (slots.size === 0) this.leftovers.delete(pid);\n return concat(chunks);\n }\n}\n", "export const DRIVER_PROTOCOL: readonly [number, number] = [1, 1];\n\nexport interface DriverCapabilities {\n readonly?: boolean;\n symlinks?: boolean;\n chmod?: boolean;\n linkTimes?: boolean;\n ranges?: boolean;\n sessions?: boolean;\n listingStats?: boolean;\n caseInsensitive?: boolean;\n normalization?: 'none' | 'nfc' | 'nfd-insensitive';\n maxIo?: number;\n maxFile?: number;\n attrTtl?: number;\n entryTtl?: number;\n}\n\nexport interface DriverAttr {\n kind: 'file' | 'directory' | 'symlink';\n size: number;\n mtime: number;\n mode?: number;\n ino?: number;\n etag?: string;\n}\n\nexport interface DriverEntry {\n name: string;\n kind: DriverAttr['kind'];\n attr?: DriverAttr;\n}\n\nexport interface DriverStatfs {\n bsize: number;\n blocks: number;\n bfree: number;\n}\n\nexport interface MountRequestInfo {\n source: string;\n options: Record<string, string>;\n}\n\nexport type DriverCall =\n | { op: 'getattr'; path: string }\n | { op: 'readdir'; path: string }\n | {\n op: 'open';\n path: string;\n write: boolean;\n create: boolean;\n truncate: boolean;\n exclusive: boolean;\n ifMatch?: string;\n }\n | { op: 'read'; fh: number; offset: number; size: number }\n | { op: 'write'; fh: number; offset: number; bytes: Uint8Array }\n | { op: 'release'; fh: number }\n | { op: 'mkdir'; path: string }\n | { op: 'rmdir'; path: string }\n | { op: 'unlink'; path: string }\n | { op: 'rename'; from: string; to: string }\n | { op: 'symlink'; target: string; path: string }\n | { op: 'readlink'; path: string }\n | { op: 'setattr'; path: string; mode?: number; mtime?: number; size?: number }\n | { op: 'statfs' };\n\nexport type DriverRequest = DriverCall & { id: number };\n\nexport interface DriverReply {\n id: number;\n result?: unknown;\n errno?: string;\n message?: string;\n}\n\nexport interface KernelDriverHello {\n protocol: readonly [number, number];\n mount: MountRequestInfo;\n}\n\nexport interface DriverHello {\n protocol: readonly [number, number];\n capabilities?: DriverCapabilities;\n error?: string;\n errno?: string;\n}\n\nexport type KernelToDriver = { hello: KernelDriverHello } | DriverRequest;\n\nexport type DriverToKernel = { hello: DriverHello } | DriverReply | { invalidate: string[] | true };\n\nexport function driverVersionError(theirs: unknown): string | undefined {\n const major = Array.isArray(theirs) ? theirs[0] : undefined;\n if (major === DRIVER_PROTOCOL[0]) return undefined;\n const named = typeof major === 'number' ? `${major}.x` : 'without a version';\n return `slicc-kernel driver protocol ${named} is not supported: this side speaks ${DRIVER_PROTOCOL.join('.')}`;\n}\n", "import {\n DRIVER_PROTOCOL,\n type DriverCall,\n type DriverCapabilities,\n type DriverHello,\n type DriverReply,\n driverVersionError,\n type MountRequestInfo,\n} from './protocol.ts';\n\nexport interface DriverPortLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close?(): void;\n}\n\nexport interface ConnectionOptions {\n timeoutMs?: number;\n onInvalidate?: (paths: string[] | true) => void;\n onFail?: (error: Error) => void;\n}\n\ninterface Waiting {\n resolve(value: unknown): void;\n reject(error: Error): void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nexport const DRIVER_TIMEOUT_MS = 30_000;\n\nfunction unref(timer: ReturnType<typeof setTimeout>): ReturnType<typeof setTimeout> {\n (timer as { unref?: () => void }).unref?.();\n return timer;\n}\n\nexport function errnoError(code: string, message: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${message}`), { code });\n}\n\nexport class DriverConnection {\n readonly capabilities: DriverCapabilities;\n failure: Error | undefined;\n private readonly port: DriverPortLike;\n private readonly waiting: Map<number, Waiting>;\n private readonly timeoutMs: number;\n private nextId = 0;\n private readonly onFail: ((error: Error) => void) | undefined;\n\n private constructor(\n port: DriverPortLike,\n capabilities: DriverCapabilities,\n waiting: Map<number, Waiting>,\n timeoutMs: number,\n onFail: ((error: Error) => void) | undefined\n ) {\n this.port = port;\n this.capabilities = capabilities;\n this.waiting = waiting;\n this.timeoutMs = timeoutMs;\n this.onFail = onFail;\n }\n\n static async open(\n port: DriverPortLike,\n mount: MountRequestInfo,\n options: ConnectionOptions = {}\n ): Promise<DriverConnection> {\n const timeoutMs = options.timeoutMs ?? DRIVER_TIMEOUT_MS;\n const waiting = new Map<number, Waiting>();\n const greeted = Promise.withResolvers<DriverHello>();\n port.addEventListener('message', (event) => {\n const data = event.data as {\n hello?: DriverHello;\n invalidate?: string[] | true;\n } & DriverReply;\n if (data.hello) return greeted.resolve(data.hello);\n if (data.invalidate !== undefined) return options.onInvalidate?.(data.invalidate);\n const call = waiting.get(data.id);\n if (!call) return;\n waiting.delete(data.id);\n clearTimeout(call.timer);\n if (data.errno) call.reject(errnoError(data.errno, data.message ?? data.errno));\n else call.resolve(data.result);\n });\n port.start?.();\n port.postMessage({ hello: { protocol: DRIVER_PROTOCOL, mount } });\n const timer = unref(\n setTimeout(\n () => greeted.reject(errnoError('EIO', `the driver did not answer within ${timeoutMs} ms`)),\n timeoutMs\n )\n );\n let hello: DriverHello;\n try {\n hello = await greeted.promise;\n } finally {\n clearTimeout(timer);\n }\n const refused = driverVersionError(hello.protocol);\n if (refused) throw errnoError('EPROTO', refused);\n if (hello.error) throw errnoError(hello.errno ?? 'EIO', hello.error);\n return new DriverConnection(port, hello.capabilities ?? {}, waiting, timeoutMs, options.onFail);\n }\n\n call(call: DriverCall, transfer: Transferable[] = []): Promise<unknown> {\n if (this.failure) return Promise.reject(this.failure);\n const id = ++this.nextId;\n return new Promise((resolve, reject) => {\n const timer = unref(\n setTimeout(() => {\n this.waiting.delete(id);\n const error = errnoError(\n 'EIO',\n `the driver did not answer ${call.op} within ${this.timeoutMs} ms`\n );\n reject(error);\n this.fail(error);\n this.onFail?.(error);\n }, this.timeoutMs)\n );\n this.waiting.set(id, { resolve, reject, timer });\n this.port.postMessage({ ...call, id }, transfer);\n });\n }\n\n fail(error: Error): void {\n if (this.failure) return;\n this.failure = error;\n for (const call of this.waiting.values()) {\n clearTimeout(call.timer);\n call.reject(error);\n }\n this.waiting.clear();\n }\n\n close(): void {\n this.fail(errnoError('EIO', 'the file system is unmounted'));\n this.port.close?.();\n }\n}\n", "import { type FsStat, inodeOf, type KernelFs, lutimesOf, normalizePath } from '../fs/types.ts';\nimport type { KeptFile, UnlinkHolder } from '../fs/unlinked.ts';\nimport { DriverConnection, type DriverPortLike, errnoError } from './connection.ts';\nimport type { DriverAttr, DriverCapabilities, DriverEntry, DriverStatfs } from './protocol.ts';\n\nexport interface MountSpec {\n type: string;\n source: string;\n target: string;\n options?: Record<string, string>;\n}\n\nexport interface MountEntry {\n type: string;\n source: string;\n target: string;\n options: Record<string, string>;\n state: 'ok' | 'failed' | 'nomedium' | 'pending';\n error?: string;\n}\n\nexport interface OpenedDriver {\n port: DriverPortLike;\n dispose(): void;\n onCrash?(listener: (error: Error) => void): void;\n present?(): boolean;\n}\n\nexport interface MountDeps {\n open(type: string, spec: MountSpec): Promise<OpenedDriver>;\n busy(target: string): boolean;\n changed?(...paths: string[]): void;\n timeoutMs?: number;\n}\n\ninterface Cached<T> {\n value: T;\n expires: number;\n}\n\ninterface Mount extends MountEntry {\n dev: number;\n conn: DriverConnection;\n caps: DriverCapabilities;\n maxFile: number;\n attrs: Map<string, Cached<DriverAttr>>;\n lists: Map<string, Cached<DriverEntry[]>>;\n dispose(): void;\n present?(): boolean;\n}\n\nconst MAX_LINKS = 40;\nconst STALE_RETRIES = 3;\nconst DEFAULT_IO = 8 * 1024 * 1024;\nconst UNITS: Record<string, number> = { '': 1, k: 1024, m: 1024 ** 2, g: 1024 ** 3, t: 1024 ** 4 };\n\nexport function parseSize(text: string): number {\n const match = /^(\\d+(?:\\.\\d+)?)\\s*([kmgt]?)i?b?$/i.exec(text.trim());\n if (!match) throw errnoError('EINVAL', `not a size: ${text}`);\n return Math.floor(Number(match[1]) * (UNITS[(match[2] as string).toLowerCase()] as number));\n}\n\nconst within = (path: string, target: string) =>\n path === target || target === '/' || path.startsWith(`${target}/`);\nexport class HeldSet extends Set<HeldPaths> {\n private readonly idle: (path: string) => void;\n\n constructor(idle: (path: string) => void) {\n super();\n this.idle = idle;\n }\n\n override add(holds: HeldPaths): this {\n holds.onIdle = this.idle;\n return super.add(holds);\n }\n\n override delete(holds: HeldPaths): boolean {\n const removed = super.delete(holds);\n for (const path of new Set([...holds.keys(), ...holds.opens.keys()])) this.idle(path);\n holds.releaseAll();\n return removed;\n }\n}\n\nexport function heldUnder(held: Iterable<Map<string, number>>, target: string): boolean {\n for (const paths of held) for (const path of paths.keys()) if (within(path, target)) return true;\n return false;\n}\n\nexport class HeldPaths extends Map<string, number> implements UnlinkHolder {\n private readonly revoked = new Set<string>();\n readonly opens = new Map<string, number>();\n readonly unlinked = new Map<string, KeptFile>();\n private readonly aliases = new Map<string, string>();\n private readonly handles = new Map<number, string>();\n private readonly keptHandles = new Map<number, KeptFile>();\n private readonly uses = new Map<KeptFile, number>();\n private lastHandle = 0;\n private owning: string | undefined;\n\n onIdle?: (path: string) => void;\n\n keyOf(path: string): string {\n return this.aliases.get(path) ?? path;\n }\n\n keptAt(path: string): KeptFile | undefined {\n return this.unlinked.get(this.keyOf(path));\n }\n\n holding(path: string): boolean {\n return this.opens.has(this.keyOf(path));\n }\n\n held(): Iterable<string> {\n return this.opens.keys();\n }\n\n isKept(path: string): boolean {\n const ids = this.handlesAt(path);\n return ids.length === 0 ? this.unlinked.has(path) : ids.every((id) => this.keptHandles.has(id));\n }\n\n private handlesAt(path: string): number[] {\n return [...this.handles].filter(([, key]) => key === path).map(([id]) => id);\n }\n\n keptFor(handle: number): KeptFile | undefined {\n return this.keptHandles.get(handle);\n }\n\n keep(path: string, file: KeptFile): void {\n const fresh = this.handlesAt(path).filter((id) => !this.keptHandles.has(id));\n for (const id of fresh) this.keptHandles.set(id, file);\n this.uses.set(file, Math.max(fresh.length, 1));\n this.unlinked.set(path, file);\n }\n\n unkeep(path: string, file: KeptFile): void {\n for (const [id, kept] of this.keptHandles) if (kept === file) this.keptHandles.delete(id);\n this.uses.delete(file);\n if (this.unlinked.get(path) === file) this.unlinked.delete(path);\n }\n\n private letGo(file: KeptFile, all = false): void {\n const left = all ? 0 : (this.uses.get(file) ?? 0) - 1;\n if (left > 0) {\n this.uses.set(file, left);\n return;\n }\n if (!this.uses.delete(file)) return;\n file.release();\n for (const [path, kept] of this.unlinked) if (kept === file) this.unlinked.delete(path);\n }\n\n releaseAll(): void {\n for (const file of [...this.uses.keys()]) this.letGo(file, true);\n this.keptHandles.clear();\n }\n\n hold(\n path: string,\n on: boolean,\n open = false,\n real?: string,\n handle?: number\n ): number | undefined {\n if (open) return this.holdOpen(path, on, real, handle);\n this.holdWrite(path, on);\n return undefined;\n }\n\n private holdOpen(path: string, on: boolean, real?: string, handle?: number): number | undefined {\n const known = handle === undefined ? undefined : this.handles.get(handle);\n const key = known ?? real ?? this.keyOf(path);\n if (key !== path) this.aliases.set(path, key);\n if (handle !== undefined) {\n const kept = this.keptHandles.get(handle);\n this.handles.delete(handle);\n this.keptHandles.delete(handle);\n if (kept) this.letGo(kept);\n }\n const count = (this.opens.get(key) ?? 0) + (on ? 1 : -1);\n if (count > 0) this.opens.set(key, count);\n else {\n this.opens.delete(key);\n for (const id of this.handlesAt(key)) this.handles.delete(id);\n const kept = this.unlinked.get(key);\n if (kept) this.letGo(kept, true);\n for (const [alias, target] of this.aliases) if (target === key) this.aliases.delete(alias);\n this.onIdle?.(key);\n }\n if (!on) return undefined;\n this.handles.set(++this.lastHandle, key);\n return this.lastHandle;\n }\n\n private holdWrite(path: string, on: boolean): void {\n const count = (this.get(path) ?? 0) + (on ? 1 : -1);\n if (count > 0) this.set(path, count);\n else {\n this.delete(path);\n this.revoked.delete(path);\n this.onIdle?.(path);\n }\n }\n\n async own<T>(path: string, op: () => Promise<T>): Promise<T> {\n this.owning = path;\n try {\n return await op();\n } finally {\n this.owning = undefined;\n }\n }\n\n owns(path: string): boolean {\n return this.owning === path;\n }\n\n revoke(prefix: string): void {\n for (const path of this.keys()) if (within(path, prefix)) this.revoked.add(path);\n }\n\n renamed(from: string, to: string): void {\n for (const [path, count] of [...this]) {\n if (!within(path, from)) continue;\n const moved = to + path.slice(from.length);\n this.delete(path);\n this.set(moved, (this.get(moved) ?? 0) + count);\n if (this.revoked.delete(path)) this.revoked.add(moved);\n }\n for (const [path, count] of [...this.opens]) {\n if (!within(path, from)) continue;\n const moved = to + path.slice(from.length);\n this.opens.delete(path);\n this.opens.set(moved, (this.opens.get(moved) ?? 0) + count);\n }\n for (const [id, key] of this.handles) {\n if (within(key, from)) this.handles.set(id, to + key.slice(from.length));\n }\n }\n\n isRevoked(path: string): boolean {\n return this.revoked.has(path);\n }\n}\n\nconst parentOf = (path: string) => path.slice(0, path.lastIndexOf('/')) || '/';\n\nconst readonly = (mount: Mount): boolean =>\n mount.caps.readonly === true || mount.options.ro !== undefined;\n\nfunction statOf(attr: DriverAttr, path: string, mount: Mount): FsStat {\n const mtime = new Date(attr.mtime);\n const fallback =\n attr.kind === 'directory' ? 0o40755 : attr.kind === 'symlink' ? 0o120777 : 0o100644;\n return {\n isFile: attr.kind === 'file',\n isDirectory: attr.kind === 'directory',\n isSymbolicLink: attr.kind === 'symlink',\n size: attr.size,\n mode: attr.mode ?? fallback,\n mtime,\n atime: mtime,\n ctime: mtime,\n ino: attr.ino ?? inodeOf(path),\n dev: mount.dev,\n ...(readonly(mount) ? { readonly: true } : {}),\n ...(mount.maxFile > 0 ? { maxFile: mount.maxFile } : {}),\n ...(mount.caps.ranges ? { ranged: true } : {}),\n ...(attr.etag !== undefined ? { version: attr.etag } : {}),\n };\n}\n\nfunction concat(chunks: Uint8Array[], total: number): Uint8Array {\n if (chunks.length === 1 && chunks[0]?.length === total) return chunks[0];\n const out = new Uint8Array(total);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\n\nfunction resized(bytes: Uint8Array, size: number): Uint8Array {\n if (size <= bytes.length) return bytes.subarray(0, size);\n const out = new Uint8Array(size);\n out.set(bytes);\n return out;\n}\n\nfunction handed(bytes: Uint8Array, transfer: boolean, chunk: number): boolean {\n const whole = bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength;\n return transfer && whole && bytes.length <= chunk && bytes.buffer instanceof ArrayBuffer;\n}\n\nfunction spliced(bytes: Uint8Array, offset: number, part: Uint8Array): Uint8Array {\n const out = resized(bytes, Math.max(bytes.length, offset + part.length));\n out.set(part, offset);\n return out;\n}\n\ninterface WriteSession {\n mount: Mount;\n fh: Promise<number>;\n extents: Array<[number, number]>;\n truncated: boolean;\n}\n\nexport class MountTable {\n private readonly mounts = new Map<string, Mount>();\n private readonly sessions = new Map<string, WriteSession>();\n private readonly committing = new Map<string, { mount: Mount; done: Promise<void> }>();\n private devices = 0;\n private readonly pending = new Set<string>();\n private readonly notes = new Map<string, MountEntry>();\n private readonly deps: MountDeps;\n\n constructor(deps: MountDeps) {\n this.deps = deps;\n }\n\n mounted(target: string): MountEntry | undefined {\n return this.mounts.get(target);\n }\n\n list(): MountEntry[] {\n const mounted = [...this.mounts.values()].map(\n ({ type, source, target, options, state, error, present }): MountEntry => ({\n type,\n source,\n target,\n options: { ...options },\n state: state === 'ok' && present?.() === false ? 'nomedium' : state,\n ...(error ? { error } : {}),\n })\n );\n const noted = [...this.notes.values()].filter((note) => !this.mounts.has(note.target));\n return [...mounted, ...noted.map((note) => ({ ...note, options: { ...note.options } }))];\n }\n\n note(spec: MountSpec, state: 'pending' | 'failed', error?: string): void {\n const target = normalizePath(spec.target);\n this.notes.set(target, {\n type: spec.type,\n source: spec.source,\n target,\n options: { ...spec.options },\n state,\n ...(error ? { error } : {}),\n });\n }\n\n locate(path: string): { mount: Mount; rel: string } | undefined {\n let best: Mount | undefined;\n for (const mount of this.mounts.values()) {\n if (within(path, mount.target) && (!best || mount.target.length > best.target.length))\n best = mount;\n }\n if (!best) return undefined;\n const rel = best.target === '/' ? path : path.slice(best.target.length);\n return { mount: best, rel: rel || '/' };\n }\n\n async mount(spec: MountSpec, fs: KernelFs): Promise<MountEntry> {\n const target = normalizePath(spec.target);\n if (this.mounts.has(target) || this.pending.has(target)) {\n throw errnoError('EBUSY', `${target} is already mounted`);\n }\n this.pending.add(target);\n try {\n return await this.attach(spec, target, fs);\n } finally {\n this.pending.delete(target);\n }\n }\n\n private async attach(spec: MountSpec, target: string, fs: KernelFs): Promise<MountEntry> {\n const st = await fs.stat(target);\n if (!st.isDirectory) throw errnoError('ENOTDIR', target);\n const options = { ...spec.options };\n const maxFile = options.maxfile !== undefined ? parseSize(options.maxfile) : undefined;\n const opened = await this.deps.open(spec.type, { ...spec, target, options });\n let mounted: Mount | undefined;\n const started = Promise.withResolvers<never>();\n opened.onCrash?.((error) => {\n if (mounted) this.crashed(mounted, error);\n else\n started.reject(\n errnoError('EIO', `the ${spec.type} driver failed to start: ${error.message}`)\n );\n });\n let conn: DriverConnection;\n try {\n conn = await Promise.race([\n DriverConnection.open(\n opened.port,\n { source: spec.source, options },\n {\n ...(this.deps.timeoutMs ? { timeoutMs: this.deps.timeoutMs } : {}),\n onInvalidate: (paths) => this.invalidated(target, paths),\n onFail: (error) => {\n if (mounted) this.crashed(mounted, error);\n },\n }\n ),\n started.promise,\n ]);\n } catch (err) {\n opened.dispose();\n throw err;\n }\n const caps = conn.capabilities;\n const mount: Mount = {\n type: spec.type,\n source: spec.source,\n target,\n options,\n state: 'ok',\n dev: 256 + ++this.devices,\n conn,\n caps,\n maxFile: maxFile ?? caps.maxFile ?? 0,\n attrs: new Map(),\n lists: new Map(),\n dispose: () => opened.dispose(),\n ...(opened.present ? { present: opened.present } : {}),\n };\n mounted = mount;\n this.mounts.set(target, mount);\n this.notes.delete(target);\n return this.list().find((m) => m.target === target) as MountEntry;\n }\n\n unnote(target: string): void {\n this.notes.delete(normalizePath(target));\n }\n\n umount(target: string, detach = false): void {\n const at = normalizePath(target);\n const mount = this.mounts.get(at);\n if (!mount && this.notes.delete(at)) return;\n if (!mount) throw errnoError('EINVAL', `${at} is not mounted`);\n if (!detach && this.deps.busy(at)) throw errnoError('EBUSY', `${at} has open files`);\n this.notes.delete(at);\n this.mounts.delete(at);\n const waits = [...this.sessions]\n .filter(([, s]) => s.mount === mount)\n .map(([real]) => this.commit(real));\n for (const c of this.committing.values()) if (c.mount === mount) waits.push(c.done);\n const close = () => {\n mount.conn.close();\n mount.dispose();\n };\n if (waits.length === 0) close();\n else void Promise.allSettled(waits).then(close);\n }\n\n session(mount: Mount, real: string, rel: string): WriteSession {\n let session = this.sessions.get(real);\n if (!session) {\n const open = () =>\n mount.conn.call({\n op: 'open',\n path: rel,\n write: true,\n create: true,\n truncate: false,\n exclusive: false,\n }) as Promise<number>;\n const before = this.committing.get(real)?.done ?? Promise.resolve();\n const fh = before.then(open, open);\n session = { mount, fh, extents: [], truncated: false };\n this.sessions.set(real, session);\n fh.catch(() => this.sessions.delete(real));\n }\n return session;\n }\n\n writing(real: string): WriteSession | undefined {\n return this.sessions.get(real);\n }\n\n async commit(real: string): Promise<void> {\n const session = this.sessions.get(real);\n if (!session) return this.committing.get(real)?.done;\n this.sessions.delete(real);\n const done = (async () => {\n try {\n await session.mount.conn.call({ op: 'release', fh: await session.fh });\n } finally {\n this.forget(session.mount, real);\n }\n })();\n const entry = { mount: session.mount, done };\n this.committing.set(real, entry);\n const settle = () => {\n if (this.committing.get(real) === entry) this.committing.delete(real);\n };\n done.then(settle, settle);\n return done;\n }\n\n async commitUnder(prefix: string): Promise<void> {\n const at = normalizePath(prefix);\n await Promise.all(\n [...this.sessions.keys()].filter((p) => within(p, at)).map((p) => this.commit(p))\n );\n }\n\n async commitOverlapping(real: string, offset: number, length: number): Promise<void> {\n const session = this.sessions.get(real);\n if (!session) return;\n const end = offset + length;\n if (session.truncated || session.extents.some(([a, b]) => a < end && offset < b)) {\n await this.commit(real);\n }\n }\n\n private crashed(mount: Mount, error: Error): void {\n mount.state = 'failed';\n mount.attrs.clear();\n mount.lists.clear();\n mount.error = error.message;\n mount.conn.fail(\n errnoError('EIO', `the ${mount.type} driver for ${mount.target} failed: ${error.message}`)\n );\n }\n\n private invalidated(target: string, paths: string[] | true): void {\n const mount = this.mounts.get(target);\n if (!mount) return;\n if (paths === true) {\n mount.attrs.clear();\n mount.lists.clear();\n this.deps.changed?.(target);\n return;\n }\n const full = paths.map((p) => normalizePath(`${target}/${p}`));\n for (const path of full) this.forget(mount, path);\n this.deps.changed?.(...full);\n }\n\n forget(mount: Mount, path: string): void {\n for (const key of [...mount.attrs.keys()]) if (within(key, path)) mount.attrs.delete(key);\n mount.lists.delete(path);\n mount.lists.delete(parentOf(path));\n for (const key of [...mount.lists.keys()]) if (within(key, path)) mount.lists.delete(key);\n }\n\n async getattr(mount: Mount, path: string, rel: string): Promise<DriverAttr> {\n if (mount.conn.failure) throw mount.conn.failure;\n const cached = mount.attrs.get(path);\n if (cached && cached.expires > Date.now()) return cached.value;\n const attr = (await mount.conn.call({ op: 'getattr', path: rel })) as DriverAttr;\n const ttl = mount.caps.attrTtl ?? 1000;\n if (ttl > 0) mount.attrs.set(path, { value: attr, expires: Date.now() + ttl });\n return attr;\n }\n\n async readdir(mount: Mount, path: string, rel: string): Promise<DriverEntry[]> {\n if (mount.conn.failure) throw mount.conn.failure;\n const cached = mount.lists.get(path);\n if (cached && cached.expires > Date.now()) return cached.value;\n const entries = (await mount.conn.call({ op: 'readdir', path: rel })) as DriverEntry[];\n const ttl = mount.caps.entryTtl ?? mount.caps.attrTtl ?? 1000;\n if (ttl > 0) mount.lists.set(path, { value: entries, expires: Date.now() + ttl });\n return entries;\n }\n\n async statfs(path: string): Promise<{ quota: number; usage: number } | undefined> {\n const found = this.locate(normalizePath(path));\n if (!found) return undefined;\n const st = (await found.mount.conn.call({ op: 'statfs' })) as DriverStatfs | null;\n if (!st) return { quota: 0, usage: 0 };\n return { quota: st.blocks * st.bsize, usage: (st.blocks - st.bfree) * st.bsize };\n }\n\n wrap(base: KernelFs): KernelFs {\n return new MountFs(this, base);\n }\n}\n\ntype Located = { mount: Mount; rel: string };\n\nfunction noteExtent(extents: Array<[number, number]>, from: number, to: number): void {\n const last = extents.at(-1);\n if (last && from <= last[1] && to >= last[0]) {\n last[0] = Math.min(last[0], from);\n last[1] = Math.max(last[1], to);\n } else extents.push([from, to]);\n}\n\nclass MountFs implements KernelFs {\n private readonly table: MountTable;\n private readonly base: KernelFs;\n\n constructor(table: MountTable, base: KernelFs) {\n this.table = table;\n this.base = base;\n }\n\n private at(path: string): Located | undefined {\n return this.table.locate(normalizePath(path));\n }\n\n private writable(mount: Mount, path: string): void {\n if (readonly(mount)) throw errnoError('EROFS', path);\n }\n\n private async follow(path: string, hops = 0, create = false): Promise<string> {\n const found = this.at(path);\n if (!found) return path;\n const real = normalizePath(path);\n let attr: DriverAttr;\n try {\n attr = await this.table.getattr(found.mount, real, found.rel);\n } catch (err) {\n if (create && (err as { code?: unknown }).code === 'ENOENT') return real;\n throw err;\n }\n if (attr.kind !== 'symlink') return real;\n if (hops >= MAX_LINKS) throw errnoError('ELOOP', path);\n const target = (await found.mount.conn.call({ op: 'readlink', path: found.rel })) as string;\n return this.follow(this.base.resolvePath(parentOf(real), target), hops + 1, create);\n }\n\n private async open(mount: Mount, rel: string, write: boolean): Promise<number> {\n return (await mount.conn.call({\n op: 'open',\n path: rel,\n write,\n create: write,\n truncate: write,\n exclusive: false,\n })) as number;\n }\n\n resolvePath(base: string, path: string): string {\n return this.base.resolvePath(base, path);\n }\n\n async readFile(path: string): Promise<string> {\n return new TextDecoder().decode(await this.readFileBuffer(path));\n }\n\n async readFileBuffer(path: string): Promise<Uint8Array> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found) return this.base.readFileBuffer(real);\n for (let attempt = 1; ; attempt++) {\n try {\n return await this.readWhole(found.mount, real, found.rel);\n } catch (err) {\n if ((err as { code?: unknown }).code !== 'ESTALE' || attempt >= STALE_RETRIES) throw err;\n this.table.forget(found.mount, real);\n }\n }\n }\n\n private async readWhole(mount: Mount, real: string, rel: string): Promise<Uint8Array> {\n await this.table.commit(real);\n const attr = await this.table.getattr(mount, real, rel);\n if (attr.kind === 'directory') throw errnoError('EISDIR', real);\n if (mount.maxFile > 0 && attr.size > mount.maxFile) {\n throw errnoError('EFBIG', `${real} is larger than this mount's maxfile (${mount.maxFile})`);\n }\n const fh = await this.open(mount, rel, false);\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const bytes = (await mount.conn.call({\n op: 'read',\n fh,\n offset: total,\n size: chunk,\n })) as Uint8Array;\n if (bytes.length === 0) break;\n chunks.push(bytes);\n total += bytes.length;\n if (bytes.length < chunk && total >= attr.size) break;\n }\n } finally {\n await mount.conn.call({ op: 'release', fh });\n }\n return concat(chunks, total);\n }\n\n async writeFile(path: string, content: Uint8Array | string): Promise<void> {\n const real = await this.follow(path, 0, true);\n const found = this.at(real);\n if (!found) return this.base.writeFile(real, content);\n const { mount, rel } = found;\n this.writable(mount, real);\n const bytes = typeof content === 'string' ? new TextEncoder().encode(content) : content;\n if (mount.maxFile > 0 && bytes.length > mount.maxFile) {\n throw errnoError(\n 'EFBIG',\n `${real} would be larger than this mount's maxfile (${mount.maxFile})`\n );\n }\n for (let attempt = 1; ; attempt++) {\n try {\n return await this.writeWhole(mount, real, rel, bytes);\n } catch (err) {\n if ((err as { code?: unknown }).code !== 'ESTALE' || attempt >= STALE_RETRIES) throw err;\n }\n }\n }\n\n private async writeWhole(mount: Mount, real: string, rel: string, bytes: Uint8Array) {\n await this.table.commit(real);\n this.table.forget(mount, real);\n const fh = await this.open(mount, rel, true);\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n try {\n for (let offset = 0; offset < bytes.length; offset += chunk) {\n const part = bytes.slice(offset, offset + chunk);\n await mount.conn.call({ op: 'write', fh, offset, bytes: part }, [part.buffer]);\n }\n } finally {\n await mount.conn.call({ op: 'release', fh });\n this.table.forget(mount, real);\n }\n }\n\n async pread(path: string, offset: number, length: number, version?: string): Promise<Uint8Array> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found && this.base.pread) return this.base.pread(real, offset, length);\n if (!found) return (await this.base.readFileBuffer(real)).slice(offset, offset + length);\n const { mount, rel } = found;\n if ((await this.table.getattr(mount, real, rel)).kind === 'directory') {\n throw errnoError('EISDIR', real);\n }\n await this.table.commitOverlapping(real, offset, length);\n const fh = (await mount.conn\n .call({\n op: 'open',\n path: rel,\n write: false,\n create: false,\n truncate: false,\n exclusive: false,\n ...(version !== undefined ? { ifMatch: version } : {}),\n })\n .catch((err: unknown) => {\n const gone = version !== undefined && (err as { code?: unknown }).code === 'ENOENT';\n throw gone ? errnoError('ESTALE', `${real} is gone from the host`) : err;\n })) as number;\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (total < length) {\n const bytes = (await mount.conn.call({\n op: 'read',\n fh,\n offset: offset + total,\n size: Math.min(chunk, length - total),\n })) as Uint8Array;\n if (bytes.length === 0) break;\n chunks.push(bytes);\n total += bytes.length;\n }\n } finally {\n await mount.conn.call({ op: 'release', fh });\n }\n return concat(chunks, total);\n }\n\n private fits(mount: Mount, real: string, end: number): void {\n if (mount.maxFile > 0 && end > mount.maxFile) {\n throw errnoError(\n 'EFBIG',\n `${real} would be larger than this mount's maxfile (${mount.maxFile})`\n );\n }\n }\n\n async pwrite(path: string, offset: number, bytes: Uint8Array, transfer = false): Promise<void> {\n const real = await this.follow(path, 0, true);\n const found = this.at(real);\n if (!found && this.base.pwrite) return this.base.pwrite(real, offset, bytes);\n if (!found)\n return this.base.writeFile(\n real,\n spliced(await this.base.readFileBuffer(real), offset, bytes)\n );\n const { mount, rel } = found;\n this.writable(mount, real);\n this.fits(mount, real, offset + bytes.length);\n this.table.forget(mount, real);\n if (mount.caps.sessions) {\n const session = this.table.session(mount, real, rel);\n const end = offset + bytes.length;\n await this.writeRuns(mount, await session.fh, offset, bytes, transfer);\n noteExtent(session.extents, offset, end);\n this.table.forget(mount, real);\n return;\n }\n const fh = (await mount.conn.call({\n op: 'open',\n path: rel,\n write: true,\n create: true,\n truncate: false,\n exclusive: false,\n })) as number;\n try {\n await this.writeRuns(mount, fh, offset, bytes, transfer);\n } finally {\n await mount.conn.call({ op: 'release', fh });\n this.table.forget(mount, real);\n }\n }\n\n private async writeRuns(\n mount: Mount,\n fh: number,\n offset: number,\n bytes: Uint8Array,\n transfer: boolean\n ): Promise<void> {\n const chunk = mount.caps.maxIo ?? DEFAULT_IO;\n for (let at = 0; at < bytes.length; at += chunk) {\n const part = handed(bytes, transfer, chunk) ? bytes : bytes.slice(at, at + chunk);\n await mount.conn.call({ op: 'write', fh, offset: offset + at, bytes: part }, [part.buffer]);\n }\n }\n\n async truncate(path: string, size: number): Promise<void> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found && this.base.truncate) return this.base.truncate(real, size);\n if (!found?.mount.caps.ranges) {\n return this.writeFile(real, resized(await this.readFileBuffer(real), size));\n }\n const { mount, rel } = found;\n this.writable(mount, real);\n this.fits(mount, real, size);\n this.table.forget(mount, real);\n const session = this.table.writing(real);\n if (session) session.truncated = true;\n try {\n await mount.conn.call({ op: 'setattr', path: rel, size });\n } finally {\n this.table.forget(mount, real);\n }\n }\n\n async exists(path: string): Promise<boolean> {\n if (!this.at(path)) return this.base.exists(path);\n try {\n await this.stat(path);\n return true;\n } catch (err) {\n const code = (err as { code?: unknown }).code;\n if (code === 'ENOENT' || code === 'ENOTDIR') return false;\n throw err;\n }\n }\n\n async lstat(path: string): Promise<FsStat> {\n const found = this.at(path);\n if (!found) return this.base.lstat(path);\n const real = normalizePath(path);\n if (this.table.writing(real)?.truncated) await this.table.commit(real);\n return this.statWriting(\n await this.table.getattr(found.mount, real, found.rel),\n real,\n found.mount\n );\n }\n\n private statWriting(attr: DriverAttr, real: string, mount: Mount): FsStat {\n const ends = (this.table.writing(real)?.extents ?? []).map(([, end]) => end);\n return statOf({ ...attr, size: Math.max(attr.size, ...ends) }, real, mount);\n }\n\n async stat(path: string): Promise<FsStat> {\n const real = await this.follow(path);\n return this.at(real) ? this.lstat(real) : this.base.stat(real);\n }\n\n private async entries(\n path: string\n ): Promise<{ real: string; mount: Mount; list: DriverEntry[] }> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found) throw errnoError('ENOTDIR', real);\n return {\n real,\n mount: found.mount,\n list: await this.table.readdir(found.mount, real, found.rel),\n };\n }\n\n async readdir(path: string): Promise<string[]> {\n if (!this.at(path)) return this.base.readdir(path);\n return (await this.entries(path)).list.map((e) => e.name);\n }\n\n async readdirStat(path: string): Promise<Array<[string, FsStat | null]>> {\n if (!this.at(path)) return this.base.readdirStat(path);\n const { real, mount, list } = await this.entries(path);\n return Promise.all(\n list.map(async (entry): Promise<[string, FsStat | null]> => {\n const child = normalizePath(`${real}/${entry.name}`);\n if (entry.attr && mount.caps.listingStats) {\n return [entry.name, this.statWriting(entry.attr, child, mount)];\n }\n return [entry.name, await this.lstat(child).catch(() => null)];\n })\n );\n }\n\n async mkdir(path: string, options: { recursive?: boolean } = {}): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.mkdir(path, options);\n const { mount, rel } = found;\n const real = normalizePath(path);\n this.writable(mount, real);\n if (!options.recursive) {\n if (rel === '/') throw errnoError('EEXIST', real);\n this.table.forget(mount, real);\n await mount.conn.call({ op: 'mkdir', path: rel });\n return;\n }\n const parts = rel.split('/').filter(Boolean);\n for (let n = 1; n <= parts.length; n++) {\n const sub = `/${parts.slice(0, n).join('/')}`;\n const full = normalizePath(`${mount.target}${sub}`);\n const exists = await this.table.getattr(mount, full, sub).catch(() => undefined);\n if (exists?.kind === 'directory') continue;\n if (exists) throw errnoError('ENOTDIR', full);\n this.table.forget(mount, full);\n await mount.conn.call({ op: 'mkdir', path: sub });\n }\n }\n\n async rm(path: string, options: { recursive?: boolean; force?: boolean } = {}): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.rm(path, options);\n const { mount, rel } = found;\n const real = normalizePath(path);\n if (rel === '/') throw errnoError('EBUSY', `${real} is a mount point`);\n this.writable(mount, real);\n await this.table.commitUnder(real);\n let attr: DriverAttr;\n try {\n attr = await this.table.getattr(mount, real, rel);\n } catch (err) {\n if (options.force && (err as { code?: unknown }).code === 'ENOENT') return;\n throw err;\n }\n this.table.forget(mount, real);\n if (attr.kind === 'directory' && options.recursive) {\n for (const entry of await this.table.readdir(mount, real, rel)) {\n await this.rm(`${real}/${entry.name}`, { recursive: true, force: options.force ?? false });\n }\n this.table.forget(mount, real);\n }\n await mount.conn.call({ op: attr.kind === 'directory' ? 'rmdir' : 'unlink', path: rel });\n this.table.forget(mount, real);\n }\n\n async rename(from: string, to: string): Promise<void> {\n const a = this.at(from);\n const b = this.at(to);\n if (!a && !b) return this.base.rename(from, to);\n if (!a || !b || a.mount !== b.mount) throw errnoError('EXDEV', `${from} -> ${to}`);\n this.writable(a.mount, normalizePath(to));\n await this.table.commitUnder(from);\n await this.table.commitUnder(to);\n this.table.forget(a.mount, normalizePath(from));\n this.table.forget(a.mount, normalizePath(to));\n try {\n await a.mount.conn.call({ op: 'rename', from: a.rel, to: b.rel });\n } finally {\n this.table.forget(a.mount, normalizePath(from));\n this.table.forget(a.mount, normalizePath(to));\n }\n }\n\n async symlink(target: string, path: string): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.symlink(target, path);\n this.writable(found.mount, normalizePath(path));\n if (!found.mount.caps.symlinks)\n throw errnoError('EPERM', `${path}: this file system has no symlinks`);\n this.table.forget(found.mount, normalizePath(path));\n await found.mount.conn.call({ op: 'symlink', target, path: found.rel });\n }\n\n async realpath(path: string, follow: boolean): Promise<string> {\n if (this.at(path) || !this.base.realpath) throw errnoError('ENOSYS', path);\n const real = await this.base.realpath(path, follow);\n if (this.at(real)) throw errnoError('ENOSYS', path);\n return real;\n }\n\n async readlink(path: string): Promise<string> {\n const found = this.at(path);\n if (!found) return this.base.readlink(path);\n return (await found.mount.conn.call({ op: 'readlink', path: found.rel })) as string;\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n const found = this.at(path);\n if (!found) return this.base.chmod(path, mode);\n this.writable(found.mount, normalizePath(path));\n if (!found.mount.caps.chmod) return;\n this.table.forget(found.mount, normalizePath(path));\n await found.mount.conn.call({ op: 'setattr', path: found.rel, mode });\n }\n\n async utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n const real = await this.follow(path);\n const found = this.at(real);\n if (!found) return this.base.utimes(real, atime, mtime);\n await this.setMtime(found, real, mtime);\n }\n\n async lutimes(path: string, atime: Date, mtime: Date): Promise<void> {\n const found = this.at(path);\n if (!found) return lutimesOf(this.base, path, atime, mtime);\n const real = normalizePath(path);\n if (!found.mount.caps.linkTimes && (await this.lstat(real)).isSymbolicLink) {\n throw errnoError('EOPNOTSUPP', path);\n }\n await this.setMtime(found, real, mtime);\n }\n\n private async setMtime(found: Located, real: string, mtime: Date): Promise<void> {\n this.writable(found.mount, real);\n this.table.forget(found.mount, real);\n await found.mount.conn.call({ op: 'setattr', path: found.rel, mtime: mtime.getTime() });\n }\n}\n", "import type { KernelFs } from '../fs/types.ts';\nimport type { KeptFile } from '../fs/unlinked.ts';\n\nexport interface SyncFsTokenEntry {\n fs: KernelFs;\n cwd: string;\n statfs?: (path: string) => Promise<{ quota: number; usage: number } | undefined>;\n hold?: (\n path: string,\n held: boolean,\n open: boolean,\n real?: string,\n handle?: number\n ) => number | undefined;\n keptFor?: (handle: number) => KeptFile | undefined;\n gate?: <T>(path: string, op: () => Promise<T>) => Promise<T>;\n unlinked?: (path: string) => KeptFile | undefined;\n own?: <T>(path: string, op: () => Promise<T>) => Promise<T>;\n revoked?: (path: string) => boolean;\n renamed?: (from: string, to: string) => void;\n}\n\nconst registry = new Map<string, SyncFsTokenEntry>();\n\nexport function mintSyncFsToken(entry: SyncFsTokenEntry): string {\n const token = crypto.randomUUID();\n registry.set(token, entry);\n return token;\n}\n\nexport function resolveSyncFsToken(token: string): SyncFsTokenEntry | null {\n return registry.get(token) ?? null;\n}\n\nexport function revokeSyncFsToken(token: string): void {\n registry.delete(token);\n}\n", "export const SYNC_FS_OPS = [\n 'read',\n 'write',\n 'exists',\n 'stat',\n 'lstat',\n 'readdir',\n 'readdir-stat',\n 'mkdir',\n 'rm',\n 'rename',\n 'unlink',\n 'rmdir',\n 'symlink',\n 'readlink',\n 'chmod',\n 'utimes',\n 'lutimes',\n 'statfs',\n 'hold',\n 'create',\n 'kept',\n 'pread',\n 'pwrite',\n 'truncate',\n] as const;\n\nexport type SyncFsOp = (typeof SYNC_FS_OPS)[number];\n\nexport interface SyncFsRequest {\n token: string;\n op: SyncFsOp;\n path: string;\n body?: Uint8Array;\n arg2?: string;\n mode?: number;\n atimeMs?: number;\n mtimeMs?: number;\n offset?: number;\n length?: number;\n version?: string;\n handle?: number;\n}\n\nexport type SyncFsResult =\n | { ok: true; kind: 'bytes'; bytes: Uint8Array }\n | { ok: true; kind: 'json'; json: unknown }\n | { ok: true; kind: 'void' }\n | { ok: false; errno: string; message: string };\n\nexport const SYNC_FS_REQUEST_TIMEOUT_MS = 25_000;\n\nexport interface SyncFsBridgeStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink?: boolean;\n size: number;\n mode?: number;\n mtimeMs?: number;\n atimeMs?: number;\n ctimeMs?: number;\n ino?: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n version?: string;\n}\n\nexport interface SyncFsUsage {\n quota: number;\n usage: number;\n}\n\nexport function parseSyncFsUsage(json: unknown): SyncFsUsage | null {\n const u = json as Partial<SyncFsUsage> | null;\n if (!u || typeof u.quota !== 'number' || typeof u.usage !== 'number') return null;\n return { quota: u.quota, usage: u.usage };\n}\n\nexport type SyncFsFileIo = Pick<\n SyncFsPosixBridge,\n 'readFile' | 'writeFile' | 'pread' | 'pwrite' | 'truncate'\n>;\n\nexport interface SyncFsPosixBridge {\n pinned?(handle: number): SyncFsFileIo;\n kept?(handle: number): boolean;\n readFile(path: string): Uint8Array;\n writeFile(path: string, bytes: Uint8Array, open?: boolean): void;\n stat(path: string): SyncFsBridgeStat;\n lstat(path: string): SyncFsBridgeStat;\n readdir(path: string): string[];\n exists(path: string): boolean;\n mkdir(path: string): void;\n rm(path: string): void;\n rename(from: string, to: string): void;\n unlink(path: string): void;\n rmdir(path: string): void;\n symlink(target: string, linkPath: string): void;\n readlink(path: string): string;\n chmod(path: string, mode: number): void;\n utimes(path: string, atimeMs: number, mtimeMs: number): void;\n lutimes(path: string, atimeMs: number, mtimeMs: number): void;\n hold?(path: string, held: boolean, open?: boolean, handle?: number): number | undefined;\n create?(path: string): void;\n readdirStat(path: string): Array<[string, SyncFsBridgeStat | null]>;\n statfs?(path?: string): SyncFsUsage | null;\n pread?(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite?(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate?(path: string, size: number): void;\n}\n\nexport function syncError(code: string, label: string): Error & { code: string } {\n return Object.assign(new Error(`${code}: ${label}`), { code });\n}\n\nexport function parseSyncFsStat(json: unknown): SyncFsBridgeStat | null {\n const s = json as Partial<SyncFsBridgeStat> | null;\n if (\n !s ||\n typeof s.isFile !== 'boolean' ||\n typeof s.isDirectory !== 'boolean' ||\n typeof s.size !== 'number'\n ) {\n return null;\n }\n return {\n isFile: s.isFile,\n isDirectory: s.isDirectory,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n ...(typeof s.mode === 'number' ? { mode: s.mode } : {}),\n ...(typeof s.mtimeMs === 'number' ? { mtimeMs: s.mtimeMs } : {}),\n ...(typeof s.atimeMs === 'number' ? { atimeMs: s.atimeMs } : {}),\n ...(typeof s.ctimeMs === 'number' ? { ctimeMs: s.ctimeMs } : {}),\n ...(typeof s.ino === 'number' ? { ino: s.ino } : {}),\n ...(typeof s.dev === 'number' ? { dev: s.dev } : {}),\n ...(s.readonly === true ? { readonly: true } : {}),\n ...(typeof s.maxFile === 'number' ? { maxFile: s.maxFile } : {}),\n ...(s.ranged === true ? { ranged: true } : {}),\n ...(typeof s.version === 'string' ? { version: s.version } : {}),\n };\n}\n", "import { type FsStat, type KernelFs, lutimesOf, rangedOps } from '../fs/types.ts';\nimport { resolveSyncFsToken, type SyncFsTokenEntry } from './sync-fs-token-registry.ts';\nimport {\n type SyncFsOp,\n type SyncFsRequest,\n type SyncFsResult,\n type SyncFsUsage,\n syncError,\n} from './sync-fs-wire.ts';\n\nexport function toErrno(err: unknown): SyncFsResult {\n const message = err instanceof Error ? err.message : String(err);\n const code = (err as { code?: unknown })?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message };\n }\n return { ok: false, errno: 'EIO', message };\n}\n\nexport interface SyncFsStatJson {\n isDirectory: boolean;\n isFile: boolean;\n isSymbolicLink: boolean;\n size: number;\n mode: number;\n mtimeMs: number;\n atimeMs: number;\n ctimeMs: number;\n ino: number;\n dev?: number;\n readonly?: boolean;\n maxFile?: number;\n ranged?: boolean;\n version?: string;\n}\n\nfunction statJson(s: FsStat): SyncFsStatJson {\n return {\n isDirectory: s.isDirectory,\n isFile: s.isFile,\n isSymbolicLink: s.isSymbolicLink,\n size: s.size,\n mode: s.mode,\n mtimeMs: s.mtime.getTime(),\n atimeMs: s.atime.getTime(),\n ctimeMs: s.ctime.getTime(),\n ino: s.ino,\n ...(s.dev !== undefined ? { dev: s.dev } : {}),\n ...(s.readonly ? { readonly: true } : {}),\n ...(s.maxFile ? { maxFile: s.maxFile } : {}),\n ...(s.ranged ? { ranged: true } : {}),\n ...(s.version !== undefined ? { version: s.version } : {}),\n };\n}\n\nasync function readdirStat(\n fs: KernelFs,\n dir: string\n): Promise<Array<[string, SyncFsStatJson | null]>> {\n return (await fs.readdirStat(dir)).map(([name, stat]) => [name, stat && statJson(stat)]);\n}\n\nasync function storageUsage(): Promise<SyncFsUsage | null> {\n const estimate = await globalThis.navigator?.storage?.estimate?.();\n if (typeof estimate?.quota !== 'number') return null;\n return { quota: estimate.quota, usage: estimate.usage ?? 0 };\n}\n\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nfunction json(value: unknown): SyncFsResult {\n return { ok: true, kind: 'json', json: value };\n}\n\nasync function run(\n entry: SyncFsTokenEntry,\n path: string,\n req: SyncFsRequest\n): Promise<SyncFsResult> {\n const { fs, cwd } = entry;\n switch (req.op) {\n case 'read':\n return { ok: true, kind: 'bytes', bytes: await fs.readFileBuffer(path) };\n case 'write':\n await fs.writeFile(path, req.body ?? new Uint8Array(0));\n return done;\n case 'exists':\n return json(await fs.exists(path));\n case 'stat':\n return json(statJson(await fs.stat(path)));\n case 'lstat':\n return json(statJson(await fs.lstat(path)));\n case 'readdir':\n return json(await fs.readdir(path));\n case 'readdir-stat':\n return json(await readdirStat(fs, path));\n case 'mkdir':\n await fs.mkdir(path, { recursive: true });\n return done;\n case 'rm':\n await fs.rm(path, { recursive: true });\n return done;\n case 'rename': {\n const to = fs.resolvePath(cwd, req.arg2 ?? '');\n await fs.rename(path, to);\n entry.renamed?.(path, to);\n return done;\n }\n case 'unlink':\n if ((await fs.lstat(path)).isDirectory) throw syncError('EISDIR', path);\n await fs.rm(path);\n return done;\n case 'rmdir':\n if (!(await fs.lstat(path)).isDirectory) throw syncError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw syncError('ENOTEMPTY', path);\n await fs.rm(path, { recursive: true });\n return done;\n case 'symlink':\n await fs.symlink(req.arg2 ?? '', path);\n return done;\n case 'create':\n await createExclusive(fs, path);\n return done;\n case 'readlink':\n return json(await fs.readlink(path));\n case 'chmod':\n await fs.chmod(path, req.mode ?? 0);\n return done;\n case 'utimes':\n await fs.utimes(path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n case 'lutimes':\n await lutimesOf(fs, path, new Date(req.atimeMs ?? 0), new Date(req.mtimeMs ?? 0));\n return done;\n case 'pread':\n case 'pwrite':\n case 'truncate':\n return ranged(fs, path, req);\n default:\n return { ok: false, errno: 'EINVAL', message: `sync-fs: unknown op '${req.op as string}'` };\n }\n}\n\nasync function createExclusive(fs: KernelFs, path: string): Promise<void> {\n if (fs.createExclusive) return fs.createExclusive(path);\n if (\n await fs.lstat(path).then(\n () => true,\n () => false\n )\n )\n throw syncError('EEXIST', path);\n await fs.writeFile(path, new Uint8Array(0));\n}\n\nasync function ranged(fs: KernelFs, path: string, req: SyncFsRequest): Promise<SyncFsResult> {\n const ops = rangedOps(fs);\n if (!ops) throw syncError('ENOSYS', path);\n const offset = req.offset ?? 0;\n if (req.op === 'pread')\n return {\n ok: true,\n kind: 'bytes',\n bytes: await ops.pread(path, offset, req.length ?? 0, req.version),\n };\n if (req.op === 'pwrite') await ops.pwrite(path, offset, req.body ?? new Uint8Array(0), true);\n else await ops.truncate(path, req.length ?? 0);\n return done;\n}\n\nconst UNLINKED_OPS = new Set<SyncFsOp>(['read', 'pread', 'pwrite', 'truncate']);\nconst OWN_OPS = new Set<SyncFsOp>(['rm', 'unlink', 'rmdir', 'rename']);\n\nasync function keptOr(entry: SyncFsTokenEntry, path: string, handle?: number): Promise<string> {\n if (handle !== undefined) return entry.keptFor?.(handle)?.hidden ?? path;\n const kept = entry.unlinked?.(path);\n return kept && !(await entry.fs.exists(path)) ? kept.hidden : path;\n}\n\nexport async function dispatchSyncFs(req: SyncFsRequest): Promise<SyncFsResult> {\n const entry = resolveSyncFsToken(req.token);\n if (!entry) return { ok: false, errno: 'EACCES', message: 'sync-fs: unknown or revoked token' };\n const { fs, cwd } = entry;\n try {\n const path = fs.resolvePath(cwd, req.path);\n if (req.op === 'kept') return json(entry.keptFor?.(req.handle ?? -1) !== undefined);\n if (req.op === 'statfs') return json((await entry.statfs?.(path)) ?? (await storageUsage()));\n if (req.op === 'hold') {\n const [on, open] = [((req.mode ?? 0) & 1) === 1, ((req.mode ?? 0) & 2) === 2];\n if (on && open) {\n const real = await fs.realpath?.(path, true).catch(() => path);\n return json(entry.hold?.(path, on, open, real) ?? null);\n }\n entry.hold?.(path, on, open, undefined, req.handle);\n return done;\n }\n if (entry.revoked?.(path)) return { ok: false, errno: 'EIO', message: `${path} was unmounted` };\n if ((req.op === 'write' && req.mode === 1) || UNLINKED_OPS.has(req.op)) {\n const serve = async () => run(entry, await keptOr(entry, path, req.handle), req);\n return await (entry.gate ? entry.gate(path, serve) : serve());\n }\n if (!entry.own || !OWN_OPS.has(req.op)) return await run(entry, path, req);\n const target = req.op === 'rename' ? fs.resolvePath(cwd, req.arg2 ?? '') : path;\n return await entry.own(target, () => run(entry, path, req));\n } catch (err) {\n return toErrno(err);\n }\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport type { SyncFsRequest, SyncFsResult } from './sync-fs-wire.ts';\n\nexport const SAB_HEADER_I32 = 16;\nexport const SAB_HEADER_BYTES = SAB_HEADER_I32 * 4;\n\nexport const SAB_I_STATE = 0;\nexport const SAB_I_SEQ = 1;\nexport const SAB_I_STATUS = 2;\nexport const SAB_I_TOTAL = 3;\nexport const SAB_I_CHUNK = 4;\nexport const SAB_I_OFFSET = 5;\nexport const SAB_I_REQ = 6;\nexport const SAB_I_PUB = 7;\n\nexport const SAB_I_SIGNALS = 8;\n\nexport const SAB_I_TIMERS = 9;\n\nexport const SAB_I_MEMORY = 10;\n\nexport const SAB_I_TOTAL_HI = 11;\n\nexport const SAB_I_OFFSET_HI = 12;\n\nexport const SAB_I_KILLED = 13;\n\nexport const SAB_I_ASYNC = 14;\n\nexport const SAB_I_STOP = 15;\n\nconst U32 = 2 ** 32;\n\nexport function storeU53(header: Int32Array, lo: number, hi: number, value: number): void {\n Atomics.store(header, hi, Math.floor(value / U32));\n Atomics.store(header, lo, (value % U32) | 0);\n}\n\nexport function loadU53(header: Int32Array, lo: number, hi: number): number {\n return (Atomics.load(header, lo) >>> 0) + Atomics.load(header, hi) * U32;\n}\n\nexport function publishMemory(sab: SharedArrayBuffer, bytes: number): void {\n if (bytes > 0)\n Atomics.store(new Int32Array(sab, 0, SAB_HEADER_I32), SAB_I_MEMORY, Math.ceil(bytes / 65536));\n}\n\nexport const SAB_STATE_IDLE = 0;\nexport const SAB_STATE_PENDING = 1;\nexport const SAB_STATE_READY = 2;\n\nexport const SAB_STATUS_BYTES = 1;\nexport const SAB_STATUS_JSON = 2;\nexport const SAB_STATUS_VOID = 3;\nexport const SAB_STATUS_ERRNO = 4;\n\nexport const SAB_DEFAULT_WINDOW_BYTES = 1024 * 1024;\n\nexport const SAB_MIN_BYTES = SAB_HEADER_BYTES + 4096;\n\nexport const SYNC_SAB_REQ_MSG = 'sync-sab-req';\n\nexport const SYNC_SAB_NEXT_MSG = 'sync-sab-next';\n\nexport type SyncSabRequestBody = Omit<SyncFsRequest, 'token'> | WasmSyscall;\n\nexport interface SyncSabReqMsg {\n type: typeof SYNC_SAB_REQ_MSG;\n id: number;\n req: SyncSabRequestBody;\n}\nexport interface SyncSabNextMsg {\n type: typeof SYNC_SAB_NEXT_MSG;\n id: number;\n offset: number;\n}\n\nexport interface SabEncodedResult {\n status: number;\n payload: Uint8Array;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport function encodeSabResult(result: SyncFsResult): SabEncodedResult {\n if (!result.ok) {\n return {\n status: SAB_STATUS_ERRNO,\n payload: encoder.encode(JSON.stringify({ errno: result.errno, message: result.message })),\n };\n }\n switch (result.kind) {\n case 'bytes':\n return { status: SAB_STATUS_BYTES, payload: result.bytes };\n case 'json':\n return { status: SAB_STATUS_JSON, payload: encoder.encode(JSON.stringify(result.json)) };\n default:\n return { status: SAB_STATUS_VOID, payload: new Uint8Array(0) };\n }\n}\n\nexport function decodeSabResult(status: number, payload: Uint8Array): SyncFsResult {\n switch (status) {\n case SAB_STATUS_BYTES:\n return { ok: true, kind: 'bytes', bytes: payload };\n case SAB_STATUS_VOID:\n return { ok: true, kind: 'void' };\n case SAB_STATUS_JSON: {\n try {\n return { ok: true, kind: 'json', json: JSON.parse(decoder.decode(payload)) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed json payload' };\n }\n }\n case SAB_STATUS_ERRNO: {\n try {\n const parsed = JSON.parse(decoder.decode(payload)) as {\n errno?: unknown;\n message?: unknown;\n };\n const errno =\n typeof parsed.errno === 'string' && /^E[A-Z]+$/.test(parsed.errno) ? parsed.errno : 'EIO';\n return { ok: false, errno, message: String(parsed.message ?? errno) };\n } catch {\n return { ok: false, errno: 'EIO', message: 'sync-sab: malformed errno payload' };\n }\n }\n default:\n return { ok: false, errno: 'EIO', message: `sync-sab: unknown status ${status}` };\n }\n}\n\nexport interface SabViews {\n header: Int32Array;\n window: Uint8Array;\n}\n\nexport function sabViews(sab: SharedArrayBuffer): SabViews {\n if (sab.byteLength < SAB_MIN_BYTES) {\n throw new Error(`sync-sab: buffer too small (${sab.byteLength} < ${SAB_MIN_BYTES})`);\n }\n return {\n header: new Int32Array(sab, 0, SAB_HEADER_I32),\n window: new Uint8Array(sab, SAB_HEADER_BYTES),\n };\n}\n", "import type { WasmSyscall } from '../kernel/process.ts';\nimport {\n SYNC_FS_REQUEST_TIMEOUT_MS,\n type SyncFsRequest,\n type SyncFsResult,\n} from './sync-fs-wire.ts';\nimport {\n encodeSabResult,\n SAB_I_CHUNK,\n SAB_I_OFFSET,\n SAB_I_OFFSET_HI,\n SAB_I_PUB,\n SAB_I_REQ,\n SAB_I_SEQ,\n SAB_I_STATE,\n SAB_I_STATUS,\n SAB_I_TOTAL,\n SAB_I_TOTAL_HI,\n SAB_STATE_READY,\n type SabViews,\n SYNC_SAB_NEXT_MSG,\n SYNC_SAB_REQ_MSG,\n type SyncSabNextMsg,\n type SyncSabReqMsg,\n sabViews,\n storeU53,\n} from './sync-sab-wire.ts';\n\nexport interface SabPortLike {\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface SyncSabResponderHandle {\n dispose(): void;\n}\n\ninterface PendingPayload {\n status: number;\n payload: Uint8Array;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst PENDING_TTL_MS = SYNC_FS_REQUEST_TIMEOUT_MS + 5_000;\n\nexport type SyncSabDispatchRequest = SyncFsRequest | (WasmSyscall & { token: string });\n\nexport interface SyncSabResponderOptions {\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>;\n}\n\nexport function attachSyncSabResponder(\n port: SabPortLike,\n sab: SharedArrayBuffer,\n token: string,\n opts: SyncSabResponderOptions\n): SyncSabResponderHandle {\n const views: SabViews = sabViews(sab);\n const { header, window } = views;\n const pending = new Map<number, PendingPayload>();\n let disposed = false;\n\n const { dispatch } = opts;\n\n function drop(id: number): void {\n const entry = pending.get(id);\n if (!entry) return;\n clearTimeout(entry.timer);\n pending.delete(id);\n }\n\n function publish(id: number, entry: PendingPayload, offset: number): void {\n if (Atomics.load(header, SAB_I_REQ) !== id) {\n drop(id);\n return;\n }\n const chunk = Math.min(window.byteLength, entry.payload.byteLength - offset);\n if (chunk > 0) window.set(entry.payload.subarray(offset, offset + chunk));\n Atomics.store(header, SAB_I_STATUS, entry.status);\n storeU53(header, SAB_I_TOTAL, SAB_I_TOTAL_HI, entry.payload.byteLength);\n Atomics.store(header, SAB_I_CHUNK, chunk);\n storeU53(header, SAB_I_OFFSET, SAB_I_OFFSET_HI, offset);\n Atomics.store(header, SAB_I_SEQ, id);\n Atomics.store(header, SAB_I_STATE, SAB_STATE_READY);\n Atomics.add(header, SAB_I_PUB, 1);\n Atomics.notify(header, SAB_I_PUB);\n\n if (offset + chunk >= entry.payload.byteLength) drop(id);\n }\n\n function settle(id: number, result: SyncFsResult): void {\n if (disposed) return;\n const { status, payload } = encodeSabResult(result);\n\n drop(id);\n const entry: PendingPayload = {\n status,\n payload,\n timer: setTimeout(() => drop(id), PENDING_TTL_MS),\n };\n pending.set(id, entry);\n publish(id, entry, 0);\n }\n\n const handler = (event: MessageEvent): void => {\n const data = event.data as\n | { type?: unknown; id?: unknown; req?: unknown; offset?: unknown }\n | undefined;\n if (!data || typeof data.id !== 'number') return;\n if (data.type === SYNC_SAB_NEXT_MSG) {\n const entry = pending.get(data.id);\n const offset = (data as Partial<SyncSabNextMsg>).offset;\n if (\n !entry ||\n typeof offset !== 'number' ||\n !Number.isInteger(offset) ||\n offset < 0 ||\n offset > entry.payload.byteLength\n ) {\n settle(data.id, { ok: false, errno: 'EIO', message: 'sync-sab: bad continuation' });\n return;\n }\n publish(data.id, entry, offset);\n return;\n }\n if (data.type !== SYNC_SAB_REQ_MSG || !data.req || typeof data.req !== 'object') return;\n const id = data.id;\n\n const body = (data as SyncSabReqMsg).req;\n const req = { ...body, token } as SyncSabDispatchRequest;\n let dispatched: Promise<SyncFsResult>;\n try {\n dispatched = dispatch(req);\n } catch (err) {\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n void dispatched.then(\n (result) => settle(id, result),\n (err) =>\n settle(id, {\n ok: false,\n errno: 'EIO',\n message: err instanceof Error ? err.message : String(err),\n })\n );\n };\n\n port.addEventListener('message', handler);\n return {\n dispose: () => {\n if (disposed) return;\n disposed = true;\n port.removeEventListener('message', handler);\n for (const id of [...pending.keys()]) drop(id);\n },\n };\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { KernelError } from './fd-table.ts';\n\nexport type HostSyscall =\n | { op: 'lock'; path: string; exclusive: boolean; fd: number }\n | { op: 'unlock'; path: string }\n | { op: 'async-submit'; req: { op: string } }\n | { op: 'async-wait'; timeoutMs?: number }\n | { op: 'async-take'; id: number }\n | { op: 'async-resolve'; value: unknown }\n | { op: 'async-hold' }\n | { op: 'async-cancel'; id: number }\n | { op: 'async-close' };\n\nexport const HOST_OPS: readonly HostSyscall['op'][] = [\n 'lock',\n 'unlock',\n 'async-submit',\n 'async-wait',\n 'async-take',\n 'async-resolve',\n 'async-hold',\n 'async-cancel',\n 'async-close',\n];\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\ninterface Holder {\n exclusive: boolean;\n fds: Set<number>;\n}\n\nexport class LockTable {\n private readonly held = new Map<string, Map<number, Holder>>();\n\n lock(pid: number, path: string, exclusive: boolean, fd: number): boolean {\n const holders = this.held.get(path) ?? new Map<number, Holder>();\n for (const [other, h] of holders) if (other !== pid && (exclusive || h.exclusive)) return false;\n const mine = holders.get(pid) ?? { exclusive, fds: new Set<number>() };\n mine.exclusive = exclusive;\n mine.fds.add(fd);\n holders.set(pid, mine);\n this.held.set(path, holders);\n return true;\n }\n\n unlock(pid: number, path: string): void {\n const holders = this.held.get(path);\n holders?.delete(pid);\n if (holders?.size === 0) this.held.delete(path);\n }\n\n closed(pid: number, fd: number): void {\n for (const [path, holders] of [...this.held]) {\n const mine = holders.get(pid);\n if (mine?.fds.delete(fd) && mine.fds.size === 0) this.unlock(pid, path);\n }\n }\n\n release(pid: number): void {\n for (const path of [...this.held.keys()]) this.unlock(pid, path);\n }\n}\n\ntype Run = (req: { op: string }, cancelled: AbortSignal) => Promise<SyncFsResult>;\n\nexport class AsyncOps {\n private next = 1;\n private readonly results = new Map<number, SyncFsResult | undefined>();\n private readonly ready: number[] = [];\n private readonly running = new Map<number, AbortController>();\n private readonly waiters = new Set<() => void>();\n private closed = false;\n private readonly run: Run;\n private readonly onReady: (() => void) | undefined;\n\n constructor(run: Run, onReady?: () => void) {\n this.run = run;\n this.onReady = onReady;\n }\n\n submit(req: { op: string }): number {\n const id = this.hold();\n const running = new AbortController();\n this.running.set(id, running);\n this.run(req, running.signal).then(\n (result) => this.complete(id, result),\n (err: unknown) => this.complete(id, { ok: false, errno: 'EIO', message: String(err) })\n );\n return id;\n }\n\n resolve(value: unknown): number {\n const id = this.hold();\n this.complete(id, json(value));\n return id;\n }\n\n hold(): number {\n const id = this.next++;\n this.results.set(id, undefined);\n return id;\n }\n\n take(id: number): SyncFsResult {\n if (!this.results.has(id)) throw new KernelError('EINVAL');\n const result = this.results.get(id);\n if (!result) throw new KernelError('EAGAIN');\n this.forget(id);\n return result;\n }\n\n cancel(id: number): void {\n this.running.get(id)?.abort();\n this.forget(id);\n }\n\n private forget(id: number): void {\n this.running.delete(id);\n this.results.delete(id);\n const at = this.ready.indexOf(id);\n if (at >= 0) this.ready.splice(at, 1);\n }\n\n async wait(timeoutMs: number | undefined, signal: AbortSignal): Promise<number> {\n for (;;) {\n if (this.closed) return -1;\n const id = this.ready.shift();\n if (id !== undefined) return id;\n if (timeoutMs !== undefined && timeoutMs <= 0) return 0;\n const woke = await this.sleep(timeoutMs, signal);\n if (!woke) return 0;\n }\n }\n\n close(): void {\n this.closed = true;\n this.wake();\n }\n\n private sleep(timeoutMs: number | undefined, signal: AbortSignal): Promise<boolean> {\n return new Promise<boolean>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n clearTimeout(timer);\n this.waiters.delete(wake);\n signal.removeEventListener('abort', abort);\n };\n const wake = () => {\n cleanup();\n resolve(true);\n };\n const abort = () => {\n cleanup();\n reject(new KernelError('EINTR'));\n };\n this.waiters.add(wake);\n signal.addEventListener('abort', abort, { once: true });\n if (timeoutMs !== undefined) {\n timer = setTimeout(() => {\n cleanup();\n resolve(false);\n }, timeoutMs);\n }\n });\n }\n\n private complete(id: number, result: SyncFsResult): void {\n this.running.delete(id);\n if (!this.results.has(id)) return;\n this.results.set(id, result);\n this.ready.push(id);\n this.wake();\n this.onReady?.();\n }\n\n private wake(): void {\n for (const wake of [...this.waiters]) wake();\n }\n}\n\nexport interface HostOpsContext {\n pid: number;\n locks: LockTable | undefined;\n ops: AsyncOps;\n blocking: () => AbortSignal;\n valid: (req: { op: string }) => boolean;\n}\n\nexport async function hostSyscall(req: HostSyscall, ctx: HostOpsContext): Promise<SyncFsResult> {\n switch (req.op) {\n case 'lock':\n if (!ctx.locks) throw new KernelError('ENOSYS');\n if (!ctx.locks.lock(ctx.pid, req.path, req.exclusive, req.fd))\n throw new KernelError('EAGAIN');\n return done;\n case 'unlock':\n ctx.locks?.unlock(ctx.pid, req.path);\n return done;\n case 'async-submit':\n if (!ctx.valid(req.req)) throw new KernelError('EINVAL');\n return json(ctx.ops.submit(req.req));\n case 'async-wait':\n return json(await ctx.ops.wait(req.timeoutMs, ctx.blocking()));\n case 'async-take':\n return ctx.ops.take(req.id);\n case 'async-resolve':\n return json(ctx.ops.resolve(req.value));\n case 'async-hold':\n return json(ctx.ops.hold());\n case 'async-cancel':\n ctx.ops.cancel(req.id);\n return done;\n case 'async-close':\n ctx.ops.close();\n return done;\n }\n}\n", "export const HOST_LOOPBACK = 'host.slicc.internal';\n\nexport const HOST_LOOPBACK_ADDRESS = [10, 0, 2, 2] as const;\n\nexport const PAGE_LOOPBACK = 'kernel.localhost';\n\nexport const PAGE_LOOPBACK_URL = `http://{port}.${PAGE_LOOPBACK}`;\n\nexport function toHostLoopback(href: string): string {\n const url = new URL(href);\n if (url.hostname.replace(/\\.$/, '').toLowerCase() !== HOST_LOOPBACK) return href;\n url.hostname = '127.0.0.1';\n return url.href;\n}\n\nexport const DEFAULT_HOSTNAME = 'slicc';\n\nexport const HOSTNAME_ADDRESS = '127.0.1.1';\n\nexport const LIBC_HOSTNAMES: readonly string[] = ['emscripten', 'wasmer.sh'];\n\nconst LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;\n\nfunction reserved(name: string): boolean {\n const lower = name.toLowerCase();\n return (\n lower === 'localhost' ||\n lower.endsWith('.localhost') ||\n lower === HOST_LOOPBACK ||\n lower === 'wasmer.sh' ||\n /^\\d+(\\.\\d+){3}$/.test(lower)\n );\n}\n\nexport function isHostname(name: unknown): name is string {\n if (typeof name !== 'string' || name.length > 253 || reserved(name)) return false;\n return name.split('.').every((l) => LABEL.test(l));\n}\n\nexport function hostnameOf(env: Readonly<Record<string, string>>): string {\n return isHostname(env.HOSTNAME) ? env.HOSTNAME : DEFAULT_HOSTNAME;\n}\n\nexport function ownNames(hostname: string): string[] {\n return [...new Set([hostname.toLowerCase(), ...LIBC_HOSTNAMES])];\n}\n\nexport function hostsFile(hostname: string = DEFAULT_HOSTNAME): string {\n return [\n '127.0.0.1 localhost localhost.localdomain',\n '::1 localhost ip6-localhost',\n `${HOSTNAME_ADDRESS} ${ownNames(hostname).join(' ')}`,\n `${HOST_LOOPBACK_ADDRESS.join('.')} ${HOST_LOOPBACK}`,\n '',\n ].join('\\n');\n}\n", "import {\n acceptKey,\n closeFrame,\n frame,\n isUpgrade,\n OP_BINARY,\n OP_TEXT,\n pongFrame,\n sendableCode,\n switchingHead,\n WsError,\n WsReader,\n} from '../../cdp/websocket.ts';\nimport { KernelError } from '../fd-table.ts';\nimport type { KernelSocket, LoopbackNet } from '../socket.ts';\nimport {\n type ByteSource,\n chunk,\n fieldTokens,\n fieldValues,\n HttpError,\n Incoming,\n LAST_CHUNK,\n latin1Bytes,\n parseRequestHead,\n REASON,\n type RequestHead,\n readBody,\n requestFraming,\n responseHead,\n} from './http1.ts';\nimport { toHostLoopback } from './loopback-names.ts';\nimport type {\n HeaderList,\n RealmTransport,\n RealmTransportResponse,\n RealmWebSocket,\n} from './transport.ts';\nimport { MESSAGE_LIMIT } from './ws-queue.ts';\n\nconst SEND_BUFFER = 1024 * 1024;\nconst TLS_HANDSHAKE = 0x16;\nconst TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\nconst NO_WEBSOCKET =\n 'WebSocket not supported by this transport (fetchTransport needs { webSocket: true })';\n\nexport const REALM_PROXY_PORT = 3128;\nexport interface ProxyLimits {\n maxConnections: number;\n maxHead: number;\n idleMs: number;\n bodyBudget: number;\n closeWaitMs: number;\n}\nconst DEFAULT_LIMITS: ProxyLimits = {\n maxConnections: 64,\n maxHead: 64 * 1024,\n idleMs: 120000,\n bodyBudget: 128 * 1024 * 1024,\n closeWaitMs: 5000,\n};\nexport interface TunnelTarget {\n host: string;\n port: number;\n}\nexport interface HttpSink {\n write(bytes: Uint8Array, signal?: AbortSignal): Promise<unknown>;\n}\nexport type ServeHttp = (source: ByteSource, sink: HttpSink, origin: string) => Promise<void>;\nexport type TunnelHandler = (\n conn: KernelSocket,\n incoming: Incoming,\n target: TunnelTarget,\n signal: AbortSignal,\n serveHttp: ServeHttp\n) => Promise<void>;\nexport interface RealmProxyOptions {\n net: LoopbackNet;\n transport: RealmTransport;\n host?: string;\n port?: number;\n tunnel?: TunnelHandler;\n tunnelReady?: () => Promise<void>;\n limits?: Partial<ProxyLimits>;\n}\nconst HOP_BY_HOP = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-connection',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\nconst REQUEST_OWN = new Set(['host', 'content-length', 'expect']);\nclass Budget {\n private free: number;\n private waiters: Array<() => void> = [];\n constructor(free: number) {\n this.free = free;\n }\n async acquire(n: number, signal: AbortSignal): Promise<void> {\n while (this.free < n) {\n signal.throwIfAborted();\n await new Promise<void>((resolve) => {\n const done = (): void => {\n signal.removeEventListener('abort', done);\n resolve();\n };\n this.waiters.push(done);\n signal.addEventListener('abort', done, { once: true });\n });\n }\n this.free -= n;\n }\n release(n: number): void {\n this.free += n;\n const waiters = this.waiters;\n this.waiters = [];\n for (const wake of waiters) wake();\n }\n}\nexport function canonicalHost(host: string): string | undefined {\n const bare = host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;\n try {\n return new URL(`http://${bare}/`).hostname;\n } catch {\n return undefined;\n }\n}\nfunction localV4(a: number, b: number): boolean {\n return a === 127 || a === 0 || (a === 169 && b === 254);\n}\nfunction hextets(address: string): number[] | undefined {\n const [head, tail, extra] = address.split('::');\n if (extra !== undefined) return undefined;\n const part = (text: string | undefined) =>\n text ? text.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n const groups =\n tail === undefined\n ? front\n : [...front, ...new Array(8 - front.length - back.length).fill(0), ...back];\n return groups.length === 8 && groups.every((g) => g >= 0 && g <= 0xffff) ? groups : undefined;\n}\nfunction localV6(address: string): boolean {\n const g = hextets(address);\n if (!g) return true;\n if ((g[0] & 0xffc0) === 0xfe80) return true;\n const zeroPrefix = g.slice(0, 5).every((x) => x === 0);\n if (!zeroPrefix) return false;\n if (g[5] === 0xffff || (g[5] === 0 && g[6] !== 0)) return localV4(g[6] >> 8, g[6] & 0xff);\n return g[5] === 0 && g[6] === 0;\n}\nexport function isLoopbackHost(hostname: string): boolean {\n const canonical = canonicalHost(hostname);\n if (canonical === undefined) return false;\n const host = canonical.replace(/\\.+$/, '');\n if (host === 'localhost' || host.endsWith('.localhost')) return true;\n if (host.startsWith('[')) return localV6(host.slice(1, -1));\n const v4 = /^(\\d+)\\.(\\d+)\\.\\d+\\.\\d+$/.exec(host);\n return v4 ? localV4(Number(v4[1]), Number(v4[2])) : false;\n}\nfunction dropped(headers: HeaderList): Set<string> {\n return new Set([...HOP_BY_HOP, ...fieldTokens(headers, 'connection')]);\n}\nexport function forwardRequestHeaders(headers: HeaderList): HeaderList {\n const drop = dropped(headers);\n return headers.filter(([name]) => {\n const lower = name.toLowerCase();\n return !drop.has(lower) && !REQUEST_OWN.has(lower);\n });\n}\nexport function forwardResponseHeaders(\n headers: HeaderList,\n opts: {\n encodedBodies: boolean;\n bodiless: boolean;\n }\n): Array<readonly [string, string]> {\n const drop = dropped(headers);\n if (!opts.encodedBodies) drop.add('content-encoding');\n if (!(opts.encodedBodies && opts.bodiless)) drop.add('content-length');\n return headers.filter(([name]) => !drop.has(name.toLowerCase()));\n}\nfunction keepsAlive(req: RequestHead): boolean {\n const tokens = fieldTokens(req.headers, 'connection');\n if (tokens.includes('close')) return false;\n return req.minor >= 1 || tokens.includes('keep-alive');\n}\nexport function tunnelRequestUrl(req: RequestHead, origin: string): string {\n const base = new URL(origin);\n let url: URL;\n try {\n url = new URL(req.target, req.target.startsWith('/') ? base : undefined);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n const hosts = fieldValues(req.headers, 'host');\n const hostOk = hosts.every(\n (h) => URL.canParse(`https://${h}`) && new URL(`https://${h}`).host === base.host\n );\n if (url.origin !== base.origin || !hostOk) {\n throw new HttpError(421, `this tunnel is for ${base.host}`);\n }\n return url.href;\n}\nexport function requestUrl(req: RequestHead): string {\n if (req.target.startsWith('/')) {\n throw new HttpError(400, 'this is a proxy: send the absolute URL (GET http://host/path)');\n }\n let url: URL;\n try {\n url = new URL(req.target);\n } catch {\n throw new HttpError(400, 'malformed request target');\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new HttpError(400, `unsupported scheme ${url.protocol}`);\n }\n if (isLoopbackHost(url.hostname)) {\n throw new HttpError(\n 403,\n `${url.hostname} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return url.href;\n}\nexport function tunnelTarget(req: RequestHead): TunnelTarget {\n const match = /^([A-Za-z0-9.-]+|\\[[0-9A-Fa-f:.]+\\]):(\\d{1,5})$/.exec(req.target);\n const port = Number(match?.[2]);\n if (!match || port < 1 || port > 65535) {\n throw new HttpError(400, 'CONNECT needs host:port');\n }\n const host = canonicalHost(match[1]);\n if (host === undefined) throw new HttpError(400, 'CONNECT needs host:port');\n if (isLoopbackHost(host)) {\n throw new HttpError(\n 403,\n `${host} is the realm's own loopback, which the proxy does not reach: list it in no_proxy`\n );\n }\n return { host, port };\n}\nexport async function watchHangup(\n conn: KernelSocket,\n abort: AbortController,\n until: AbortSignal\n): Promise<void> {\n while (!until.aborted && !abort.signal.aborted) {\n if (conn.poll().hangup) {\n abort.abort(new KernelError('EPIPE'));\n return;\n }\n try {\n await conn.changed(until);\n } catch {\n return;\n }\n }\n}\nfunction untilAborted(\n response: Promise<RealmTransportResponse>,\n signal: AbortSignal\n): Promise<RealmTransportResponse> {\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason ?? new KernelError('EINTR'));\n response.then((late) => late.cancel()).catch(() => undefined);\n };\n if (signal.aborted) return onAbort();\n signal.addEventListener('abort', onAbort, { once: true });\n response.then(resolve, reject).finally(() => signal.removeEventListener('abort', onAbort));\n });\n}\ninterface Idle {\n ms: number;\n}\ninterface Exchange {\n sink: HttpSink;\n incoming: Incoming;\n origin?: string;\n conn?: KernelSocket;\n socket: KernelSocket;\n idle: Idle;\n}\nfunction plainResponse(status: number, message: string): RealmTransportResponse {\n const body = latin1Bytes(`slicc realm proxy: ${message}\\n`);\n return {\n status,\n statusText: REASON[status] ?? '',\n headers: [['Content-Type', 'text/plain; charset=utf-8']],\n body: (async function* () {\n yield body;\n })(),\n cancel: async () => undefined,\n };\n}\nfunction timedSource(conn: KernelSocket, idle: Idle, stop: AbortSignal): ByteSource {\n return {\n read: (max, signal) => {\n const own = signal ? [stop, signal] : [stop];\n if (Number.isFinite(idle.ms)) own.push(AbortSignal.timeout(idle.ms));\n return conn.read(max, AbortSignal.any(own));\n },\n };\n}\nexport function webSocketTarget(req: RequestHead): RequestHead {\n return { ...req, target: req.target.replace(/^ws(s?):/i, (_, s) => `http${s.toLowerCase()}:`) };\n}\nfunction wireCode(code: number): number {\n if (code === 1005) return 1000;\n return sendableCode(code) ? code : 1011;\n}\nfunction quietly(ms: number): Promise<void> {\n return new Promise((resolve) => {\n AbortSignal.timeout(ms).addEventListener('abort', () => resolve(), { once: true });\n });\n}\nexport class RealmProxy {\n private readonly options: RealmProxyOptions;\n private readonly listener: KernelSocket;\n private readonly stop = new AbortController();\n private readonly limits: ProxyLimits;\n private readonly slots: Budget;\n private readonly bodies: Budget;\n private readonly connections = new Set<KernelSocket>();\n private warnedWebSocket = false;\n readonly closed: Promise<void>;\n readonly port: number;\n constructor(options: RealmProxyOptions) {\n this.options = options;\n this.limits = { ...DEFAULT_LIMITS, ...options.limits };\n this.slots = new Budget(this.limits.maxConnections);\n this.bodies = new Budget(this.limits.bodyBudget);\n this.listener = options.net.listen({\n family: 'inet',\n host: options.host ?? '127.0.0.1',\n port: options.port ?? REALM_PROXY_PORT,\n });\n this.port = this.listener.local?.family === 'inet' ? this.listener.local.port : 0;\n this.closed = this.acceptLoop();\n }\n get stopped(): boolean {\n return this.stop.signal.aborted;\n }\n close(): void {\n if (this.stop.signal.aborted) return;\n this.stop.abort();\n this.listener.close();\n for (const conn of this.connections) conn.close();\n }\n private async acceptLoop(): Promise<void> {\n const served = new Set<Promise<void>>();\n try {\n for (;;) {\n await this.slots.acquire(1, this.stop.signal);\n let conn: KernelSocket;\n try {\n conn = await this.listener.accept(this.stop.signal);\n } catch {\n this.slots.release(1);\n break;\n }\n const done = this.serve(conn).finally(() => {\n this.slots.release(1);\n served.delete(done);\n });\n served.add(done);\n }\n } catch {}\n await Promise.allSettled([...served]);\n }\n private async serve(conn: KernelSocket): Promise<void> {\n this.connections.add(conn);\n const idle = { ms: this.limits.idleMs };\n const incoming = new Incoming(timedSource(conn, idle, this.stop.signal));\n try {\n await this.requests({ sink: conn, incoming, conn, socket: conn, idle });\n } finally {\n this.connections.delete(conn);\n conn.close();\n }\n }\n private async requests(ctx: Exchange): Promise<void> {\n try {\n for (;;) {\n const head = await ctx.incoming.head(this.limits.maxHead);\n if (!head || !(await this.exchange(ctx, head))) break;\n }\n } catch (e) {\n if (e instanceof HttpError) await this.refuse(ctx.sink, e);\n }\n }\n private async refuse(sink: HttpSink, error: HttpError): Promise<void> {\n try {\n await this.relay(sink, 'GET', 1, plainResponse(error.status, error.message), false);\n } catch {}\n }\n private async exchange(ctx: Exchange, head: Uint8Array): Promise<boolean> {\n const { sink: conn, incoming } = ctx;\n const req = parseRequestHead(head);\n if (req.method === 'CONNECT') {\n if (!ctx.conn) throw new HttpError(400, 'CONNECT inside a tunnel');\n await this.connect(ctx.conn, incoming, req, ctx.idle);\n return false;\n }\n if (req.method === 'GET' && isUpgrade(req.headers)) {\n await this.websocket(ctx, req);\n return false;\n }\n const url = ctx.origin ? tunnelRequestUrl(req, ctx.origin) : requestUrl(req);\n const keep = keepsAlive(req);\n const framing = requestFraming(req.headers);\n const reserve =\n framing.kind === 'length' ? framing.length : framing.kind === 'chunked' ? this.cap() : 0;\n if (reserve > this.cap()) throw new HttpError(413, `request body over ${this.cap()} bytes`);\n await this.expectContinue(conn, req, framing.kind !== 'none');\n await this.bodies.acquire(reserve, this.stop.signal);\n let response: RealmTransportResponse;\n const abort = new AbortController();\n const stopExchange = () => abort.abort();\n this.stop.signal.addEventListener('abort', stopExchange, { once: true });\n try {\n try {\n const body = await readBody(incoming, framing, this.cap());\n const waiting = new AbortController();\n void watchHangup(ctx.socket, abort, waiting.signal);\n try {\n response = await this.upstream(req, url, body, abort.signal);\n } finally {\n waiting.abort();\n }\n } finally {\n this.bodies.release(reserve);\n }\n return await this.relay(conn, req.method, req.minor, response, keep);\n } finally {\n this.stop.signal.removeEventListener('abort', stopExchange);\n abort.abort();\n }\n }\n private cap(): number {\n return Math.min(this.options.transport.traits.maxRequestBody, this.limits.bodyBudget);\n }\n private async expectContinue(conn: HttpSink, req: RequestHead, hasBody: boolean): Promise<void> {\n const expect = fieldTokens(req.headers, 'expect');\n if (expect.length === 0) return;\n if (expect.length !== 1 || expect[0] !== '100-continue') {\n throw new HttpError(417, `unsupported expectation: ${expect.join(', ')}`);\n }\n if (hasBody && req.minor >= 1) {\n await conn.write(latin1Bytes('HTTP/1.1 100 Continue\\r\\n\\r\\n'), this.stop.signal);\n }\n }\n private async upstream(\n req: RequestHead,\n url: string,\n body: Uint8Array | undefined,\n signal: AbortSignal\n ): Promise<RealmTransportResponse> {\n try {\n const fetching = this.options.transport.fetch({\n url: toHostLoopback(url),\n method: req.method.toUpperCase(),\n headers: forwardRequestHeaders(req.headers),\n body: req.method === 'GET' || req.method === 'HEAD' ? undefined : body,\n signal,\n });\n return await untilAborted(fetching, signal);\n } catch (e) {\n if (signal.aborted) throw e;\n const message = e instanceof Error ? e.message : String(e);\n const status = (\n e as {\n status?: unknown;\n } | null\n )?.status;\n const own = typeof status === 'number' && status >= 400 && status <= 599 ? status : 502;\n return plainResponse(own, message || 'upstream request failed');\n }\n }\n private async relay(\n conn: HttpSink,\n method: string,\n minor: number,\n response: RealmTransportResponse,\n keepAlive: boolean\n ): Promise<boolean> {\n const status = response.status;\n const bodiless = method === 'HEAD' || status === 204 || status === 304 || status < 200;\n const headers = forwardResponseHeaders(response.headers, {\n encodedBodies: this.options.transport.traits.encodedBodies,\n bodiless,\n });\n const chunked = !bodiless && minor >= 1;\n const keep = keepAlive && (bodiless || chunked);\n headers.push(['Connection', keep ? 'keep-alive' : 'close']);\n if (chunked) headers.push(['Transfer-Encoding', 'chunked']);\n const signal = this.stop.signal;\n await conn.write(\n responseHead(status, response.statusText || REASON[status] || '', headers),\n signal\n );\n if (bodiless) {\n await response.cancel();\n return keep;\n }\n try {\n for await (const piece of response.body) {\n if (piece.length > 0) await conn.write(chunked ? chunk(piece) : piece, signal);\n }\n } catch {\n await response.cancel().catch(() => undefined);\n return false;\n }\n if (chunked) await conn.write(LAST_CHUNK, signal);\n return keep;\n }\n private async connect(\n conn: KernelSocket,\n incoming: Incoming,\n req: RequestHead,\n idle: Idle\n ): Promise<void> {\n const target = tunnelTarget(req);\n const refused = target.port === 443 ? await this.tunnelReady(target) : undefined;\n if (refused) throw refused;\n await conn.write(latin1Bytes('HTTP/1.1 200 Connection Established\\r\\n\\r\\n'), this.stop.signal);\n try {\n const first = await incoming.peek(this.stop.signal);\n if (first === undefined) return;\n if (first !== TLS_HANDSHAKE) {\n const origin = `http://${target.port === 80 ? target.host : `${target.host}:${target.port}`}`;\n await this.requests({ sink: conn, incoming, origin, socket: conn, idle });\n return;\n }\n const tunnel = this.options.tunnel;\n if (!tunnel || (target.port !== 443 && (await this.tunnelReady(target)))) return;\n await tunnel(conn, incoming, target, this.stop.signal, (source, sink, origin) =>\n this.requests({ sink, incoming: new Incoming(source), origin, socket: conn, idle })\n );\n } catch {}\n }\n private async tunnelReady(target: TunnelTarget): Promise<HttpError | undefined> {\n const name = `CONNECT ${target.host}:${target.port}`;\n if (!this.options.tunnel) return new HttpError(501, `${name}: no tunnels through this proxy`);\n try {\n await this.options.tunnelReady?.();\n return undefined;\n } catch (e) {\n return new HttpError(501, `${name}: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n private async websocket(ctx: Exchange, req: RequestHead): Promise<void> {\n const href = ctx.origin ? tunnelRequestUrl(req, ctx.origin) : requestUrl(webSocketTarget(req));\n const { transport } = this.options;\n if (!transport.traits.websocket || !transport.websocket) {\n if (!this.warnedWebSocket) {\n this.warnedWebSocket = true;\n console.warn(`slicc-kernel: a program asked for a WebSocket: ${NO_WEBSOCKET}`);\n }\n throw new HttpError(501, NO_WEBSOCKET);\n }\n const accept = await acceptKey(req.headers);\n const protocols = fieldValues(req.headers, 'sec-websocket-protocol')\n .flatMap((v) => v.split(','))\n .map((t) => t.trim())\n .filter((t) => t !== '');\n const hangup = new AbortController();\n const waiting = new AbortController();\n void watchHangup(ctx.socket, hangup, waiting.signal);\n let socket: RealmWebSocket;\n try {\n socket = await transport.websocket({\n url: toHostLoopback(href).replace(/^http/, 'ws'),\n protocols,\n headers: forwardRequestHeaders(req.headers),\n signal: AbortSignal.any([this.stop.signal, hangup.signal]),\n });\n } catch (e) {\n waiting.abort();\n throw new HttpError(502, e instanceof Error ? e.message : String(e));\n }\n ctx.idle.ms = Number.POSITIVE_INFINITY;\n try {\n if (hangup.signal.aborted) throw hangup.signal.reason;\n if (\n socket.protocol &&\n !(protocols.includes(socket.protocol) && TOKEN.test(socket.protocol))\n ) {\n throw new HttpError(502, 'the far end chose a subprotocol the client did not offer');\n }\n await ctx.sink.write(switchingHead(accept, socket.protocol), this.stop.signal);\n await this.bridge(ctx, socket, hangup.signal);\n } catch (e) {\n socket.close(1001, 'the client went away');\n throw e;\n } finally {\n waiting.abort();\n }\n }\n private async bridge(ctx: Exchange, socket: RealmWebSocket, hangup: AbortSignal): Promise<void> {\n const stop = this.stop.signal;\n let chain: Promise<unknown> = Promise.resolve();\n const toGuest = (bytes: Uint8Array): Promise<unknown> => {\n chain = chain.then(() => ctx.sink.write(bytes, stop));\n return chain;\n };\n const done = new AbortController();\n const reading = AbortSignal.any([stop, done.signal, hangup]);\n const stopping = () => socket.close(1001, 'the proxy is stopping');\n stop.addEventListener('abort', stopping, { once: true });\n let guestDone = false;\n let closeSent = false;\n const outbound = (async () => {\n for await (const data of socket.messages) {\n if (guestDone) continue;\n const text = typeof data === 'string';\n await toGuest(\n frame(text ? OP_TEXT : OP_BINARY, text ? new TextEncoder().encode(data) : data)\n );\n }\n const closed = await socket.closed;\n if (guestDone) return;\n closeSent = true;\n await toGuest(closeFrame(wireCode(closed.code), closed.reason));\n AbortSignal.timeout(this.limits.closeWaitMs).addEventListener('abort', () => done.abort(), {\n once: true,\n });\n })().catch(() => done.abort());\n const reader = new WsReader(ctx.incoming, MESSAGE_LIMIT, true);\n try {\n for (;;) {\n const event = await reader.next(reading);\n if (!event) break;\n if (event.kind === 'ping') {\n await toGuest(pongFrame(event.payload));\n continue;\n }\n if (event.kind === 'close') {\n guestDone = true;\n if (closeSent) break;\n const code = wireCode(event.code);\n socket.close(code, event.reason);\n const reply = await Promise.race([\n socket.closed,\n quietly(this.limits.closeWaitMs).then(() => ({ code, reason: event.reason })),\n ]);\n await toGuest(closeFrame(wireCode(reply.code), reply.reason));\n break;\n }\n while (socket.buffered > SEND_BUFFER && !reading.aborted) await quietly(10);\n socket.send(event.kind === 'text' ? event.text : event.bytes);\n }\n } catch (e) {\n if (e instanceof WsError) {\n guestDone = true;\n socket.close(e.code, e.message);\n await toGuest(closeFrame(e.code, e.message)).catch(() => undefined);\n }\n } finally {\n guestDone = true;\n socket.close(1000, 'the client went away');\n stop.removeEventListener('abort', stopping);\n await Promise.race([outbound, quietly(this.limits.closeWaitMs)]);\n }\n }\n}\n", "export type Signer = (tbs: Uint8Array) => Promise<Uint8Array>;\nfunction concat(parts: readonly Uint8Array[]): Uint8Array {\n const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));\n let at = 0;\n for (const p of parts) {\n out.set(p, at);\n at += p.length;\n }\n return out;\n}\nfunction length(n: number): Uint8Array {\n if (n < 0x80) return Uint8Array.of(n);\n const bytes: number[] = [];\n for (let v = n; v > 0; v = Math.floor(v / 256)) bytes.unshift(v & 0xff);\n return Uint8Array.of(0x80 | bytes.length, ...bytes);\n}\nexport function tlv(tag: number, ...contents: readonly Uint8Array[]): Uint8Array {\n const body = concat(contents);\n return concat([Uint8Array.of(tag), length(body.length), body]);\n}\nconst seq = (...parts: Uint8Array[]) => tlv(0x30, ...parts);\nconst set = (...parts: Uint8Array[]) => tlv(0x31, ...parts);\nconst octets = (bytes: Uint8Array) => tlv(0x04, bytes);\nconst bits = (bytes: Uint8Array, unused = 0) => tlv(0x03, Uint8Array.of(unused), bytes);\nconst TRUE = tlv(0x01, Uint8Array.of(0xff));\nexport function integer(magnitude: Uint8Array): Uint8Array {\n let start = 0;\n while (start < magnitude.length - 1 && magnitude[start] === 0) start++;\n const trimmed = magnitude.subarray(start);\n return tlv(0x02, trimmed[0] & 0x80 ? concat([Uint8Array.of(0), trimmed]) : trimmed);\n}\nexport function oid(dotted: string): Uint8Array {\n const [a, b, ...rest] = dotted.split('.').map(Number);\n const out = [40 * a + b];\n for (const arc of rest) {\n const groups: number[] = [];\n for (let v = arc; ; v = Math.floor(v / 128)) {\n groups.unshift(v & 0x7f);\n if (v < 128) break;\n }\n out.push(...groups.map((g, i) => (i < groups.length - 1 ? g | 0x80 : g)));\n }\n return tlv(0x06, Uint8Array.from(out));\n}\nconst utf8 = (text: string) => tlv(0x0c, new TextEncoder().encode(text));\nconst ascii = (text: string) => Uint8Array.from(text, (c) => c.charCodeAt(0) & 0x7f);\nfunction time(date: Date): Uint8Array {\n const iso = date.toISOString().replace(/[-:T]/g, '').slice(0, 14);\n const year = date.getUTCFullYear();\n return year < 2050 ? tlv(0x17, ascii(`${iso.slice(2)}Z`)) : tlv(0x18, ascii(`${iso}Z`));\n}\nconst ECDSA_SHA256 = seq(oid('1.2.840.10045.4.3.2'));\nexport interface DistinguishedName {\n commonName: string;\n organization?: string;\n}\nfunction name(dn: DistinguishedName): Uint8Array {\n const rdns = [];\n if (dn.organization) rdns.push(set(seq(oid('2.5.4.10'), utf8(dn.organization))));\n rdns.push(set(seq(oid('2.5.4.3'), utf8(dn.commonName))));\n return seq(...rdns);\n}\nfunction extension(id: string, critical: boolean, value: Uint8Array): Uint8Array {\n return critical ? seq(oid(id), TRUE, octets(value)) : seq(oid(id), octets(value));\n}\nexport function children(der: Uint8Array): Uint8Array[] {\n const out: Uint8Array[] = [];\n const [, bodyStart, bodyEnd] = header(der, 0);\n for (let at = bodyStart; at < bodyEnd; ) {\n const [, , end] = header(der, at);\n out.push(der.subarray(at, end));\n at = end;\n }\n return out;\n}\nfunction header(der: Uint8Array, at: number): [tag: number, start: number, end: number] {\n const tag = der[at];\n let len = der[at + 1];\n let start = at + 2;\n if (len & 0x80) {\n const count = len & 0x7f;\n len = 0;\n for (let i = 0; i < count; i++) len = len * 256 + der[start + i];\n start += count;\n }\n if (start + len > der.length) throw new Error('truncated DER');\n return [tag, start, start + len];\n}\nexport function contents(element: Uint8Array): Uint8Array {\n const [, start, end] = header(element, 0);\n return element.subarray(start, end);\n}\nexport function publicKeyBits(spki: Uint8Array): Uint8Array {\n const key = children(spki)[1];\n return contents(key).subarray(1);\n}\nexport async function keyId(spki: Uint8Array): Promise<Uint8Array> {\n return new Uint8Array(\n await crypto.subtle.digest('SHA-1', publicKeyBits(spki) as Uint8Array<ArrayBuffer>)\n );\n}\nexport function ecdsaDer(raw: Uint8Array): Uint8Array {\n const half = raw.length / 2;\n return seq(integer(raw.subarray(0, half)), integer(raw.subarray(half)));\n}\nexport function randomSerial(): Uint8Array {\n const serial = crypto.getRandomValues(new Uint8Array(16));\n serial[0] = (serial[0] & 0x7f) | 0x01;\n return serial;\n}\nexport function ipv4(host: string): Uint8Array | undefined {\n const m = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host);\n if (!m) return undefined;\n const parts = m.slice(1).map(Number);\n return parts.every((p) => p <= 255) ? Uint8Array.from(parts) : undefined;\n}\nexport function ipv6(host: string): Uint8Array | undefined {\n if (!host.includes(':') || !/^[0-9A-Fa-f:.]+$/.test(host)) return undefined;\n const v4 = /(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(host);\n let text = host;\n const tail: number[] = [];\n if (v4) {\n const bytes = ipv4(v4[1]);\n if (!bytes) return undefined;\n tail.push((bytes[0] << 8) | bytes[1], (bytes[2] << 8) | bytes[3]);\n text = host.slice(0, -v4[1].length).replace(/:$/, host.endsWith(`::${v4[1]}`) ? ':' : '');\n }\n const halves = text.split('::');\n if (halves.length > 2) return undefined;\n const groups = (part: string) => (part === '' ? [] : part.split(':'));\n const head = groups(halves[0]);\n const back = halves.length === 2 ? groups(halves[1]) : [];\n if (![...head, ...back].every((g) => /^[0-9A-Fa-f]{1,4}$/.test(g))) return undefined;\n const words = [...head, ...back].map((g) => Number.parseInt(g, 16));\n const missing = 8 - words.length - tail.length;\n if (halves.length === 2 ? missing < 1 : missing !== 0) return undefined;\n const all = [\n ...head.map((g) => Number.parseInt(g, 16)),\n ...new Array(halves.length === 2 ? missing : 0).fill(0),\n ...back.map((g) => Number.parseInt(g, 16)),\n ...tail,\n ];\n return Uint8Array.from(all.flatMap((w) => [w >> 8, w & 0xff]));\n}\nexport interface CertificateRequest {\n serial: Uint8Array;\n issuer: DistinguishedName;\n subject: DistinguishedName;\n notBefore: Date;\n notAfter: Date;\n spki: Uint8Array;\n issuerSpki: Uint8Array;\n kind:\n | {\n ca: true;\n }\n | {\n ca: false;\n host: string;\n };\n sign: Signer;\n}\nasync function extensions(req: CertificateRequest): Promise<Uint8Array> {\n const list = [extension('2.5.29.14', false, octets(await keyId(req.spki)))];\n if (req.kind.ca) {\n list.push(extension('2.5.29.19', true, seq(TRUE, integer(Uint8Array.of(0)))));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x86), 1)));\n } else {\n list.push(extension('2.5.29.35', false, seq(tlv(0x80, await keyId(req.issuerSpki)))));\n list.push(extension('2.5.29.19', true, seq()));\n list.push(extension('2.5.29.15', true, bits(Uint8Array.of(0x80), 7)));\n list.push(extension('2.5.29.37', false, seq(oid('1.3.6.1.5.5.7.3.1'))));\n const ip = ipv4(req.kind.host) ?? ipv6(req.kind.host);\n const altName = ip ? tlv(0x87, ip) : tlv(0x82, ascii(req.kind.host));\n list.push(extension('2.5.29.17', false, seq(altName)));\n }\n return tlv(0xa3, seq(...list));\n}\nexport async function certificate(req: CertificateRequest): Promise<Uint8Array> {\n const tbs = seq(\n tlv(0xa0, integer(Uint8Array.of(2))),\n integer(req.serial),\n ECDSA_SHA256,\n name(req.issuer),\n seq(time(req.notBefore), time(req.notAfter)),\n name(req.subject),\n req.spki,\n await extensions(req)\n );\n const signature = ecdsaDer(await req.sign(tbs));\n return seq(tbs, ECDSA_SHA256, bits(signature));\n}\nexport function pem(der: Uint8Array): string {\n let b64 = '';\n for (let i = 0; i < der.length; i += 0x8000) {\n b64 += String.fromCharCode(...der.subarray(i, i + 0x8000));\n }\n const lines = btoa(b64).match(/.{1,64}/g) ?? [];\n return `-----BEGIN CERTIFICATE-----\\n${lines.join('\\n')}\\n-----END CERTIFICATE-----\\n`;\n}\n", "import { certificate, type DistinguishedName, ipv6, pem, randomSerial } from './x509.ts';\nexport interface CaRecord {\n key: CryptoKey;\n cert: Uint8Array;\n spki: Uint8Array;\n notAfter: number;\n name: DistinguishedName;\n}\nexport interface CaStore {\n get(owner: string): Promise<CaRecord | undefined>;\n swap(owner: string, expected: CaRecord | undefined, record: CaRecord): Promise<CaRecord>;\n}\n\nfunction sameCert(a: CaRecord | undefined, b: CaRecord | undefined): boolean {\n if (!a || !b) return a === b;\n return a.cert.length === b.cert.length && a.cert.every((byte, i) => byte === b.cert[i]);\n}\n\nexport function winner(\n current: CaRecord | undefined,\n expected: CaRecord | undefined,\n record: CaRecord\n): CaRecord | undefined {\n return sameCert(current, expected) ? record : current;\n}\nconst DAY = 24 * 60 * 60 * 1000;\nconst CA_LIFETIME = 3650 * DAY;\nconst CA_RENEW_BEFORE = 30 * DAY;\nexport const LEAF_LIFETIME = 7 * DAY;\nconst ECDSA = { name: 'ECDSA', namedCurve: 'P-256' } as const;\nconst SIGN = { name: 'ECDSA', hash: 'SHA-256' } as const;\nfunction request<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\nexport function indexedDbCaStore(dbName = 'slicc-realm-ca'): CaStore {\n let db: Promise<IDBDatabase> | undefined;\n const open = () => {\n db ??= new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, 1);\n req.onupgradeneeded = () => req.result.createObjectStore('ca');\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n db.catch(() => {\n db = undefined;\n });\n return db;\n };\n return {\n async get(owner) {\n const store = (await open()).transaction('ca').objectStore('ca');\n return (await request(store.get(owner))) as CaRecord | undefined;\n },\n async swap(owner, expected, record) {\n const tx = (await open()).transaction('ca', 'readwrite');\n const store = tx.objectStore('ca');\n let stored = record;\n const read = store.get(owner);\n read.onsuccess = () => {\n const current = read.result as CaRecord | undefined;\n const kept = winner(current, expected, record);\n if (kept === record) store.put(record, owner);\n else stored = kept as CaRecord;\n };\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n return stored;\n },\n };\n}\nexport class LeafNameError extends Error {}\nexport function validLeafName(host: string): boolean {\n if (ipv6(host)) return true;\n if (host.length === 0 || host.length > 253) return false;\n return host.split('.').every((label) => /^(?!-)[a-z0-9-]{1,63}(?<!-)$/i.test(label));\n}\nexport class RealmCa {\n private readonly record: CaRecord;\n private constructor(record: CaRecord) {\n this.record = record;\n }\n static async open(owner: string, store: CaStore, now = Date.now()): Promise<RealmCa> {\n const stored = await store.get(owner).catch(() => undefined);\n if (stored && stored.notAfter - now > CA_RENEW_BEFORE) return new RealmCa(stored);\n const record = await RealmCa.create(owner, now);\n return new RealmCa(await store.swap(owner, stored, record));\n }\n private static async create(owner: string, now: number): Promise<CaRecord> {\n const pair = await crypto.subtle.generateKey(ECDSA, false, ['sign', 'verify']);\n const spki = new Uint8Array(await crypto.subtle.exportKey('spki', pair.publicKey));\n const id = Array.from(crypto.getRandomValues(new Uint8Array(4)), (b) =>\n b.toString(16).padStart(2, '0')\n ).join('');\n const name = { organization: 'SLICC', commonName: `SLICC realm CA ${owner} ${id}` };\n const notAfter = now + CA_LIFETIME;\n const cert = await certificate({\n serial: randomSerial(),\n issuer: name,\n subject: name,\n notBefore: new Date(now - DAY),\n notAfter: new Date(notAfter),\n spki,\n issuerSpki: spki,\n kind: { ca: true },\n sign: signer(pair.privateKey),\n });\n return { key: pair.privateKey, cert, spki, notAfter, name };\n }\n get cert(): Uint8Array {\n return this.record.cert;\n }\n get pem(): string {\n return pem(this.record.cert);\n }\n async issue(host: string, spki: Uint8Array, now = Date.now()): Promise<Uint8Array> {\n const name = host.toLowerCase();\n if (!validLeafName(name)) throw new LeafNameError(`no certificate for ${host}`);\n return certificate({\n serial: randomSerial(),\n issuer: this.record.name,\n subject: { commonName: name.length <= 64 ? name : 'SLICC realm leaf' },\n notBefore: new Date(now - 60 * 60 * 1000),\n notAfter: new Date(now + LEAF_LIFETIME),\n spki,\n issuerSpki: this.record.spki,\n kind: { ca: false, host: name },\n sign: signer(this.record.key),\n });\n }\n}\nfunction signer(key: CryptoKey) {\n return async (tbs: Uint8Array) =>\n new Uint8Array(await crypto.subtle.sign(SIGN, key, tbs as Uint8Array<ArrayBuffer>));\n}\nconst opened = new WeakMap<CaStore, Map<string, Promise<RealmCa>>>();\nexport function realmCa(owner: string, store: CaStore): Promise<RealmCa> {\n const cas = opened.get(store) ?? new Map<string, Promise<RealmCa>>();\n opened.set(store, cas);\n let ca = cas.get(owner);\n if (!ca) {\n const opening = RealmCa.open(owner, store);\n ca = opening;\n cas.set(owner, opening);\n opening.catch(() => {\n if (cas.get(owner) === opening) cas.delete(owner);\n });\n }\n return ca;\n}\n", "type TlsExport =\n | 'malloc'\n | 'free'\n | 'tls_last_error'\n | 'tls_strerror'\n | 'tls_leaf_new'\n | 'tls_leaf_spki'\n | 'tls_leaf_add_cert'\n | 'tls_leaf_free'\n | 'tls_session_new'\n | 'tls_feed'\n | 'tls_feed_eof'\n | 'tls_in_room'\n | 'tls_read'\n | 'tls_write'\n | 'tls_out_size'\n | 'tls_out_take'\n | 'tls_close'\n | 'tls_alpn_http11'\n | 'tls_session_free';\n\nexport type TlsEngineModule = { readonly HEAPU8: Uint8Array } & {\n readonly [K in TlsExport as `_${K}`]: (...args: number[]) => number;\n};\n\nconst SCRATCH = 64 * 1024;\nconst EOF = -1;\nexport class TlsError extends Error {\n readonly code: number;\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n }\n}\nexport class TlsEngine {\n private readonly m: TlsEngineModule;\n private readonly scratch: number;\n constructor(m: TlsEngineModule) {\n this.m = m;\n this.scratch = m._malloc(SCRATCH);\n if (!this.scratch) throw new Error('tls engine: out of memory');\n }\n private put(bytes: Uint8Array): number {\n const ptr = this.m._malloc(bytes.length + 1);\n if (!ptr) throw new Error('tls engine: out of memory');\n this.m.HEAPU8.set(bytes, ptr);\n this.m.HEAPU8[ptr + bytes.length] = 0;\n return ptr;\n }\n private taken(n: number): Uint8Array {\n return this.m.HEAPU8.slice(this.scratch, this.scratch + n);\n }\n error(code: number, what: string): TlsError {\n this.m._tls_strerror(code, this.scratch, 256);\n const end = this.m.HEAPU8.indexOf(0, this.scratch);\n const text = new TextDecoder().decode(this.m.HEAPU8.subarray(this.scratch, end));\n return new TlsError(code, `${what}: ${text || code}`);\n }\n leaf(): TlsLeaf {\n const ptr = this.m._tls_leaf_new();\n if (!ptr) throw this.error(this.m._tls_last_error(), 'leaf key');\n return new TlsLeaf(this, this.m, ptr);\n }\n session(leaf: TlsLeaf, host: string): TlsSession {\n const name = this.put(new TextEncoder().encode(host));\n try {\n const ptr = this.m._tls_session_new(leaf.ptr, name);\n if (!ptr) throw this.error(this.m._tls_last_error(), 'tls session');\n return new TlsSession(this, this.m, ptr);\n } finally {\n this.m._free(name);\n }\n }\n withBytes<T>(bytes: Uint8Array, fn: (ptr: number) => T): T {\n const ptr = this.put(bytes);\n try {\n return fn(ptr);\n } finally {\n this.m._free(ptr);\n }\n }\n intoScratch(fn: (ptr: number, max: number) => number): number | Uint8Array {\n const n = fn(this.scratch, SCRATCH);\n return n > 0 ? this.taken(n) : n;\n }\n}\nexport class TlsLeaf {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n spki(): Uint8Array {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_leaf_spki(this.ptr, ptr, max));\n if (typeof out === 'number') throw this.engine.error(out, 'leaf public key');\n return out;\n }\n addCert(der: Uint8Array): void {\n const ret = this.engine.withBytes(der, (ptr) =>\n this.m._tls_leaf_add_cert(this.ptr, ptr, der.length)\n );\n if (ret !== 0) throw this.engine.error(ret, 'leaf certificate');\n }\n release(): void {\n this.m._tls_leaf_free(this.ptr);\n }\n}\nexport class TlsSession {\n private readonly engine: TlsEngine;\n private readonly m: TlsEngineModule;\n private readonly ptr: number;\n constructor(engine: TlsEngine, m: TlsEngineModule, ptr: number) {\n this.engine = engine;\n this.m = m;\n this.ptr = ptr;\n }\n feed(bytes: Uint8Array): number {\n return this.engine.withBytes(bytes, (ptr) => this.m._tls_feed(this.ptr, ptr, bytes.length));\n }\n feedEnd(): void {\n this.m._tls_feed_eof(this.ptr);\n }\n read(): Uint8Array | 'more' | 'eof' {\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_read(this.ptr, ptr, max));\n if (out instanceof Uint8Array) return out;\n if (out === 0) return 'more';\n if (out === EOF) return 'eof';\n throw this.engine.error(out, 'tls');\n }\n write(bytes: Uint8Array): number {\n const n = this.engine.withBytes(bytes, (ptr) => this.m._tls_write(this.ptr, ptr, bytes.length));\n if (n < 0) throw this.engine.error(n, 'tls');\n return n;\n }\n take(): Uint8Array {\n if (this.m._tls_out_size(this.ptr) === 0) return new Uint8Array(0);\n const out = this.engine.intoScratch((ptr, max) => this.m._tls_out_take(this.ptr, ptr, max));\n return out instanceof Uint8Array ? out : new Uint8Array(0);\n }\n close(): void {\n this.m._tls_close(this.ptr);\n }\n free(): void {\n this.m._tls_session_free(this.ptr);\n }\n}\nconst loading = new WeakMap<() => Promise<TlsEngineModule>, Promise<TlsEngine>>();\nexport function loadTlsEngine(load: () => Promise<TlsEngineModule>): Promise<TlsEngine> {\n let engine = loading.get(load);\n if (!engine) {\n const started = load().then((m) => new TlsEngine(m));\n engine = started;\n loading.set(load, started);\n started.catch(() => {\n if (loading.get(load) === started) loading.delete(load);\n });\n }\n return engine;\n}\n", "import type { KernelSocket } from '../socket.ts';\nimport type { ByteSource, Incoming } from './http1.ts';\nimport type { HttpSink, TunnelHandler, TunnelTarget } from './proxy-service.ts';\nimport { LEAF_LIFETIME, type RealmCa } from './realm-ca.ts';\nimport type { TlsEngine, TlsLeaf, TlsSession } from './tls-engine.ts';\n\nconst LEAF_REUSE = LEAF_LIFETIME - 24 * 60 * 60 * 1000;\nconst LEAF_CACHE = 256;\nconst CIPHER_READ = 64 * 1024;\nexport class TlsStream implements ByteSource, HttpSink {\n private readonly session: TlsSession;\n private readonly cipherIn: ByteSource;\n private readonly cipherOut: KernelSocket;\n private pending: Uint8Array = new Uint8Array(0);\n private ended = false;\n constructor(session: TlsSession, cipherIn: ByteSource, cipherOut: KernelSocket) {\n this.session = session;\n this.cipherIn = cipherIn;\n this.cipherOut = cipherOut;\n }\n private async flush(signal?: AbortSignal): Promise<void> {\n for (let out = this.session.take(); out.length > 0; out = this.session.take()) {\n await this.cipherOut.write(out, signal);\n }\n }\n private feedPending(): void {\n if (this.pending.length === 0) return;\n const n = this.session.feed(this.pending);\n this.pending = this.pending.subarray(n);\n }\n async read(_max: number, signal?: AbortSignal): Promise<Uint8Array> {\n for (;;) {\n this.feedPending();\n const got = this.session.read();\n await this.flush(signal);\n if (got instanceof Uint8Array) return got;\n if (got === 'eof') return new Uint8Array(0);\n if (this.pending.length > 0) continue;\n if (this.ended) {\n this.session.feedEnd();\n const last = this.session.read();\n await this.flush(signal);\n return last instanceof Uint8Array ? last : new Uint8Array(0);\n }\n const cipher = await this.cipherIn.read(CIPHER_READ, signal);\n if (cipher.length === 0) this.ended = true;\n else this.pending = cipher;\n }\n }\n async write(bytes: Uint8Array, signal?: AbortSignal): Promise<number> {\n for (let at = 0; at < bytes.length; ) {\n const n = this.session.write(bytes.subarray(at, at + 16 * 1024));\n await this.flush(signal);\n at += n;\n }\n return bytes.length;\n }\n async close(signal?: AbortSignal): Promise<void> {\n this.session.close();\n await this.flush(signal);\n }\n}\ninterface CachedLeaf {\n leaf: Promise<TlsLeaf>;\n expires: number;\n}\nexport interface TlsTerminatorOptions {\n ca: () => Promise<RealmCa>;\n engine: () => Promise<TlsEngine>;\n now?: () => number;\n}\nexport class TlsTerminator {\n private readonly options: TlsTerminatorOptions;\n private readonly leaves = new Map<string, CachedLeaf>();\n private readonly now: () => number;\n constructor(options: TlsTerminatorOptions) {\n this.options = options;\n this.now = options.now ?? Date.now;\n }\n private leafFor(engine: TlsEngine, host: string): Promise<TlsLeaf> {\n const now = this.now();\n const cached = this.leaves.get(host);\n if (cached && cached.expires > now) {\n this.leaves.delete(host);\n this.leaves.set(host, cached);\n return cached.leaf;\n }\n if (cached) void this.drop(host, cached);\n const leaf = this.issue(engine, host, now);\n const entry = { leaf, expires: now + LEAF_REUSE };\n this.leaves.set(host, entry);\n leaf.catch(() => {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n });\n for (const [oldest, old] of this.leaves) {\n if (this.leaves.size <= LEAF_CACHE) break;\n void this.drop(oldest, old);\n }\n return leaf;\n }\n private async drop(host: string, entry: CachedLeaf): Promise<void> {\n if (this.leaves.get(host) === entry) this.leaves.delete(host);\n (await entry.leaf.catch(() => undefined))?.release();\n }\n private async issue(engine: TlsEngine, host: string, now: number): Promise<TlsLeaf> {\n const ca = await this.options.ca();\n const leaf = engine.leaf();\n try {\n leaf.addCert(await ca.issue(host, leaf.spki(), now));\n leaf.addCert(ca.cert);\n return leaf;\n } catch (e) {\n leaf.release();\n throw e;\n }\n }\n async close(): Promise<void> {\n await Promise.all([...this.leaves].map(([host, entry]) => this.drop(host, entry)));\n }\n readonly handler: TunnelHandler = async (conn, incoming, target, signal, serveHttp) => {\n const engine = await this.options.engine();\n const host = target.host.replace(/^\\[|\\]$/g, '');\n const leaf = await this.leafFor(engine, host);\n const session = engine.session(leaf, host);\n try {\n const stream = new TlsStream(session, cipherSource(incoming), conn);\n const origin = `https://${authority(target)}`;\n await serveHttp(stream, stream, origin);\n await stream.close(signal).catch(() => undefined);\n } finally {\n session.free();\n }\n };\n}\nexport function authority(target: TunnelTarget): string {\n return target.port === 443 ? target.host : `${target.host}:${target.port}`;\n}\nfunction cipherSource(incoming: Incoming): ByteSource {\n return { read: (max, signal) => incoming.some(max, signal) };\n}\n", "import type { KernelFs } from '../../fs/types.ts';\nimport type { LoopbackNet } from '../socket.ts';\nimport {\n DEFAULT_HOSTNAME,\n HOST_LOOPBACK,\n ownNames,\n PAGE_LOOPBACK,\n PAGE_LOOPBACK_URL,\n} from './loopback-names.ts';\nimport { REALM_PROXY_PORT, RealmProxy } from './proxy-service.ts';\nimport {\n type CaRecord,\n type CaStore,\n indexedDbCaStore,\n type RealmCa,\n realmCa,\n winner,\n} from './realm-ca.ts';\nimport { loadTlsEngine, type TlsEngine, type TlsEngineModule } from './tls-engine.ts';\nimport { TlsTerminator } from './tls-tunnel.ts';\nimport type { RealmTransport } from './transport.ts';\n\nexport const NO_TRANSPORT =\n 'slicc-kernel: no network transport (createKernel({ network: { transport } }))';\n\nexport const TLS_ENGINE_PACKAGE = '@ai-ecoverse/wasm-tls-engine';\n\nexport const CA_PATH = '/etc/ssl/certs/slicc-kernel-ca.pem';\n\nconst PROXY_URL = `http://127.0.0.1:${REALM_PROXY_PORT}`;\n\nconst NO_PROXY = 'localhost,.localhost,127.0.0.1,127.0.0.0/8';\n\nconst CA_OWNER = 'slicc-kernel';\n\nexport const CA_DB = 'slicc-kernel-ca';\n\nexport function networkEnv(hostname: string = DEFAULT_HOSTNAME): Record<string, string> {\n const bypass = [NO_PROXY, ...ownNames(hostname).filter((n) => n !== 'wasmer.sh')].join(',');\n return {\n http_proxy: PROXY_URL,\n https_proxy: PROXY_URL,\n HTTP_PROXY: PROXY_URL,\n HTTPS_PROXY: PROXY_URL,\n no_proxy: bypass,\n NO_PROXY: bypass,\n SSL_CERT_FILE: CA_PATH,\n CURL_CA_BUNDLE: CA_PATH,\n GIT_SSL_CAINFO: CA_PATH,\n SLICC_HOST_LOOPBACK: HOST_LOOPBACK,\n SLICC_PAGE_LOOPBACK: PAGE_LOOPBACK,\n SLICC_PAGE_LOOPBACK_URL: PAGE_LOOPBACK_URL,\n };\n}\n\nexport function missingTransport(): RealmTransport {\n return {\n traits: { manualRedirects: true, encodedBodies: true, maxRequestBody: 0, unavailable: true },\n fetch: () => Promise.reject(Object.assign(new Error(NO_TRANSPORT), { status: 502 })),\n };\n}\n\nexport function memoryCaStore(): CaStore {\n const records = new Map<string, CaRecord>();\n return {\n get: async (owner) => records.get(owner),\n swap: async (owner, expected, record) => {\n const kept = winner(records.get(owner), expected, record) as CaRecord;\n records.set(owner, kept);\n return kept;\n },\n };\n}\n\nexport function caStore(name: string | false): CaStore {\n return name === false ? memoryCaStore() : indexedDbCaStore(name);\n}\n\nfunction base64(bytes: Uint8Array): string {\n let text = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n text += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(text);\n}\n\nexport function packageTlsEngine(fs: KernelFs, modules: string): () => Promise<TlsEngineModule> {\n const dir = `${modules.replace(/\\/+$/, '')}/${TLS_ENGINE_PACKAGE}/dist`;\n return async () => {\n let glue: Uint8Array;\n let wasmBinary: Uint8Array;\n try {\n [glue, wasmBinary] = await Promise.all([\n fs.readFileBuffer(`${dir}/slicc-tls-engine.mjs`),\n fs.readFileBuffer(`${dir}/slicc-tls-engine.wasm`),\n ]);\n } catch {\n throw new Error(`TLS needs ${TLS_ENGINE_PACKAGE} installed in ${modules}`);\n }\n const url = `data:text/javascript;base64,${base64(glue)}`;\n const factory = (await import(url)) as {\n default: (options: {\n wasmBinary: Uint8Array;\n locateFile: (path: string) => string;\n }) => Promise<TlsEngineModule>;\n };\n return factory.default({ wasmBinary, locateFile: (path) => path });\n };\n}\n\nexport interface NetworkOptions {\n transport?: RealmTransport;\n engine: () => Promise<TlsEngine>;\n ca: () => Promise<RealmCa>;\n now?: () => number;\n}\n\nexport function kernelCa(store: CaStore): () => Promise<RealmCa> {\n return () => realmCa(CA_OWNER, store);\n}\n\nexport function kernelTlsEngine(load: () => Promise<TlsEngineModule>): () => Promise<TlsEngine> {\n return () => loadTlsEngine(load);\n}\n\nconst CERTIFICATE = /-----BEGIN CERTIFICATE-----[\\s\\S]*?-----END CERTIFICATE-----/g;\n\nexport const CA_BUNDLE_MAX = 16;\n\nexport interface LockLike {\n request<T>(name: string, run: () => Promise<T>): Promise<T>;\n}\n\nconst CA_FILE_LOCK = 'slicc-kernel-ca-file';\nconst CA_FILE_TRIES = 3;\n\nasync function addToBundle(fs: KernelFs, own: string): Promise<boolean> {\n const current = (await fs.exists(CA_PATH)) ? await fs.readFile(CA_PATH) : '';\n const all = current.match(CERTIFICATE) ?? [];\n const others = all.filter((cert) => cert !== own);\n if (others.length < all.length) return true;\n const bundle = [...others, own].slice(-CA_BUNDLE_MAX);\n await fs.mkdir(CA_PATH.slice(0, CA_PATH.lastIndexOf('/')), { recursive: true });\n await fs.writeFile(CA_PATH, `${bundle.join('\\n')}\\n`);\n return false;\n}\n\nexport async function writeCaFile(\n fs: KernelFs,\n ca: () => Promise<RealmCa>,\n locks: LockLike | undefined = globalThis.navigator?.locks as LockLike | undefined\n): Promise<void> {\n const own = (await ca()).pem.trim();\n const update = async () => {\n for (let i = 0; i < CA_FILE_TRIES && !(await addToBundle(fs, own)); i++);\n };\n await (locks ? locks.request(CA_FILE_LOCK, update) : update());\n}\n\nexport function enableNetwork(\n net: LoopbackNet,\n options: NetworkOptions\n): () => RealmProxy | undefined {\n let proxy: RealmProxy | undefined;\n const transport = options.transport ?? missingTransport();\n net.activate({ family: 'inet', host: '127.0.0.1', port: REALM_PROXY_PORT }, () => {\n const tls = new TlsTerminator({\n ca: options.ca,\n engine: options.engine,\n ...(options.now ? { now: options.now } : {}),\n });\n const started = new RealmProxy({\n net,\n transport,\n tunnel: tls.handler,\n tunnelReady: async () => {\n await options.engine();\n },\n });\n proxy = started;\n void started.closed.then(async () => {\n if (proxy === started) proxy = undefined;\n await tls.close();\n });\n });\n return () => proxy;\n}\n", "import type { SyncFsResult } from '../../realm/sync-fs-wire.ts';\nimport { NO_TRANSPORT } from './network.ts';\nimport type { HeaderList, RealmTransport } from './transport.ts';\n\nexport type HttpSyscall =\n | {\n op: 'net-request';\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { op: 'net-read'; handle: number; max: number }\n | { op: 'net-close'; handle: number }\n | { op: 'net-traits' };\n\nexport const HTTP_OPS: readonly string[] = ['net-request', 'net-read', 'net-close', 'net-traits'];\n\nexport interface HttpHead {\n handle: number;\n status: number;\n statusText: string;\n url: string;\n headers: HeaderList;\n}\n\ninterface Open {\n abort: AbortController;\n body: AsyncIterator<Uint8Array>;\n left: Uint8Array;\n done: boolean;\n reading: Promise<void>;\n cancel(): Promise<void>;\n}\n\nconst EMPTY = new Uint8Array(0);\n\nfunction message(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n\nasync function* once(bytes: Uint8Array): AsyncGenerator<Uint8Array> {\n yield bytes;\n}\n\nexport class HttpHandles {\n private readonly transport: RealmTransport;\n\n private readonly open = new Map<number, Open>();\n\n private nextHandle = 0;\n\n constructor(transport: RealmTransport) {\n this.transport = transport;\n }\n\n syscall(req: HttpSyscall): Promise<SyncFsResult> {\n if (req.op === 'net-request') return this.request(req);\n if (req.op === 'net-read') return this.read(req.handle, req.max);\n if (req.op === 'net-traits') return Promise.resolve(this.traits());\n return this.close(req.handle);\n }\n\n private traits(): SyncFsResult {\n const { unavailable, crossOrigin = 'any', ...rest } = this.transport.traits;\n if (unavailable) return { ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT };\n return { ok: true, kind: 'json', json: { ...rest, crossOrigin } };\n }\n\n private add(\n abort: AbortController,\n body: AsyncIterable<Uint8Array>,\n cancel: () => Promise<void>\n ) {\n const handle = ++this.nextHandle;\n this.open.set(handle, {\n abort,\n body: body[Symbol.asyncIterator](),\n left: EMPTY,\n done: false,\n reading: Promise.resolve(),\n cancel,\n });\n return handle;\n }\n\n private async request(req: Extract<HttpSyscall, { op: 'net-request' }>): Promise<SyncFsResult> {\n const abort = new AbortController();\n try {\n const response = await this.transport.fetch({\n url: req.url,\n method: req.method,\n headers: req.headers,\n ...(req.body ? { body: req.body } : {}),\n signal: abort.signal,\n });\n const handle = this.add(abort, response.body, () => response.cancel());\n const head: HttpHead = {\n handle,\n status: response.status,\n statusText: response.statusText,\n url: req.url,\n headers: response.headers,\n };\n return { ok: true, kind: 'json', json: head };\n } catch (e) {\n const text = message(e);\n if (text === NO_TRANSPORT) return { ok: false, errno: 'ENETUNREACH', message: text };\n const status = (e as { status?: unknown }).status;\n if (typeof status !== 'number' || status === 502) {\n return { ok: false, errno: 'ECONNREFUSED', message: text };\n }\n const body = new TextEncoder().encode(text);\n const handle = this.add(abort, once(body), async () => undefined);\n const head: HttpHead = {\n handle,\n status,\n statusText: '',\n url: req.url,\n headers: [['content-type', 'text/plain; charset=utf-8']],\n };\n return { ok: true, kind: 'json', json: head };\n }\n }\n\n private async read(handle: number, max: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n const turn = entry.reading.then(() => this.take(entry, max));\n entry.reading = turn.then(() => undefined);\n return turn;\n }\n\n private async take(entry: Open, max: number): Promise<SyncFsResult> {\n if (entry.left.length === 0 && !entry.done) {\n try {\n const next = await entry.body.next();\n if (next.done) entry.done = true;\n else entry.left = next.value;\n } catch (e) {\n entry.done = true;\n const timedOut = (e as { code?: unknown } | null)?.code === 'ETIMEDOUT';\n return { ok: false, errno: timedOut ? 'ETIMEDOUT' : 'EIO', message: message(e) };\n }\n }\n const bytes = entry.left.subarray(0, Math.max(0, max));\n entry.left = entry.left.subarray(bytes.length);\n return { ok: true, kind: 'bytes', bytes };\n }\n\n private async close(handle: number): Promise<SyncFsResult> {\n const entry = this.open.get(handle);\n if (!entry) return { ok: false, errno: 'EBADF', message: `no request ${handle}` };\n this.open.delete(handle);\n entry.abort.abort();\n await entry.cancel().catch(() => undefined);\n return { ok: true, kind: 'void' };\n }\n\n async closeAll(): Promise<void> {\n await Promise.all([...this.open.keys()].map((handle) => this.close(handle)));\n }\n}\n", "import { HOST_LOOPBACK, HOST_LOOPBACK_ADDRESS } from './loopback-names.ts';\n\nexport interface RouteTable {\n prefixes: readonly string[];\n exit: boolean;\n}\n\nexport type Destination = 'loopback' | 'host' | 'reserved' | 'uplink' | 'unreachable';\n\ninterface Prefix {\n v6: boolean;\n bits: bigint;\n length: number;\n}\n\nconst HOST_ADDRESS = HOST_LOOPBACK_ADDRESS.join('.');\n\nexport function ipv4Bytes(text: string): number[] | undefined {\n const parts = text.split('.');\n if (parts.length !== 4 || !parts.every((p) => /^\\d{1,3}$/.test(p))) return undefined;\n const bytes = parts.map(Number);\n return bytes.every((b) => b <= 255) ? bytes : undefined;\n}\n\nexport function ipv6Groups(text: string): number[] | undefined {\n if (!text.includes(':')) return undefined;\n let canonical: string;\n try {\n canonical = new URL(`http://[${text}]/`).hostname.slice(1, -1);\n } catch {\n return undefined;\n }\n const [head, tail] = canonical.split('::');\n const part = (s: string | undefined) =>\n s ? s.split(':').map((h) => Number.parseInt(h, 16)) : [];\n const front = part(head);\n const back = part(tail);\n return tail === undefined\n ? front\n : [...front, ...new Array<number>(8 - front.length - back.length).fill(0), ...back];\n}\n\nfunction toBits(values: number[], width: number): bigint {\n return values.reduce((acc, v) => (acc << BigInt(width)) | BigInt(v), 0n);\n}\n\nfunction addressBits(host: string): { v6: boolean; bits: bigint } | undefined {\n const v4 = ipv4Bytes(host);\n if (v4) return { v6: false, bits: toBits(v4, 8) };\n const v6 = ipv6Groups(host);\n return v6 ? { v6: true, bits: toBits(v6, 16) } : undefined;\n}\n\nfunction parsePrefix(text: string): Prefix | undefined {\n const parts = text.trim().split('/');\n if (parts.length > 2) return undefined;\n const [address = '', size] = parts;\n const parsed = addressBits(address);\n if (!parsed) return undefined;\n const max = parsed.v6 ? 128 : 32;\n const length = size === undefined ? max : /^\\d{1,3}$/.test(size) ? Number(size) : -1;\n if (length < 0 || length > max) return undefined;\n return { ...parsed, length };\n}\n\nfunction within(prefix: Prefix, addr: { v6: boolean; bits: bigint }): boolean {\n if (prefix.v6 !== addr.v6) return false;\n const shift = BigInt((prefix.v6 ? 128 : 32) - prefix.length);\n return addr.bits >> shift === prefix.bits >> shift;\n}\n\nconst RESERVED = [\n '0.0.0.0/8',\n '127.0.0.0/8',\n '169.254.0.0/16',\n '224.0.0.0/4',\n '240.0.0.0/4',\n '::/96',\n '::ffff:0:0/96',\n 'fe80::/10',\n 'ff00::/8',\n].map((p) => parsePrefix(p) as Prefix);\n\nexport class Routes {\n private table: Prefix[] = [];\n private exit = false;\n readonly ipv6: boolean;\n\n constructor(ipv6 = false) {\n this.ipv6 = ipv6;\n }\n\n set(table: RouteTable): void {\n const parsed = (table.prefixes ?? []).map(parsePrefix);\n const bad = (table.prefixes ?? []).find((_, i) => !parsed[i]);\n if (bad !== undefined) throw new Error(`not an address prefix: ${bad}`);\n this.table = parsed as Prefix[];\n this.exit = table.exit === true;\n }\n\n classify(host: string): Destination {\n const name = host.toLowerCase().replace(/\\.$/, '');\n if (name === 'localhost' || name.endsWith('.localhost') || name === '0.0.0.0') {\n return 'loopback';\n }\n if (name === HOST_LOOPBACK || name === HOST_ADDRESS) return 'host';\n const addr = addressBits(name);\n if (!addr) return 'unreachable';\n if (addr.v6 && addr.bits === 1n) return 'loopback';\n if (!addr.v6 && addr.bits >> 24n === 127n) return 'loopback';\n if (RESERVED.some((p) => within(p, addr))) return 'reserved';\n if (addr.v6 && !this.ipv6) return 'unreachable';\n if (this.exit || this.table.some((p) => within(p, addr))) return 'uplink';\n return 'unreachable';\n }\n}\n", "import { Routes, type RouteTable } from './routes.ts';\n\nexport interface UplinkTraits {\n tcp: true;\n udp: false;\n ipv6: boolean;\n}\n\nexport type ResolveFamily = 0 | 4 | 6;\n\nexport interface ResolveAnswer {\n addresses: string[];\n ttl?: number;\n}\n\nexport interface UplinkConn {\n readonly localAddr: string;\n readonly remoteAddr: string;\n read(): Promise<Uint8Array | null>;\n write(bytes: Uint8Array): Promise<number>;\n closeWrite(): void;\n close(): void;\n}\n\nexport interface UplinkDial {\n network: 'tcp';\n host: string;\n port: number;\n signal: AbortSignal;\n}\n\nexport interface NetworkUplink {\n readonly traits: UplinkTraits;\n readonly routes?: RouteTable;\n resolve(\n name: string,\n family: ResolveFamily,\n signal?: AbortSignal\n ): Promise<string[] | ResolveAnswer>;\n dial(req: UplinkDial): Promise<UplinkConn>;\n}\n\nexport type UplinkCall =\n | { uplink: 'resolve'; uid: number; name: string; family: ResolveFamily }\n | { uplink: 'dial'; uid: number; host: string; port: number }\n | { uplink: 'cancel'; uid: number }\n | { uplink: 'read'; uid: number; cid: number }\n | { uplink: 'write'; uid: number; cid: number; bytes: Uint8Array }\n | { uplink: 'close-write'; cid: number }\n | { uplink: 'close'; cid: number };\n\nexport type UplinkReply =\n | { uplink: 'resolved'; uid: number; addresses: string[]; ttl?: number }\n | { uplink: 'dialled'; uid: number; cid: number; localAddr: string; remoteAddr: string }\n | { uplink: 'data'; uid: number; bytes: Uint8Array | null }\n | { uplink: 'written'; uid: number; n: number }\n | { uplink: 'error'; uid: number; message: string; code?: string };\n\nexport interface UplinkPeer {\n postMessage(message: UplinkReply, transfer?: Transferable[]): void;\n}\n\nexport interface UplinkPort {\n postMessage(message: UplinkCall, transfer?: Transferable[]): void;\n}\n\nexport interface UplinkServer {\n answer(call: UplinkCall): void;\n close(): void;\n}\n\nexport function answerOf(result: string[] | ResolveAnswer): ResolveAnswer {\n const answer = Array.isArray(result) ? { addresses: result } : result;\n const addresses = Array.isArray(answer?.addresses)\n ? answer.addresses.filter((a): a is string => typeof a === 'string')\n : [];\n return {\n addresses,\n ...(typeof answer?.ttl === 'number' && answer.ttl >= 0 ? { ttl: answer.ttl } : {}),\n };\n}\n\nfunction failure(uid: number, e: unknown): UplinkReply {\n const code = (e as { code?: unknown } | null)?.code;\n return {\n uplink: 'error',\n uid,\n message: e instanceof Error ? e.message : String(e),\n ...(typeof code === 'string' ? { code } : {}),\n };\n}\n\nconst NEVER = new Routes(true);\n\nexport function serveUplink(peer: UplinkPeer, uplink: NetworkUplink): UplinkServer {\n const conns = new Map<number, UplinkConn>();\n const pending = new Map<number, AbortController>();\n let nextCid = 0;\n let closed = false;\n const run = (uid: number, work: (signal: AbortSignal) => Promise<UplinkReply | undefined>) => {\n const abort = new AbortController();\n pending.set(uid, abort);\n void work(abort.signal)\n .then(\n (reply) => reply && peer.postMessage(reply, transferOf(reply)),\n (e: unknown) => peer.postMessage(failure(uid, e))\n )\n .finally(() => pending.delete(uid));\n };\n const conn = (cid: number): UplinkConn => {\n const found = conns.get(cid);\n if (!found) throw Object.assign(new Error('no such uplink connection'), { code: 'EBADF' });\n return found;\n };\n const dial = async (call: Extract<UplinkCall, { uplink: 'dial' }>, signal: AbortSignal) => {\n const kind = NEVER.classify(call.host);\n if (kind === 'loopback' || kind === 'host' || kind === 'reserved') {\n throw Object.assign(new Error(`the uplink does not carry ${call.host}`), {\n code: 'ENETUNREACH',\n });\n }\n const { host, port } = call;\n const opened = await uplink.dial({ network: 'tcp', host, port, signal });\n if (signal.aborted || closed) {\n opened.close();\n return undefined;\n }\n const cid = ++nextCid;\n conns.set(cid, opened);\n const { localAddr, remoteAddr } = opened;\n return { uplink: 'dialled' as const, uid: call.uid, cid, localAddr, remoteAddr };\n };\n const drop = (cid: number) => {\n const found = conns.get(cid);\n conns.delete(cid);\n found?.close();\n };\n return {\n answer(call) {\n switch (call.uplink) {\n case 'resolve':\n return run(call.uid, async (signal) => ({\n uplink: 'resolved',\n uid: call.uid,\n ...answerOf(await uplink.resolve(call.name, call.family, signal)),\n }));\n case 'dial':\n return run(call.uid, (signal) => dial(call, signal));\n case 'cancel':\n return pending.get(call.uid)?.abort();\n case 'read':\n return run(call.uid, async () => ({\n uplink: 'data',\n uid: call.uid,\n bytes: (await conn(call.cid).read())?.slice() ?? null,\n }));\n case 'write':\n return run(call.uid, async () => ({\n uplink: 'written',\n uid: call.uid,\n n: await conn(call.cid).write(call.bytes),\n }));\n case 'close-write':\n return conns.get(call.cid)?.closeWrite();\n default:\n return drop(call.cid);\n }\n },\n close() {\n closed = true;\n for (const abort of pending.values()) abort.abort();\n for (const cid of [...conns.keys()]) drop(cid);\n },\n };\n}\n\nfunction transferOf(reply: UplinkReply): Transferable[] | undefined {\n if (reply.uplink !== 'data' || !reply.bytes) return undefined;\n return [reply.bytes.buffer as ArrayBuffer];\n}\n\ntype Answer = Exclude<UplinkReply, { uplink: 'error' }>;\n\nexport class RemoteUplink implements NetworkUplink {\n readonly traits: UplinkTraits;\n readonly routes: RouteTable | undefined;\n private readonly port: UplinkPort;\n private readonly waiting = new Map<number, PromiseWithResolvers<Answer>>();\n private nextId = 0;\n\n constructor(port: UplinkPort, traits: UplinkTraits, routes?: RouteTable) {\n this.port = port;\n this.traits = traits;\n this.routes = routes;\n }\n\n receive(reply: UplinkReply): void {\n const waiter = this.waiting.get(reply.uid);\n if (!waiter) return;\n this.waiting.delete(reply.uid);\n if (reply.uplink === 'error') {\n waiter.reject(Object.assign(new Error(reply.message), { code: reply.code }));\n } else waiter.resolve(reply);\n }\n\n private ask<T extends Answer>(\n call: Extract<UplinkCall, { uid: number }>,\n signal?: AbortSignal,\n transfer?: Transferable[]\n ): Promise<T> {\n const waiter = Promise.withResolvers<Answer>();\n this.waiting.set(call.uid, waiter);\n const abort = () => {\n this.waiting.delete(call.uid);\n this.port.postMessage({ uplink: 'cancel', uid: call.uid });\n waiter.reject(signal?.reason);\n };\n signal?.addEventListener('abort', abort, { once: true });\n const settled = () => signal?.removeEventListener('abort', abort);\n waiter.promise.then(settled, settled);\n this.port.postMessage(call, transfer);\n return waiter.promise as Promise<T>;\n }\n\n async resolve(name: string, family: ResolveFamily, signal?: AbortSignal) {\n const reply = await this.ask<Extract<Answer, { uplink: 'resolved' }>>(\n { uplink: 'resolve', uid: ++this.nextId, name, family },\n signal\n );\n return answerOf(reply);\n }\n\n async dial(req: UplinkDial): Promise<UplinkConn> {\n req.signal.throwIfAborted();\n const { host, port } = req;\n const opened = await this.ask<Extract<Answer, { uplink: 'dialled' }>>(\n { uplink: 'dial', uid: ++this.nextId, host, port },\n req.signal\n );\n const { cid, localAddr, remoteAddr } = opened;\n return {\n localAddr,\n remoteAddr,\n read: async () => {\n const got = await this.ask<Extract<Answer, { uplink: 'data' }>>({\n uplink: 'read',\n uid: ++this.nextId,\n cid,\n });\n return got.bytes;\n },\n write: async (bytes) => {\n const copy = bytes.slice();\n const call = { uplink: 'write' as const, uid: ++this.nextId, cid, bytes: copy };\n const done = await this.ask<Extract<Answer, { uplink: 'written' }>>(call, undefined, [\n copy.buffer,\n ]);\n return done.n;\n },\n closeWrite: () => this.port.postMessage({ uplink: 'close-write', cid }),\n close: () => this.port.postMessage({ uplink: 'close', cid }),\n };\n }\n}\n", "import { KernelError } from '../fd-table.ts';\nimport {\n DEFAULT_HOSTNAME,\n HOST_LOOPBACK,\n HOST_LOOPBACK_ADDRESS,\n HOSTNAME_ADDRESS,\n ownNames,\n} from './loopback-names.ts';\nimport { ipv4Bytes, ipv6Groups, type Routes } from './routes.ts';\nimport { answerOf, type NetworkUplink, type ResolveFamily } from './uplink.ts';\n\nexport const RESOLVE_TTL_MAX = 60;\nexport const RESOLVE_TIMEOUT_MS = 10_000;\nexport const RESOLVE_CACHE_MAX = 256;\n\nconst LOOPBACK_NAMES = new Set(['localhost', 'localhost.localdomain', 'ip6-localhost', '::1']);\n\ninterface Cached {\n addresses: string[];\n expires: number;\n}\n\nexport interface ResolverOptions {\n uplink?: NetworkUplink | undefined;\n routes: Routes;\n now?: () => number;\n timeoutMs?: number;\n log?: (message: string) => void;\n hostname?: string;\n}\n\nfunction loopbackName(name: string, own: readonly string[]): boolean {\n return LOOPBACK_NAMES.has(name) || name.endsWith('.localhost') || own.includes(name);\n}\n\nexport function hostsEntry(\n name: string,\n own: readonly string[] = ownNames(DEFAULT_HOSTNAME)\n): string | undefined {\n if (own.includes(name)) return HOSTNAME_ADDRESS;\n if (LOOPBACK_NAMES.has(name) || name.endsWith('.localhost')) return '127.0.0.1';\n if (name === HOST_LOOPBACK) return HOST_LOOPBACK_ADDRESS.join('.');\n return ipv4Bytes(name) ? name : undefined;\n}\n\nexport class Resolver {\n private readonly uplink: NetworkUplink | undefined;\n private readonly routes: Routes;\n private readonly now: () => number;\n private readonly timeoutMs: number;\n private readonly log: (message: string) => void;\n private readonly own: readonly string[];\n private readonly cache = new Map<string, Cached>();\n private readonly pending = new Map<string, Lookup>();\n\n constructor(options: ResolverOptions) {\n this.uplink = options.uplink;\n this.routes = options.routes;\n this.now = options.now ?? Date.now;\n this.timeoutMs = options.timeoutMs ?? RESOLVE_TIMEOUT_MS;\n this.log = options.log ?? ((message) => console.warn(message));\n this.own = ownNames(options.hostname ?? DEFAULT_HOSTNAME);\n }\n\n async resolve(\n name: string,\n family: ResolveFamily,\n blocking?: () => AbortSignal\n ): Promise<string[]> {\n const key = name.toLowerCase().replace(/\\.$/, '');\n const local = hostsEntry(key, this.own);\n if (ipv6Groups(key)) {\n const v4 = family !== 6 && local ? [local] : [];\n return family === 4 ? v4 : [...v4, key];\n }\n if (local) {\n const six = loopbackName(key, this.own) ? ['::1'] : [];\n return family === 6 ? six : family === 4 ? [local] : [local, ...six];\n }\n if (!this.uplink || key === '') return [];\n const asked: ResolveFamily = this.uplink.traits.ipv6 ? family : 4;\n if (family === 6 && asked !== 6) return [];\n const id = `${asked}:${key}`;\n const hit = this.cache.get(id);\n if (hit && hit.expires > this.now()) return hit.addresses;\n const signal = blocking?.();\n if (signal?.aborted) throw new KernelError('EINTR');\n let lookup = this.pending.get(id);\n if (!lookup) {\n const abort = new AbortController();\n lookup = { work: this.lookup(key, asked, id, abort.signal), abort, waiters: 0 };\n this.pending.set(id, lookup);\n void lookup.work.then(() => this.pending.delete(id));\n }\n return waitFor(lookup, signal);\n }\n\n private async lookup(\n name: string,\n family: ResolveFamily,\n id: string,\n abandoned: AbortSignal\n ): Promise<string[]> {\n const uplink = this.uplink as NetworkUplink;\n const timeout = AbortSignal.any([AbortSignal.timeout(this.timeoutMs), abandoned]);\n let answer: { addresses: string[]; ttl?: number };\n try {\n answer = answerOf(\n await Promise.race([\n uplink.resolve(name, family, timeout),\n new Promise<never>((_, reject) =>\n timeout.addEventListener('abort', () => reject(timeout.reason), { once: true })\n ),\n ])\n );\n } catch {\n return [];\n }\n const addresses = answer.addresses.filter((a) => this.usable(name, a, family));\n if (addresses.length > 0) this.remember(id, addresses, answer.ttl);\n return addresses;\n }\n\n private usable(name: string, address: string, family: ResolveFamily): boolean {\n const v4 = ipv4Bytes(address) !== undefined;\n if (!v4 && (family === 4 || !ipv6Groups(address))) return false;\n if (v4 && family === 6) return false;\n const kind = this.routes.classify(address);\n if (kind !== 'loopback' && kind !== 'host' && kind !== 'reserved') return true;\n this.log(`slicc-kernel: dropped the uplink's answer ${address} for ${name}: it is ${kind}`);\n return false;\n }\n\n private remember(id: string, addresses: string[], ttl: number | undefined): void {\n const seconds = Math.min(ttl ?? RESOLVE_TTL_MAX, RESOLVE_TTL_MAX);\n if (seconds <= 0) return;\n this.cache.delete(id);\n this.cache.set(id, { addresses, expires: this.now() + seconds * 1000 });\n if (this.cache.size > RESOLVE_CACHE_MAX) {\n this.cache.delete(this.cache.keys().next().value as string);\n }\n }\n}\n\ninterface Lookup {\n work: Promise<string[]>;\n abort: AbortController;\n waiters: number;\n}\n\nfunction waitFor(lookup: Lookup, signal: AbortSignal | undefined): Promise<string[]> {\n lookup.waiters++;\n return new Promise<string[]>((resolve, reject) => {\n const abort = () => {\n if (--lookup.waiters === 0) lookup.abort.abort(new KernelError('EINTR'));\n reject(new KernelError('EINTR'));\n };\n signal?.addEventListener('abort', abort, { once: true });\n void lookup.work.then((value) => {\n if (signal?.aborted) return;\n lookup.waiters--;\n signal?.removeEventListener('abort', abort);\n resolve(value);\n });\n });\n}\n", "import { KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport { SIG } from './signals.ts';\n\nexport interface Termios {\n c_iflag: number;\n c_oflag: number;\n c_cflag: number;\n c_lflag: number;\n c_cc: number[];\n}\n\nexport interface TtyScreen {\n write(bytes: Uint8Array): void;\n}\n\nconst ICRNL = 0o400;\nconst IUTF8 = 0o40000;\nconst OPOST = 0o1;\nconst ONLCR = 0o4;\nconst ISIG = 0o1;\nconst ICANON = 0o2;\nconst ECHO = 0o10;\nconst ECHOE = 0o20;\nconst ECHOCTL = 0o1000;\nconst NOFLSH = 0o200;\nconst IEXTEN = 0o100000;\nconst VINTR = 0;\nconst VQUIT = 1;\nconst VERASE = 2;\nconst VKILL = 3;\nconst VEOF = 4;\nconst VSUSP = 10;\nconst VWERASE = 14;\n\nexport function defaultTermios(): Termios {\n const cCc = new Array<number>(32).fill(0);\n Object.assign(cCc, { [VINTR]: 0x03, [VQUIT]: 0x1c, [VERASE]: 0x7f, [VKILL]: 0x15 });\n Object.assign(cCc, { [VEOF]: 0x04, 6: 1, 8: 0x11, 9: 0x13, [VSUSP]: 0x1a });\n Object.assign(cCc, { 12: 0x12, 13: 0x0f, [VWERASE]: 0x17, 15: 0x16 });\n return {\n c_iflag: ICRNL | 0o2000 | 0o20000 | IUTF8,\n c_oflag: OPOST | ONLCR,\n c_cflag: 0o17 | 0o60 | 0o200,\n c_lflag: ISIG | ICANON | ECHO | ECHOE | 0o40 | ECHOCTL | 0o4000 | IEXTEN,\n c_cc: cCc,\n };\n}\n\nconst encoder = new TextEncoder();\n\nfunction isContinuation(byte: number): boolean {\n return (byte & 0xc0) === 0x80;\n}\n\nexport class KernelTty {\n private termios = defaultTermios();\n private cols = 80;\n private rows = 24;\n\n private readable: Array<Uint8Array | null> = [];\n\n private line: number[] = [];\n private waiters: Array<() => void> = [];\n\n private hungUp = false;\n\n name?: string;\n\n onRead?: () => void;\n\n private readers = 0;\n\n private readonly screen: TtyScreen;\n\n private readonly signal: (sig: number) => void;\n\n constructor(\n screen: TtyScreen,\n\n signal: (sig: number) => void\n ) {\n this.screen = screen;\n\n this.signal = signal;\n }\n\n receive(bytes: Uint8Array): void {\n for (const byte of bytes) this.key(byte);\n this.wake();\n }\n\n resize(cols: number, rows: number): void {\n this.setSize(cols, rows);\n this.signal(SIG.WINCH);\n }\n\n hangup(): void {\n this.hungUp = true;\n this.wake();\n }\n\n signalHangup(): void {\n this.signal(SIG.HUP);\n }\n\n setSize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n }\n\n tcgets(): Termios {\n return { ...this.termios, c_cc: [...this.termios.c_cc] };\n }\n\n tcsets(termios: Termios): void {\n const wasCanonical = this.canonical;\n this.termios = { ...termios, c_cc: [...termios.c_cc] };\n\n if (wasCanonical && !this.canonical && this.line.length > 0) {\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n this.wake();\n }\n }\n\n winsize(): [number, number] {\n return [this.rows, this.cols];\n }\n\n file(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.read(max, signal),\n write: async (bytes) => {\n if (this.hungUp) throw new KernelError('EIO');\n this.output(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.readable.length > 0 || this.hungUp,\n writable: true,\n hangup: this.hungUp,\n }),\n changed: (signal) => this.changed(signal),\n close: () => {},\n tty: this,\n });\n }\n\n private get canonical(): boolean {\n return (this.termios.c_lflag & ICANON) !== 0;\n }\n\n private cc(slot: number): number {\n return this.termios.c_cc[slot] ?? 0;\n }\n\n private key(input: number): void {\n const { c_iflag, c_lflag } = this.termios;\n const byte = input === 0x0d && c_iflag & ICRNL ? 0x0a : input;\n if (c_lflag & ISIG && this.signalKey(byte)) return;\n if (!this.canonical) {\n this.readable.push(Uint8Array.of(byte));\n if (c_lflag & ECHO) this.echo(byte);\n return;\n }\n this.edit(byte);\n }\n\n private signalKey(byte: number): boolean {\n const sig =\n byte === this.cc(VINTR)\n ? SIG.INT\n : byte === this.cc(VQUIT)\n ? SIG.QUIT\n : byte === this.cc(VSUSP)\n ? SIG.TSTP\n : 0;\n if (!sig || byte === 0) return false;\n if (this.termios.c_lflag & ECHO) this.echo(byte);\n if (!(this.termios.c_lflag & NOFLSH)) {\n this.line = [];\n this.readable = [];\n }\n this.signal(sig);\n return true;\n }\n\n private edit(byte: number): void {\n const echo = (this.termios.c_lflag & ECHO) !== 0;\n if (byte === this.cc(VERASE) || byte === 0x08) {\n this.rubOut(this.lastCharLength());\n } else if (byte === this.cc(VKILL)) {\n this.rubOut(this.line.length);\n } else if (byte === this.cc(VWERASE)) {\n this.rubOut(this.lastWordLength());\n } else if (byte === this.cc(VEOF)) {\n this.readable.push(this.line.length > 0 ? Uint8Array.from(this.line) : null);\n this.line = [];\n } else if (byte === 0x0a) {\n this.line.push(byte);\n if (echo) this.output(encoder.encode('\\n'));\n this.readable.push(Uint8Array.from(this.line));\n this.line = [];\n } else {\n this.line.push(byte);\n if (echo) this.echo(byte);\n }\n }\n\n private lastWordLength(): number {\n let end = this.line.length;\n while (end > 0 && this.line[end - 1] === 0x20) end--;\n while (end > 0 && this.line[end - 1] !== 0x20) end--;\n return this.line.length - end;\n }\n\n private lastCharLength(): number {\n const { line } = this;\n let n = Math.min(1, line.length);\n if (this.termios.c_iflag & IUTF8) {\n while (n < line.length && isContinuation(line[line.length - n] ?? 0)) n++;\n }\n return n;\n }\n\n private rubOut(n: number): void {\n const dropped = this.line.splice(this.line.length - n, n);\n const utf8 = (this.termios.c_iflag & IUTF8) !== 0;\n const cells = utf8 ? dropped.filter((b) => !isContinuation(b)).length : dropped.length;\n if (cells > 0 && this.termios.c_lflag & ECHO) {\n this.output(encoder.encode('\\b \\b'.repeat(cells)), false);\n }\n }\n\n private echo(byte: number): void {\n if (byte < 0x20 && byte !== 0x0a && byte !== 0x09 && this.termios.c_lflag & ECHOCTL) {\n this.output(Uint8Array.of(0x5e, byte + 0x40), false);\n return;\n }\n this.output(Uint8Array.of(byte));\n }\n\n private output(bytes: Uint8Array, translate = true): void {\n const { c_oflag } = this.termios;\n if (!translate || !(c_oflag & OPOST && c_oflag & ONLCR) || !bytes.includes(0x0a)) {\n this.screen.write(bytes);\n return;\n }\n const out: number[] = [];\n for (const byte of bytes) {\n if (byte === 0x0a) out.push(0x0d);\n out.push(byte);\n }\n this.screen.write(Uint8Array.from(out));\n }\n\n get reading(): boolean {\n return this.readers > 0;\n }\n\n private async read(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n this.onRead?.();\n this.readers++;\n try {\n return await this.take(max, signal);\n } finally {\n this.readers--;\n }\n }\n\n private async take(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.readable.length === 0) {\n if (this.hungUp) return new Uint8Array(0);\n await this.changed(signal);\n }\n const head = this.readable[0];\n if (head === null) {\n this.readable.shift();\n return new Uint8Array(0);\n }\n if (head === undefined) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.readable.length > 0 && n < max) {\n const next = this.readable[0];\n if (next === null || next === undefined) break;\n const take = next.subarray(0, max - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.readable[0] = next.subarray(take.length);\n else this.readable.shift();\n if (this.canonical) break;\n }\n const out = new Uint8Array(n);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, type PollState } from './fd-table.ts';\nimport type { JobTable } from './jobs.ts';\nimport { KernelTty } from './tty.ts';\n\nexport type PtySignal = (tty: KernelTty, sig: number) => void;\n\nexport class PtyPair {\n readonly slave: KernelTty;\n\n locked = true;\n\n packet = false;\n private queue: Uint8Array[] = [];\n private waiters: Array<() => void> = [];\n private masterOpen = true;\n private slaveRefs = 0;\n private slaveSeen = false;\n\n readonly index: number;\n\n private readonly onFree: (pair: PtyPair) => void;\n\n constructor(\n index: number,\n\n signal: PtySignal,\n\n onFree: (pair: PtyPair) => void,\n\n onRead?: (tty: KernelTty) => void\n ) {\n this.index = index;\n\n this.onFree = onFree;\n this.slave = new KernelTty({ write: (bytes) => this.fromSlave(bytes) }, (sig) =>\n signal(this.slave, sig)\n );\n if (onRead) this.slave.onRead = () => onRead(this.slave);\n this.slave.name = `/dev/pts/${index}`;\n }\n\n master(): OpenFile {\n return new OpenFile({\n read: (max, signal) => this.readMaster(max, signal),\n write: async (bytes) => {\n this.slave.receive(bytes);\n return bytes.length;\n },\n poll: (): PollState => ({\n readable: this.queue.length > 0 || this.slaveGone,\n writable: true,\n hangup: this.slaveGone,\n }),\n changed: (signal) => this.changed(signal),\n close: () => this.closeMaster(),\n pty: this,\n });\n }\n\n openSlave(): OpenFile {\n if (!this.masterOpen || this.locked) throw new KernelError('EIO');\n const file = this.slave.file().file;\n this.slaveRefs += 1;\n this.slaveSeen = true;\n return new OpenFile({ ...file, close: () => this.closeSlave() });\n }\n\n private get slaveGone(): boolean {\n return this.slaveSeen && this.slaveRefs === 0;\n }\n\n private fromSlave(bytes: Uint8Array): void {\n if (!this.masterOpen) return;\n this.queue.push(bytes.slice());\n this.wake();\n }\n\n private async readMaster(max: number, signal?: AbortSignal): Promise<Uint8Array> {\n while (this.queue.length === 0) {\n if (this.slaveGone) throw new KernelError('EIO');\n await this.changed(signal);\n }\n\n const status = this.packet ? 1 : 0;\n const chunks: Uint8Array[] = [];\n let n = 0;\n while (this.queue.length > 0 && n < max - status) {\n const next = this.queue[0] as Uint8Array;\n const take = next.subarray(0, max - status - n);\n chunks.push(take);\n n += take.length;\n if (take.length < next.length) this.queue[0] = next.subarray(take.length);\n else this.queue.shift();\n }\n const out = new Uint8Array(status + n);\n let at = status;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n }\n\n private closeMaster(): void {\n this.masterOpen = false;\n this.queue = [];\n\n this.slave.hangup();\n this.slave.signalHangup();\n this.freeIfUnused();\n }\n\n private closeSlave(): void {\n this.slaveRefs -= 1;\n this.wake();\n this.freeIfUnused();\n }\n\n private freeIfUnused(): void {\n if (!this.masterOpen && this.slaveRefs === 0) this.onFree(this);\n }\n\n private changed(signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.reject(new KernelError('EINTR'));\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n this.waiters = this.waiters.filter((w) => w !== waiter);\n reject(new KernelError('EINTR'));\n };\n const waiter = (): void => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n };\n this.waiters.push(waiter);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n private wake(): void {\n const waiters = this.waiters;\n this.waiters = [];\n for (const resolve of waiters) resolve();\n }\n}\n\nexport class PtyTable {\n private readonly pairs = new Map<number, PtyPair>();\n\n private readonly signal: PtySignal;\n\n private readonly onRead: ((tty: KernelTty) => void) | undefined;\n\n constructor(signal: PtySignal, onRead?: (tty: KernelTty) => void) {\n this.signal = signal;\n this.onRead = onRead;\n }\n\n open(): { pair: PtyPair; master: OpenFile } {\n let index = 0;\n while (this.pairs.has(index)) index += 1;\n const pair = new PtyPair(index, this.signal, (p) => this.pairs.delete(p.index), this.onRead);\n this.pairs.set(index, pair);\n return { pair, master: pair.master() };\n }\n\n get(index: number): PtyPair {\n const pair = this.pairs.get(index);\n if (!pair) throw new KernelError('ENOENT');\n return pair;\n }\n\n numbers(): number[] {\n return [...this.pairs.keys()].sort((a, b) => a - b);\n }\n}\n\nexport function ptsNumber(path: string): number | undefined {\n const m = /^\\/dev\\/pts\\/(\\d+)$/.exec(path);\n return m ? Number(m[1]) : undefined;\n}\n\nexport type PtySyscall =\n | { op: 'pty-open' }\n | { op: 'pty-slave-open'; n: number; noctty: boolean }\n | { op: 'pty-number'; fd: number }\n | { op: 'pty-lock'; fd: number; lock: boolean }\n | { op: 'pty-ctty'; fd: number }\n | { op: 'pty-packet'; fd: number; on: boolean }\n | { op: 'pty-list' }\n | { op: 'pty-winsz-set'; fd: number; rows: number; cols: number };\n\nexport const PTY_OPS: readonly PtySyscall['op'][] = [\n 'pty-open',\n 'pty-slave-open',\n 'pty-number',\n 'pty-lock',\n 'pty-ctty',\n 'pty-packet',\n 'pty-list',\n 'pty-winsz-set',\n];\n\nexport interface PtyContext {\n pid: number;\n fds: FdTable;\n ptys?: PtyTable;\n jobs?: JobTable;\n}\n\nfunction masterOf(ctx: PtyContext, fd: number): PtyPair {\n const pair = ctx.fds.get(fd).file.pty;\n if (!pair) throw new KernelError('ENOTTY');\n return pair;\n}\n\nfunction terminalOf(ctx: PtyContext, fd: number): KernelTty {\n const file = ctx.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n}\n\nconst json = (value: unknown): SyncFsResult => ({ ok: true, kind: 'json', json: value });\nconst done: SyncFsResult = { ok: true, kind: 'void' };\n\nexport function ptySyscall(req: PtySyscall, ctx: PtyContext): SyncFsResult {\n switch (req.op) {\n case 'pty-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n return json(ctx.fds.install(ctx.ptys.open().master, 3));\n }\n case 'pty-slave-open': {\n if (!ctx.ptys) throw new KernelError('ENOENT');\n const pair = ctx.ptys.get(req.n);\n const fd = ctx.fds.install(pair.openSlave(), 3);\n\n if (!req.noctty) ctx.jobs?.acquireTerminal(ctx.pid, pair.slave);\n return json(fd);\n }\n case 'pty-number':\n return json(masterOf(ctx, req.fd).index);\n case 'pty-lock':\n masterOf(ctx, req.fd).locked = req.lock;\n return done;\n case 'pty-ctty': {\n const tty = terminalOf(ctx, req.fd);\n\n const leader = ctx.jobs?.getsid(ctx.pid, 0) === ctx.pid;\n if (leader && ctx.jobs?.controllingTerminal(ctx.pid) === tty) return done;\n if (!ctx.jobs?.acquireTerminal(ctx.pid, tty)) throw new KernelError('EPERM');\n return done;\n }\n case 'pty-list':\n return json(ctx.ptys?.numbers() ?? []);\n case 'pty-packet':\n masterOf(ctx, req.fd).packet = req.on;\n return done;\n case 'pty-winsz-set':\n terminalOf(ctx, req.fd).resize(req.cols, req.rows);\n return done;\n }\n}\n", "import { type FdTable, KernelError, pollFile } from './fd-table.ts';\n\nexport interface SelectResult {\n read: number[];\n write: number[];\n\n hangup?: number[];\n}\n\nfunction ready(fds: FdTable, read: readonly number[], write: readonly number[]): SelectResult {\n const hangup = new Set<number>();\n const pick = (list: readonly number[], dir: 'readable' | 'writable') =>\n list.filter((fd) => {\n const state = pollFile(fds.get(fd).file);\n if (state.hangup) hangup.add(fd);\n return state[dir] || state.hangup;\n });\n const out: SelectResult = { read: pick(read, 'readable'), write: pick(write, 'writable') };\n if (hangup.size > 0) out.hangup = [...hangup];\n return out;\n}\n\nfunction interruption(signal: AbortSignal): { promise: Promise<never>; done(): void } {\n const { promise, reject } = Promise.withResolvers<never>();\n const fail = (): void => reject(new KernelError('EINTR'));\n if (signal.aborted) fail();\n else signal.addEventListener('abort', fail, { once: true });\n return { promise, done: () => signal.removeEventListener('abort', fail) };\n}\n\nexport async function selectFds(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n timeoutMs: number,\n interrupt: AbortSignal\n): Promise<SelectResult> {\n const deadline = timeoutMs < 0 ? Number.POSITIVE_INFINITY : Date.now() + timeoutMs;\n const interrupted = interruption(interrupt);\n interrupted.promise.catch(() => {});\n try {\n return await waitReady(fds, read, write, deadline, interrupted.promise);\n } finally {\n interrupted.done();\n }\n}\n\nasync function waitReady(\n fds: FdTable,\n read: readonly number[],\n write: readonly number[],\n deadline: number,\n interrupted: Promise<never>\n): Promise<SelectResult> {\n for (;;) {\n const now = ready(fds, read, write);\n if (now.read.length > 0 || now.write.length > 0 || Date.now() >= deadline) return now;\n\n const round = new AbortController();\n const changes = [...new Set([...read, ...write])].flatMap((fd) => {\n const file = fds.get(fd).file;\n return file.changed === undefined ? [] : [file.changed(round.signal).catch(() => undefined)];\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const expiry =\n deadline === Number.POSITIVE_INFINITY\n ? []\n : [new Promise<void>((resolve) => (timer = setTimeout(resolve, deadline - Date.now())))];\n try {\n await Promise.race([...changes, ...expiry, interrupted]);\n } finally {\n round.abort();\n clearTimeout(timer);\n }\n }\n}\n", "import type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport { type FdTable, KernelError, OpenFile, pollFile } from './fd-table.ts';\nimport type { ResolveFamily } from './net/uplink.ts';\nimport { KernelSocket, type LoopbackNet, type SockAddr, type SocketDomain } from './socket.ts';\nexport type SocketSyscall =\n | {\n op: 'sock-open';\n domain: SocketDomain;\n }\n | {\n op: 'sock-pair';\n domain: SocketDomain;\n }\n | {\n op: 'sock-bind';\n fd: number;\n addr: SockAddr;\n }\n | {\n op: 'sock-listen';\n fd: number;\n backlog: number;\n }\n | {\n op: 'sock-accept';\n fd: number;\n nonblock: boolean;\n }\n | {\n op: 'sock-connect';\n fd: number;\n addr: SockAddr;\n nonblock: boolean;\n }\n | {\n op: 'sock-shutdown';\n fd: number;\n how: number;\n }\n | {\n op: 'sock-name';\n fd: number;\n peer: boolean;\n }\n | {\n op: 'sock-getopt';\n fd: number;\n level: number;\n name: number;\n }\n | {\n op: 'sock-setopt';\n fd: number;\n level: number;\n name: number;\n value: number;\n }\n | {\n op: 'sock-resolve';\n name: string;\n family: ResolveFamily;\n };\nexport const SOCKET_OPS: readonly SocketSyscall['op'][] = [\n 'sock-open',\n 'sock-pair',\n 'sock-bind',\n 'sock-listen',\n 'sock-accept',\n 'sock-connect',\n 'sock-shutdown',\n 'sock-name',\n 'sock-getopt',\n 'sock-setopt',\n 'sock-resolve',\n];\nexport interface SocketProcess {\n fds: FdTable;\n net: LoopbackNet;\n blocking(): AbortSignal;\n resolve(name: string, family: ResolveFamily, blocking: () => AbortSignal): Promise<string[]>;\n}\nfunction socketAt(fds: FdTable, fd: number): KernelSocket {\n const file = fds.get(fd).file;\n if (!(file instanceof KernelSocket)) throw new KernelError('ENOTSOCK');\n return file;\n}\nconst ok = (json?: unknown): SyncFsResult =>\n json === undefined ? { ok: true, kind: 'void' } : { ok: true, kind: 'json', json };\nexport async function socketSyscall(\n req: SocketSyscall,\n proc: SocketProcess\n): Promise<SyncFsResult> {\n const { fds, net } = proc;\n switch (req.op) {\n case 'sock-open':\n return ok(fds.install(new OpenFile(net.socket(req.domain)), 3));\n case 'sock-pair': {\n const [a, b] = KernelSocket.pair(net, req.domain);\n const first = fds.install(new OpenFile(a), 3);\n try {\n return ok([first, fds.install(new OpenFile(b), 3)]);\n } catch (e) {\n await Promise.resolve(fds.close(first));\n throw e;\n }\n }\n case 'sock-bind':\n socketAt(fds, req.fd).bind(req.addr);\n return ok();\n case 'sock-listen':\n socketAt(fds, req.fd).listen(req.backlog);\n return ok();\n case 'sock-accept':\n return ok(await accept(proc, req.fd, req.nonblock));\n case 'sock-connect': {\n const dialing = socketAt(fds, req.fd).connect(req.addr);\n if (req.nonblock) {\n dialing?.catch(() => undefined);\n throw new KernelError('EINPROGRESS');\n }\n if (dialing !== undefined) await interruptible(dialing, proc.blocking());\n return ok();\n }\n case 'sock-shutdown':\n socketAt(fds, req.fd).shutdown(req.how);\n return ok();\n case 'sock-name': {\n const socket = socketAt(fds, req.fd);\n const addr = req.peer ? socket.peer : socket.local;\n if (req.peer && !addr) throw new KernelError('ENOTCONN');\n return ok(addr ?? unnamed(socket.domain));\n }\n case 'sock-getopt':\n return ok(socketAt(fds, req.fd).getOption(req.level, req.name));\n case 'sock-setopt':\n socketAt(fds, req.fd).setOption(req.level, req.name, req.value);\n return ok();\n case 'sock-resolve': {\n const addresses = await proc.resolve(req.name, req.family, () => proc.blocking());\n if (addresses.length === 0) throw new KernelError('ENOENT');\n return ok(addresses);\n }\n }\n}\nfunction interruptible(dialing: Promise<void>, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const abort = () => reject(new KernelError('EINTR'));\n signal.addEventListener('abort', abort, { once: true });\n dialing.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));\n });\n}\nfunction unnamed(domain: SocketDomain): SockAddr {\n return domain === 'inet'\n ? { family: 'inet', host: '0.0.0.0', port: 0 }\n : { family: 'unix', path: '' };\n}\nasync function accept(\n proc: SocketProcess,\n fd: number,\n nonblock: boolean\n): Promise<{\n fd: number;\n peer: SockAddr | undefined;\n}> {\n const listener = socketAt(proc.fds, fd);\n const waits = !nonblock && !pollFile(listener).readable;\n const socket = await listener.accept(waits ? proc.blocking() : undefined, nonblock);\n return { fd: proc.fds.install(new OpenFile(socket), 3), peer: socket.peer };\n}\n", "export const PAGE = 64 * 1024;\nexport const READAHEAD = 1024 * 1024;\nexport const CLEAN_LIMIT = 4 * 1024 * 1024;\nexport const WRITEBACK = 8 * 1024 * 1024;\nexport const RUN = 1024 * 1024;\n\nexport interface Run {\n offset: number;\n bytes: Uint8Array;\n}\n\nexport interface FlushPlan {\n shrink?: number;\n runs: Run[];\n extend?: number;\n}\n\nexport class Pages {\n length: number;\n private stored: number;\n private shrink: number | undefined;\n private readonly pages = new Map<number, Uint8Array>();\n private readonly dirty = new Set<number>();\n private readonly free: Uint8Array[] = [];\n private pinned = false;\n\n constructor(size: number) {\n this.length = size;\n this.stored = size;\n }\n\n get dirtyBytes(): number {\n return this.dirty.size * PAGE;\n }\n\n get changed(): boolean {\n return this.dirty.size > 0 || this.shrink !== undefined || this.length !== this.stored;\n }\n\n missing(at: number, length: number): Array<[number, number]> {\n this.evict();\n const end = Math.min(this.stored, at + length, this.length);\n const runs: Array<[number, number]> = [];\n for (let page = Math.floor(at / PAGE); page * PAGE < end; page++) {\n if (this.pages.has(page)) continue;\n const last = runs[runs.length - 1];\n if (last && last[0] + last[1] === page * PAGE) last[1] += PAGE;\n else runs.push([page * PAGE, PAGE]);\n }\n const last = runs[runs.length - 1];\n if (last) last[1] = Math.max(last[1], Math.min(READAHEAD, this.stored - last[0]));\n return runs.map(([start, n]) => [start, Math.min(n, this.stored - start)]);\n }\n\n partial(at: number, length: number): Array<[number, number]> {\n if (length === 0) return [];\n this.evict();\n const edges = new Set([Math.floor(at / PAGE), Math.floor((at + length - 1) / PAGE)]);\n const runs: Array<[number, number]> = [];\n for (const page of edges) {\n const start = page * PAGE;\n const covered = at <= start && at + length >= start + PAGE;\n if (covered || this.pages.has(page) || start >= this.stored) continue;\n runs.push([start, Math.min(PAGE, this.stored - start)]);\n }\n return runs;\n }\n\n fill(start: number, bytes: Uint8Array): void {\n for (let at = 0; at < bytes.length; at += PAGE) {\n const page = (start + at) / PAGE;\n if (this.pages.has(page)) continue;\n const part = bytes.subarray(at, Math.min(at + PAGE, bytes.length));\n const fresh = this.take(part.length);\n fresh.set(part);\n this.pages.set(page, fresh);\n }\n }\n\n read(at: number, length: number): Uint8Array {\n const out = new Uint8Array(Math.max(0, Math.min(this.length, at + length) - at));\n this.readInto(at, out);\n return out;\n }\n\n readInto(at: number, out: Uint8Array): number {\n const end = Math.min(this.length, at + out.length);\n for (let pos = at; pos < end; ) {\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, end - pos);\n const bytes = this.pages.get(page);\n if (bytes) out.set(bytes.subarray(from, from + n), pos - at);\n else out.fill(0, pos - at, pos - at + n);\n pos += n;\n }\n return Math.max(0, end - at);\n }\n\n write(at: number, bytes: Uint8Array): void {\n for (let done = 0; done < bytes.length; ) {\n const pos = at + done;\n const page = Math.floor(pos / PAGE);\n const from = pos - page * PAGE;\n const n = Math.min(PAGE - from, bytes.length - done);\n let target = this.pages.get(page);\n if (!target) {\n target = this.take(0);\n this.pages.set(page, target);\n }\n target.set(bytes.subarray(done, done + n), from);\n this.dirty.add(page);\n done += n;\n }\n this.length = Math.max(this.length, at + bytes.length);\n }\n\n truncate(size: number): void {\n if (size < this.stored) {\n this.stored = size;\n this.shrink = Math.min(this.shrink ?? size, size);\n }\n if (size < this.length) {\n const edge = Math.floor(size / PAGE);\n for (const page of [...this.pages.keys()]) {\n if (page > edge || (page === edge && size === edge * PAGE)) this.drop(page);\n }\n this.pages.get(edge)?.fill(0, size - edge * PAGE);\n }\n this.length = size;\n }\n\n plan(): FlushPlan {\n const runs: Run[] = [];\n const sorted = [...this.dirty].sort((a, b) => a - b);\n for (let i = 0; i < sorted.length; ) {\n let j = i + 1;\n const first = sorted[i] as number;\n while (\n j < sorted.length &&\n sorted[j] === first + (j - i) &&\n ((sorted[j] as number) * PAGE) % RUN !== 0\n ) {\n j++;\n }\n const start = first * PAGE;\n const end = Math.min(this.length, (first + (j - i)) * PAGE);\n const bytes = new Uint8Array(end - start);\n for (let k = i; k < j; k++) {\n const page = this.pages.get(sorted[k] as number) as Uint8Array;\n bytes.set(page.subarray(0, Math.min(PAGE, end - (k - i) * PAGE - start)), (k - i) * PAGE);\n }\n runs.push({ offset: start, bytes });\n i = j;\n }\n const written = Math.max(this.stored, ...runs.map((r) => r.offset + r.bytes.length));\n return {\n ...(this.shrink !== undefined ? { shrink: this.shrink } : {}),\n runs,\n ...(this.length > written ? { extend: this.length } : {}),\n };\n }\n\n flushed(): void {\n this.dirty.clear();\n this.shrink = undefined;\n this.stored = this.length;\n this.evict();\n }\n\n pin(): void {\n this.pinned = true;\n }\n\n reset(size: number): void {\n if (this.pinned) return;\n for (const page of [...this.pages.keys()]) if (!this.dirty.has(page)) this.drop(page);\n if (this.changed) return;\n this.length = size;\n this.stored = size;\n }\n\n private evict(): void {\n if (this.pinned) return;\n let clean = (this.pages.size - this.dirty.size) * PAGE;\n for (const page of this.pages.keys()) {\n if (clean <= CLEAN_LIMIT) return;\n if (this.dirty.has(page)) continue;\n this.drop(page);\n clean -= PAGE;\n }\n }\n\n private take(used: number): Uint8Array {\n const page = this.free.pop();\n if (!page) return new Uint8Array(PAGE);\n page.fill(0, used);\n return page;\n }\n\n private drop(page: number): void {\n const bytes = this.pages.get(page) as Uint8Array;\n this.pages.delete(page);\n this.dirty.delete(page);\n if (this.free.length < CLEAN_LIMIT / PAGE) this.free.push(bytes);\n }\n}\n", "import { Pages, WRITEBACK } from './pages.ts';\n\nexport interface RangedIo {\n pread(path: string, offset: number, length: number, version?: string): Uint8Array;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): void;\n truncate(path: string, size: number): void;\n}\n\nexport interface AsyncRangedIo {\n pread(path: string, offset: number, length: number, version?: string): Promise<Uint8Array>;\n pwrite(path: string, offset: number, bytes: Uint8Array, transfer?: boolean): Promise<void>;\n truncate(path: string, size: number): Promise<void>;\n}\n\nexport class RangedFile {\n private readonly pages: Pages;\n private readonly io: RangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: RangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n get changed(): boolean {\n return this.pages.changed;\n }\n\n get pinnedVersion(): string | undefined {\n return this.version;\n }\n\n forget(): void {\n this.pages.reset(this.pages.length);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private fetch(runs: Array<[number, number]>): void {\n for (const [start, n] of runs) {\n this.pages.fill(start, this.io.pread(this.path, start, n, this.version));\n }\n }\n\n read(at: number, length: number): Uint8Array {\n this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n readInto(at: number, out: Uint8Array): number {\n this.fetch(this.pages.missing(at, out.length));\n return this.pages.readInto(at, out);\n }\n\n write(at: number, bytes: Uint8Array): void {\n this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n flush(): void {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n pin(): void {\n this.pinned = true;\n this.pages.pin();\n this.fetch(this.pages.missing(0, this.pages.length));\n }\n\n reset(size: number): void {\n this.pages.reset(size);\n }\n}\n\nexport class AsyncRangedFile {\n private readonly pages: Pages;\n private readonly io: AsyncRangedIo;\n private pinned = false;\n private version: string | undefined;\n path: string;\n\n constructor(io: AsyncRangedIo, path: string, size: number, version?: string) {\n this.io = io;\n this.path = path;\n this.version = version;\n this.pages = new Pages(size);\n }\n\n size(): number {\n return this.pages.length;\n }\n\n private async fetch(runs: Array<[number, number]>): Promise<void> {\n for (const [start, n] of runs) {\n this.pages.fill(start, await this.io.pread(this.path, start, n, this.version));\n }\n }\n\n async read(at: number, length: number): Promise<Uint8Array> {\n await this.fetch(this.pages.missing(at, length));\n return this.pages.read(at, length);\n }\n\n async write(at: number, bytes: Uint8Array): Promise<void> {\n await this.fetch(this.pages.partial(at, bytes.length));\n this.pages.write(at, bytes);\n if (!this.pinned && this.pages.dirtyBytes >= WRITEBACK) await this.flush();\n }\n\n truncate(size: number): void {\n this.pages.truncate(size);\n }\n\n async flush(): Promise<void> {\n if (this.pinned || !this.pages.changed) return;\n const plan = this.pages.plan();\n if (plan.shrink !== undefined) await this.io.truncate(this.path, plan.shrink);\n for (const run of plan.runs) await this.io.pwrite(this.path, run.offset, run.bytes, true);\n if (plan.extend !== undefined) await this.io.truncate(this.path, plan.extend);\n this.version = undefined;\n this.pages.flushed();\n }\n\n async pin(): Promise<void> {\n this.pinned = true;\n this.pages.pin();\n await this.fetch(this.pages.missing(0, this.pages.length));\n }\n}\n", "import { AsyncRangedFile, type AsyncRangedIo } from '../fs/ranged.ts';\nimport { fsError, type KernelFs, rangedOps } from '../fs/types.ts';\nimport type { KeptFile, UnlinkHolder } from '../fs/unlinked.ts';\nimport { KernelError, OpenFile } from './fd-table.ts';\n\nexport interface VfsFileFs extends Partial<AsyncRangedIo> {\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: Uint8Array): Promise<void>;\n stat?(path: string): Promise<{\n readonly?: boolean;\n maxFile?: number;\n size?: number;\n ranged?: boolean;\n version?: string;\n }>;\n readlink?(path: string): Promise<string>;\n lstat?(path: string): Promise<unknown>;\n realpath?(path: string, follow: boolean): Promise<string>;\n}\n\nconst O_ACCMODE = 0o3;\nconst O_WRONLY = 0o1;\nconst O_RDWR = 0o2;\nconst O_APPEND = 0o2000;\n\nconst SEEK_SET = 0;\nconst SEEK_CUR = 1;\nconst SEEK_END = 2;\n\nexport interface VfsFileOptions {\n path: string;\n\n flags: number;\n\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n dirty?: boolean;\n\n pin?: VersionPin;\n\n truncate?: boolean;\n\n create?: boolean;\n}\n\nexport interface VersionPin {\n version: string;\n size: number;\n}\n\nexport const WRITEBACK_MS = 250;\n\nconst WRITEBACK_COST_FACTOR = 10;\n\nfunction isMissing(err: unknown): boolean {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return true;\n return err instanceof Error && err.message.startsWith('ENOENT');\n}\n\nfunction within(path: string, root: string): boolean {\n return path === root || path.startsWith(root.endsWith('/') ? root : `${root}/`);\n}\n\nexport class VfsNode {\n private data: Uint8Array | undefined;\n private ranged: AsyncRangedFile | undefined;\n private readonly pin: VersionPin | undefined;\n private length = 0;\n private dirty = false;\n private queue: Promise<unknown> = Promise.resolve();\n\n private writeBack: ReturnType<typeof setTimeout> | undefined;\n\n private writeBackCost = 0;\n\n opens = 0;\n\n writers = 0;\n\n private missing = false;\n\n private revoked = false;\n\n private readonly fs: VfsFileFs;\n\n path: string;\n\n orphaned: boolean;\n\n constructor(\n fs: VfsFileFs,\n\n path: string,\n\n contents?: Uint8Array,\n\n orphaned: boolean = false,\n\n dirty = false,\n\n pin?: VersionPin\n ) {\n this.fs = fs;\n this.pin = pin;\n\n this.path = path;\n\n this.orphaned = orphaned;\n if (contents !== undefined) this.data = new Uint8Array(contents);\n else if (orphaned) this.data = new Uint8Array(0);\n this.length = this.data?.length ?? 0;\n if (dirty && contents !== undefined) this.markDirty();\n }\n\n serial<T>(op: () => Promise<T>): Promise<T> {\n const next = this.queue.then(op);\n this.queue = next.catch(() => undefined);\n return next;\n }\n\n revoke(): void {\n this.revoked = true;\n clearTimeout(this.writeBack);\n this.writeBack = undefined;\n this.data = undefined;\n this.ranged = undefined;\n }\n\n private async prepare(): Promise<AsyncRangedFile | undefined> {\n if (this.revoked) throw new KernelError('EIO');\n if (this.ranged || this.data) return this.ranged;\n const io = rangedOps(this.fs);\n if (io && this.pin && !this.orphaned) {\n this.ranged = new AsyncRangedFile(io, this.path, this.pin.size, this.pin.version);\n return this.ranged;\n }\n const st =\n io && !this.orphaned ? await this.fs.stat?.(this.path).catch(() => undefined) : undefined;\n if (io && st?.ranged) {\n this.ranged = new AsyncRangedFile(io, this.path, st.size ?? 0, st.version);\n return this.ranged;\n }\n await this.load();\n return undefined;\n }\n\n async keep(): Promise<void> {\n const ranged = await this.prepare();\n await ranged?.pin();\n }\n\n async load(): Promise<Uint8Array> {\n if (this.revoked) throw new KernelError('EIO');\n if (!this.data) {\n try {\n this.data = await this.fs.readFileBuffer(this.path);\n } catch (err) {\n if (!isMissing(err)) throw err;\n this.data = new Uint8Array(0);\n this.missing = true;\n }\n this.length = this.data.length;\n }\n return this.data;\n }\n\n holds(): boolean {\n return this.dirty;\n }\n\n replace(contents: Uint8Array): void {\n this.ranged = undefined;\n this.data = new Uint8Array(contents);\n this.length = this.data.length;\n this.missing = false;\n this.markDirty();\n }\n\n async materialize(): Promise<void> {\n if (await this.prepare()) return;\n if (!this.missing || this.orphaned) return;\n this.missing = false;\n await this.fs.writeFile(this.path, this.data?.slice(0, this.length) ?? new Uint8Array(0));\n if (!this.dirty) this.data = undefined;\n }\n\n async size(): Promise<number> {\n const ranged = await this.prepare();\n return ranged ? ranged.size() : this.length;\n }\n\n async pread(max: number, at: number): Promise<Uint8Array> {\n const ranged = await this.prepare();\n if (ranged) return ranged.read(at, max);\n const bytes = await this.load();\n const n = Math.max(0, Math.min(max, this.length - at));\n return bytes.slice(at, at + n);\n }\n\n private cap: Promise<number | undefined> | undefined;\n\n limit(): Promise<number | undefined> {\n if (this.cap !== undefined) return this.cap;\n const stat = this.fs.stat?.bind(this.fs);\n if (!stat || this.orphaned) return Promise.resolve(undefined);\n const parent = this.path.slice(0, this.path.lastIndexOf('/')) || '/';\n this.cap ??= stat(this.path)\n .catch(() => stat(parent))\n .then(\n (st) => st.maxFile,\n () => undefined\n );\n return this.cap;\n }\n\n private async fits(end: number): Promise<void> {\n const max = await this.limit();\n if (max !== undefined && end > max) throw new KernelError('EFBIG');\n }\n\n renamedTo(path: string): void {\n this.path = path;\n if (this.ranged) this.ranged.path = path;\n this.cap = undefined;\n }\n\n async pwrite(bytes: Uint8Array, at: number): Promise<number> {\n if (bytes.length === 0) return 0;\n await this.fits(at + bytes.length);\n const ranged = await this.prepare();\n if (ranged) {\n await ranged.write(at, bytes);\n this.markDirty();\n return bytes.length;\n }\n const buf = this.ensure(at + bytes.length);\n if (at > this.length) buf.fill(0, this.length, at);\n buf.set(bytes, at);\n this.length = Math.max(this.length, at + bytes.length);\n this.markDirty();\n return bytes.length;\n }\n\n async truncate(size: number): Promise<void> {\n await this.fits(size);\n const ranged = await this.prepare();\n if (ranged) {\n ranged.truncate(size);\n this.markDirty();\n return;\n }\n const buf = this.ensure(size);\n if (size > this.length) buf.fill(0, this.length, size);\n this.length = size;\n this.markDirty();\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.writeBack !== undefined || this.orphaned) return;\n const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);\n this.writeBack = setTimeout(() => {\n this.writeBack = undefined;\n this.serial(() => this.flush()).catch(() => undefined);\n }, delay);\n }\n\n private ensure(need: number): Uint8Array {\n const cur = this.data ?? new Uint8Array(0);\n if (cur.length >= need) return cur;\n const grown = new Uint8Array(Math.max(need, cur.length * 2, 256));\n grown.set(cur.subarray(0, this.length));\n this.data = grown;\n return grown;\n }\n\n async flush(): Promise<void> {\n if (this.revoked && this.dirty) throw new KernelError('EIO');\n if (!this.dirty || this.orphaned || !(this.data || this.ranged)) return;\n this.dirty = false;\n const started = performance.now();\n try {\n if (this.ranged) await this.ranged.flush();\n else await this.fs.writeFile(this.path, (this.data as Uint8Array).slice(0, this.length));\n } catch (err) {\n this.dirty = true;\n throw err;\n }\n this.writeBackCost = performance.now() - started;\n }\n}\n\nexport class VfsNodes implements UnlinkHolder {\n private readonly byPath = new Map<string, VfsNode>();\n\n private readonly kept = new Map<VfsNode, KeptFile>();\n\n keepsOnDisk = false;\n\n private readonly fs: VfsFileFs;\n\n private readonly entries = new Map<string, Promise<unknown>>();\n\n private readonly onClosed: ((path: string) => void) | undefined;\n\n constructor(fs: VfsFileFs, onClosed?: (path: string) => void) {\n this.fs = fs;\n this.onClosed = onClosed;\n }\n\n async onEntry<T>(path: string, op: () => Promise<T>): Promise<T> {\n const key = await this.entryKey(path);\n const run = (this.entries.get(key) ?? Promise.resolve()).then(op);\n const tail = run.catch(() => undefined);\n this.entries.set(key, tail);\n void tail.then(() => {\n if (this.entries.get(key) === tail) this.entries.delete(key);\n });\n return run;\n }\n\n async entryKey(path: string): Promise<string> {\n const parent = parentOf(path);\n const dir = await this.real(parent, true, () => realDir(this.fs, parent));\n return joinName(dir, path.slice(path.lastIndexOf('/') + 1));\n }\n\n targetKey(path: string): Promise<string> {\n return this.real(path, true, () => realTarget(this.fs, path));\n }\n\n private async real(path: string, follow: boolean, walk: () => Promise<string>): Promise<string> {\n if (this.fs.realpath) {\n try {\n return await this.fs.realpath(path, follow);\n } catch (err) {\n if (errCode(err) === 'ELOOP') throw err;\n }\n }\n return walk();\n }\n\n createExclusive(path: string): Promise<void> {\n return this.onEntry(path, async () => {\n const node = this.byPath.get(path);\n const held = node ? await node.serial(async () => node.holds()) : false;\n if (held || (await present(this.fs, path))) throw fsError('EEXIST', path);\n await this.fs.writeFile(path, new Uint8Array(0));\n });\n }\n\n open(path: string, pin?: VersionPin, writable = false): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, undefined, false, false, pin);\n this.byPath.set(path, node);\n }\n node.opens++;\n if (writable) node.writers++;\n return node;\n }\n\n adopt(path: string, contents: Uint8Array, dirty: boolean, writable = false): VfsNode {\n let node = this.byPath.get(path);\n if (!node) {\n node = new VfsNode(this.fs, path, contents, false, dirty);\n this.byPath.set(path, node);\n } else if (dirty) {\n node.replace(contents);\n }\n node.opens++;\n if (writable) node.writers++;\n return node;\n }\n\n holds(prefix: string): boolean {\n for (const path of this.byPath.keys()) if (within(path, prefix)) return true;\n return false;\n }\n\n writes(prefix: string): boolean {\n for (const [path, node] of this.byPath)\n if (node.writers > 0 && within(path, prefix)) return true;\n return false;\n }\n\n closed(node: VfsNode, writable = false): void {\n node.opens--;\n if (writable) node.writers--;\n if (node.opens > 0) {\n if (writable && node.writers === 0) this.onClosed?.(node.path);\n return;\n }\n if (this.byPath.get(node.path) === node) this.byPath.delete(node.path);\n this.kept.get(node)?.release();\n this.kept.delete(node);\n this.onClosed?.(node.path);\n }\n\n held(): Iterable<string> {\n return this.byPath.keys();\n }\n\n owns(): boolean {\n return false;\n }\n\n isKept(): boolean {\n return false;\n }\n\n keep(path: string, file: KeptFile): void {\n const node = this.byPath.get(path);\n if (!node) {\n file.release();\n return;\n }\n this.byPath.delete(path);\n node.renamedTo(file.hidden);\n this.byPath.set(file.hidden, node);\n this.kept.set(node, file);\n }\n\n unkeep(path: string, file: KeptFile): void {\n const node = this.byPath.get(file.hidden);\n if (!node) return;\n this.byPath.delete(file.hidden);\n node.renamedTo(path);\n this.byPath.set(path, node);\n this.kept.delete(node);\n }\n\n async flush(path: string): Promise<void> {\n for (const [p, node] of this.byPath) if (within(p, path)) await node.serial(() => node.flush());\n }\n\n async unlinking(path: string): Promise<void> {\n for (const [held, node] of [...this.byPath]) {\n if (!within(held, path)) continue;\n await node.serial(async () => {\n await Promise.all([this.keepsOnDisk || node.keep(), node.limit()]);\n });\n }\n }\n\n revoke(prefix: string): void {\n for (const [path, node] of this.byPath) {\n if (!within(path, prefix)) continue;\n node.revoke();\n this.byPath.delete(path);\n }\n }\n\n unlinked(path: string): void {\n for (const [held, node] of [...this.byPath]) {\n if (!within(held, path)) continue;\n node.orphaned = true;\n this.byPath.delete(held);\n }\n }\n\n renamed(from: string, to: string): void {\n if (from === to) return;\n const moved: VfsNode[] = [];\n for (const [p, node] of this.byPath) {\n if (within(p, from)) moved.push(node);\n else if (within(p, to)) {\n node.orphaned = true;\n this.byPath.delete(p);\n }\n }\n for (const node of moved) {\n this.byPath.delete(node.path);\n node.renamedTo(to + node.path.slice(from.length));\n this.byPath.set(node.path, node);\n }\n }\n}\n\nexport async function present(fs: VfsFileFs, path: string, follow = false): Promise<boolean> {\n const look = (follow ? undefined : fs.lstat) ?? fs.stat;\n try {\n await (look ? look.call(fs, path) : fs.readFileBuffer(path));\n return true;\n } catch (err) {\n if ((err as { code?: unknown } | null)?.code === 'ENOENT') return false;\n throw err;\n }\n}\n\nconst MAX_LINKS = 40;\n\nfunction parentOf(path: string): string {\n return path.slice(0, path.lastIndexOf('/')) || '/';\n}\n\nasync function linkOf(fs: VfsFileFs, path: string): Promise<string | undefined> {\n return fs.readlink?.(path).catch(() => undefined);\n}\n\ninterface Budget {\n hops: number;\n}\n\nasync function realDir(fs: VfsFileFs, dir: string, budget: Budget = { hops: 0 }): Promise<string> {\n const queue = dir.split('/').filter(Boolean);\n let at = '/';\n while (queue.length > 0) {\n const part = queue.shift() as string;\n if (part === '.') continue;\n if (part === '..') {\n at = parentOf(at);\n continue;\n }\n const next = at === '/' ? `/${part}` : `${at}/${part}`;\n const link = await linkOf(fs, next);\n if (link === undefined) {\n at = next;\n continue;\n }\n if (budget.hops >= MAX_LINKS) throw fsError('ELOOP', dir);\n budget.hops++;\n queue.unshift(...link.split('/').filter(Boolean));\n if (link.startsWith('/')) at = '/';\n }\n return at;\n}\n\nfunction errCode(err: unknown): unknown {\n return (err as { code?: unknown } | null)?.code;\n}\n\nfunction joinName(dir: string, name: string): string {\n return dir === '/' ? `/${name}` : `${dir}/${name}`;\n}\n\nasync function realTarget(fs: VfsFileFs, path: string): Promise<string> {\n const budget: Budget = { hops: 0 };\n let dir = await realDir(fs, parentOf(path), budget);\n let name = path.slice(path.lastIndexOf('/') + 1);\n for (;;) {\n const link = await linkOf(fs, joinName(dir, name));\n if (link === undefined) break;\n if (budget.hops >= MAX_LINKS) throw fsError('ELOOP', path);\n budget.hops++;\n const target = link.startsWith('/') ? link : joinName(dir, link);\n dir = await realDir(fs, parentOf(target), budget);\n name = target.slice(target.lastIndexOf('/') + 1);\n }\n return joinName(dir, name);\n}\n\nasync function targetDir(fs: VfsFileFs, path: string): Promise<string> {\n return parentOf(await realTarget(fs, path).catch(() => path));\n}\n\nexport async function refuseReadonly(\n fs: VfsFileFs,\n path: string,\n flags: number,\n opts: { create?: boolean; truncate?: boolean } = {}\n): Promise<void> {\n const writes = (flags & O_ACCMODE) !== 0 || opts.truncate === true;\n if ((!writes && !opts.create) || !fs.stat) return;\n const stat = (p: string) =>\n fs.stat?.(p).catch((err: unknown) => {\n const code = (err as { code?: unknown } | null)?.code;\n if (isMissing(err) || typeof code !== 'string') return undefined;\n throw err;\n });\n const own = await stat(path);\n if (own && !writes) return;\n const st = own ?? (await stat(await targetDir(fs, path)));\n if (st?.readonly) throw new KernelError('EROFS');\n}\n\nexport function keepingOpen(fs: KernelFs, nodes: VfsNodes): KernelFs {\n return {\n ...fs,\n async rm(path, options) {\n const at = await nodes.entryKey(fs.resolvePath('/', path));\n await nodes.unlinking(at);\n await fs.rm(path, options);\n nodes.unlinked(at);\n },\n async rename(from, to) {\n const a = await nodes.entryKey(fs.resolvePath('/', from));\n const b = await nodes.entryKey(fs.resolvePath('/', to));\n return nodes.onEntry(b, async () => {\n await nodes.unlinking(b);\n await fs.rename(from, to);\n nodes.renamed(a, b);\n });\n },\n writeFile: (path, content) =>\n nodes.onEntry(fs.resolvePath('/', path), () => fs.writeFile(path, content)),\n createExclusive: async (path) =>\n nodes.createExclusive(await nodes.entryKey(fs.resolvePath('/', path))),\n symlink: (target, path) =>\n nodes.onEntry(fs.resolvePath('/', path), () => fs.symlink(target, path)),\n mkdir: (path, options) =>\n nodes.onEntry(fs.resolvePath('/', path), () => fs.mkdir(path, options)),\n };\n}\n\nexport function vfsFile(fs: VfsFileFs, opts: VfsFileOptions, nodes?: VfsNodes): OpenFile {\n const access = opts.flags & O_ACCMODE;\n const readable = access !== O_WRONLY;\n const writable = access === O_WRONLY || access === O_RDWR;\n\n const node =\n !nodes || opts.orphan\n ? new VfsNode(fs, opts.path, opts.contents, opts.orphan === true, opts.dirty === true)\n : opts.contents !== undefined\n ? nodes.adopt(opts.path, opts.contents, opts.dirty === true, writable)\n : nodes.open(opts.path, opts.pin, writable);\n\n let openError: { err: unknown } | undefined;\n const atOpen = (op: () => Promise<void>): void => {\n void node.serial(op).catch((err: unknown) => {\n openError ??= { err };\n });\n };\n if (opts.create) atOpen(() => node.materialize());\n if (opts.truncate) atOpen(() => node.truncate(0));\n const takeOpenError = (): void => {\n if (!openError) return;\n const { err } = openError;\n openError = undefined;\n throw err;\n };\n let offset = opts.position;\n const serial = <T>(op: () => Promise<T>) =>\n node.serial(() => {\n takeOpenError();\n return op();\n });\n\n return new OpenFile({\n read: readable\n ? (max) =>\n serial(async () => {\n const out = await node.pread(max, offset);\n offset += out.length;\n return out;\n })\n : undefined,\n write: writable\n ? (bytes) =>\n serial(async () => {\n if (opts.flags & O_APPEND) offset = await node.size();\n offset += await node.pwrite(bytes, offset);\n return bytes.length;\n })\n : undefined,\n seek: (to, whence) =>\n serial(async () => {\n let base = 0;\n if (whence === SEEK_CUR) base = offset;\n else if (whence === SEEK_END) base = await node.size();\n else if (whence !== SEEK_SET) throw new KernelError('EINVAL');\n if (base + to < 0) throw new KernelError('EINVAL');\n offset = base + to;\n return offset;\n }),\n pread: (max, at) =>\n serial(() => {\n if (!readable) throw new KernelError('EBADF');\n return node.pread(max, at);\n }),\n pwrite: (bytes, at) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.pwrite(bytes, at);\n }),\n resize: (size) =>\n serial(() => {\n if (!writable) throw new KernelError('EBADF');\n return node.truncate(size);\n }),\n stat: () =>\n serial(async () => ({\n path: node.path,\n size: await node.size(),\n ...(node.orphaned ? { orphan: true as const } : {}),\n })),\n flush: () => serial(() => node.flush()),\n\n close: () =>\n node.serial(async () => {\n try {\n takeOpenError();\n await node.flush();\n } finally {\n nodes?.closed(node, writable);\n }\n }),\n });\n}\n", "import type { MountCall } from '../mount/syscall.ts';\nimport type { LinkRecord } from '../process/wasi/wasix-linker.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n type ChildForker,\n type ChildSpawner,\n type ChildStdio,\n ChildTable,\n type InheritedSlot,\n SpawnError,\n} from './children.ts';\nimport {\n type FdTable,\n type HeldMeta,\n heldFile,\n KernelError,\n type KernelFdKind,\n kernelFdKind,\n type OpenFile,\n openPipe,\n pollFile,\n} from './fd-table.ts';\nimport { AsyncOps, HOST_OPS, type HostSyscall, hostSyscall, type LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport { HTTP_OPS, type HttpHandles, type HttpSyscall } from './net/http-syscalls.ts';\nimport { NO_TRANSPORT } from './net/network.ts';\nimport { Resolver } from './net/resolver.ts';\nimport { Routes } from './net/routes.ts';\nimport type { MountLine, ProcessListing } from './proc-info.ts';\nimport type { ForkState } from './protocol.ts';\nimport { PTY_OPS, type PtySyscall, type PtyTable, ptySyscall } from './pty.ts';\nimport { selectFds } from './select.ts';\nimport { type DefaultAction, defaultAction, isSignal, SIG, sigbit } from './signals.ts';\nimport { KernelSocket, LoopbackNet } from './socket.ts';\nimport { SOCKET_OPS, type SocketSyscall, socketSyscall } from './socket-syscalls.ts';\nimport type { KernelTty, Termios } from './tty.ts';\nimport {\n present,\n refuseReadonly,\n type VersionPin,\n type VfsFileFs,\n VfsNodes,\n vfsFile,\n} from './vfs-file.ts';\n\nfunction aborted(signal: AbortSignal): Promise<never> {\n return new Promise<never>((_, reject) => {\n signal.addEventListener('abort', () => reject(new KernelError('EINTR')), { once: true });\n });\n}\n\nexport type WasmSyscall =\n | {\n op: 'fd-read';\n fd: number;\n max: number;\n\n nonblock?: boolean;\n\n peek?: boolean;\n }\n | { op: 'fd-write'; fd: number; body: Uint8Array; nonblock?: boolean }\n | { op: 'fd-close'; fd: number }\n | { op: 'fd-pipe' }\n | { op: 'fd-poll'; fd: number }\n | {\n op: 'fd-open-vfs';\n path: string;\n flags: number;\n position: number;\n\n contents?: Uint8Array;\n\n orphan?: boolean;\n\n truncate?: boolean;\n\n create?: boolean;\n\n exclusive?: boolean;\n\n existing?: boolean;\n\n pin?: VersionPin;\n }\n | { op: 'fd-pread'; fd: number; offset: number; max: number }\n | { op: 'fd-pwrite'; fd: number; offset: number; body: Uint8Array }\n | { op: 'fd-resize'; fd: number; size: number }\n | { op: 'fd-vfs-stat'; fd: number }\n | { op: 'fd-path-flush'; path: string }\n | { op: 'fd-path-unlinking'; path: string }\n | { op: 'fd-path-unlinked'; path: string }\n | { op: 'fd-path-renamed'; from: string; to: string }\n | { op: 'fd-seek'; fd: number; offset: number; whence: number }\n | { op: 'fd-select'; read: number[]; write: number[]; timeoutMs: number }\n | { op: 'fd-info'; fd: number }\n | { op: 'fd-dup'; fd: number; min?: number }\n | { op: 'fd-reserve'; fd?: number; min?: number; meta?: HeldMeta }\n | { op: 'fd-meta'; fd: number; meta: HeldMeta }\n | { op: 'fd-setfl'; fd: number; flags: number }\n | { op: 'fd-cloexec'; fd: number; on: boolean }\n | { op: 'fd-list' }\n | { op: 'dl-log'; append?: LinkRecord; from: number }\n | {\n op: 'proc-alarm';\n sig: number;\n ms: number;\n firstMs?: number;\n repeat: boolean;\n\n timer?: number;\n }\n | { op: 'fd-renumber'; from: number; to: number; keep?: boolean }\n | { op: 'proc-umask'; mask?: number }\n | {\n op: 'fd-promote';\n fd: number;\n share?: number;\n path?: string;\n flags?: number;\n position?: number;\n contents?: Uint8Array;\n orphan?: boolean;\n\n dirty?: boolean;\n\n pin?: VersionPin;\n }\n | { op: 'fd-open-tty'; name?: string }\n | { op: 'fd-tty-names' }\n | { op: 'tty-get'; fd: number }\n | { op: 'tty-set'; fd: number; termios: Termios }\n | { op: 'tty-winsz'; fd: number }\n | { op: 'fd-flush'; fd: number }\n | {\n op: 'proc-spawn';\n file: string;\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n stdio: ChildStdio[];\n\n inherit?: InheritedSlot[];\n\n exec?: boolean;\n }\n | {\n op: 'proc-wait';\n pid: number;\n nohang: boolean;\n\n untraced?: boolean;\n continued?: boolean;\n }\n | { op: 'proc-captured'; pid: number; slot: number }\n | { op: 'proc-fork'; state: ForkState }\n | { op: 'proc-kill'; pid: number; sig: number }\n | { op: 'proc-list' }\n | { op: 'mount-list' }\n | ({ op: 'mount' } & MountCall)\n | { op: 'umount'; target: string; flags: number }\n | { op: 'proc-exec'; pid: number }\n | { op: 'proc-identity' }\n | { op: 'proc-setpgid'; pid: number; pgid: number }\n | { op: 'proc-getpgid'; pid: number }\n | { op: 'proc-getsid'; pid: number }\n | { op: 'proc-setsid' }\n | { op: 'tty-pgrp-get'; fd: number }\n | { op: 'tty-pgrp-set'; fd: number; pgrp: number }\n | { op: 'sig-mask'; caught: number; ignored: number; defaults?: number }\n | { op: 'sig-pause' }\n | SocketSyscall\n | HttpSyscall\n | PtySyscall\n | HostSyscall;\n\ntype FdSyscall = Extract<WasmSyscall, { op: `fd-${string}` }>;\n\ntype JobSyscall = Extract<\n WasmSyscall,\n { op: 'proc-setpgid' | 'proc-getpgid' | 'proc-getsid' | 'proc-setsid' }\n>;\n\nconst JOB_OPS: ReadonlySet<string> = new Set([\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n]);\n\nfunction isJobSyscall(req: WasmSyscall): req is JobSyscall {\n return JOB_OPS.has(req.op);\n}\n\nfunction isHttpSyscall(req: WasmSyscall): req is HttpSyscall {\n return req.op.startsWith('net-');\n}\n\nfunction isSocketSyscall(req: WasmSyscall): req is SocketSyscall {\n return req.op.startsWith('sock-');\n}\n\nfunction isHostSyscall(req: { op: string }): req is HostSyscall {\n return (HOST_OPS as readonly string[]).includes(req.op);\n}\n\nfunction isPtySyscall(req: WasmSyscall): req is PtySyscall {\n return req.op.startsWith('pty-');\n}\n\ntype VfsSyscall = Extract<\n FdSyscall,\n {\n op:\n | 'fd-pread'\n | 'fd-pwrite'\n | 'fd-resize'\n | 'fd-vfs-stat'\n | 'fd-path-flush'\n | 'fd-path-unlinking'\n | 'fd-path-unlinked'\n | 'fd-path-renamed';\n }\n>;\n\nfunction isVfsSyscall(req: FdSyscall): req is VfsSyscall {\n return (\n req.op.startsWith('fd-path-') ||\n req.op === 'fd-pread' ||\n req.op === 'fd-pwrite' ||\n req.op === 'fd-resize' ||\n req.op === 'fd-vfs-stat'\n );\n}\n\nfunction isFdSyscall(req: WasmSyscall): req is FdSyscall {\n return req.op.startsWith('fd-');\n}\n\nfunction isTtySyscall(req: WasmSyscall): req is TtySyscall {\n return req.op.startsWith('tty-');\n}\n\nexport interface FdInfo {\n tty: boolean;\n kind: KernelFdKind;\n meta?: HeldMeta;\n flags?: number;\n cloexec?: true;\n\n name?: string;\n}\n\nconst SYSCALL_OPS: ReadonlySet<string> = new Set([\n 'fd-read',\n 'fd-write',\n 'fd-close',\n 'fd-pipe',\n 'fd-poll',\n 'fd-open-vfs',\n 'fd-seek',\n 'fd-pread',\n 'fd-pwrite',\n 'fd-resize',\n 'fd-vfs-stat',\n 'fd-path-flush',\n 'fd-path-unlinking',\n 'fd-path-unlinked',\n 'fd-path-renamed',\n 'fd-select',\n 'fd-info',\n 'fd-dup',\n 'fd-reserve',\n 'fd-meta',\n 'fd-setfl',\n 'fd-cloexec',\n 'fd-list',\n 'proc-alarm',\n 'proc-umask',\n 'dl-log',\n 'fd-renumber',\n 'fd-promote',\n 'fd-open-tty',\n 'fd-tty-names',\n 'tty-get',\n 'tty-set',\n 'tty-winsz',\n 'fd-flush',\n 'proc-spawn',\n 'proc-wait',\n 'proc-captured',\n 'proc-fork',\n 'proc-kill',\n 'proc-list',\n 'mount-list',\n 'mount',\n 'umount',\n 'proc-exec',\n 'proc-identity',\n 'proc-setpgid',\n 'proc-getpgid',\n 'proc-getsid',\n 'proc-setsid',\n 'tty-pgrp-get',\n 'tty-pgrp-set',\n 'sig-mask',\n 'sig-pause',\n ...SOCKET_OPS,\n ...HTTP_OPS,\n ...PTY_OPS,\n ...HOST_OPS,\n]);\n\ntype TtySyscall = Extract<WasmSyscall, { op: `tty-${string}` }>;\n\nexport function isWasmSyscall(req: object): req is WasmSyscall {\n const op = (req as { op?: unknown }).op;\n return typeof op === 'string' && SYSCALL_OPS.has(op);\n}\n\nconst MAX_READ = 1024 * 1024;\n\nexport const DEFAULT_UMASK = 0o022;\n\nconst DYING: SyncFsResult = { ok: false, errno: 'EINTR', message: 'the process is being killed' };\n\nconst HOSTS_ONLY = new Resolver({ routes: new Routes() });\n\nexport interface WasmProcessOptions {\n ignored?: number;\n\n umask?: number;\n\n identity?: () => Promise<{ pid: number; ppid: number }>;\n\n onSyscall?: (req: WasmSyscall) => void;\n\n spawner?: ChildSpawner;\n\n forker?: ChildForker;\n\n fs: VfsFileFs;\n\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n\n writesBack?: (pid: number) => boolean;\n\n processes?: () => ProcessListing;\n\n openFiles?: Set<VfsNodes>;\n\n nodes?: VfsNodes;\n\n mounts?: () => MountLine[];\n\n mount?: (call: MountCall, signal: AbortSignal) => Promise<unknown>;\n\n umount?: (target: string, flags: number) => Promise<void>;\n\n onPending?: (sig: number) => void;\n\n onTimer?: (which: number) => void;\n\n onAsync?: () => void;\n\n hasPending?: () => boolean;\n\n pendingBits?: () => number;\n\n raise?: (sig: number) => void;\n\n onReap?: (pid: number) => void;\n\n jobs?: JobTable;\n\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n\n locks?: LockTable;\n\n resolver?: Resolver;\n}\n\nexport type StateListener = (state: 'stopped' | 'continued', sig: number) => void;\n\nexport type SignalOutcome = DefaultAction | 'deliver' | 'forward';\n\nexport class WasmProcess {\n private exited = false;\n private readonly children: ChildTable;\n\n private caught = 0;\n private ignored = 0;\n private inherited = 0;\n\n private interrupt = new AbortController();\n\n private dying = false;\n\n umask = DEFAULT_UMASK;\n\n private execChild: number | undefined;\n\n execTermsig: number | undefined;\n\n private stopped = 0;\n\n private stops = 0;\n private resumed: Promise<void> = Promise.resolve();\n private wake: (() => void) | undefined;\n private readonly stateListeners: StateListener[] = [];\n\n private net: LoopbackNet | undefined;\n\n private readonly nodes: VfsNodes;\n\n readonly pid: number;\n\n readonly fds: FdTable;\n\n private readonly options: WasmProcessOptions;\n\n constructor(\n pid: number,\n\n fds: FdTable,\n\n options: WasmProcessOptions\n ) {\n this.pid = pid;\n\n this.fds = fds;\n\n this.options = options;\n this.inherited = options.ignored ?? 0;\n this.umask = options.umask ?? DEFAULT_UMASK;\n this.children = new ChildTable(fds, options.spawner, options.forker);\n this.nodes = options.nodes ?? new VfsNodes(options.fs);\n if (!options.nodes) options.openFiles?.add(this.nodes);\n this.children.onChildState = () => this.signal(SIG.CHLD);\n this.children.onReap = options.onReap;\n }\n\n private ignores(bit: number): boolean {\n return ((this.ignored | (this.inherited & ~this.caught)) & bit) !== 0;\n }\n\n inheritable(fork = false): number {\n return ((fork ? 0 : this.ignored) | this.inherited) & ~this.caught;\n }\n\n signal(sig: number): SignalOutcome {\n if (this.execChild !== undefined) {\n void Promise.resolve(this.options.kill?.(this.execChild, sig)).catch(() => undefined);\n if (sig !== SIG.KILL) return 'forward';\n if (!this.options.writesBack?.(this.execChild)) return 'terminate';\n this.wake?.();\n return 'forward';\n }\n if (sig === SIG.KILL) return 'terminate';\n\n if (sig === SIG.CONT) this.cont();\n if (sig === SIG.STOP) return this.stop(sig);\n const bit = sigbit(sig);\n if (this.ignores(bit)) return 'ignore';\n if (!(this.caught & bit)) {\n const action = defaultAction(sig);\n return action === 'stop' ? this.stop(sig) : action;\n }\n if (((this.options.pendingBits?.() ?? 0) & bit) !== 0 && defaultAction(sig) === 'terminate') {\n return 'terminate';\n }\n this.options.onPending?.(sig);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n return 'deliver';\n }\n\n onState(listener: StateListener): void {\n this.stateListeners.push(listener);\n }\n\n private stop(sig: number): 'stop' {\n if (this.stopped) return 'stop';\n this.stopped = sig;\n this.stops++;\n this.resumed = new Promise((resolve) => (this.wake = resolve));\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n for (const listener of this.stateListeners) listener('stopped', sig);\n return 'stop';\n }\n\n private cont(): void {\n if (!this.stopped) return;\n this.stopped = 0;\n this.wake?.();\n for (const listener of this.stateListeners) listener('continued', SIG.CONT);\n }\n\n async syscall(req: WasmSyscall, cancelled?: AbortSignal): Promise<SyncFsResult> {\n this.options.onSyscall?.(req);\n for (;;) {\n await this.resumed;\n if (this.dying) return DYING;\n const stops = this.stops;\n const result = await this.dispatch(req, cancelled);\n if (this.dying) return DYING;\n\n const restart = !result.ok && result.errno === 'EINTR' && this.stops !== stops;\n if (restart && !this.options.hasPending?.()) continue;\n\n await this.resumed;\n return result;\n }\n }\n\n setUmask(mask?: number): number {\n const old = this.umask;\n if (mask !== undefined) this.umask = mask & 0o777;\n return old;\n }\n\n die(): void {\n if (this.dying) return;\n this.dying = true;\n this.interrupt.abort();\n this.wake?.();\n }\n\n private async dispatch(req: WasmSyscall, cancelled?: AbortSignal): Promise<SyncFsResult> {\n try {\n if (isFdSyscall(req)) return await this.fdSyscall(req, cancelled);\n if (isTtySyscall(req)) return this.ttySyscall(req);\n if (isJobSyscall(req)) return this.jobSyscall(req);\n if (isSocketSyscall(req)) return await this.socketSyscall(req);\n if (isHttpSyscall(req)) return await this.httpSyscall(req);\n if (isHostSyscall(req)) {\n return await hostSyscall(req, {\n pid: this.pid,\n locks: this.options.locks,\n ops: this.asyncOps,\n blocking: () => this.blockingSignal(),\n valid: (inner) => isWasmSyscall(inner) && !isHostSyscall(inner),\n });\n }\n if (isPtySyscall(req)) {\n const { ptys, jobs } = this.options;\n return ptySyscall(req, { pid: this.pid, fds: this.fds, ptys, jobs });\n }\n return await this.procSyscall(req);\n } catch (e) {\n if (e instanceof KernelError || e instanceof SpawnError) {\n return { ok: false, errno: e.code, message: e.code };\n }\n const code = (e as { code?: unknown } | null)?.code;\n if (typeof code === 'string' && /^E[A-Z]+$/.test(code)) {\n return { ok: false, errno: code, message: code };\n }\n throw e;\n }\n }\n\n private blockingSignal(): AbortSignal {\n if (this.options.hasPending?.()) throw new KernelError('EINTR');\n return this.interrupt.signal;\n }\n\n private async read(req: Extract<WasmSyscall, { op: 'fd-read' }>): Promise<Uint8Array> {\n const file = this.fds.get(req.fd).file;\n const read = req.peek ? file.peek : file.read;\n if (!read) throw new KernelError(req.peek && file.read ? 'EOPNOTSUPP' : 'EBADF');\n if (file.tty) this.checkForeground(file.tty);\n\n if (req.max <= 0) return new Uint8Array(0);\n const ready = pollFile(file).readable;\n if (!ready && req.nonblock) throw new KernelError('EAGAIN');\n const signal = ready ? this.interrupt.signal : this.blockingSignal();\n return read.call(file, Math.max(0, Math.min(req.max, MAX_READ)), signal);\n }\n\n private async write(fd: number, body: Uint8Array, nonblock = false): Promise<number> {\n const file = this.fds.get(fd).file;\n if (!file.write) throw new KernelError('EBADF');\n if (!pollFile(file).writable) {\n if (nonblock) throw new KernelError('EAGAIN');\n return file.write(body, this.blockingSignal());\n }\n\n if (nonblock) return file.write(body, AbortSignal.abort());\n\n return file.write(\n body,\n this.options.hasPending?.() ? AbortSignal.abort() : this.interrupt.signal\n );\n }\n\n private async openVfs(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): Promise<number> {\n await refuseReadonly(this.options.fs, req.path, req.flags, req);\n const fd = this.fds.install(heldFile(), 3);\n try {\n const nodes = this.nodes;\n const path = req.orphan\n ? req.path\n : req.exclusive\n ? await nodes.entryKey(req.path)\n : req.create\n ? await nodes.targetKey(req.path)\n : await this.keptOr(await nodes.targetKey(req.path));\n const open = { ...req, path };\n if (req.exclusive) {\n await nodes.createExclusive(path);\n this.fds.installAt(fd, this.openVfsFile(open));\n } else if (req.create) {\n await nodes.onEntry(path, async () => {\n this.fds.installAt(fd, this.openVfsFile(open));\n await this.fds.get(fd).file.stat?.();\n });\n } else {\n this.fds.installAt(fd, this.openVfsFile(open));\n }\n if (req.existing && !(await present(this.options.fs, path, true))) {\n throw new KernelError('ENOENT');\n }\n } catch (err) {\n await Promise.resolve(this.fds.close(fd));\n throw err;\n }\n return fd;\n }\n\n private openVfsFile(req: Extract<FdSyscall, { op: 'fd-open-vfs' }>): OpenFile {\n return vfsFile(\n this.options.fs,\n {\n path: req.path,\n flags: req.flags,\n position: req.position,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.truncate ? { truncate: true } : {}),\n ...(req.create ? { create: true } : {}),\n ...(req.pin ? { pin: req.pin } : {}),\n },\n this.nodes\n );\n }\n\n private async fdSyscall(req: FdSyscall, cancelled?: AbortSignal): Promise<SyncFsResult> {\n if (isVfsSyscall(req)) return this.vfsSyscall(req);\n switch (req.op) {\n case 'fd-read':\n return { ok: true, kind: 'bytes', bytes: await this.read(req) };\n case 'fd-write':\n return { ok: true, kind: 'json', json: await this.write(req.fd, req.body, req.nonblock) };\n case 'fd-close':\n this.options.locks?.closed(this.pid, req.fd);\n await Promise.resolve(this.fds.close(req.fd));\n return { ok: true, kind: 'void' };\n case 'fd-pipe': {\n const pipe = openPipe();\n const read = this.fds.install(pipe.read, 3);\n let write: number;\n try {\n write = this.fds.install(pipe.write, 3);\n } catch (e) {\n await Promise.resolve(this.fds.close(read));\n throw e;\n }\n return { ok: true, kind: 'json', json: [read, write] };\n }\n case 'fd-poll':\n return { ok: true, kind: 'json', json: pollFile(this.fds.get(req.fd).file) };\n case 'fd-open-vfs':\n return { ok: true, kind: 'json', json: await this.openVfs(req) };\n case 'fd-info':\n return { ok: true, kind: 'json', json: this.fdInfo(req.fd) };\n case 'fd-list':\n return {\n ok: true,\n kind: 'json',\n json: this.fds.numbers().map((fd) => ({ fd, ...this.fdInfo(fd) })),\n };\n case 'fd-meta': {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n const cloexec = this.fds.closesOnExec(req.fd);\n this.fds.installAt(req.fd, heldFile(req.meta));\n if (cloexec) this.fds.setCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n }\n case 'fd-setfl':\n this.fds.setStatusFlags(req.fd, req.flags);\n return { ok: true, kind: 'void' };\n case 'fd-cloexec':\n if (req.on) this.fds.setCloseOnExec(req.fd);\n else this.fds.clearCloseOnExec(req.fd);\n return { ok: true, kind: 'void' };\n case 'fd-dup':\n return { ok: true, kind: 'json', json: this.fds.dup(req.fd, req.min ?? 3) };\n case 'fd-reserve':\n return { ok: true, kind: 'json', json: this.reserve(req.fd, req.min, req.meta) };\n case 'fd-promote':\n await this.promote(req);\n return { ok: true, kind: 'void' };\n case 'fd-renumber':\n if (req.from !== req.to) {\n this.fds.dup2(req.from, req.to);\n if (!req.keep) await Promise.resolve(this.fds.close(req.from));\n }\n return { ok: true, kind: 'void' };\n case 'fd-open-tty': {\n const tty =\n req.name === undefined\n ? this.controllingTerminal()\n : this.options.jobs?.terminalNamed(req.name);\n if (!tty) throw new KernelError('ENXIO');\n return { ok: true, kind: 'json', json: this.fds.install(tty.file(), 3) };\n }\n case 'fd-tty-names':\n return { ok: true, kind: 'json', json: this.options.jobs?.terminalNames() ?? [] };\n case 'fd-select': {\n const { read, write, timeoutMs } = req;\n const blocking = this.blockingSignal();\n const signal = cancelled ? AbortSignal.any([blocking, cancelled]) : blocking;\n const selected = await selectFds(this.fds, read, write, timeoutMs, signal);\n return { ok: true, kind: 'json', json: selected };\n }\n case 'fd-seek': {\n const file = this.fds.get(req.fd).file;\n if (!file.seek) throw new KernelError('ESPIPE');\n return { ok: true, kind: 'json', json: await file.seek(req.offset, req.whence) };\n }\n case 'fd-flush': {\n const file = this.fds.get(req.fd).file;\n if (file.flush) await file.flush();\n return { ok: true, kind: 'void' };\n }\n }\n }\n\n private async vfsSyscall(req: VfsSyscall): Promise<SyncFsResult> {\n if ('path' in req || 'from' in req) {\n const nodes = this.nodes;\n if (req.op === 'fd-path-flush') {\n await nodes.flush(await nodes.targetKey(req.path).catch(() => req.path));\n } else if (req.op === 'fd-path-unlinking')\n await nodes.unlinking(await nodes.entryKey(req.path));\n else if (req.op === 'fd-path-unlinked') nodes.unlinked(await nodes.entryKey(req.path));\n else if (req.op === 'fd-path-renamed') {\n nodes.renamed(await nodes.entryKey(req.from), await nodes.entryKey(req.to));\n }\n return { ok: true, kind: 'void' };\n }\n const file = this.fds.get(req.fd).file;\n if (!file.pread || !file.pwrite || !file.resize || !file.stat) throw new KernelError('ESPIPE');\n switch (req.op) {\n case 'fd-pread':\n return {\n ok: true,\n kind: 'bytes',\n bytes: await file.pread(Math.min(req.max, MAX_READ), req.offset),\n };\n case 'fd-pwrite':\n return { ok: true, kind: 'json', json: await file.pwrite(req.body, req.offset) };\n case 'fd-resize':\n await file.resize(req.size);\n return { ok: true, kind: 'void' };\n case 'fd-vfs-stat':\n return { ok: true, kind: 'json', json: await file.stat() };\n }\n }\n\n keptPath?: (path: string) => string | undefined;\n\n private async keptOr(path: string): Promise<string> {\n const kept = this.keptPath?.(path);\n return kept !== undefined && !(await present(this.options.fs, path, true)) ? kept : path;\n }\n\n private async promote(req: Extract<WasmSyscall, { op: 'fd-promote' }>): Promise<void> {\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n if (req.share !== undefined) {\n this.fds.dup2(req.share, req.fd);\n return;\n }\n if (req.path === undefined) throw new KernelError('EINVAL');\n const path = req.orphan ? req.path : await this.keptOr(await this.nodes.targetKey(req.path));\n if (!this.fds.get(req.fd).file.held) throw new KernelError('EBADF');\n const file = vfsFile(\n this.options.fs,\n {\n path,\n flags: req.flags ?? 0,\n position: req.position ?? 0,\n ...(req.contents !== undefined ? { contents: req.contents } : {}),\n ...(req.orphan ? { orphan: true } : {}),\n ...(req.dirty ? { dirty: true } : {}),\n ...(req.pin ? { pin: req.pin } : {}),\n },\n this.nodes\n );\n this.fds.installAt(req.fd, file);\n }\n\n private reserve(fd: number | undefined, min = 3, meta?: HeldMeta): number {\n if (fd === undefined) return this.fds.install(heldFile(meta), Math.max(3, min));\n if (this.fds.has(fd)) throw new KernelError('EBADF');\n this.fds.installAt(fd, heldFile(meta));\n return fd;\n }\n\n private fdInfo(fd: number): FdInfo {\n const file = this.fds.get(fd).file;\n const flags = this.fds.statusFlags(fd);\n return {\n tty: file.tty !== undefined,\n kind: file instanceof KernelSocket ? 'socket' : kernelFdKind(file),\n ...(file.heldMeta ? { meta: file.heldMeta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(this.fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(file.tty?.name ? { name: file.tty.name } : file.pty ? { name: '/dev/ptmx' } : {}),\n };\n }\n\n private ttySyscall(req: TtySyscall): SyncFsResult {\n const tty = this.tty(req.fd);\n const jobs = this.options.jobs;\n switch (req.op) {\n case 'tty-get':\n return { ok: true, kind: 'json', json: tty.tcgets() };\n case 'tty-set':\n tty.tcsets(req.termios);\n return { ok: true, kind: 'void' };\n case 'tty-winsz':\n return { ok: true, kind: 'json', json: tty.winsize() };\n case 'tty-pgrp-get':\n return { ok: true, kind: 'json', json: jobs ? jobs.tcgetpgrp(tty, this.sid()) : this.pid };\n case 'tty-pgrp-set':\n if (jobs) jobs.tcsetpgrp(this.pid, tty, req.pgrp);\n else if (req.pgrp !== this.pid) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n }\n }\n\n private checkForeground(tty: KernelTty): void {\n const jobs = this.options.jobs;\n if (!jobs) return;\n const session = jobs.controllingTerminal(this.pid);\n if (session !== undefined && session !== tty) return;\n const pgid = this.pgid();\n if (jobs.tcgetpgrp(tty, this.sid()) === pgid) return;\n if (this.ignores(sigbit(SIG.TTIN))) throw new KernelError('EIO');\n jobs.killGroup(pgid, SIG.TTIN);\n throw new KernelError('EINTR');\n }\n\n private waitGroup(pid: number): ((child: number) => boolean) | undefined {\n const jobs = this.options.jobs;\n if (!jobs || pid > 0 || pid === -1) return undefined;\n const group = pid === 0 ? this.pgid() : -pid;\n\n return (child) => (jobs.pgidOf(child) ?? this.pgid()) === group;\n }\n\n private pgid(): number {\n return this.options.jobs?.getpgid(this.pid, 0) ?? this.pid;\n }\n\n private sid(): number {\n return this.options.jobs?.getsid(this.pid, 0) ?? this.pid;\n }\n\n private controllingTerminal(): KernelTty | undefined {\n const session = this.options.jobs?.controllingTerminal(this.pid);\n return session === undefined ? this.fds.stdioTerminal() : (session ?? undefined);\n }\n\n private jobSyscall(req: JobSyscall): SyncFsResult {\n const jobs = this.options.jobs;\n const self = (pid: number): number => {\n if (pid !== 0 && pid !== this.pid) throw new KernelError('ESRCH');\n return this.pid;\n };\n switch (req.op) {\n case 'proc-setpgid':\n if (jobs) jobs.setpgid(this.pid, req.pid, req.pgid);\n else if (self(req.pid) !== (req.pgid || this.pid)) throw new KernelError('EPERM');\n return { ok: true, kind: 'void' };\n case 'proc-getpgid':\n return { ok: true, kind: 'json', json: jobs?.getpgid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-getsid':\n return { ok: true, kind: 'json', json: jobs?.getsid(this.pid, req.pid) ?? self(req.pid) };\n case 'proc-setsid':\n if (!jobs) throw new KernelError('EPERM');\n return { ok: true, kind: 'json', json: jobs.setsid(this.pid) };\n }\n }\n\n private httpSyscall(req: HttpSyscall): Promise<SyncFsResult> {\n const http = this.options.http;\n if (!http) return Promise.resolve({ ok: false, errno: 'ENETUNREACH', message: NO_TRANSPORT });\n return http.syscall(req);\n }\n\n private socketSyscall(req: SocketSyscall): Promise<SyncFsResult> {\n this.net ??= this.options.net ?? new LoopbackNet();\n const resolver = this.options.resolver ?? HOSTS_ONLY;\n return socketSyscall(req, {\n fds: this.fds,\n net: this.net,\n blocking: () => this.blockingSignal(),\n resolve: (name, family, blocking) => resolver.resolve(name, family, blocking),\n });\n }\n\n private tty(fd: number): KernelTty {\n const file = this.fds.get(fd).file;\n const tty = file.tty ?? file.pty?.slave;\n if (!tty) throw new KernelError('ENOTTY');\n return tty;\n }\n\n private async procSyscall(\n req: Exclude<\n WasmSyscall,\n FdSyscall | TtySyscall | JobSyscall | SocketSyscall | HttpSyscall | PtySyscall | HostSyscall\n >\n ): Promise<SyncFsResult> {\n switch (req.op) {\n case 'proc-fork':\n return { ok: true, kind: 'json', json: await this.children.fork(req.state) };\n case 'proc-spawn': {\n const { file, argv, env, cwd, stdio, inherit, exec } = req;\n const spawned = { file, argv, env, cwd, ...(exec ? { exec } : {}) };\n const pid = await this.children.spawn(spawned, stdio, inherit);\n return { ok: true, kind: 'json', json: pid };\n }\n case 'proc-wait': {\n const signal = req.nohang ? this.interrupt.signal : this.blockingSignal();\n const flags = {\n untraced: req.untraced,\n continued: req.continued,\n inGroup: this.waitGroup(req.pid),\n };\n const waited = await this.children.wait(req.pid, req.nohang, signal, flags);\n return { ok: true, kind: 'json', json: waited };\n }\n case 'proc-identity':\n return { ok: true, kind: 'json', json: (await this.options.identity?.()) ?? null };\n case 'proc-exec': {\n this.execChild = req.pid;\n this.options.jobs?.exec(this.pid, req.pid);\n\n this.children.watch(req.pid, (state, sig) =>\n state === 'stopped' ? this.stop(sig) : this.cont()\n );\n\n await this.fds.closeAll();\n try {\n const waited = await this.children.wait(req.pid, false);\n const termsig = waited[1] & 0x7f;\n if (termsig) this.execTermsig = termsig;\n return { ok: true, kind: 'json', json: waited };\n } finally {\n this.execChild = undefined;\n }\n }\n case 'proc-kill':\n if (req.sig !== 0 && !isSignal(req.sig)) throw new KernelError('EINVAL');\n\n if (!(await this.options.kill?.(req.pid === 0 ? -this.pgid() : req.pid, req.sig))) {\n throw new KernelError('ESRCH');\n }\n return { ok: true, kind: 'void' };\n case 'proc-list':\n return {\n ok: true,\n kind: 'json',\n json: this.options.processes?.() ?? { boot: 0, processes: [] },\n };\n case 'mount-list':\n return { ok: true, kind: 'json', json: this.options.mounts?.() ?? [] };\n case 'mount':\n case 'umount':\n return this.mountSyscall(req);\n case 'proc-alarm':\n this.setAlarm(req.sig, req.firstMs ?? req.ms, req.repeat ? req.ms : 0, req.timer);\n return { ok: true, kind: 'void' };\n case 'proc-umask':\n return { ok: true, kind: 'json', json: this.setUmask(req.mask) };\n case 'dl-log':\n if (req.append) this.dlLog.push(req.append);\n return { ok: true, kind: 'json', json: this.dlLog.slice(req.from) };\n case 'sig-mask':\n this.caught = req.caught;\n this.ignored = req.ignored;\n this.inherited &= ~(req.defaults ?? 0);\n return { ok: true, kind: 'void' };\n case 'sig-pause':\n return this.pause();\n case 'proc-captured':\n return { ok: true, kind: 'bytes', bytes: this.children.captured(req.pid, req.slot) };\n }\n }\n\n private async mountSyscall(\n req: Extract<WasmSyscall, { op: 'mount' | 'umount' }>\n ): Promise<SyncFsResult> {\n const { mount, umount } = this.options;\n if (!mount || !umount) throw new KernelError('ENOSYS');\n try {\n if (req.op === 'umount') await umount(req.target, req.flags);\n else {\n const { source, target, type, flags, data } = req;\n const signal = this.blockingSignal();\n await Promise.race([mount({ source, target, type, flags, data }, signal), aborted(signal)]);\n }\n } catch (err) {\n const code = (err as { code?: unknown } | null)?.code;\n if (typeof code !== 'string') throw err;\n return { ok: false, errno: code, message: (err as Error).message };\n }\n return { ok: true, kind: 'void' };\n }\n\n private pause(): Promise<never> {\n return aborted(this.blockingSignal());\n }\n\n private alarm: ReturnType<typeof setTimeout> | undefined;\n private readonly dlLog: LinkRecord[] = [];\n private readonly asyncOps = new AsyncOps(\n (req, cancelled) => this.syscall(req as WasmSyscall, cancelled),\n () => this.options.onAsync?.()\n );\n private alarmEvery: ReturnType<typeof setInterval> | undefined;\n\n private setAlarm(sig: number, first: number, every: number, timer?: number): void {\n if (!isSignal(sig)) throw new KernelError('EINVAL');\n this.clearAlarm();\n if (first <= 0) return;\n const fire =\n timer === undefined ? () => this.options.raise?.(sig) : () => this.timerExpired(timer);\n this.alarm = setTimeout(() => {\n this.alarm = undefined;\n fire();\n if (every > 0) this.alarmEvery = setInterval(fire, every);\n }, first);\n }\n\n private timerExpired(which: number): void {\n this.options.onTimer?.(which);\n const blocked = this.interrupt;\n this.interrupt = new AbortController();\n blocked.abort();\n }\n\n private clearAlarm(): void {\n clearTimeout(this.alarm);\n clearInterval(this.alarmEvery);\n this.alarm = undefined;\n this.alarmEvery = undefined;\n }\n\n async exit(): Promise<void> {\n if (this.exited) return;\n this.exited = true;\n this.die();\n this.clearAlarm();\n this.interrupt.abort();\n this.options.locks?.release(this.pid);\n this.asyncOps.close();\n for (const pid of this.children.pids()) this.options.onReap?.(pid);\n await this.fds.closeAll();\n if (!this.options.nodes) this.options.openFiles?.delete(this.nodes);\n await this.options.http?.closeAll();\n }\n}\n", "import type { ForeignResults, ImportedMemory } from '../process/wasi/wasi-module.ts';\nimport type { WasiForkState } from '../process/wasi/wasix-fork.ts';\nimport type { DeviceMeta, KernelFdKind } from './fd-table.ts';\n\nexport const WASM_PROCESS_INIT = 'wasm-process-init';\nexport const WASM_PROCESS_EXIT = 'wasm-process-exit';\nexport const WASM_PROCESS_ERROR = 'wasm-process-error';\nexport const WASM_THREAD_SPAWN = 'wasm-thread-spawn';\nexport const WASM_THREAD_INIT = 'wasm-thread-init';\nexport const WASM_THREAD_EXIT = 'wasm-thread-exit';\nexport const WASM_MAX_THREADS = 256;\nexport const WASM_DEFAULT_THREADS = 64;\n\nexport interface WasmProgram {\n abi?: 'emscripten' | 'wasi';\n glue: string;\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n names?: string;\n imports?: string;\n preopenRoot?: boolean;\n}\n\nexport interface JsProgram {\n abi: 'js';\n glue: string;\n path: string;\n}\n\nexport type Program = WasmProgram | JsProgram;\n\nexport interface ForkState {\n memory: Uint8Array;\n currData: number;\n forkSp: number;\n callStackNames: Array<[number, string]>;\n ppid: number;\n streams?: ForkStream[];\n cwd?: string;\n wasi?: WasiForkState;\n}\n\nexport interface KernelStreamEntry {\n fd: number;\n kernel: number;\n kind: KernelFdKind;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport type ForkStream = KernelStreamEntry | { fd: number; path: string; flags: number };\n\nexport interface InheritedFd {\n fd: number;\n kind: KernelFdKind;\n device?: DeviceMeta;\n flags?: number;\n cloexec?: boolean;\n desc?: number;\n}\n\nexport interface WasmProcessInitMsg {\n type: typeof WASM_PROCESS_INIT;\n pid: number;\n program: WasmProgram;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n sab: SharedArrayBuffer;\n ppid?: number;\n umask?: number;\n fork?: ForkState;\n fds?: InheritedFd[];\n}\n\nexport interface JsLane {\n sab: SharedArrayBuffer;\n port: MessagePort;\n}\n\nexport type JsProcessInitMsg = Omit<WasmProcessInitMsg, 'program' | 'fork'> & {\n program: JsProgram;\n lane?: JsLane;\n};\n\nexport type ProcessInitMsg = WasmProcessInitMsg | JsProcessInitMsg;\n\nexport interface WasmProcessExitMsg {\n type: typeof WASM_PROCESS_EXIT;\n code: number;\n}\n\nexport interface WasmProcessErrorMsg {\n type: typeof WASM_PROCESS_ERROR;\n message: string;\n}\n\nexport interface WasmThread {\n tid: number;\n arg: number;\n memory: WebAssembly.Memory;\n ids: SharedArrayBuffer;\n modules?: Record<string, WebAssembly.Module>;\n}\n\nexport interface WasmThreadSpawnMsg {\n type: typeof WASM_THREAD_SPAWN;\n thread: WasmThread;\n}\n\nexport interface WasmThreadInitMsg extends Omit<WasmProcessInitMsg, 'type' | 'fork' | 'fds'> {\n type: typeof WASM_THREAD_INIT;\n thread: WasmThread;\n}\n\nexport interface WasmThreadExitMsg {\n type: typeof WASM_THREAD_EXIT;\n}\n", "import type { PathGate } from '../fs/unlinked.ts';\nimport { HeldPaths } from '../mount/mount-fs.ts';\nimport { dispatchSyncFs } from '../realm/sync-fs-dispatch.ts';\nimport {\n mintSyncFsToken,\n revokeSyncFsToken,\n type SyncFsTokenEntry,\n} from '../realm/sync-fs-token-registry.ts';\nimport type { SyncFsResult } from '../realm/sync-fs-wire.ts';\nimport {\n attachSyncSabResponder,\n type SyncSabDispatchRequest,\n} from '../realm/sync-sab-responder.ts';\nimport {\n SAB_DEFAULT_WINDOW_BYTES,\n SAB_HEADER_BYTES,\n SAB_HEADER_I32,\n SAB_I_ASYNC,\n SAB_I_KILLED,\n SAB_I_MEMORY,\n SAB_I_SIGNALS,\n SAB_I_STOP,\n SAB_I_TIMERS,\n} from '../realm/sync-sab-wire.ts';\nimport type { ChildForker, ChildSpawner } from './children.ts';\nimport { type FdTable, kernelFdKind, type OpenFile } from './fd-table.ts';\nimport type { LockTable } from './host-ops.ts';\nimport type { JobTable } from './jobs.ts';\nimport type { HttpHandles } from './net/http-syscalls.ts';\nimport type { Resolver } from './net/resolver.ts';\nimport type { MountLine, ProcessListing } from './proc-info.ts';\nimport {\n isWasmSyscall,\n type StateListener,\n WasmProcess,\n type WasmProcessOptions,\n type WasmSyscall,\n} from './process.ts';\nimport {\n type ForkState,\n type InheritedFd,\n type JsLane,\n type ProcessInitMsg,\n type Program,\n WASM_MAX_THREADS,\n WASM_PROCESS_ERROR,\n WASM_PROCESS_EXIT,\n WASM_PROCESS_INIT,\n WASM_THREAD_EXIT,\n WASM_THREAD_INIT,\n WASM_THREAD_SPAWN,\n type WasmThread,\n type WasmThreadInitMsg,\n} from './protocol.ts';\nimport type { PtyTable } from './pty.ts';\nimport { SIG, sigbit } from './signals.ts';\nimport { KernelSocket, type LoopbackNet } from './socket.ts';\nimport type { VfsNodes } from './vfs-file.ts';\n\nexport interface WasmWorkerLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message' | 'error', handler: (event: MessageEvent) => void): void;\n terminate(): void;\n}\n\nexport interface SpawnWasmOptions {\n pid: number;\n ignored?: number;\n umask?: number;\n identity?: () => Promise<{ pid: number; ppid: number }>;\n onSyscall?: (req: WasmSyscall) => void;\n program: Program;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n fs: SyncFsTokenEntry['fs'];\n createWorker: () => WasmWorkerLike;\n onError?: (message: string) => void;\n spawner?: ChildSpawner;\n forker?: ChildForker;\n fork?: ForkState;\n ppid?: number;\n\n shownPid?: number;\n kill?: (pid: number, sig: number) => boolean | Promise<boolean>;\n writesBack?: (pid: number) => boolean;\n processes?: () => ProcessListing;\n openFiles?: Set<VfsNodes>;\n nodes?: VfsNodes;\n statfs?: (path: string) => Promise<{ quota: number; usage: number } | undefined>;\n mounts?: () => MountLine[];\n mount?: WasmProcessOptions['mount'];\n umount?: WasmProcessOptions['umount'];\n held?: Set<HeldPaths>;\n unlinkGate?: PathGate;\n jobs?: JobTable;\n ptys?: PtyTable;\n\n net?: LoopbackNet;\n\n http?: HttpHandles;\n locks?: LockTable;\n onReap?: (pid: number) => void;\n resolver?: Resolver;\n}\n\nexport interface WasmProcessHandle {\n pid: number;\n exited: Promise<number>;\n kill(code?: number): void;\n signal(sig: number): void;\n termsig(): number | undefined;\n onState(listener: StateListener): void;\n memory(): number;\n ignoredSignals(fork?: boolean): number;\n umask?(): number;\n writesBack(): boolean;\n}\n\nconst CRASHED = 70;\nexport const KILL_GRACE_MS = 2000;\n\nconst descIds = new WeakMap<OpenFile, number>();\nlet nextDescId = 1;\n\nfunction descId(file: OpenFile): number {\n const id = descIds.get(file) ?? nextDescId++;\n descIds.set(file, id);\n return id;\n}\n\nexport function inheritedFds(fds: FdTable): InheritedFd[] {\n return fds\n .numbers()\n .filter((fd) => fd > 2 && !fds.get(fd).file.held)\n .map((fd): InheritedFd => {\n const open = fds.get(fd);\n const flags = fds.statusFlags(fd);\n const kind = open.file instanceof KernelSocket ? 'socket' : kernelFdKind(open.file);\n const meta = open.file.heldMeta;\n return {\n fd,\n kind,\n ...(kind === 'device' && meta && 'device' in meta ? { device: meta } : {}),\n ...(flags !== undefined ? { flags } : {}),\n ...(fds.closesOnExec(fd) ? { cloexec: true } : {}),\n ...(kind === 'stream' ? { desc: descId(open) } : {}),\n };\n });\n}\n\ninterface WorkerSays {\n type?: string;\n code?: unknown;\n message?: unknown;\n thread?: WasmThread;\n}\n\nclass Dying {\n ending: { code: number; sig: number } | undefined;\n private timer: ReturnType<typeof setTimeout> | undefined;\n private busy = 0;\n private finish: (() => void) | undefined;\n\n start(code: number, sig: number, header: Int32Array, process: WasmProcess, finish: () => void) {\n if (this.ending) return;\n this.ending = { code, sig };\n this.finish = finish;\n this.arm();\n Atomics.store(header, SAB_I_KILLED, code);\n process.die();\n }\n\n async serving<T>(work: () => Promise<T>): Promise<T> {\n this.busy++;\n clearTimeout(this.timer);\n try {\n return await work();\n } finally {\n this.busy--;\n this.arm();\n }\n }\n\n private arm(): void {\n clearTimeout(this.timer);\n if (this.busy === 0 && this.finish) this.timer = setTimeout(this.finish, KILL_GRACE_MS);\n }\n\n clear(): void {\n clearTimeout(this.timer);\n }\n\n status(reported: unknown): [number, number | undefined] {\n if (this.ending) return [this.ending.code, this.ending.sig];\n return [typeof reported === 'number' ? reported : CRASHED, undefined];\n }\n}\n\nfunction notifiers(header: Int32Array): { onPending(sig: number): void; onAsync(): void } {\n return {\n onPending(sig) {\n Atomics.or(header, SAB_I_SIGNALS, sigbit(sig));\n Atomics.notify(header, SAB_I_SIGNALS);\n },\n onAsync() {\n Atomics.add(header, SAB_I_ASYNC, 1);\n Atomics.notify(header, SAB_I_ASYNC);\n },\n };\n}\n\nfunction publishStops(process: WasmProcess, header: Int32Array): void {\n process.onState((state) => {\n Atomics.store(header, SAB_I_STOP, state === 'stopped' ? 1 : 0);\n Atomics.notify(header, SAB_I_STOP);\n });\n}\n\nfunction transferOf(opts: SpawnWasmOptions, lane: JsLane | undefined): Transferable[] {\n const transfer: Transferable[] = opts.fork ? [opts.fork.memory.buffer as ArrayBuffer] : [];\n return lane ? [...transfer, lane.port] : transfer;\n}\n\nfunction openLane(\n token: string,\n dispatch: (req: SyncSabDispatchRequest) => Promise<SyncFsResult>\n): { lane: JsLane; dispose(): void } {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const { port1, port2 } = new MessageChannel();\n const responder = attachSyncSabResponder(port1, sab, token, { dispatch });\n port1.start();\n return {\n lane: { sab, port: port2 },\n dispose() {\n responder.dispose();\n port1.close();\n },\n };\n}\n\nfunction processInit(\n opts: SpawnWasmOptions,\n sab: SharedArrayBuffer,\n umask: number,\n lane: JsLane | undefined\n): ProcessInitMsg {\n const base = {\n type: WASM_PROCESS_INIT,\n pid: opts.shownPid ?? opts.pid,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab,\n umask,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n } as const;\n if (opts.program.abi === 'js') {\n return {\n ...base,\n program: opts.program,\n fds: inheritedFds(opts.fds),\n lane,\n };\n }\n return {\n ...base,\n program: opts.program,\n ...(opts.fork ? { fork: opts.fork } : { fds: inheritedFds(opts.fds) }),\n };\n}\n\nfunction inherited(opts: SpawnWasmOptions): { ignored?: number; umask?: number } {\n return {\n ...(opts.ignored ? { ignored: opts.ignored } : {}),\n ...(opts.umask !== undefined ? { umask: opts.umask } : {}),\n };\n}\n\nfunction holdingToken(opts: SpawnWasmOptions, holds: HeldPaths): string {\n return mintSyncFsToken({\n fs: opts.fs,\n cwd: opts.cwd,\n ...(opts.statfs ? { statfs: opts.statfs } : {}),\n hold: (path, on, open, real, handle) => holds.hold(path, on, open, real, handle),\n keptFor: (handle) => holds.keptFor(handle),\n unlinked: (path) => holds.keptAt(path),\n gate: (path, op) =>\n opts.unlinkGate && holds.holding(path) ? opts.unlinkGate.run(holds.keyOf(path), op) : op(),\n own: (path, op) => holds.own(path, op),\n revoked: (path) => holds.isRevoked(path),\n renamed: (from, to) => holds.renamed(from, to),\n });\n}\n\nexport function spawnWasmProcess(opts: SpawnWasmOptions): WasmProcessHandle {\n const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const header = new Int32Array(sab, 0, SAB_HEADER_I32);\n const process = new WasmProcess(opts.pid, opts.fds, {\n ...inherited(opts),\n ...(opts.identity ? { identity: opts.identity } : {}),\n ...(opts.onSyscall ? { onSyscall: opts.onSyscall } : {}),\n spawner: opts.spawner,\n forker: opts.forker,\n fs: opts.fs,\n kill: opts.kill,\n ...(opts.writesBack ? { writesBack: opts.writesBack } : {}),\n processes: opts.processes,\n openFiles: opts.openFiles,\n ...(opts.nodes ? { nodes: opts.nodes } : {}),\n mounts: opts.mounts,\n ...(opts.mount ? { mount: opts.mount } : {}),\n ...(opts.umount ? { umount: opts.umount } : {}),\n jobs: opts.jobs,\n ptys: opts.ptys,\n net: opts.net,\n http: opts.http,\n locks: opts.locks,\n onReap: opts.onReap,\n resolver: opts.resolver,\n ...notifiers(header),\n onTimer: (which) => void Atomics.or(header, SAB_I_TIMERS, 1 << which),\n hasPending: () =>\n Atomics.load(header, SAB_I_SIGNALS) !== 0 || Atomics.load(header, SAB_I_TIMERS) !== 0,\n raise: (sig) => signal(sig),\n ...(opts.program.abi === 'wasi' || opts.program.abi === 'js'\n ? { pendingBits: () => Atomics.load(header, SAB_I_SIGNALS) }\n : {}),\n });\n publishStops(process, header);\n const holds = new HeldPaths();\n opts.held?.add(holds);\n const token = holdingToken(opts, holds);\n process.keptPath = (path) => holds.keptAt(path)?.hidden;\n const worker = opts.createWorker();\n const dying = new Dying();\n const dispatch = (req: SyncSabDispatchRequest): Promise<SyncFsResult> =>\n dying.serving(() => (isWasmSyscall(req) ? process.syscall(req) : dispatchSyncFs(req)));\n const responder = attachSyncSabResponder(worker, sab, token, { dispatch });\n const lane = opts.program.abi === 'js' ? openLane(token, dispatch) : undefined;\n\n const { promise: exited, resolve: settle } = Promise.withResolvers<number>();\n let done = false;\n let endedBy: number | undefined;\n\n const finish = (code: number, sig?: number): void => {\n if (done) return;\n done = true;\n dying.clear();\n endedBy = sig ?? process.execTermsig;\n worker.removeEventListener('message', onMessage);\n worker.removeEventListener('error', onError);\n for (const tid of [...threads.keys()]) endThread(tid);\n responder.dispose();\n lane?.dispose();\n revokeSyncFsToken(token);\n opts.held?.delete(holds);\n worker.terminate();\n void process.exit().then(\n () => settle(code),\n () => settle(code)\n );\n };\n\n const handle = (data: WorkerSays | undefined): void => {\n if (data?.type === WASM_PROCESS_EXIT) {\n finish(...dying.status(data.code));\n } else if (data?.type === WASM_PROCESS_ERROR) {\n if (!dying.ending) opts.onError?.(String(data.message));\n finish(...dying.status(CRASHED));\n } else if (data?.type === WASM_THREAD_SPAWN && data.thread) {\n spawnThread(data.thread);\n }\n };\n const onMessage = (event: MessageEvent): void => handle(event.data as WorkerSays | undefined);\n const onError = (event: MessageEvent): void => {\n event.preventDefault();\n opts.onError?.(String((event as unknown as ErrorEvent).message ?? 'worker error'));\n finish(CRASHED);\n };\n worker.addEventListener('message', onMessage);\n worker.addEventListener('error', onError);\n\n const threads = new Map<number, () => void>();\n const endThread = (tid: number): void => {\n const end = threads.get(tid);\n threads.delete(tid);\n end?.();\n };\n const spawnThread = (thread: WasmThread): void => {\n const { program } = opts;\n if (done || program.abi === 'js') return;\n if (threads.size >= WASM_MAX_THREADS - 1) {\n opts.onError?.(`more than ${WASM_MAX_THREADS} threads`);\n finish(CRASHED);\n return;\n }\n const tsab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);\n const tw = opts.createWorker();\n const tresponder = attachSyncSabResponder(tw, tsab, token, { dispatch });\n const onThreadMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerSays | undefined;\n if (data?.type === WASM_THREAD_EXIT) endThread(thread.tid);\n else handle(data);\n };\n tw.addEventListener('message', onThreadMessage);\n tw.addEventListener('error', onError);\n threads.set(thread.tid, () => {\n tw.removeEventListener('message', onThreadMessage);\n tw.removeEventListener('error', onError);\n tresponder.dispose();\n tw.terminate();\n });\n const tinit: WasmThreadInitMsg = {\n type: WASM_THREAD_INIT,\n pid: opts.shownPid ?? opts.pid,\n program,\n argv0: opts.argv0,\n args: opts.args,\n env: opts.env,\n cwd: opts.cwd,\n sab: tsab,\n ...(opts.ppid !== undefined ? { ppid: opts.ppid } : {}),\n thread,\n };\n tw.postMessage(tinit);\n };\n\n worker.postMessage(\n processInit(opts, sab, process.umask, lane?.lane),\n transferOf(opts, lane?.lane)\n );\n\n const signal = (sig: number): void => {\n if (process.signal(sig) !== 'terminate') return;\n const code = sig === SIG.KILL ? 137 : 128 + sig;\n if (opts.program.abi !== 'wasi' || done) finish(code, sig);\n else dying.start(code, sig, header, process, () => finish(code, sig));\n };\n const kill = (code = 137): void =>\n finish(code, code > 128 && code < 160 ? code - 128 : undefined);\n return {\n pid: opts.pid,\n exited,\n kill,\n signal,\n termsig: () => endedBy,\n onState: (listener) => process.onState(listener),\n memory: () => Atomics.load(header, SAB_I_MEMORY) * 65536,\n ignoredSignals: (fork) => process.inheritable(fork),\n umask: () => process.umask,\n writesBack: () => opts.program.abi === 'wasi' && !done,\n };\n}\n", "import { KernelError } from './fd-table.ts';\nimport type { KernelTty } from './tty.ts';\n\nexport interface JobMember {\n pid: number;\n pgid: number;\n sid: number;\n\n signal(sig: number): void;\n\n execParent?: number;\n\n ppid?: number;\n\n execed?: boolean;\n\n shownAs?: number;\n}\n\nexport class JobTable {\n private readonly members = new Map<number, JobMember>();\n private readonly foreground = new Map<KernelTty, number>();\n\n private readonly terminals = new Map<number, KernelTty>();\n\n add(\n pid: number,\n parentPid: number | undefined,\n signal: (sig: number) => void,\n terminal?: KernelTty\n ): JobMember {\n const parent = parentPid === undefined ? undefined : this.members.get(parentPid);\n if (!parent && terminal) this.terminals.set(pid, terminal);\n const member: JobMember = {\n pid,\n ppid: parent?.pid,\n pgid: parent?.pgid ?? pid,\n sid: parent?.sid ?? pid,\n signal,\n };\n this.members.set(pid, member);\n return member;\n }\n\n list(): JobMember[] {\n return [...this.members.values()];\n }\n\n remove(pid: number): void {\n this.members.delete(pid);\n }\n\n exec(pid: number, child: number, adopt = false): void {\n const member = this.members.get(child);\n if (member && adopt) member.shownAs = this.shown(pid);\n if (member) member.execParent = pid;\n const execer = this.members.get(pid);\n if (execer) execer.execed = true;\n }\n\n shown(pid: number): number {\n let member = this.members.get(pid);\n for (let up = member; up; up = this.members.get(up.execParent ?? -1)) member = up;\n return member?.pid ?? pid;\n }\n\n shownParent(pid: number): number | undefined {\n const parent = this.members.get(this.shown(pid))?.ppid;\n return parent === undefined ? undefined : this.shown(parent);\n }\n\n sessionOf(pgid: number): number | undefined {\n for (const member of this.members.values()) if (member.pgid === pgid) return member.sid;\n return undefined;\n }\n\n join(pid: number, pgid: number): void {\n const sid = this.sessionOf(pgid);\n if (sid === undefined) throw new KernelError('ESRCH');\n const member = this.member(pid);\n member.pgid = pgid;\n member.sid = sid;\n }\n\n pgidOf(pid: number): number | undefined {\n return this.members.get(pid)?.pgid;\n }\n\n private member(pid: number): JobMember {\n const member = this.members.get(pid);\n if (!member) throw new KernelError('ESRCH');\n return member;\n }\n\n private idOf(pid: number): number {\n return this.members.get(pid)?.shownAs ?? pid;\n }\n\n private byId(id: number): JobMember {\n for (const member of this.members.values()) if (member.shownAs === id) return member;\n return this.member(id);\n }\n\n setpgid(caller: number, pid: number, pgid: number): void {\n const me = this.idOf(caller);\n const target = this.byId(pid || me);\n const id = this.idOf(target.pid);\n const group = pgid || id;\n if (group < 0) throw new KernelError('EINVAL');\n const self = this.member(caller);\n if (id !== me) {\n if (target.ppid === undefined || this.idOf(target.ppid) !== me) {\n throw new KernelError('ESRCH');\n }\n if (target.execed) throw new KernelError('EACCES');\n }\n if (target.sid !== self.sid) throw new KernelError('EPERM');\n if (id === target.sid) throw new KernelError('EPERM');\n\n const exists = [...this.members.values()].some((m) => m.pgid === group && m.sid === target.sid);\n if (group !== id && !exists) throw new KernelError('EPERM');\n target.pgid = group;\n }\n\n getpgid(caller: number, pid: number): number {\n return this.byId(pid || this.idOf(caller)).pgid;\n }\n\n getsid(caller: number, pid: number): number {\n return this.byId(pid || this.idOf(caller)).sid;\n }\n\n setsid(pid: number): number {\n const member = this.member(pid);\n const id = this.idOf(pid);\n if (member.pgid === id) throw new KernelError('EPERM');\n member.sid = id;\n member.pgid = id;\n this.terminals.delete(id);\n return id;\n }\n\n terminalNamed(name: string): KernelTty | undefined {\n return this.knownTerminals().find((tty) => tty.name === name);\n }\n\n terminalNames(): string[] {\n return this.knownTerminals().flatMap((tty) => (tty.name ? [tty.name] : []));\n }\n\n private knownTerminals(): KernelTty[] {\n return [...new Set([...this.terminals.values(), ...this.foreground.keys()])];\n }\n\n controllingTerminal(pid: number): KernelTty | null | undefined {\n const member = this.members.get(pid);\n return member && (this.terminals.get(member.sid) ?? null);\n }\n\n acquireTerminal(pid: number, tty: KernelTty): boolean {\n const member = this.members.get(pid);\n const id = this.idOf(pid);\n if (!member || member.sid !== id || this.terminals.has(id)) return false;\n if ([...this.terminals.values()].includes(tty)) return false;\n this.terminals.set(id, tty);\n this.foreground.set(tty, member.pgid);\n return true;\n }\n\n killGroup(pgid: number, sig: number): boolean {\n const targets = [...this.members.values()].filter((m) => m.pgid === pgid);\n const pids = new Set(targets.map((m) => m.pid));\n if (sig !== 0) {\n for (const m of targets)\n if (m.execParent === undefined || !pids.has(m.execParent)) m.signal(sig);\n }\n return targets.length > 0;\n }\n\n tcgetpgrp(tty: KernelTty, fallback: number): number {\n return this.foreground.get(tty) ?? fallback;\n }\n\n tcsetpgrp(caller: number, tty: KernelTty, pgid: number): void {\n const self = this.member(caller);\n const inSession = [...this.members.values()].some((m) => m.pgid === pgid && m.sid === self.sid);\n if (!inSession) throw new KernelError('EPERM');\n this.foreground.set(tty, pgid);\n }\n\n signalOwnedForeground(tty: KernelTty, sig: number): void {\n const pgid = this.foreground.get(tty);\n if (pgid !== undefined) this.killGroup(pgid, sig);\n }\n\n signalForeground(tty: KernelTty, fallback: number, sig: number): void {\n this.killGroup(this.tcgetpgrp(tty, fallback), sig);\n }\n}\n", "const SETUP_OPS = new Set([\n 'proc-list',\n 'proc-identity',\n 'fd-info',\n 'sig-mask',\n 'proc-setpgid',\n 'tty-pgrp-set',\n 'proc-exec',\n 'proc-spawn',\n]);\n\nexport const SETTLE_MS = 2000;\n\nconst KEY_SIGNALS = new Set([2, 3, 20]);\n\ninterface Held {\n pgid: number;\n send: () => void;\n copy?: boolean;\n}\n\nexport class SettlingChildren {\n private readonly children = new Map<\n number,\n { ppid: number; execer?: number; timer?: ReturnType<typeof setTimeout> }\n >();\n private held: Held[] = [];\n private parked: Held[] = [];\n private readonly pgidOf: (pid: number) => number | undefined;\n private readonly settleMs: number;\n\n constructor(pgidOf: (pid: number) => number | undefined, settleMs = SETTLE_MS) {\n this.pgidOf = pgidOf;\n this.settleMs = settleMs;\n }\n\n started(pid: number, ppid: number): void {\n const parent = this.children.get(ppid);\n this.children.set(pid, parent ? { ppid: parent.ppid, execer: ppid } : { ppid });\n const group = this.pgidOf(ppid);\n for (const p of this.parked) if (p.pgid === group) this.held.push({ ...p, copy: true });\n this.parked = this.parked.filter((p) => p.pgid !== group);\n }\n\n reading(pgid: number): void {\n this.parked = this.parked.filter((p) => p.pgid !== pgid);\n this.held = this.held.filter((h) => !(h.copy && h.pgid === pgid));\n }\n\n syscall(pid: number, op: string): void {\n const child = this.children.get(pid);\n if (!child) return;\n if (!SETUP_OPS.has(op)) {\n this.settled(pid);\n return;\n }\n child.timer ??= setTimeout(() => this.settled(pid), this.settleMs);\n }\n\n settled(pid: number): void {\n const child = this.children.get(pid);\n if (!child) return;\n clearTimeout(child.timer);\n this.children.delete(pid);\n if (child.execer !== undefined) this.settled(child.execer);\n const ready = this.held.filter((h) => !this.blocking(h.pgid));\n this.held = this.held.filter((h) => this.blocking(h.pgid));\n for (const h of ready) h.send();\n }\n\n deliver(sig: number, pgid: number, send: () => void, foreground?: () => number): void {\n if (!KEY_SIGNALS.has(sig)) {\n send();\n } else if (this.blocking(pgid)) {\n this.held.push({ pgid, send });\n } else if (foreground) {\n send();\n const moved = () => {\n if (foreground() !== pgid) send();\n };\n this.parked.push({ pgid, send: moved });\n } else {\n send();\n }\n }\n\n private blocking(pgid: number): boolean {\n for (const { ppid } of this.children.values()) if (this.pgidOf(ppid) === pgid) return true;\n return false;\n }\n}\n", "import {\n DRIVER_PROTOCOL,\n type DriverAttr,\n type DriverCapabilities,\n type DriverEntry,\n type DriverRequest,\n type DriverStatfs,\n driverVersionError,\n type KernelDriverHello,\n type MountRequestInfo,\n} from './protocol.ts';\n\nexport type {\n DriverAttr,\n DriverCapabilities,\n DriverEntry,\n DriverStatfs,\n MountRequestInfo,\n} from './protocol.ts';\n\nexport interface OpenFlags {\n write: boolean;\n create: boolean;\n truncate: boolean;\n exclusive: boolean;\n ifMatch?: string;\n}\n\nexport interface FilesystemHandlers {\n mount?(\n info: MountRequestInfo\n ): Promise<DriverCapabilities | undefined> | DriverCapabilities | undefined;\n getattr(path: string): Promise<DriverAttr>;\n readdir(path: string): Promise<DriverEntry[]>;\n open(path: string, flags: OpenFlags): Promise<number>;\n read(fh: number, offset: number, size: number): Promise<Uint8Array>;\n write(fh: number, offset: number, bytes: Uint8Array): Promise<void>;\n release(fh: number): Promise<void>;\n mkdir(path: string): Promise<void>;\n rmdir(path: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n symlink?(target: string, path: string): Promise<void>;\n readlink?(path: string): Promise<string>;\n setattr?(path: string, attr: { mode?: number; mtime?: number; size?: number }): Promise<void>;\n statfs?(): Promise<DriverStatfs>;\n}\n\nexport interface DriverPort {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n}\n\nexport interface ServedFilesystem {\n invalidate(paths: string[] | true): void;\n}\n\nexport function fsError(code: string, message = code): Error & { code: string } {\n return Object.assign(new Error(message), { code });\n}\n\nasync function dispatch(h: FilesystemHandlers, req: DriverRequest): Promise<unknown> {\n switch (req.op) {\n case 'getattr':\n return h.getattr(req.path);\n case 'readdir':\n return h.readdir(req.path);\n case 'open':\n return h.open(req.path, {\n write: req.write,\n create: req.create,\n truncate: req.truncate,\n exclusive: req.exclusive,\n ...(req.ifMatch !== undefined ? { ifMatch: req.ifMatch } : {}),\n });\n case 'read':\n return h.read(req.fh, req.offset, req.size);\n case 'write':\n return h.write(req.fh, req.offset, req.bytes);\n case 'release':\n return h.release(req.fh);\n case 'mkdir':\n return h.mkdir(req.path);\n case 'rmdir':\n return h.rmdir(req.path);\n case 'unlink':\n return h.unlink(req.path);\n case 'rename':\n return h.rename(req.from, req.to);\n case 'symlink':\n if (!h.symlink) throw fsError('EPERM', 'this file system has no symlinks');\n return h.symlink(req.target, req.path);\n case 'readlink':\n if (!h.readlink) throw fsError('EINVAL', `${req.path} is not a symlink`);\n return h.readlink(req.path);\n case 'setattr':\n return h.setattr?.(req.path, {\n ...(req.mode !== undefined ? { mode: req.mode } : {}),\n ...(req.mtime !== undefined ? { mtime: req.mtime } : {}),\n ...(req.size !== undefined ? { size: req.size } : {}),\n });\n case 'statfs':\n return h.statfs?.() ?? null;\n default:\n throw fsError('ENOSYS', `unknown driver op ${(req as { op: string }).op}`);\n }\n}\n\nexport function serveFilesystem(\n port: DriverPort,\n handlers: FilesystemHandlers,\n capabilities: DriverCapabilities = {},\n options: { owned?: boolean } = {}\n): ServedFilesystem {\n let open = false;\n const reply = (message: object, transfer: Transferable[] = []) =>\n port.postMessage(message, transfer);\n async function hello(message: KernelDriverHello): Promise<void> {\n const refused = driverVersionError(message.protocol);\n if (refused) {\n reply({ hello: { protocol: DRIVER_PROTOCOL, error: refused, errno: 'EPROTO' } });\n return;\n }\n try {\n const refined = await handlers.mount?.(message.mount);\n open = true;\n reply({\n hello: { protocol: DRIVER_PROTOCOL, capabilities: { ...capabilities, ...refined } },\n });\n } catch (err) {\n const code = (err as { code?: unknown })?.code;\n reply({\n hello: {\n protocol: DRIVER_PROTOCOL,\n error: err instanceof Error ? err.message : String(err),\n errno: typeof code === 'string' ? code : 'EIO',\n },\n });\n }\n }\n port.addEventListener('message', (event) => {\n const data = event.data as { hello?: KernelDriverHello } & DriverRequest;\n if (data.hello) {\n void hello(data.hello);\n return;\n }\n if (!open) return;\n dispatch(handlers, data).then(\n (result) => {\n if (result instanceof Uint8Array) {\n const whole = result.byteOffset === 0 && result.byteLength === result.buffer.byteLength;\n const bytes = options.owned && whole ? result : result.slice();\n reply({ id: data.id, result: bytes }, [bytes.buffer]);\n } else reply({ id: data.id, result: result ?? null });\n },\n (err: unknown) => {\n const code = (err as { code?: unknown })?.code;\n reply({\n id: data.id,\n errno: typeof code === 'string' ? code : 'EIO',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n );\n });\n port.start?.();\n return { invalidate: (paths) => reply({ invalidate: paths }) };\n}\n", "import { type FilesystemHandlers, fsError } from './driver.ts';\nimport type { DriverAttr, DriverStatfs } from './protocol.ts';\n\nexport type MediumHandlers = Required<Omit<FilesystemHandlers, 'mount' | 'statfs'>> &\n Pick<FilesystemHandlers, 'statfs'>;\n\nexport interface MediumSlot<K> {\n readonly handlers: FilesystemHandlers;\n present(): boolean;\n insert(key: K, handlers: MediumHandlers): void;\n eject(): void;\n}\n\nconst EMPTY_ROOT: DriverAttr = { kind: 'directory', size: 0, mtime: 0, mode: 0o40755 };\n\nexport const absent = () => fsError('ENOMEDIUM', 'No medium found');\n\nexport function mediumSlot<K>(\n lost: (err: unknown, key: K) => Promise<boolean>,\n onLost: (key: K) => void\n): MediumSlot<K> {\n let current: { key: K; handlers: MediumHandlers } | undefined;\n function wrap<A extends unknown[], R>(\n pick: (h: MediumHandlers) => (...args: A) => Promise<R>\n ): (...args: A) => Promise<R> {\n return async (...args) => {\n const medium = current;\n if (!medium) throw absent();\n try {\n return await pick(medium.handlers)(...args);\n } catch (err) {\n if (!(await lost(err, medium.key))) throw err;\n if (current === medium) {\n current = undefined;\n onLost(medium.key);\n }\n throw absent();\n }\n };\n }\n const getattr = wrap((h) => h.getattr);\n const readdir = wrap((h) => h.readdir);\n const statfs = wrap((h) => async () => (await h.statfs?.()) ?? null);\n return {\n handlers: {\n getattr: (path) => (current || path !== '/' ? getattr(path) : Promise.resolve(EMPTY_ROOT)),\n readdir: (path) => (current || path !== '/' ? readdir(path) : Promise.resolve([])),\n open: wrap((h) => h.open),\n read: wrap((h) => h.read),\n write: wrap((h) => h.write),\n release: wrap((h) => h.release),\n mkdir: wrap((h) => h.mkdir),\n rmdir: wrap((h) => h.rmdir),\n unlink: wrap((h) => h.unlink),\n rename: wrap((h) => h.rename),\n symlink: wrap((h) => h.symlink),\n readlink: wrap((h) => h.readlink),\n setattr: wrap((h) => h.setattr),\n statfs: () => (current ? statfs() : Promise.resolve(null)) as Promise<DriverStatfs>,\n },\n present: () => current !== undefined,\n insert(key, handlers) {\n current = { key, handlers };\n },\n eject() {\n current = undefined;\n },\n };\n}\n", "import { OpfsFs, type WriteSession } from '../fs/opfs.ts';\nimport type { FsStat, KernelFs } from '../fs/types.ts';\nimport { type FilesystemHandlers, fsError, type OpenFlags } from './driver.ts';\nimport { mediumSlot } from './medium.ts';\nimport type { DriverAttr, DriverCapabilities, DriverEntry } from './protocol.ts';\n\nexport const FSA_CAPABILITIES: DriverCapabilities = {\n listingStats: true,\n ranges: true,\n sessions: true,\n};\n\nexport interface PermissionHandle {\n queryPermission?(descriptor: { mode: 'read' | 'readwrite' }): Promise<PermissionState>;\n requestPermission?(descriptor: { mode: 'read' | 'readwrite' }): Promise<PermissionState>;\n}\n\nexport type MediumHandle = FileSystemDirectoryHandle & PermissionHandle;\n\ntype Handlers = Required<Omit<FilesystemHandlers, 'mount' | 'statfs'>>;\n\nexport type SessionFs = KernelFs & Pick<OpfsFs, 'writeSession' | 'pread'>;\n\ninterface Opened {\n path: string;\n session?: Promise<WriteSession>;\n}\n\nconst codeOf = (err: unknown) => (err as { code?: unknown } | null)?.code;\nconst denied = (err: unknown) =>\n codeOf(err) === 'EACCES' || (err as { name?: unknown } | null)?.name === 'NotAllowedError';\n\nfunction attrOf(st: FsStat): DriverAttr {\n return {\n kind: st.isDirectory ? 'directory' : st.isSymbolicLink ? 'symlink' : 'file',\n size: st.size,\n mtime: st.mtime.getTime(),\n mode: st.mode,\n ino: st.ino,\n };\n}\n\nexport function kernelFsHandlers(fs: SessionFs): Handlers {\n const handles = new Map<number, Opened>();\n let nextFh = 0;\n const handle = (fh: number): Opened => {\n const found = handles.get(fh);\n if (!found) throw fsError('EBADF', `handle ${fh}`);\n return found;\n };\n async function existing(path: string): Promise<FsStat | undefined> {\n try {\n return await fs.stat(path);\n } catch (err) {\n if (codeOf(err) === 'ENOENT') return undefined;\n throw err;\n }\n }\n return {\n getattr: async (path) => attrOf(await fs.lstat(path)),\n readdir: async (path) =>\n (await fs.readdirStat(path)).flatMap(([name, st]): DriverEntry[] => {\n if (!st) return [];\n const attr = attrOf(st);\n return [{ name, kind: attr.kind, attr }];\n }),\n async open(path: string, flags: OpenFlags) {\n const st = await existing(path);\n if (st && flags.exclusive) throw fsError('EEXIST', path);\n if (st?.isDirectory && flags.write) throw fsError('EISDIR', path);\n if (!st && !flags.create) throw fsError('ENOENT', path);\n if (!st || flags.truncate) await fs.writeFile(path, new Uint8Array(0));\n handles.set(++nextFh, { path });\n return nextFh;\n },\n read: async (fh, offset, size) => fs.pread(handle(fh).path, offset, size),\n async write(fh, offset, bytes) {\n const h = handle(fh);\n h.session ??= fs.writeSession(h.path, false);\n await (await h.session).write(offset, bytes);\n },\n async release(fh) {\n const h = handle(fh);\n handles.delete(fh);\n if (h.session !== undefined) await (await h.session).close();\n },\n mkdir: (path) => fs.mkdir(path),\n async rmdir(path) {\n if (!(await fs.lstat(path)).isDirectory) throw fsError('ENOTDIR', path);\n if ((await fs.readdir(path)).length > 0) throw fsError('ENOTEMPTY', path);\n await fs.rm(path);\n },\n async unlink(path) {\n if ((await fs.lstat(path)).isDirectory) throw fsError('EISDIR', path);\n await fs.rm(path);\n },\n rename: (from, to) => fs.rename(from, to),\n symlink: (target, path) => fs.symlink(target, path),\n readlink: (path) => fs.readlink(path),\n async setattr(path, change) {\n if (change.size !== undefined) {\n const open = [...handles.values()].find(\n (h) => h.path === path && h.session !== undefined\n )?.session;\n if (open !== undefined) await (await open).truncate(change.size);\n else await fs.truncate?.(path, change.size);\n }\n if (change.mode !== undefined) await fs.chmod(path, change.mode);\n if (change.mtime !== undefined) {\n await fs.utimes(path, new Date(change.mtime), new Date(change.mtime));\n }\n },\n };\n}\n\nexport interface Medium {\n readonly handlers: FilesystemHandlers;\n present(): boolean;\n insert(handle: MediumHandle): void;\n eject(): void;\n}\n\nexport function granted(handle: PermissionHandle): Promise<boolean> {\n if (!handle.queryPermission) return Promise.resolve(true);\n return handle.queryPermission({ mode: 'readwrite' }).then(\n (state) => state === 'granted',\n () => false\n );\n}\n\nexport function removableMedium(\n onLost: (handle: MediumHandle) => void,\n open: (handle: MediumHandle) => SessionFs = (handle) => new OpfsFs(handle)\n): Medium {\n const slot = mediumSlot<MediumHandle>(\n async (err, handle) => denied(err) && !(await granted(handle)),\n onLost\n );\n return {\n handlers: slot.handlers,\n present: slot.present,\n insert: (handle) => slot.insert(handle, kernelFsHandlers(open(handle))),\n eject: slot.eject,\n };\n}\n", "import { normalizePath } from '../fs/types.ts';\nimport { errnoError } from './connection.ts';\nimport { type MountSpec, parseSize } from './mount-fs.ts';\n\nexport const MS_RDONLY = 1;\nconst MS_MGC_MSK = 0xffff0000;\nconst MS_MGC_VAL = 0xc0ed0000;\n\nconst IGNORED_FLAGS =\n 2 | 4 | 8 | 16 | 128 | 1024 | 2048 | 32768 | (1 << 21) | (1 << 24) | (1 << 25);\n\nexport const MNT_FORCE = 1;\nexport const MNT_DETACH = 2;\nconst UMOUNT_NOFOLLOW = 8;\n\nconst GENERIC = new Set([\n 'defaults',\n 'async',\n 'sync',\n 'dirsync',\n 'atime',\n 'noatime',\n 'diratime',\n 'nodiratime',\n 'relatime',\n 'norelatime',\n 'strictatime',\n 'nostrictatime',\n 'lazytime',\n 'nolazytime',\n 'suid',\n 'nosuid',\n 'dev',\n 'nodev',\n 'exec',\n 'noexec',\n 'auto',\n 'noauto',\n 'user',\n 'nouser',\n 'users',\n 'nofail',\n '_netdev',\n 'silent',\n 'loud',\n]);\n\nexport interface MountCall {\n source: string;\n target: string;\n type: string;\n flags: number;\n data: string;\n}\n\nexport interface ProcessMountRequest {\n op: 'mount' | 'umount';\n pid: number;\n target: string;\n type?: string;\n source?: string;\n options?: Record<string, string>;\n}\n\nexport type ProcessMountPolicy =\n | boolean\n | ((req: ProcessMountRequest) => boolean | Promise<boolean>);\n\nexport function parseMountOptions(data: string): Record<string, string> {\n const options: Record<string, string> = {};\n for (const raw of data.split(',')) {\n const item = raw.trim();\n if (!item || GENERIC.has(item)) continue;\n if (item === 'rw') {\n delete options.ro;\n continue;\n }\n const eq = item.indexOf('=');\n if (eq === 0) throw errnoError('EINVAL', `bad mount option ${item}`);\n if (eq < 0) options[item] = '';\n else options[item.slice(0, eq)] = item.slice(eq + 1);\n }\n if (options.maxfile !== undefined) parseSize(options.maxfile);\n return options;\n}\n\nexport function refusedTarget(target: string): void {\n const at = normalizePath(target);\n const kernel = at === '/' || [`/proc`, `/dev`].some((k) => at === k || at.startsWith(`${k}/`));\n if (kernel) throw errnoError('EBUSY', `${at} belongs to the kernel`);\n}\n\nfunction absolute(target: string): string {\n if (!target) throw errnoError('ENOENT', 'no mount point');\n if (!target.startsWith('/')) throw errnoError('EINVAL', `not an absolute path: ${target}`);\n return normalizePath(target);\n}\n\nexport function mountCall(call: MountCall): MountSpec {\n let flags = call.flags >>> 0;\n if ((flags & MS_MGC_MSK) >>> 0 === MS_MGC_VAL) flags &= ~MS_MGC_MSK;\n if (flags & ~(MS_RDONLY | IGNORED_FLAGS)) {\n throw errnoError('EINVAL', `unsupported mount flags ${flags.toString(16)}`);\n }\n if (!call.type) throw errnoError('EINVAL', 'no file system type');\n const target = absolute(call.target);\n refusedTarget(target);\n const options = parseMountOptions(call.data);\n if (flags & MS_RDONLY) options.ro = '';\n return { type: call.type, source: call.source || 'none', target, options };\n}\n\nexport function umountCall(target: string, flags: number): { target: string; detach: boolean } {\n const known = MNT_FORCE | MNT_DETACH | UMOUNT_NOFOLLOW;\n if ((flags >>> 0) & ~known) throw errnoError('EINVAL', `unsupported umount flags ${flags}`);\n const at = absolute(target);\n refusedTarget(at);\n return { target: at, detach: (flags & (MNT_FORCE | MNT_DETACH)) !== 0 };\n}\n", "import type { MountEntry, MountSpec } from './mount-fs.ts';\nimport { parseMountOptions } from './syscall.ts';\n\nexport const FSTAB_PATH = '/etc/fstab';\n\nexport const FSTAB_RETRIES = [1000, 4000, 16000];\n\nconst FINAL = new Set(['EINVAL', 'EBUSY', 'EPERM', 'EACCES']);\n\nexport interface FstabLine {\n line: number;\n spec: MountSpec;\n invalid?: Error;\n}\n\nexport interface FstabResult {\n line: number;\n target: string;\n entry?: MountEntry;\n code?: string;\n error?: string;\n}\n\nfunction unescape(field: string): string {\n return field.replace(/\\\\([0-7]{3})/g, (_, octal: string) =>\n String.fromCharCode(Number.parseInt(octal, 8))\n );\n}\n\nexport function parseFstab(text: string): FstabLine[] {\n const lines: FstabLine[] = [];\n text.split('\\n').forEach((raw, index) => {\n const content = raw.replace(/#.*$/, '').trim();\n if (!content) return;\n const [source, target, type, options = 'defaults'] = content.split(/\\s+/).map(unescape);\n if (source === undefined || target === undefined || type === undefined) return;\n if (options.split(',').includes('noauto')) return;\n const spec = { source, target, type, options: {} };\n try {\n lines.push({ line: index + 1, spec: { ...spec, options: parseMountOptions(options) } });\n } catch (err) {\n lines.push({ line: index + 1, spec, invalid: err as Error });\n }\n });\n return lines;\n}\n\nfunction codeOf(err: unknown): string {\n const code = (err as { code?: unknown } | null)?.code;\n return typeof code === 'string' ? code : 'EIO';\n}\n\nfunction wait(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', done, { once: true });\n });\n}\n\nexport async function mountFstab(\n lines: readonly FstabLine[],\n mount: (spec: MountSpec) => Promise<MountEntry>,\n signal: AbortSignal,\n retries: readonly number[] = FSTAB_RETRIES,\n discard: (entry: MountEntry) => void = () => {},\n settled: (line: FstabLine, result: FstabResult) => void = () => {}\n): Promise<FstabResult[]> {\n return Promise.all(\n lines.map(async (each) => {\n const result = await mountLine(each, mount, signal, retries, discard);\n settled(each, result);\n return result;\n })\n );\n}\n\nasync function mountLine(\n { line, spec, invalid }: FstabLine,\n mount: (spec: MountSpec) => Promise<MountEntry>,\n signal: AbortSignal,\n retries: readonly number[],\n discard: (entry: MountEntry) => void\n): Promise<FstabResult> {\n let failed: unknown = invalid;\n for (let attempt = 0; !invalid && attempt <= retries.length && !signal.aborted; attempt++) {\n try {\n const entry = await mount(spec);\n if (!signal.aborted) return { line, target: spec.target, entry };\n discard(entry);\n failed = Object.assign(new Error('the kernel stopped'), { code: 'ECANCELED' });\n break;\n } catch (err) {\n failed = err;\n if (FINAL.has(codeOf(err)) || attempt === retries.length) break;\n await wait(retries[attempt] as number, signal);\n }\n }\n const code = codeOf(failed);\n return { line, target: spec.target, code, error: String((failed as Error)?.message ?? code) };\n}\n", "import { type FilesystemHandlers, fsError, type OpenFlags, serveFilesystem } from './driver.ts';\nimport { type MediumHandlers, mediumSlot } from './medium.ts';\nimport type { MountSpec, OpenedDriver } from './mount-fs.ts';\nimport type { DriverAttr, DriverCapabilities, DriverEntry, DriverStatfs } from './protocol.ts';\n\nexport interface HostfsGrant {\n url: string;\n token: string;\n readonly?: boolean;\n capabilities?: DriverCapabilities;\n}\n\nexport type HostfsGrantHook = (\n source: string,\n options: { readonly: boolean }\n) => Promise<HostfsGrant>;\n\nexport type FetchLike = (url: string, init: RequestInit) => Promise<Response>;\n\nexport interface HostfsEvent {\n paths?: string[];\n all?: boolean;\n ping?: number;\n}\n\nexport const HOSTFS_IO = 16 * 1024 * 1024;\n\nconst codeOf = (err: unknown) => (err as { code?: unknown } | null)?.code;\n\nexport const unreachable = (err: unknown) => codeOf(err) === 'ENOTCONN';\n\nfunction rel(path: string): string {\n return path.replace(/^\\/+/, '');\n}\n\nexport class HostfsClient {\n private grant: HostfsGrant;\n private readonly regrant: () => Promise<HostfsGrant>;\n private readonly fetch: FetchLike;\n\n constructor(grant: HostfsGrant, regrant: () => Promise<HostfsGrant>, fetch: FetchLike) {\n this.grant = grant;\n this.regrant = regrant;\n this.fetch = fetch;\n }\n\n get capabilities(): DriverCapabilities {\n return this.grant.capabilities ?? {};\n }\n\n get token(): string {\n return this.grant.token;\n }\n\n get maxIo(): number {\n return this.capabilities.maxIo ?? HOSTFS_IO;\n }\n\n private async send(\n path: string,\n init: RequestInit,\n handle = false,\n retried = false\n ): Promise<Response> {\n let response: Response;\n try {\n response = await this.fetch(`${this.grant.url}${path}`, {\n ...init,\n credentials: 'omit',\n headers: {\n ...(init.headers as Record<string, string>),\n 'X-Hostfs-Token': this.grant.token,\n },\n });\n } catch (err) {\n throw fsError('ENOTCONN', `the host proxy is unreachable: ${(err as Error).message}`);\n }\n if (response.ok) return response;\n if (response.headers.get('X-Proxy-Error')) {\n await response.body?.cancel();\n if (retried || response.status !== 403) {\n throw fsError('EACCES', `the host proxy refused this folder (${response.status})`);\n }\n this.grant = await this.regrant();\n if (handle)\n throw fsError('ESTALE', 'the folder was granted again, so its open files are gone');\n return this.send(path, init, false, true);\n }\n const errno = response.headers.get('X-Hostfs-Errno') ?? 'EIO';\n const body = (await response.json().catch(() => ({}))) as { message?: unknown };\n throw fsError(errno, typeof body.message === 'string' ? body.message : errno);\n }\n\n async call<T>(op: string, body: Record<string, unknown> = {}, handle = false): Promise<T> {\n const response = await this.send(\n '/api/hostfs',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ op, ...body }),\n },\n handle\n );\n return (await response.json()) as T;\n }\n\n async read(fh: number, offset: number, size: number, ifMatch?: string): Promise<Uint8Array> {\n const response = await this.send(\n '/api/hostfs',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ op: 'read', fh, offset, size, ...(ifMatch ? { ifMatch } : {}) }),\n },\n true\n );\n return new Uint8Array(await response.arrayBuffer());\n }\n\n async write(fh: number, offset: number, bytes: Uint8Array): Promise<void> {\n const response = await this.send(\n '/api/hostfs/write',\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'X-Hostfs-Request': JSON.stringify({ fh, offset }),\n },\n body: bytes as BodyInit,\n },\n true\n );\n await response.body?.cancel();\n }\n\n async watch(\n signal: AbortSignal,\n onEvent: (event: HostfsEvent) => void,\n onOpen: () => void = () => undefined\n ): Promise<void> {\n const response = await this.send('/api/hostfs/watch', { method: 'POST', signal });\n onOpen();\n const reader = (response.body as ReadableStream<Uint8Array>).getReader();\n const decoder = new TextDecoder();\n let buffered = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) return;\n buffered += decoder.decode(value, { stream: true });\n let end = buffered.indexOf('\\n');\n while (end >= 0) {\n const line = buffered.slice(0, end).trim();\n buffered = buffered.slice(end + 1);\n if (line) onEvent(JSON.parse(line) as HostfsEvent);\n end = buffered.indexOf('\\n');\n }\n }\n } catch (err) {\n if (signal.aborted) return;\n throw fsError('ENOTCONN', `the host proxy's watch broke: ${(err as Error).message}`);\n } finally {\n reader.releaseLock();\n }\n }\n}\n\ninterface Remote {\n client: HostfsClient;\n token: string;\n fh: number;\n etag: string | undefined;\n restore: { path: string; mode: number } | undefined;\n}\n\nexport function hostfsHandlers(current: () => HostfsClient): MediumHandlers {\n const handles = new Map<number, Remote>();\n let nextFh = 0;\n const fresh = (remote: Remote): Remote => {\n if (remote.client.token === remote.token) return remote;\n throw fsError('ESTALE', 'the folder was granted again, so this open file is gone');\n };\n const live = (fh: number): Remote => {\n const remote = handles.get(fh);\n if (!remote) throw fsError('EBADF', `handle ${fh}`);\n return fresh(remote);\n };\n const call = <T>(op: string, body: Record<string, unknown> = {}) => current().call<T>(op, body);\n async function writable(client: HostfsClient, path: string, flags: OpenFlags) {\n const { ifMatch: _, ...asked } = flags;\n const opening = () =>\n client.call<{ fh: number; attr?: DriverAttr }>('open', { path: rel(path), ...asked });\n try {\n return { opened: await opening(), restore: undefined };\n } catch (err) {\n if (!flags.write || codeOf(err) !== 'EACCES') throw err;\n const mode = (await client.call<DriverAttr>('stat', { path: rel(path) })).mode ?? 0;\n if (mode & 0o200) throw err;\n const restore = { path: rel(path), mode };\n await client.call('setattr', { path: rel(path), mode: mode | 0o200 });\n const opened = await opening().catch(async (again: unknown) => {\n await client.call('setattr', restore);\n throw again;\n });\n return { opened, restore };\n }\n }\n const handlers: MediumHandlers = {\n getattr: async (path) => await call<DriverAttr>('stat', { path: rel(path) }),\n async readdir(path) {\n const { entries } = await call<{ entries: Array<{ name: string; attr: DriverAttr }> }>(\n 'list',\n { path: rel(path) }\n );\n return entries.map(({ name, attr }): DriverEntry => ({ name, kind: attr.kind, attr }));\n },\n async open(path: string, flags: OpenFlags) {\n const client = current();\n const token = client.token;\n const { opened, restore } = await writable(client, path, flags);\n if (flags.ifMatch !== undefined && opened.attr?.etag !== flags.ifMatch) {\n await client.call('release', { fh: opened.fh }, true);\n throw fsError('ESTALE', `${path} changed on the host while it was being read`);\n }\n handles.set(++nextFh, {\n client,\n token,\n fh: opened.fh,\n etag: flags.write ? undefined : opened.attr?.etag,\n restore,\n });\n return nextFh;\n },\n async read(fh, offset, size) {\n const remote = live(fh);\n return remote.client.read(\n remote.fh,\n offset,\n Math.min(size, remote.client.maxIo),\n remote.etag\n );\n },\n async write(fh, offset, bytes) {\n const remote = live(fh);\n const most = remote.client.maxIo;\n for (let at = 0; at < bytes.length; at += most) {\n await remote.client.write(remote.fh, offset + at, bytes.subarray(at, at + most));\n }\n },\n async release(fh) {\n const remote = handles.get(fh);\n if (!remote) throw fsError('EBADF', `handle ${fh}`);\n handles.delete(fh);\n try {\n await fresh(remote).client.call('release', { fh: remote.fh }, true);\n } finally {\n if (remote.restore) await current().call('setattr', remote.restore);\n }\n },\n mkdir: async (path) => void (await call('mkdir', { path: rel(path) })),\n rmdir: async (path) => void (await call('rmdir', { path: rel(path) })),\n unlink: async (path) => void (await call('unlink', { path: rel(path) })),\n rename: async (from, to) => void (await call('rename', { from: rel(from), to: rel(to) })),\n symlink: async (target, path) => void (await call('symlink', { target, path: rel(path) })),\n readlink: async (path) =>\n (await call<{ target: string }>('readlink', { path: rel(path) })).target,\n async setattr(path, { size, ...change }) {\n if (size !== undefined && !current().capabilities.ranges) await resize(handlers, path, size);\n else if (size !== undefined) change = { ...change, size } as typeof change;\n if (Object.keys(change).length > 0) await call('setattr', { path: rel(path), ...change });\n },\n statfs: () => call<DriverStatfs>('statfs'),\n };\n return handlers;\n}\n\nconst KEEP: OpenFlags = { write: false, create: false, truncate: false, exclusive: false };\n\nasync function resize(h: FilesystemHandlers, path: string, size: number): Promise<void> {\n const was = (await h.getattr(path)).size;\n if (size === was) return;\n const kept: Uint8Array[] = [];\n if (size < was && size > 0) {\n const fh = await h.open(path, KEEP);\n try {\n for (let at = 0; at < size; ) {\n const bytes = await h.read(fh, at, size - at);\n if (bytes.length === 0) break;\n kept.push(bytes);\n at += bytes.length;\n }\n } finally {\n await h.release(fh);\n }\n }\n const fh = await h.open(path, { ...KEEP, write: true, truncate: size < was });\n try {\n if (size > was) await h.write(fh, size - 1, new Uint8Array(1));\n let at = 0;\n for (const bytes of kept) {\n await h.write(fh, at, bytes);\n at += bytes.length;\n }\n } finally {\n await h.release(fh);\n }\n}\n\nexport interface WatchLoop {\n connect(): Promise<HostfsClient>;\n up(client: HostfsClient): void;\n event(event: HostfsEvent): void;\n down(): void;\n silenceMs?: number;\n backoffMs?: [number, number];\n connectMs?: number;\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', done);\n });\n}\n\nexport interface Watching {\n ready: Promise<void>;\n kick(): void;\n}\n\nexport function keepWatching(loop: WatchLoop, signal: AbortSignal): Watching {\n const silenceMs = loop.silenceMs ?? 45_000;\n const [first, most] = loop.backoffMs ?? [1000, 30_000];\n const ready = Promise.withResolvers<void>();\n const capped = setTimeout(ready.resolve, loop.connectMs ?? 15_000);\n const uncap = () => clearTimeout(capped);\n void ready.promise.then(uncap);\n signal.addEventListener('abort', uncap, { once: true });\n let wait = first;\n let up = false;\n let current: AbortController | undefined;\n async function session(): Promise<boolean> {\n const session = new AbortController();\n current = session;\n const stop = () => session.abort();\n signal.addEventListener('abort', stop);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const quiet = () => {\n clearTimeout(timer);\n timer = setTimeout(stop, silenceMs);\n };\n let opened = false;\n try {\n const client = await loop.connect();\n quiet();\n await client.watch(\n session.signal,\n (event) => {\n quiet();\n if (!event.ping) loop.event(event);\n },\n () => {\n quiet();\n opened = true;\n up = true;\n loop.up(client);\n ready.resolve();\n }\n );\n return opened;\n } catch {\n return opened;\n } finally {\n clearTimeout(timer);\n signal.removeEventListener('abort', stop);\n }\n }\n void (async () => {\n while (!signal.aborted) {\n const began = Date.now();\n const opened = await session();\n if (signal.aborted) return;\n if (opened && Date.now() - began >= first) {\n wait = first;\n continue;\n }\n if (!opened && up) {\n up = false;\n loop.down();\n }\n ready.resolve();\n await sleep(wait, signal);\n wait = Math.min(wait * 2, most);\n }\n })();\n return { ready: ready.promise, kick: () => current?.abort() };\n}\n\nexport function invalidation(event: HostfsEvent): string[] | true {\n return event.paths ?? true;\n}\n\nexport interface HostfsTiming {\n silenceMs?: number;\n backoffMs?: [number, number];\n connectMs?: number;\n}\n\nexport async function openHostfs(\n spec: MountSpec,\n hook: HostfsGrantHook,\n fetch: FetchLike,\n timing: HostfsTiming = {}\n): Promise<OpenedDriver> {\n const readonly = spec.options?.ro !== undefined;\n const { port1, port2 } = new MessageChannel();\n const slot = mediumSlot<HostfsClient>(\n async (err) => unreachable(err),\n () => watching.kick()\n );\n const stop = new AbortController();\n const grant = () => hook(spec.source, { readonly });\n let active: HostfsClient | undefined;\n const handlers = hostfsHandlers(() => active as HostfsClient);\n const ranged = () => (active?.capabilities.ranges === true ? { ranges: true } : {});\n const served = serveFilesystem(\n port2,\n { ...slot.handlers, mount: ranged },\n {\n symlinks: true,\n chmod: true,\n listingStats: true,\n maxIo: HOSTFS_IO,\n ...(readonly ? { readonly: true } : {}),\n }\n );\n const watching = keepWatching(\n {\n connect: async () => new HostfsClient(await grant(), grant, fetch),\n up(client) {\n active = client;\n slot.insert(client, handlers);\n served.invalidate(true);\n },\n event: (event) => served.invalidate(invalidation(event)),\n down() {\n slot.eject();\n served.invalidate(true);\n },\n ...timing,\n },\n stop.signal\n );\n await watching.ready;\n return {\n port: port1,\n present: slot.present,\n dispose() {\n stop.abort();\n port1.close();\n port2.close();\n },\n };\n}\n", "import type { MediumHandle } from './fsa.ts';\n\nexport interface MediaStore {\n get(id: string): Promise<MediumHandle | undefined>;\n put(id: string, handle: MediumHandle): Promise<void>;\n}\n\nexport const MEDIA_STORE = 'handles';\n\nexport function memoryMedia(): MediaStore {\n const handles = new Map<string, MediumHandle>();\n return {\n get: async (id) => handles.get(id),\n put: async (id, handle) => void handles.set(id, handle),\n };\n}\n\nfunction settle<T>(request: IDBRequest, value: () => T): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(value());\n request.onerror = () => reject(request.error);\n });\n}\n\nexport function openMedia(name: string, factory: IDBFactory): Promise<MediaStore> {\n const request = factory.open(name, 1);\n request.onupgradeneeded = () => request.result.createObjectStore(MEDIA_STORE);\n return settle(request, () => {\n const db = request.result;\n const store = (mode: IDBTransactionMode) =>\n db.transaction(MEDIA_STORE, mode).objectStore(MEDIA_STORE);\n return {\n get: (id) => {\n const got = store('readonly').get(id);\n return settle(got, () => got.result as MediumHandle | undefined);\n },\n put: (id, handle) => settle(store('readwrite').put(handle, id), () => undefined),\n } satisfies MediaStore;\n });\n}\n", "export const CHUNK = 1024 * 1024;\n\nexport class ChunkedBytes {\n private chunks: Array<Uint8Array | undefined> = [];\n size = 0;\n\n read(offset: number, length: number): Uint8Array {\n const end = Math.min(this.size, offset + length);\n if (end <= offset) return new Uint8Array(0);\n const out = new Uint8Array(end - offset);\n for (let at = offset; at < end; ) {\n const index = Math.floor(at / CHUNK);\n const from = at - index * CHUNK;\n const n = Math.min(CHUNK - from, end - at);\n const chunk = this.chunks[index];\n if (chunk) out.set(chunk.subarray(from, Math.min(from + n, chunk.length)), at - offset);\n at += n;\n }\n return out;\n }\n\n write(offset: number, bytes: Uint8Array, owned = false): void {\n const whole = owned && bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength;\n for (let done = 0; done < bytes.length; ) {\n const at = offset + done;\n const index = Math.floor(at / CHUNK);\n const from = at - index * CHUNK;\n const n = Math.min(CHUNK - from, bytes.length - done);\n if (whole && n === CHUNK && bytes.length === CHUNK) this.chunks[index] = bytes;\n else this.room(index, from + n).set(bytes.subarray(done, done + n), from);\n done += n;\n }\n this.size = Math.max(this.size, offset + bytes.length);\n }\n\n truncate(size: number): void {\n if (size < this.size) {\n const keep = Math.ceil(size / CHUNK);\n this.chunks.length = Math.min(this.chunks.length, keep);\n const tail = this.chunks[keep - 1];\n const from = size - (keep - 1) * CHUNK;\n if (tail && from < tail.length) tail.fill(0, from);\n }\n this.size = size;\n }\n\n private room(index: number, need: number): Uint8Array {\n const chunk = this.chunks[index];\n if (chunk && chunk.length >= need) return chunk;\n const grown = new Uint8Array(Math.min(CHUNK, Math.max(need, (chunk?.length ?? 0) * 2)));\n if (chunk) grown.set(chunk);\n this.chunks[index] = grown;\n return grown;\n }\n}\n", "import { ChunkedBytes } from './chunked.ts';\nimport { type FilesystemHandlers, fsError, type OpenFlags } from './driver.ts';\nimport type { DriverAttr, DriverEntry } from './protocol.ts';\n\ninterface Node {\n kind: DriverAttr['kind'];\n ino: number;\n mode: number;\n mtime: number;\n data: ChunkedBytes;\n target: string;\n children: Map<string, Node>;\n}\n\ninterface Handle {\n node: Node;\n write: boolean;\n}\n\nexport function tmpfs(): FilesystemHandlers {\n let inodes = 0;\n const make = (kind: Node['kind'], mode: number): Node => ({\n kind,\n ino: ++inodes,\n mode,\n mtime: Date.now(),\n data: new ChunkedBytes(),\n target: '',\n children: new Map(),\n });\n const root = make('directory', 0o40755);\n const handles = new Map<number, Handle>();\n let nextFh = 0;\n\n const parts = (path: string) => path.split('/').filter(Boolean);\n function find(path: string): Node {\n let node = root;\n for (const name of parts(path)) {\n if (node.kind !== 'directory') throw fsError('ENOTDIR', path);\n const next = node.children.get(name);\n if (!next) throw fsError('ENOENT', path);\n node = next;\n }\n return node;\n }\n function parent(path: string): { dir: Node; name: string } {\n const names = parts(path);\n const name = names.pop();\n if (name === undefined) throw fsError('EBUSY', 'the root of a mount');\n const dir = find(`/${names.join('/')}`);\n if (dir.kind !== 'directory') throw fsError('ENOTDIR', path);\n return { dir, name };\n }\n const attr = (node: Node): DriverAttr => ({\n kind: node.kind,\n size:\n node.kind === 'file' ? node.data.size : node.kind === 'symlink' ? node.target.length : 4096,\n mtime: node.mtime,\n mode: node.mode,\n ino: node.ino,\n });\n const handle = (fh: number): Handle => {\n const found = handles.get(fh);\n if (!found) throw fsError('EBADF', `handle ${fh}`);\n return found;\n };\n function opened(path: string, flags: OpenFlags): Node {\n const { dir, name } = parent(path);\n const existing = dir.children.get(name);\n if (existing && flags.exclusive) throw fsError('EEXIST', path);\n if (existing?.kind === 'directory' && flags.write) throw fsError('EISDIR', path);\n if (existing) return existing;\n if (!flags.create) throw fsError('ENOENT', path);\n const node = make('file', 0o100644);\n dir.children.set(name, node);\n dir.mtime = Date.now();\n return node;\n }\n\n return {\n async getattr(path) {\n return attr(find(path));\n },\n async readdir(path) {\n const dir = find(path);\n if (dir.kind !== 'directory') throw fsError('ENOTDIR', path);\n return [...dir.children].map(\n ([name, node]): DriverEntry => ({ name, kind: node.kind, attr: attr(node) })\n );\n },\n async open(path, flags) {\n const node = opened(path, flags);\n if (flags.truncate && node.kind === 'file') {\n node.data.truncate(0);\n node.mtime = Date.now();\n }\n handles.set(++nextFh, { node, write: flags.write });\n return nextFh;\n },\n async read(fh, offset, size) {\n return handle(fh).node.data.read(offset, size);\n },\n async write(fh, offset, bytes) {\n const h = handle(fh);\n if (!h.write) throw fsError('EBADF', `handle ${fh} is read-only`);\n h.node.data.write(offset, bytes, true);\n h.node.mtime = Date.now();\n },\n async release(fh) {\n handle(fh);\n handles.delete(fh);\n },\n async mkdir(path) {\n const { dir, name } = parent(path);\n if (dir.children.has(name)) throw fsError('EEXIST', path);\n dir.children.set(name, make('directory', 0o40755));\n dir.mtime = Date.now();\n },\n async rmdir(path) {\n const { dir, name } = parent(path);\n const node = dir.children.get(name);\n if (!node) throw fsError('ENOENT', path);\n if (node.kind !== 'directory') throw fsError('ENOTDIR', path);\n if (node.children.size > 0) throw fsError('ENOTEMPTY', path);\n dir.children.delete(name);\n dir.mtime = Date.now();\n },\n async unlink(path) {\n const { dir, name } = parent(path);\n const node = dir.children.get(name);\n if (!node) throw fsError('ENOENT', path);\n if (node.kind === 'directory') throw fsError('EISDIR', path);\n dir.children.delete(name);\n dir.mtime = Date.now();\n },\n async rename(from, to) {\n const a = `/${parts(from).join('/')}`;\n const b = `/${parts(to).join('/')}`;\n if (b !== a && b.startsWith(`${a}/`)) throw fsError('EINVAL', `${to} is inside ${from}`);\n const source = parent(from);\n const node = source.dir.children.get(source.name);\n if (!node) throw fsError('ENOENT', from);\n const target = parent(to);\n const replaced = target.dir.children.get(target.name);\n if (replaced === node) return;\n if (\n replaced?.kind === 'directory' &&\n (node.kind !== 'directory' || replaced.children.size > 0)\n ) {\n throw fsError(node.kind === 'directory' ? 'ENOTEMPTY' : 'EISDIR', to);\n }\n source.dir.children.delete(source.name);\n target.dir.children.set(target.name, node);\n source.dir.mtime = Date.now();\n target.dir.mtime = source.dir.mtime;\n },\n async symlink(target, path) {\n const { dir, name } = parent(path);\n if (dir.children.has(name)) throw fsError('EEXIST', path);\n const node = make('symlink', 0o120777);\n node.target = target;\n dir.children.set(name, node);\n dir.mtime = Date.now();\n },\n async readlink(path) {\n const node = find(path);\n if (node.kind !== 'symlink') throw fsError('EINVAL', path);\n return node.target;\n },\n async setattr(path, change) {\n const node = find(path);\n if (change.mode !== undefined) node.mode = (node.mode & ~0o7777) | (change.mode & 0o7777);\n if (change.size !== undefined) {\n if (node.kind !== 'file')\n throw fsError(node.kind === 'directory' ? 'EISDIR' : 'EINVAL', path);\n node.data.truncate(change.size);\n node.mtime = Date.now();\n }\n if (change.mtime !== undefined) node.mtime = change.mtime;\n },\n async statfs() {\n return { bsize: 4096, blocks: 262144, bfree: 262144 };\n },\n };\n}\n", "export interface ImportedMemory {\n module: string;\n name: string;\n initial: number;\n maximum?: number;\n shared: boolean;\n}\n\nexport function importedMemory(bytes: Uint8Array): ImportedMemory | undefined {\n let at = 8;\n const u32 = (): number => {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = bytes[at++];\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n };\n const name = (): string => {\n const len = u32();\n const s = new TextDecoder().decode(bytes.subarray(at, at + len));\n at += len;\n return s;\n };\n const limits = () => {\n const flags = bytes[at++];\n const initial = u32();\n const maximum = flags & 1 ? u32() : undefined;\n return { initial, maximum, shared: (flags & 2) !== 0 };\n };\n while (at < bytes.length) {\n const id = bytes[at++];\n const size = u32();\n const end = at + size;\n if (id !== 2) {\n at = end;\n continue;\n }\n const count = u32();\n for (let i = 0; i < count; i++) {\n const module = name();\n const field = name();\n const kind = bytes[at++];\n if (kind === 0) u32();\n else if (kind === 1) {\n at++;\n limits();\n } else if (kind === 2) {\n const l = limits();\n return { module, name: field, ...l };\n } else if (kind === 3) at += 2;\n else if (kind === 4) {\n at++;\n u32();\n }\n }\n return undefined;\n }\n return undefined;\n}\n\nexport const RESERVED_NAMESPACES: ReadonlySet<string> = new Set([\n 'wasi_snapshot_preview1',\n 'wasix_32v1',\n 'wasi',\n 'env',\n]);\n\nexport type ForeignResult = 'none' | 'i32' | 'i64' | 'f32' | 'f64' | 'other';\n\nexport type ForeignResults = Record<string, Record<string, ForeignResult>>;\n\nconst RESULTS: Readonly<Record<number, ForeignResult>> = {\n 127: 'i32',\n 126: 'i64',\n 125: 'f32',\n 124: 'f64',\n};\n\nfunction resultOf(results: number[]): ForeignResult {\n if (results.length === 0) return 'none';\n return (results.length === 1 && RESULTS[results[0]]) || 'other';\n}\n\nclass Reader {\n at = 8;\n readonly bytes: Uint8Array;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n }\n\n byte(): number {\n return this.bytes[this.at++];\n }\n\n u32(): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const b = this.byte();\n result |= (b & 0x7f) << shift;\n if (!(b & 0x80)) return result >>> 0;\n shift += 7;\n }\n }\n\n name(): string {\n const len = this.u32();\n const s = new TextDecoder().decode(this.bytes.subarray(this.at, this.at + len));\n this.at += len;\n return s;\n }\n\n valtype(): number {\n const code = this.byte();\n if (code === 0x63 || code === 0x64) this.u32();\n return code;\n }\n\n limits(): void {\n const flags = this.byte();\n this.u32();\n if (flags & 1) this.u32();\n }\n}\n\nfunction readTypes(r: Reader): ForeignResult[] | undefined {\n const types: ForeignResult[] = [];\n for (let i = r.u32(); i > 0; i--) {\n if (r.byte() !== 0x60) return undefined;\n for (let n = r.u32(); n > 0; n--) r.valtype();\n const results: number[] = [];\n for (let n = r.u32(); n > 0; n--) results.push(r.valtype());\n types.push(resultOf(results));\n }\n return types;\n}\n\nfunction skipImport(r: Reader, kind: number): void {\n if (kind === 1) {\n r.valtype();\n r.limits();\n } else if (kind === 2) r.limits();\n else if (kind === 3) {\n r.valtype();\n r.byte();\n } else {\n r.byte();\n r.u32();\n }\n}\n\nfunction readImports(r: Reader, types: ForeignResult[]): ForeignResults {\n const foreign: ForeignResults = {};\n for (let i = r.u32(); i > 0; i--) {\n const module = r.name();\n const field = r.name();\n const kind = r.byte();\n if (kind !== 0) skipImport(r, kind);\n else {\n const type = types[r.u32()] ?? 'other';\n if (!RESERVED_NAMESPACES.has(module)) (foreign[module] ??= {})[field] = type;\n }\n }\n return foreign;\n}\n\nexport function foreignImports(bytes: Uint8Array): ForeignResults | undefined {\n const r = new Reader(bytes);\n let types: ForeignResult[] | undefined = [];\n while (r.at < bytes.length) {\n const id = r.byte();\n const end = r.u32() + r.at;\n if (id === 1) types = readTypes(r);\n if (!types) return undefined;\n if (id === 2) return readImports(r, types);\n r.at = end;\n }\n return {};\n}\n", "import { enableCdp } from './cdp/facade.ts';\nimport { CdpHosts } from './cdp/hosts.ts';\nimport type { CdpHook } from './cdp/types.ts';\nimport { serveClient } from './client/serve-client.ts';\nimport {\n type Abi,\n binfmtOf,\n type Command,\n pnpmGlobalRoots,\n scanBinfmts,\n scanCommands,\n scanFilesystems,\n} from './commands.ts';\n\nexport const PNPM_HOME = '/home/.local/share/pnpm';\n\nimport { followLinks, withCommandDirs } from './fs/commands.ts';\nimport { physicalPathAsync } from './fs/physical-path.ts';\nimport type { KernelFs } from './fs/types.ts';\nimport { fsError, normalizePath } from './fs/types.ts';\nimport { UnlinkedKeeper, type UnlinkOwner, webLocks } from './fs/unlinked.ts';\nimport { FsWatchers } from './fs/watch.ts';\nimport {\n type ChildForker,\n type ChildHandle,\n type ChildSpawner,\n SpawnError,\n} from './kernel/children.ts';\nimport { bytesSource, deviceFile, FdTable, sinkFile } from './kernel/fd-table.ts';\nimport { spawnWasmProcess, type WasmProcessHandle, type WasmWorkerLike } from './kernel/host.ts';\nimport { LockTable } from './kernel/host-ops.ts';\nimport { type JobMember, JobTable } from './kernel/jobs.ts';\nimport { HttpHandles } from './kernel/net/http-syscalls.ts';\nimport { DEFAULT_HOSTNAME, isHostname } from './kernel/net/loopback-names.ts';\nimport {\n enableNetwork,\n kernelCa,\n kernelTlsEngine,\n memoryCaStore,\n missingTransport,\n networkEnv,\n packageTlsEngine,\n writeCaFile,\n} from './kernel/net/network.ts';\nimport type { CaStore, RealmCa } from './kernel/net/realm-ca.ts';\nimport { Resolver } from './kernel/net/resolver.ts';\nimport { Routes, type RouteTable } from './kernel/net/routes.ts';\nimport type { RealmTransport } from './kernel/net/transport.ts';\nimport type { NetworkUplink } from './kernel/net/uplink.ts';\nimport type { ProcessInfo } from './kernel/proc-info.ts';\nimport { DEFAULT_UMASK } from './kernel/process.ts';\nimport type { ForkState, Program } from './kernel/protocol.ts';\nimport { PtyTable } from './kernel/pty.ts';\nimport { SettlingChildren } from './kernel/settling.ts';\nimport { LoopbackNet } from './kernel/socket.ts';\nimport { KernelTty } from './kernel/tty.ts';\nimport { keepingOpen, VfsNodes } from './kernel/vfs-file.ts';\nimport { type ServedFilesystem, serveFilesystem } from './mount/driver.ts';\nimport {\n FSA_CAPABILITIES,\n granted,\n type Medium,\n type MediumHandle,\n removableMedium,\n} from './mount/fsa.ts';\nimport {\n FSTAB_PATH,\n FSTAB_RETRIES,\n type FstabResult,\n mountFstab,\n parseFstab,\n} from './mount/fstab.ts';\nimport {\n type FetchLike,\n type HostfsGrantHook,\n type HostfsTiming,\n openHostfs,\n} from './mount/hostfs.ts';\nimport { type MediaStore, memoryMedia } from './mount/media.ts';\nimport {\n HeldSet,\n heldUnder,\n type MountEntry,\n type MountSpec,\n MountTable,\n type OpenedDriver,\n} from './mount/mount-fs.ts';\nimport {\n type MountCall,\n mountCall,\n type ProcessMountPolicy,\n type ProcessMountRequest,\n umountCall,\n} from './mount/syscall.ts';\nimport { tmpfs } from './mount/tmpfs.ts';\nimport {\n type ForeignResults,\n foreignImports,\n type ImportedMemory,\n importedMemory,\n} from './process/wasi/wasi-module.ts';\n\nexport interface LauncherOptions {\n unlinkOwner?: UnlinkOwner;\n fs: KernelFs;\n createWorker: () => WasmWorkerLike;\n modules?: string;\n env?: Record<string, string>;\n transport?: RealmTransport;\n caStore?: CaStore;\n createDriverWorker?: () => WasmWorkerLike;\n media?: MediaStore;\n onMountPending?: (pending: PendingMedium) => void;\n hostfs?: HostfsGrantHook;\n hostfsFetch?: FetchLike;\n hostfsTiming?: HostfsTiming;\n processMounts?: ProcessMountPolicy;\n fstabRetries?: readonly number[];\n cdp?: CdpHook;\n uplink?: NetworkUplink;\n hostname?: string;\n}\n\nexport interface PendingMedium {\n target: string;\n source: string;\n handle?: MediumHandle;\n}\n\ninterface Removable {\n id: string;\n medium: Medium;\n served: ServedFilesystem;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: Uint8Array;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n onStarted?: (pid: number) => void;\n collect?: boolean;\n pgid?: number;\n}\n\nexport interface TerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n onData: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalSession {\n pid: number;\n exited: Promise<number>;\n write(bytes: Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(sig: number): void;\n close(): void;\n}\n\nexport interface RunResult {\n status: number;\n stdout: Uint8Array;\n stderr: Uint8Array;\n}\n\ninterface Target {\n abi: Abi;\n glue: string;\n wasm: string;\n argv0: string;\n prefix?: string[];\n env?: Record<string, string>;\n unset?: string[];\n imports?: string;\n preopenRoot?: boolean;\n}\n\ninterface Compiled {\n module: WebAssembly.Module;\n memory?: ImportedMemory;\n foreign?: ForeignResults | undefined;\n}\n\ninterface Planned {\n target: Target;\n args: string[];\n}\n\ninterface StartRequest {\n program: Program;\n argv0: string;\n args: string[];\n env: Record<string, string>;\n cwd: string;\n fds: FdTable;\n report: (message: string) => void;\n ppid?: number;\n fork?: ForkState;\n exec?: boolean;\n pgid?: number;\n ignored?: number;\n umask?: number;\n decided?: Promise<boolean>;\n}\n\nconst COMMAND = /^\\/(?:usr\\/)?bin\\/([^/]+)$/;\nconst PACKAGE_ROOT = /^(.*\\/node_modules\\/(?:@[^/]+\\/)?[^/]+)\\//;\nconst ENV_REFERENCE = /\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\nconst WASM_MAGIC = [0x00, 0x61, 0x73, 0x6d];\nconst SHEBANG_MAX = 256;\nconst MAX_INTERPRETERS = 4;\nconst NOT_FOUND = 127;\nconst DECIDE_MS = 100;\nconst INIT_PID = 1;\nconst SHARED_DIRS = ['/tmp', '/home'];\nconst encoder = new TextEncoder();\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1);\n}\n\nfunction modulePath(glue: string): string {\n return glue.endsWith('.js') ? `${glue.slice(0, -3)}.wasm` : `${glue}.wasm`;\n}\n\nfunction isWasm(bytes: Uint8Array): boolean {\n return WASM_MAGIC.every((b, i) => bytes[i] === b);\n}\n\nfunction shebang(head: Uint8Array): string[] | undefined {\n if (head[0] !== 0x23 || head[1] !== 0x21) return undefined;\n return new TextDecoder()\n .decode(head.subarray(0, SHEBANG_MAX))\n .slice(2)\n .split('\\n')[0]\n .trim()\n .split(/[ \\t]+/);\n}\n\nfunction interpreter(head: Uint8Array): string {\n const words = shebang(head);\n if (!words) return 'node';\n if (baseName(words[0]) === 'env') words.shift();\n if (words[0] === '-S') words.shift();\n return baseName(words[0] ?? '');\n}\n\nexport function expandDefaults(\n defaults: Readonly<Record<string, string>> | undefined,\n env: Readonly<Record<string, string>>\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(defaults ?? {})) {\n let missing = false;\n const expanded = value.replace(ENV_REFERENCE, (_, name: string) => {\n const set = Object.hasOwn(env, name) ? env[name] : undefined;\n if (set === undefined) missing = true;\n return set ?? '';\n });\n if (!missing) out[key] = expanded;\n }\n return out;\n}\n\nfunction targetOf(command: Command): Target {\n return {\n abi: command.abi,\n glue: command.glue,\n wasm: command.wasm,\n argv0: command.argv0,\n ...(command.args ? { prefix: command.args } : {}),\n ...(command.env ? { env: command.env } : {}),\n ...(command.unset ? { unset: command.unset } : {}),\n ...(command.imports ? { imports: command.imports } : {}),\n ...(command.preopenRoot ? { preopenRoot: true } : {}),\n };\n}\n\nfunction withScriptEnv(target: Target, command: Command | undefined): Target {\n if (!command) return target;\n return {\n ...target,\n env: { ...target.env, ...command.env },\n unset: [\n ...(target.unset ?? []).filter((key) => !Object.hasOwn(command.env ?? {}, key)),\n ...(command.unset ?? []),\n ],\n };\n}\n\nfunction childHandle(handle: WasmProcessHandle): ChildHandle {\n return {\n pid: handle.pid,\n exited: handle.exited,\n termsig: handle.termsig,\n onState: (listener) => handle.onState(listener),\n };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, chunk) => n + chunk.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nexport class Launcher {\n readonly fs: KernelFs;\n private readonly base: KernelFs;\n private readonly createWorker: () => WasmWorkerLike;\n private readonly modulesDir: string;\n private readonly env: Record<string, string>;\n private catalog: Promise<Map<string, Command>> | undefined;\n private binfmts: Promise<Map<string, string>> | undefined;\n private readonly warned = new Set<string>();\n private readonly compiled = new Map<string, Promise<Compiled>>();\n private readonly processes = new Map<number, WasmProcessHandle>();\n private readonly zombies = new Set<number>();\n private readonly orphans = new Set<number>();\n private readonly described = new Map<number, Pick<ProcessInfo, 'argv' | 'tty' | 'started'>>();\n private readonly jobs = new JobTable();\n private readonly locks = new LockTable();\n private readonly settling = new SettlingChildren((pid) => this.jobs.pgidOf(pid));\n private readonly ptys = new PtyTable(\n (tty, sig) => this.keySignal(tty, 0, sig, () => this.jobs.signalOwnedForeground(tty, sig)),\n (tty) => this.settling.reading(this.jobs.tcgetpgrp(tty, 0))\n );\n readonly net = new LoopbackNet();\n readonly cdp: CdpHosts;\n private readonly ca: () => Promise<RealmCa>;\n readonly transport: RealmTransport;\n readonly uplink: NetworkUplink | undefined;\n readonly routes: Routes;\n readonly resolver: Resolver;\n readonly hostname: string;\n readonly watchers = new FsWatchers();\n private readonly pnpmHome: string;\n readonly mounts: MountTable;\n private readonly createDriverWorker: (() => WasmWorkerLike) | undefined;\n private readonly media: MediaStore;\n private readonly onMountPending: ((pending: PendingMedium) => void) | undefined;\n private readonly removable = new Map<string, Removable>();\n private readonly hostfs: Pick<LauncherOptions, 'hostfs' | 'hostfsFetch' | 'hostfsTiming'>;\n private readonly fstabRetries: readonly number[];\n private readonly inserted = new Map<string, MediumHandle>();\n private readonly openFiles = new Set<VfsNodes>();\n private readonly deciding = new Map<number, Set<(byParent: boolean) => void>>();\n readonly identities = { asked: 0, timedOut: 0 };\n private readonly nodes: VfsNodes;\n private readonly unlinked: UnlinkedKeeper;\n private readonly held = new HeldSet((path) => this.released(path));\n private readonly processMounts: ProcessMountPolicy;\n private readonly booting = new AbortController();\n fstab: Promise<FstabResult[]> = Promise.resolve([]);\n private nextPid = 1000;\n readonly boot = Date.now();\n private terminals = 0;\n\n constructor(options: LauncherOptions) {\n this.mounts = new MountTable({\n open: (type, spec) => this.driver(type, spec),\n busy: (target) =>\n [...this.openFiles].some((nodes) => nodes.holds(target)) || heldUnder(this.held, target),\n changed: this.watchers.changed.bind(this.watchers),\n });\n this.base = this.watchers.wrap(this.mounts.wrap(options.fs));\n this.createWorker = options.createWorker;\n this.createDriverWorker = options.createDriverWorker;\n this.media = options.media ?? memoryMedia();\n this.onMountPending = options.onMountPending;\n this.hostfs = options;\n this.fstabRetries = options.fstabRetries ?? FSTAB_RETRIES;\n this.processMounts = options.processMounts ?? true;\n this.pnpmHome = options.env?.PNPM_HOME ?? PNPM_HOME;\n this.modulesDir = options.modules ?? '/node_modules';\n this.cdp = new CdpHosts(options.cdp);\n const hostname = options.hostname ?? DEFAULT_HOSTNAME;\n if (!isHostname(hostname)) throw new Error(`not a host name: ${String(hostname)}`);\n this.hostname = hostname;\n this.env = { ...networkEnv(hostname), SLICC_CDP_URL: this.cdp.url, ...options.env };\n this.ca = kernelCa(options.caStore ?? memoryCaStore());\n this.transport = options.transport ?? missingTransport();\n this.uplink = options.uplink;\n this.routes = new Routes(options.uplink?.traits.ipv6 === true);\n if (options.uplink?.routes) this.routes.set(options.uplink.routes);\n this.resolver = new Resolver({ uplink: options.uplink, routes: this.routes, hostname });\n if (options.uplink) this.net.useUplink({ uplink: options.uplink, routes: this.routes });\n enableNetwork(this.net, {\n transport: this.transport,\n engine: kernelTlsEngine(packageTlsEngine(options.fs, this.modulesDir)),\n ca: this.ca,\n });\n enableCdp(this.net, this.cdp);\n const fs = withCommandDirs(this.base, async () => new Set((await this.commands()).keys()));\n this.nodes = new VfsNodes(fs, (path) => this.released(path));\n this.nodes.keepsOnDisk = true;\n this.openFiles.add(this.nodes);\n const holders = [this.held, [this.nodes]];\n this.unlinked = new UnlinkedKeeper(\n fs,\n { [Symbol.iterator]: () => holders.flatMap((set) => [...set]).values() },\n (path) => this.mountRoot(path),\n {\n locks: webLocks(),\n busy: (path) => [...this.openFiles].some((nodes) => nodes.holds(path)),\n owner: options.unlinkOwner,\n }\n );\n this.fs = this.unlinked.wrap(keepingOpen(fs, this.nodes));\n void this.unlinked.sweep('/');\n this.watchers.watch([this.modulesDir, this.pnpmHome], { recursive: true }, () => {\n this.catalog = undefined;\n this.binfmts = undefined;\n });\n }\n\n setRoutes(table: RouteTable): void {\n this.routes.set(table);\n }\n\n commands(): Promise<Map<string, Command>> {\n this.catalog ??= this.roots().then((roots) => scanCommands(this.base, roots));\n return this.catalog;\n }\n\n private interpreters(): Promise<Map<string, string>> {\n this.binfmts ??= this.roots().then((roots) =>\n scanBinfmts(this.base, roots, (message) => {\n if (this.warned.has(message)) return;\n this.warned.add(message);\n console.warn(message);\n })\n );\n return this.binfmts;\n }\n\n private async roots(): Promise<string[]> {\n return [this.modulesDir, ...(await pnpmGlobalRoots(this.base, this.pnpmHome))];\n }\n\n async resolve(file: string, argv0: string, cwd: string): Promise<Target | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name !== undefined) {\n const command = (await this.commands()).get(name);\n return command && !command.script ? targetOf(command) : undefined;\n }\n const path = this.fs.resolvePath(cwd, file);\n const glue = await followLinks(this.base, path);\n const linked = COMMAND.exec(glue)?.[1];\n if (linked !== undefined) {\n const target = await this.resolve(`/bin/${linked}`, argv0, cwd);\n const byPath = !COMMAND.test(path) && (await this.commands()).get(linked)?.argv0Path === true;\n return target && byPath ? { ...target, argv0: path } : target;\n }\n const head = await this.head(glue);\n if (!head) return undefined;\n if (isWasm(head)) {\n return {\n abi: 'wasi',\n glue,\n wasm: glue,\n argv0: baseName(argv0 || file).replace(/\\.wasm$/, ''),\n };\n }\n if (interpreter(head) !== 'node') return undefined;\n const wasm = modulePath(glue);\n if (!(await this.base.exists(wasm))) return undefined;\n return { abi: 'emscripten', glue, wasm, argv0: baseName(argv0 || file) };\n }\n\n private async head(path: string): Promise<Uint8Array | undefined> {\n try {\n return (await this.base.readFileBuffer(path)).subarray(0, SHEBANG_MAX);\n } catch {\n return undefined;\n }\n }\n\n private async scriptCommand(file: string): Promise<Command | undefined> {\n const name = COMMAND.exec(file)?.[1] ?? (file.includes('/') ? undefined : file);\n if (name === undefined) return undefined;\n const command = (await this.commands()).get(name);\n return command?.script ? command : undefined;\n }\n\n private async interpreted(\n file: string,\n argv: string[],\n cwd: string,\n depth = 0\n ): Promise<Planned | undefined> {\n const command = await this.scriptCommand(file);\n const script = command?.script ?? this.fs.resolvePath(cwd, file);\n const head = await this.head(script);\n if (!head) return undefined;\n const binfmt = isWasm(head) ? undefined : binfmtOf(await this.interpreters(), script);\n const words = shebang(head) ?? (binfmt ? [binfmt] : undefined);\n if (!words) return undefined;\n if (baseName(words[0]) === 'env') words.shift();\n const [interp, ...rest] = words;\n const arg = rest.join(' ');\n const passed = [...(arg ? [arg] : []), command ? script : file, ...argv.slice(1)];\n const found = interp ? await this.resolve(interp, interp, cwd) : undefined;\n if (!found) {\n if (!interp || depth >= MAX_INTERPRETERS || !(await this.scriptCommand(interp))) {\n return undefined;\n }\n const inner = await this.interpreted(interp, [interp, ...passed], cwd, depth + 1);\n return inner && { ...inner, target: withScriptEnv(inner.target, command) };\n }\n const target = withScriptEnv(found, command);\n return { target, args: [...(target.prefix ?? []), ...passed] };\n }\n\n private async plan(file: string, argv: string[], cwd: string): Promise<Planned | undefined> {\n const direct = await this.resolve(file, argv[0] ?? file, cwd);\n if (direct) return { target: direct, args: [...(direct.prefix ?? []), ...argv.slice(1)] };\n return this.interpreted(file, argv, cwd);\n }\n\n private async unrunnable(file: string, cwd: string): Promise<'ENOEXEC' | 'ENOENT'> {\n const path = this.fs.resolvePath(cwd, file);\n const head = await this.base.readFileBuffer(path).catch(() => null);\n if (!head || (head[0] === 0x23 && head[1] === 0x21)) return 'ENOENT';\n return binfmtOf(await this.interpreters(), path) ? 'ENOENT' : 'ENOEXEC';\n }\n\n private module(path: string): Promise<Compiled> {\n return this.base.stat(path).then((st) => {\n const key = `${path}:${st.size}:${st.mtime.getTime()}`;\n let module = this.compiled.get(key);\n if (!module) {\n module = this.base.readFileBuffer(path).then(async (bytes) => {\n const memory = importedMemory(bytes);\n const foreign = foreignImports(bytes);\n const compiled = await WebAssembly.compile(bytes as BufferSource);\n return {\n module: compiled,\n ...(memory ? { memory } : {}),\n foreign,\n };\n });\n this.compiled.set(key, module);\n module.catch(() => this.compiled.delete(key));\n }\n return module;\n });\n }\n\n private async names(path: string, module: WebAssembly.Module): Promise<string | undefined> {\n if (WebAssembly.Module.customSections(module, 'name').length > 0) return undefined;\n const beside = `${path}.names`;\n if (await this.base.exists(beside)) return beside;\n const root = PACKAGE_ROOT.exec(path)?.[1];\n if (root === undefined) return undefined;\n const optional = `${root}-names${beside.slice(root.length)}`;\n return (await this.base.exists(optional)) ? optional : undefined;\n }\n\n private async program(target: Target, env: Record<string, string>): Promise<Program> {\n if (target.abi === 'js') {\n return { abi: 'js', glue: await this.base.readFile(target.wasm), path: target.wasm };\n }\n if (target.abi !== 'wasi') {\n const [glue, { module }] = await Promise.all([\n this.base.readFile(target.glue),\n this.module(target.wasm),\n ]);\n return { glue, module };\n }\n const { module, memory, foreign } = await this.module(target.wasm);\n const names =\n env.SLICC_WASM_BACKTRACE === '1' ? await this.names(target.wasm, module) : undefined;\n const imports = target.imports ? await this.base.readFile(target.imports) : undefined;\n return {\n abi: 'wasi',\n glue: '',\n module,\n ...(memory ? { memory } : {}),\n foreign,\n ...(names ? { names } : {}),\n ...(imports !== undefined ? { imports } : {}),\n ...(target.preopenRoot ? { preopenRoot: true } : {}),\n };\n }\n\n private async launch(\n planned: Planned,\n req: Omit<StartRequest, 'program' | 'argv0' | 'args'>\n ): Promise<WasmProcessHandle> {\n const { target, args } = planned;\n const cwd = await physicalPathAsync(this.base, req.cwd);\n const seen = { ...req.env, HOSTNAME: this.hostname, cwd };\n const env = { ...expandDefaults(target.env, seen), ...req.env };\n for (const key of target.unset ?? []) delete env[key];\n env.HOSTNAME = this.hostname;\n let program: Program;\n try {\n program = await this.program(target, env);\n } catch (err) {\n await req.fds.closeAll();\n throw err;\n }\n return this.start({ ...req, cwd, program, argv0: target.argv0, args, env });\n }\n\n groupSession(pgid: number): number | undefined {\n return this.jobs.sessionOf(pgid);\n }\n\n private start(req: StartRequest): WasmProcessHandle {\n if (req.pgid !== undefined && this.jobs.sessionOf(req.pgid) === undefined) {\n throw fsError('ESRCH', `no process group ${req.pgid}`);\n }\n const pid = this.nextPid++;\n const terminal = req.fds.stdioTerminal();\n const decided = req.decided ?? Promise.resolve(true);\n const count = (byParent: boolean) => {\n this.identities.asked++;\n if (!byParent) this.identities.timedOut++;\n };\n let asked: Promise<void> | undefined;\n const handle = spawnWasmProcess({\n pid,\n identity: async () => {\n await (asked ??= decided.then(count));\n return this.identityOf(pid);\n },\n onSyscall: (call) => {\n this.decide(pid);\n this.settling.syscall(pid, call.op);\n },\n ...(req.ignored ? { ignored: req.ignored } : {}),\n ...(req.umask !== undefined ? { umask: req.umask } : {}),\n program: req.program,\n argv0: req.argv0,\n args: req.args,\n env: req.env,\n cwd: req.cwd,\n fds: req.fds,\n fs: this.fs,\n createWorker: this.createWorker,\n onError: req.report,\n spawner: this.spawner(pid, req.report),\n forker: this.forker(pid, req),\n kill: (target, sig) => this.kill(target, sig),\n writesBack: (target) => this.processes.get(target)?.writesBack() === true,\n processes: () => ({ boot: this.boot, processes: this.list() }),\n openFiles: this.openFiles,\n nodes: this.nodes,\n held: this.held,\n unlinkGate: this.unlinked.gate,\n statfs: (path) => this.mounts.statfs(path),\n mounts: () => this.mounts.list(),\n mount: (call, signal) => this.processMount(pid, call, signal),\n umount: (target, flags) => this.processUmount(pid, target, flags),\n jobs: this.jobs,\n ptys: this.ptys,\n net: this.net,\n http: new HttpHandles(this.transport),\n locks: this.locks,\n resolver: this.resolver,\n onReap: (child) => this.reaped(child),\n ...(req.fork ? { fork: req.fork } : {}),\n ...this.shownIds(req),\n });\n this.processes.set(pid, handle);\n if (req.ppid !== undefined) this.settling.started(pid, req.ppid);\n this.jobs.add(pid, req.ppid, (sig) => handle.signal(sig), terminal);\n if (req.exec && req.ppid !== undefined) this.jobs.exec(req.ppid, pid, true);\n if (req.pgid !== undefined) this.jobs.join(pid, req.pgid);\n this.described.set(pid, {\n argv: [req.argv0, ...req.args],\n tty: terminal?.name ?? null,\n started: Date.now(),\n });\n void handle.exited.then(() => {\n this.processes.delete(pid);\n this.settling.settled(pid);\n if (req.ppid === undefined || this.orphans.delete(pid)) this.forget(pid);\n else this.zombies.add(pid);\n });\n return handle;\n }\n\n private shownIds(req: StartRequest): { ppid?: number; shownPid?: number } {\n if (req.ppid === undefined) return {};\n if (!req.exec) return { ppid: this.jobs.shown(req.ppid) };\n const ppid = this.jobs.shownParent(req.ppid);\n return { shownPid: this.jobs.shown(req.ppid), ...(ppid !== undefined ? { ppid } : {}) };\n }\n\n private forget(pid: number): void {\n this.jobs.remove(pid);\n this.described.delete(pid);\n }\n\n private reaped(pid: number): void {\n if (this.zombies.delete(pid)) this.forget(pid);\n else this.orphans.add(pid);\n }\n\n list(): ProcessInfo[] {\n const members = new Map(this.jobs.list().map((member) => [member.pid, member]));\n const rootOf = (member: JobMember): JobMember => {\n let root = member;\n for (let up = members.get(root.execParent ?? -1); up; up = members.get(up.execParent ?? -1)) {\n root = up;\n }\n return root;\n };\n const shown = (pid: number | undefined): number => {\n const member = pid === undefined ? undefined : members.get(pid);\n const root = member && rootOf(member).pid;\n return root !== undefined && this.running(root) ? root : INIT_PID;\n };\n const listed: ProcessInfo[] = [];\n for (const member of members.values()) {\n const described = this.described.get(member.pid);\n if (member.execed || !described) continue;\n const root = rootOf(member);\n listed.push({\n pid: root.pid,\n tid: member.pid,\n ppid: shown(root.ppid),\n pgid: member.pgid,\n sid: member.sid,\n ...described,\n started: (this.described.get(root.pid) ?? described).started,\n state: this.processes.has(member.pid) ? 'S' : 'Z',\n memory: this.processes.get(member.pid)?.memory() ?? 0,\n umask: this.umaskOf(member.pid),\n });\n }\n return listed;\n }\n\n private spawner(ppid: number, report: (message: string) => void): ChildSpawner {\n return async (req, fds) => {\n const planned = await this.plan(req.file, req.argv, req.cwd);\n if (!planned) {\n await fds.closeAll();\n throw new SpawnError(await this.unrunnable(req.file, req.cwd));\n }\n const exec = req.exec ? { exec: true } : {};\n const deciding = req.exec ? undefined : this.undecided(ppid);\n const handle = await this.launch(planned, {\n ...(deciding ? { decided: deciding.promise } : {}),\n env: req.env,\n cwd: req.cwd,\n fds,\n report,\n ppid,\n ignored: this.ignoredBy(ppid),\n umask: this.umaskOf(ppid),\n ...exec,\n });\n deciding?.attach();\n return childHandle(handle);\n };\n }\n\n private undecided(ppid: number) {\n const decided = Promise.withResolvers<boolean>();\n return {\n promise: decided.promise,\n attach: () => {\n const timer = setTimeout(() => decided.resolve(false), DECIDE_MS);\n void decided.promise.then(() => clearTimeout(timer));\n const waiting = this.deciding.get(ppid) ?? new Set();\n waiting.add(decided.resolve);\n this.deciding.set(ppid, waiting);\n },\n };\n }\n\n private identityOf(pid: number): { pid: number; ppid: number } {\n const parent = this.jobs.shownParent(pid);\n const alive = parent !== undefined && this.running(parent);\n return { pid: this.jobs.shown(pid), ppid: alive ? parent : INIT_PID };\n }\n\n private running(shown: number): boolean {\n return this.jobs\n .list()\n .some((member) => !this.zombies.has(member.pid) && this.jobs.shown(member.pid) === shown);\n }\n\n private decide(ppid: number): void {\n const waiting = this.deciding.get(ppid);\n if (!waiting) return;\n this.deciding.delete(ppid);\n setTimeout(() => {\n for (const resolve of waiting) resolve(true);\n }, 0);\n }\n\n private forker(ppid: number, parent: StartRequest): ChildForker {\n const { exec: _exec, ...image } = parent;\n return async (state, fds) =>\n childHandle(\n this.start({\n ...image,\n cwd: state.cwd ?? parent.cwd,\n fds,\n ppid,\n fork: state,\n ignored: this.ignoredBy(ppid, true),\n umask: this.umaskOf(ppid),\n })\n );\n }\n\n private keySignal(tty: KernelTty, fallback: number, sig: number, send: () => void): void {\n const pgid = this.jobs.tcgetpgrp(tty, fallback);\n const foreground = () => this.jobs.tcgetpgrp(tty, fallback);\n this.settling.deliver(sig, pgid, send, tty.reading ? undefined : foreground);\n }\n\n private umaskOf(pid: number): number {\n return this.processes.get(pid)?.umask?.() ?? DEFAULT_UMASK;\n }\n\n private released(path: string): void {\n const at = normalizePath(path);\n this.unlinked.closed(at);\n const open = [...this.openFiles].some((nodes) => nodes.writes(at)) || heldUnder(this.held, at);\n if (!open) void this.mounts.commit(at).catch(() => undefined);\n }\n\n private ignoredBy(pid: number, fork = false): number {\n return this.processes.get(pid)?.ignoredSignals(fork) ?? 0;\n }\n\n kill(pid: number, sig: number): boolean {\n if (pid < 0) return this.jobs.killGroup(-pid, sig);\n const handle = this.processes.get(pid);\n if (!handle) return false;\n if (sig !== 0) handle.signal(sig);\n return true;\n }\n\n private async driver(type: string, spec: MountSpec): Promise<OpenedDriver> {\n if (type === 'fsa') return this.fsaDriver(spec);\n if (type === 'hostfs') {\n const { hostfs, hostfsFetch, hostfsTiming } = this.hostfs;\n if (!hostfs)\n throw fsError('ENODEV', 'this kernel has no hostfs hook (createKernel({ hostfs }))');\n return openHostfs(\n spec,\n hostfs,\n hostfsFetch ?? ((url, init) => fetch(url, init)),\n hostfsTiming\n );\n }\n if (type === 'tmpfs') {\n const { port1, port2 } = new MessageChannel();\n serveFilesystem(\n port2,\n tmpfs(),\n { symlinks: true, chmod: true, linkTimes: true, ranges: true, attrTtl: 0 },\n { owned: true }\n );\n return {\n port: port1,\n dispose: () => {\n port1.close();\n port2.close();\n },\n };\n }\n const module = (await scanFilesystems(this.base, await this.roots())).get(type);\n if (!module) throw fsError('ENODEV', `unknown file system type ${type}`);\n if (!this.createDriverWorker)\n throw fsError('ENODEV', `this kernel cannot start ${type} drivers`);\n const code = await this.base.readFile(module);\n const worker = this.createDriverWorker();\n const driver = new MessageChannel();\n const client = new MessageChannel();\n const served = serveClient(client.port1, {\n launcher: async () => this,\n scope: 'transport',\n });\n worker.postMessage({ code, driver: driver.port2, client: client.port2 }, [\n driver.port2,\n client.port2,\n ]);\n return {\n port: driver.port1,\n dispose: () => {\n worker.terminate();\n served.detach();\n driver.port1.close();\n },\n onCrash: (listener) =>\n worker.addEventListener('error', (event) => {\n (event as { preventDefault?: () => void }).preventDefault?.();\n listener(new Error(String((event as { message?: unknown }).message)));\n }),\n };\n }\n\n private async fsaDriver(spec: MountSpec): Promise<OpenedDriver> {\n const { target, source } = spec;\n const ask = (handle?: MediumHandle) =>\n this.onMountPending?.({ target, source, ...(handle ? { handle } : {}) });\n const { port1, port2 } = new MessageChannel();\n const medium = removableMedium((handle) => {\n served.invalidate(true);\n ask(handle);\n });\n const served = serveFilesystem(port2, medium.handlers, FSA_CAPABILITIES);\n const id = source.slice('fsa:'.length);\n this.removable.set(target, { id, medium, served });\n const stored = this.inserted.get(id) ?? (await this.media.get(id));\n if (stored && (await granted(stored))) medium.insert(stored);\n else ask(stored);\n return {\n port: port1,\n present: () => medium.present(),\n dispose: () => {\n this.removable.delete(target);\n port1.close();\n port2.close();\n },\n };\n }\n\n async mount(spec: MountSpec): Promise<MountEntry> {\n const fsa = spec.type === 'fsa' && !spec.source.startsWith('fsa:');\n const entry = await this.mounts.mount(\n fsa ? { ...spec, source: `fsa:${crypto.randomUUID()}` } : spec,\n this.fs\n );\n void this.unlinked.sweep(entry.target);\n return entry;\n }\n\n private mountRoot(path: string): string {\n let root = '/';\n for (const { target } of this.mounts.list()) {\n if (target.length > root.length && (path === target || path.startsWith(`${target}/`))) {\n root = target;\n }\n }\n return root;\n }\n\n async insert(target: string, handle: MediumHandle, source?: string): Promise<void> {\n const at = normalizePath(target);\n const slot = this.removable.get(at);\n if (!slot) throw fsError('EINVAL', `${at} is not a removable mount`);\n if (source !== undefined && source !== `fsa:${slot.id}`) {\n throw fsError('EINVAL', `${at} is no longer the drive ${source}`);\n }\n if (!(await granted(handle))) throw fsError('EACCES', `${at}: no permission for this folder`);\n this.inserted.set(slot.id, handle);\n await this.media.put(slot.id, handle);\n slot.medium.insert(handle);\n slot.served.invalidate(true);\n void this.unlinked.sweep(at);\n }\n\n umount(target: string, detach = false): void {\n const at = normalizePath(target);\n this.mounts.umount(at, detach);\n if (!detach) return;\n for (const nodes of this.openFiles) nodes.revoke(at);\n for (const holds of this.held) holds.revoke(at);\n }\n\n unmountAll(): void {\n this.booting.abort();\n const targets = this.mounts.list().map((m) => m.target);\n for (const target of targets.sort((a, b) => b.length - a.length)) this.umount(target, true);\n }\n\n private async permit(req: ProcessMountRequest): Promise<void> {\n const policy = this.processMounts;\n const allowed = typeof policy === 'function' ? await policy(req) : policy;\n if (!allowed) throw fsError('EPERM', `process ${req.pid} may not ${req.op} ${req.target}`);\n }\n\n private async processMount(pid: number, call: MountCall, signal: AbortSignal): Promise<void> {\n const spec = mountCall(call);\n await this.permit({ op: 'mount', pid, ...spec, options: { ...spec.options } });\n const entry = await this.mount(spec);\n if (signal.aborted) this.umount(entry.target, true);\n }\n\n private async processUmount(pid: number, target: string, flags: number): Promise<void> {\n const call = umountCall(target, flags);\n for (;;) {\n const mounted = this.mounts.mounted(call.target);\n await this.permit({\n op: 'umount',\n pid,\n target: call.target,\n ...(mounted ? { type: mounted.type, source: mounted.source } : {}),\n });\n if (this.mounts.mounted(call.target) === mounted) break;\n }\n this.umount(call.target, call.detach);\n }\n\n async prepare(): Promise<void> {\n for (const dir of SHARED_DIRS) await this.base.mkdir(dir, { recursive: true });\n await writeCaFile(this.base, this.ca).catch(() => undefined);\n this.fstab = this.mountFstab();\n }\n\n private async mountFstab(): Promise<FstabResult[]> {\n const text = await this.base.readFile(FSTAB_PATH).catch(() => '');\n const lines = parseFstab(text);\n for (const { spec } of lines) this.mounts.note(spec, 'pending');\n return mountFstab(\n lines,\n (spec) =>\n this.mount(spec).catch((err: unknown) => {\n this.mounts.note(spec, 'pending', (err as Error)?.message ?? String(err));\n throw err;\n }),\n this.booting.signal,\n this.fstabRetries,\n (entry) => this.umount(entry.target, true),\n ({ spec }, result) => {\n if (!result.code || result.code === 'ECANCELED' || this.booting.signal.aborted) {\n this.mounts.unnote(spec.target);\n } else this.mounts.note(spec, 'failed', result.error);\n }\n );\n }\n\n private environment(cwd: string, extra: Record<string, string> | undefined) {\n return {\n PATH: `/usr/bin:/bin:${this.pnpmHome}/bin`,\n HOME: '/home',\n PNPM_HOME: this.pnpmHome,\n ...this.env,\n PWD: cwd,\n ...extra,\n };\n }\n\n private async starting(argv: string[], dir: string | undefined) {\n this.catalog = undefined;\n this.binfmts = undefined;\n const start = dir ?? '/';\n const cwd = await physicalPathAsync(this.base, start.startsWith('/') ? start : `/${start}`);\n const [file = ''] = argv;\n await this.base.mkdir(cwd, { recursive: true });\n return { cwd, file, planned: await this.plan(file, argv, cwd) };\n }\n\n async openTerminal(argv: string[], options: TerminalOptions): Promise<TerminalSession> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n if (!planned) throw new Error(`${file}: command not found`);\n let leader = 0;\n const tty: KernelTty = new KernelTty(\n { write: (bytes) => options.onData(bytes.slice()) },\n (sig) => this.keySignal(tty, leader, sig, () => this.jobs.signalForeground(tty, leader, sig))\n );\n tty.onRead = () => this.settling.reading(this.jobs.tcgetpgrp(tty, leader));\n tty.name = `/dev/tty${++this.terminals}`;\n tty.setSize(options.cols ?? 80, options.rows ?? 24);\n const fds = new FdTable();\n const stdio = tty.file();\n fds.installAt(0, stdio);\n fds.installAt(1, stdio.retain());\n fds.installAt(2, stdio.retain());\n const env = this.environment(cwd, {\n TERM: 'xterm-256color',\n COLORTERM: 'truecolor',\n ...options.env,\n });\n const report = (message: string) => options.onData(encoder.encode(`${message}\\r\\n`));\n const handle = await this.launch(planned, { env, cwd, fds, report });\n leader = handle.pid;\n void handle.exited.then(() => tty.hangup());\n return {\n pid: handle.pid,\n exited: handle.exited,\n write: (bytes) => tty.receive(bytes),\n resize: (cols, rows) => tty.resize(cols, rows),\n signal: (sig) => this.jobs.signalForeground(tty, leader, sig),\n close: () => {\n tty.signalHangup();\n tty.hangup();\n },\n };\n }\n\n async run(argv: string[], options: RunOptions = {}): Promise<RunResult> {\n const { cwd, file, planned } = await this.starting(argv, options.cwd);\n const env = this.environment(cwd, options.env);\n const out: Uint8Array[] = [];\n const err: Uint8Array[] = [];\n const keep = options.collect !== false;\n const collect =\n (chunks: Uint8Array[], tee?: (bytes: Uint8Array) => void) => (bytes: Uint8Array) => {\n if (keep) chunks.push(bytes);\n tee?.(bytes);\n };\n const stdout = collect(out, options.onStdout);\n const stderr = collect(err, options.onStderr);\n const report = (message: string) => stderr(encoder.encode(`${message}\\n`));\n if (!planned) {\n report(`${file}: command not found`);\n return { status: NOT_FOUND, stdout: concat(out), stderr: concat(err) };\n }\n const fds = new FdTable();\n fds.installAt(0, options.stdin ? bytesSource(options.stdin) : deviceFile('null'));\n fds.installAt(1, sinkFile(stdout));\n fds.installAt(2, sinkFile(stderr));\n const group = options.pgid !== undefined ? { pgid: options.pgid } : {};\n const handle = await this.launch(planned, { env, cwd, fds, report, ...group });\n options.onStarted?.(handle.pid);\n const status = await handle.exited;\n return { status, stdout: concat(out), stderr: concat(err) };\n }\n}\n\nexport type { ProcessInfo, ProcessListing } from './kernel/proc-info.ts';\n", "type Handle = MemoryFile | MemoryDirectory;\n\nconst fail = (name: string): never => {\n throw new DOMException(name, name);\n};\n\nfunction valid(name: string): void {\n if (name === '' || name === '.' || name === '..' || name.includes('/')) {\n throw new TypeError(`invalid name: ${name}`);\n }\n}\n\nconst CHUNK = 1024 * 1024;\n\nfunction bytesOf(data: unknown): Promise<Uint8Array> | Uint8Array {\n if (typeof data === 'string') return new TextEncoder().encode(data);\n if (data instanceof Blob) return data.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n return new Uint8Array(data as ArrayBuffer);\n}\n\ninterface WriteParams {\n type: 'write' | 'seek' | 'truncate';\n data?: unknown;\n position?: number;\n size?: number;\n}\n\nconst isParams = (data: unknown): data is WriteParams =>\n ['write', 'seek', 'truncate'].includes((data as { type?: unknown } | null)?.type as string) &&\n !(data instanceof Blob);\n\nclass Chunks {\n blobs: Blob[];\n size: number;\n\n constructor(blobs: Blob[] = [], size = 0) {\n this.blobs = blobs;\n this.size = size;\n }\n\n private pad(index: number, length: number): void {\n const blob = this.blobs[index] ?? new Blob([]);\n if (blob.size < length)\n this.blobs[index] = new Blob([blob, new Uint8Array(length - blob.size)]);\n }\n\n private grow(end: number): void {\n if (end <= this.size) return;\n const last = Math.floor((end - 1) / CHUNK);\n for (let i = 0; i < last; i++) this.pad(i, CHUNK);\n this.pad(last, end - last * CHUNK);\n this.size = end;\n }\n\n async write(at: number, bytes: Uint8Array): Promise<void> {\n if (bytes.length === 0) return;\n const first = Math.floor(at / CHUNK);\n for (let i = 0; i < first; i++) this.pad(i, CHUNK);\n for (let done = 0; done < bytes.length; ) {\n const index = Math.floor((at + done) / CHUNK);\n const from = at + done - index * CHUNK;\n const n = Math.min(CHUNK - from, bytes.length - done);\n const view = bytes.subarray(done, done + n);\n const part = (\n view.buffer instanceof ArrayBuffer ? view : view.slice()\n ) as Uint8Array<ArrayBuffer>;\n const old = this.blobs[index];\n if (from === 0 && n >= (old?.size ?? 0)) this.blobs[index] = new Blob([part]);\n else {\n const merged = new Uint8Array(Math.max(old?.size ?? 0, from + n));\n if (old) merged.set(new Uint8Array(await old.arrayBuffer()));\n merged.set(part, from);\n this.blobs[index] = new Blob([merged]);\n }\n done += n;\n }\n this.size = Math.max(this.size, at + bytes.length);\n }\n\n truncate(size: number): void {\n if (size >= this.size) {\n this.grow(size);\n return;\n }\n const keep = Math.ceil(size / CHUNK);\n this.blobs.length = keep;\n if (keep > 0)\n this.blobs[keep - 1] = (this.blobs[keep - 1] as Blob).slice(0, size - (keep - 1) * CHUNK);\n this.size = size;\n }\n}\n\nclass MemoryFile {\n readonly kind = 'file';\n name: string;\n parent: MemoryDirectory;\n data = new Chunks();\n lastModified = Date.now();\n\n constructor(name: string, parent: MemoryDirectory) {\n this.name = name;\n this.parent = parent;\n }\n\n async getFile(): Promise<File> {\n return new File(this.data.blobs, this.name, { lastModified: this.lastModified });\n }\n\n async createWritable({ keepExistingData = false } = {}) {\n const next = keepExistingData ? new Chunks([...this.data.blobs], this.data.size) : new Chunks();\n let position = 0;\n const put = async (data: unknown) => {\n const bytes = await bytesOf(data);\n await next.write(position, bytes);\n position += bytes.length;\n };\n return {\n write: async (data: unknown) => {\n if (!isParams(data)) return put(data);\n if (data.type === 'truncate') return next.truncate(data.size ?? 0);\n position = data.position ?? position;\n if (data.type === 'write') await put(data.data);\n },\n seek: async (at: number) => {\n position = at;\n },\n truncate: async (size: number) => next.truncate(size),\n close: async () => {\n this.data = next;\n this.lastModified = Date.now();\n },\n abort: async () => {},\n };\n }\n\n async move(parent: MemoryDirectory, name: string): Promise<void> {\n valid(name);\n if (parent.children.get(name)?.kind === 'directory') fail('InvalidModificationError');\n this.parent.children.delete(this.name);\n this.name = name;\n this.parent = parent;\n parent.children.set(name, this);\n }\n}\n\nclass MemoryDirectory {\n readonly kind = 'directory';\n name: string;\n parent: MemoryDirectory | null;\n readonly children = new Map<string, Handle>();\n removed = false;\n\n constructor(name: string, parent: MemoryDirectory | null) {\n this.name = name;\n this.parent = parent;\n }\n\n private present(): void {\n if (this.removed) fail('NotFoundError');\n }\n\n async getDirectoryHandle(name: string, { create = false } = {}): Promise<MemoryDirectory> {\n this.present();\n valid(name);\n const found = this.children.get(name);\n if (found?.kind === 'file') fail('TypeMismatchError');\n if (found) return found as MemoryDirectory;\n if (!create) fail('NotFoundError');\n const dir = new MemoryDirectory(name, this);\n this.children.set(name, dir);\n return dir;\n }\n\n async getFileHandle(name: string, { create = false } = {}): Promise<MemoryFile> {\n this.present();\n valid(name);\n const found = this.children.get(name);\n if (found?.kind === 'directory') fail('TypeMismatchError');\n if (found) return found as MemoryFile;\n if (!create) fail('NotFoundError');\n const file = new MemoryFile(name, this);\n this.children.set(name, file);\n return file;\n }\n\n async removeEntry(name: string, { recursive = false } = {}): Promise<void> {\n this.present();\n valid(name);\n const found = this.children.get(name);\n if (!found) return fail('NotFoundError');\n if (found.kind === 'directory' && found.children.size > 0 && !recursive) {\n fail('InvalidModificationError');\n }\n this.children.delete(name);\n if (found.kind === 'directory') found.remove();\n }\n\n async resolve(handle: Handle): Promise<string[] | null> {\n const names: string[] = [];\n for (let at: Handle | null = handle; at !== this; at = at.parent) {\n if (!at || (at.kind === 'directory' && at.removed)) return null;\n names.unshift(at.name);\n }\n return names;\n }\n\n remove(): void {\n this.removed = true;\n for (const child of this.children.values()) if (child.kind === 'directory') child.remove();\n }\n\n async *keys(): AsyncGenerator<string> {\n this.present();\n for (const name of [...this.children.keys()]) yield name;\n }\n\n async *values(): AsyncGenerator<Handle> {\n for (const handle of [...this.children.values()]) yield handle;\n }\n\n async *entries(): AsyncGenerator<[string, Handle]> {\n for (const entry of [...this.children]) yield entry;\n }\n\n async move(parent: MemoryDirectory, name: string): Promise<void> {\n valid(name);\n if (parent.children.has(name)) fail('InvalidModificationError');\n this.parent?.children.delete(this.name);\n this.name = name;\n this.parent = parent;\n parent.children.set(name, this);\n }\n}\n\nexport function memoryRoot(): FileSystemDirectoryHandle {\n return new MemoryDirectory('', null) as unknown as FileSystemDirectoryHandle;\n}\n\nexport function isMemoryRoot(handle: FileSystemDirectoryHandle): boolean {\n return (handle as unknown) instanceof MemoryDirectory;\n}\n", "import type {\n HeaderList,\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n RealmTransportTraits,\n RealmWebSocket,\n RealmWebSocketMessage,\n RealmWebSocketRequest,\n} from './transport.ts';\nimport { MessageQueue, payloadSize } from './ws-queue.ts';\n\nexport type TransportCall =\n | {\n net: 'fetch';\n nid: number;\n url: string;\n method: string;\n headers: HeaderList;\n body?: Uint8Array;\n }\n | { net: 'read'; nid: number }\n | { net: 'cancel'; nid: number }\n | { net: 'ws-open'; nid: number; url: string; protocols: string[]; headers: HeaderList }\n | { net: 'ws-send'; nid: number; data: RealmWebSocketMessage }\n | { net: 'ws-close'; nid: number; code?: number; reason?: string }\n | { net: 'ws-consumed'; nid: number; n: number };\n\nexport type TransportReply =\n | { net: 'head'; nid: number; status: number; statusText: string; headers: HeaderList }\n | { net: 'chunk'; nid: number; bytes: Uint8Array }\n | { net: 'end'; nid: number }\n | { net: 'error'; nid: number; message: string; status?: number; code?: string }\n | { net: 'ws-opened'; nid: number; protocol: string }\n | { net: 'ws-message'; nid: number; data: RealmWebSocketMessage }\n | { net: 'ws-acked'; nid: number; n: number }\n | { net: 'ws-closed'; nid: number; code: number; reason: string };\n\nexport interface TransportPort {\n postMessage(message: TransportCall): void;\n}\n\nexport class TransportError extends Error {\n readonly status: number | undefined;\n readonly code: string | undefined;\n\n constructor(message: string, status?: number, code?: string) {\n super(message);\n this.status = status;\n this.code = code;\n }\n}\n\ninterface Waiter {\n resolve(reply: TransportReply): void;\n reject(error: Error): void;\n}\n\nexport class RemoteTransport implements RealmTransport {\n readonly traits: RealmTransportTraits;\n\n private readonly port: TransportPort;\n\n private readonly waiting = new Map<number, Waiter>();\n\n private nextId = 0;\n\n private readonly sockets = new Map<number, { queue: MessageQueue; acked(n: number): void }>();\n\n private failure: Error | undefined;\n\n constructor(port: TransportPort, traits: RealmTransportTraits) {\n this.port = port;\n this.traits = traits;\n }\n\n receive(reply: TransportReply): void {\n const socket = this.sockets.get(reply.nid);\n if (socket && this.toSocket(reply, socket)) return;\n const waiter = this.waiting.get(reply.nid);\n if (!waiter) return;\n this.waiting.delete(reply.nid);\n if (reply.net === 'error') {\n waiter.reject(new TransportError(reply.message, reply.status, reply.code));\n } else waiter.resolve(reply);\n }\n\n private toSocket(\n reply: TransportReply,\n socket: { queue: MessageQueue; acked(n: number): void }\n ): boolean {\n if (reply.net === 'ws-message') socket.queue.push(reply.data);\n else if (reply.net === 'ws-acked') socket.acked(reply.n);\n else if (reply.net === 'ws-closed') {\n this.sockets.delete(reply.nid);\n socket.queue.end({ code: reply.code, reason: reply.reason });\n } else return false;\n return true;\n }\n\n fail(error: Error): void {\n this.failure = error;\n for (const waiter of this.waiting.values()) waiter.reject(error);\n this.waiting.clear();\n for (const socket of this.sockets.values())\n socket.queue.end({ code: 1011, reason: error.message });\n this.sockets.clear();\n }\n\n private ask(call: TransportCall): Promise<TransportReply> {\n if (this.failure) return Promise.reject(this.failure);\n return new Promise((resolve, reject) => {\n this.waiting.set(call.nid, { resolve, reject });\n this.port.postMessage(call);\n });\n }\n\n private cancel(nid: number): void {\n const waiter = this.waiting.get(nid);\n this.waiting.delete(nid);\n waiter?.reject(new TransportError('the request was cancelled'));\n this.port.postMessage({ net: 'cancel', nid });\n }\n\n async fetch(request: RealmTransportRequest): Promise<RealmTransportResponse> {\n const nid = ++this.nextId;\n const { signal } = request;\n signal.throwIfAborted();\n let finished = false;\n const abort = () => {\n finished = true;\n this.cancel(nid);\n };\n signal.addEventListener('abort', abort, { once: true });\n const finish = () => {\n if (finished) return;\n finished = true;\n signal.removeEventListener('abort', abort);\n };\n let head: TransportReply;\n try {\n head = await this.ask({\n net: 'fetch',\n nid,\n url: request.url,\n method: request.method,\n headers: request.headers,\n ...(request.body ? { body: request.body } : {}),\n });\n } catch (e) {\n finish();\n throw e;\n }\n const { status, statusText, headers } = head as Extract<TransportReply, { net: 'head' }>;\n const read = async (): Promise<Uint8Array | undefined> => {\n if (finished) return undefined;\n const reply = await this.ask({ net: 'read', nid }).catch((e: unknown) => {\n finish();\n throw e;\n });\n if (reply.net === 'chunk') return reply.bytes;\n finish();\n return undefined;\n };\n const cancel = async () => {\n if (finished) return;\n finish();\n this.cancel(nid);\n };\n return {\n status,\n statusText,\n headers,\n cancel,\n body: {\n [Symbol.asyncIterator]: () => ({\n next: async () => {\n const bytes = await read();\n return bytes ? { value: bytes, done: false } : { value: undefined, done: true };\n },\n return: async () => {\n await cancel();\n return { value: undefined, done: true };\n },\n }),\n },\n };\n }\n\n async websocket(request: RealmWebSocketRequest): Promise<RealmWebSocket> {\n const nid = ++this.nextId;\n const { signal } = request;\n signal.throwIfAborted();\n const abort = () => this.cancel(nid);\n signal.addEventListener('abort', abort, { once: true });\n let opened: TransportReply;\n try {\n opened = await this.ask({\n net: 'ws-open',\n nid,\n url: request.url,\n protocols: request.protocols,\n headers: request.headers,\n });\n } finally {\n signal.removeEventListener('abort', abort);\n }\n const close = (code?: number, reason?: string) =>\n this.port.postMessage({ net: 'ws-close', nid, code, reason });\n const queue = new MessageQueue(\n () => close(1000, 'a message is too big'),\n Number.POSITIVE_INFINITY,\n (n) => this.port.postMessage({ net: 'ws-consumed', nid, n })\n );\n let unacked = 0;\n this.sockets.set(nid, { queue, acked: (n) => void (unacked -= n) });\n return {\n protocol: (opened as Extract<TransportReply, { net: 'ws-opened' }>).protocol,\n get buffered() {\n return unacked;\n },\n send: (data) => {\n unacked += payloadSize(data);\n this.port.postMessage({ net: 'ws-send', nid, data });\n },\n messages: queue,\n close,\n closed: queue.closed,\n };\n }\n}\n", "import { portCdpHook } from './cdp/port.ts';\nimport type { CdpHook } from './cdp/types.ts';\nimport { type LockManagerLike, locksOf } from './client/protocol.ts';\nimport { type ServedClient, serveClient } from './client/serve-client.ts';\nimport { META_DB, type MetaStore } from './fs/meta.ts';\nimport { OpfsFs } from './fs/opfs.ts';\nimport { dialSocket, serveSocket } from './kernel/dial.ts';\nimport type { WasmWorkerLike } from './kernel/host.ts';\nimport { CA_DB, caStore } from './kernel/net/network.ts';\nimport { RemoteTransport, type TransportReply } from './kernel/net/remote-transport.ts';\nimport type { RouteTable } from './kernel/net/routes.ts';\nimport type { RealmTransportTraits } from './kernel/net/transport.ts';\nimport { RemoteUplink, type UplinkReply, type UplinkTraits } from './kernel/net/uplink.ts';\nimport { SIG } from './kernel/signals.ts';\nimport {\n Launcher,\n type RunOptions,\n type TerminalOptions,\n type TerminalSession,\n} from './launcher.ts';\nimport type { MediumHandle } from './mount/fsa.ts';\nimport type { HostfsGrant, HostfsGrantHook } from './mount/hostfs.ts';\nimport type { MediaStore } from './mount/media.ts';\nimport type { MountSpec } from './mount/mount-fs.ts';\nimport type { ProcessMountRequest } from './mount/syscall.ts';\n\nexport interface KernelPort {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n}\n\nexport interface InitRequest {\n id: number;\n op: 'init';\n root?: FileSystemDirectoryHandle;\n modules?: string;\n env?: Record<string, string>;\n metadata?: string | false;\n media?: string | false;\n ca?: string | false;\n transport?: RealmTransportTraits;\n uplink?: { traits: UplinkTraits; routes?: RouteTable };\n hostfs?: boolean;\n hostname?: string;\n processMounts?: boolean | 'ask';\n cdp?: boolean;\n}\n\nexport interface RunRequest {\n id: number;\n op: 'run';\n argv: string[];\n options: Omit<RunOptions, 'onStdout' | 'onStderr'>;\n}\n\nexport interface OpenTerminalRequest {\n id: number;\n op: 'open-terminal';\n argv: string[];\n options: Omit<TerminalOptions, 'onData'>;\n}\n\nexport type TerminalAction =\n | { action: 'write'; bytes: Uint8Array }\n | { action: 'resize'; cols: number; rows: number }\n | { action: 'signal'; signal: string }\n | { action: 'close' };\n\nexport type TerminalRequest = { id: number; op: 'terminal'; terminal: number } & TerminalAction;\n\nexport interface ConnectRequest {\n id: number;\n op: 'connect';\n}\n\nexport interface RoutesRequest {\n id: number;\n op: 'routes';\n routes: RouteTable;\n}\n\nexport type MountRequest =\n | { id: number; op: 'mount'; spec: MountSpec }\n | { id: number; op: 'umount'; target: string }\n | { id: number; op: 'mounts' }\n | { id: number; op: 'insert'; target: string; source?: string; handle: MediumHandle };\n\nexport interface DialRequest {\n id: number;\n op: 'dial';\n port: number;\n host?: string;\n}\n\nexport type KernelRequest =\n | InitRequest\n | RunRequest\n | OpenTerminalRequest\n | TerminalRequest\n | ConnectRequest\n | MountRequest\n | DialRequest\n | RoutesRequest;\n\ntype WithoutId<T> = T extends unknown ? Omit<T, 'id'> : never;\n\nexport type KernelCall = WithoutId<KernelRequest>;\n\nexport async function inOpfs(deps: ServeDeps, root: FileSystemDirectoryHandle): Promise<boolean> {\n if (deps.syncAccess !== true) return false;\n const opfs = await deps.storage().catch(() => undefined);\n return (await opfs?.resolve(root).catch(() => null)) != null;\n}\n\nexport interface ServeDeps {\n storage: () => Promise<FileSystemDirectoryHandle>;\n syncAccess?: boolean;\n createWorker: () => WasmWorkerLike;\n createDriverWorker?: () => WasmWorkerLike;\n metadata?: (name: string) => Promise<MetaStore>;\n media?: (name: string) => Promise<MediaStore>;\n locks?: LockManagerLike | null;\n}\n\nexport function signalNumber(name: string): number {\n const key = name.slice(3);\n if (!name.startsWith('SIG') || !Object.hasOwn(SIG, key))\n throw new Error(`unknown signal ${name}`);\n return (SIG as Record<string, number>)[key];\n}\n\nfunction act(session: TerminalSession, req: TerminalAction): void {\n if (req.action === 'write') session.write(req.bytes);\n else if (req.action === 'resize') session.resize(req.cols, req.rows);\n else if (req.action === 'signal') session.signal(signalNumber(req.signal));\n else session.close();\n}\n\nfunction dirsChannel(name: string | false): string | undefined {\n return name === false ? undefined : `slicc-kernel-dirs:${name}`;\n}\n\nfunction caDb(req: InitRequest): string | false {\n const name = req.ca ?? (req.metadata ? `${req.metadata}-ca` : CA_DB);\n const taken = [req.metadata ?? META_DB, req.media ?? `${req.metadata ?? META_DB}:media`];\n if (name !== false && taken.includes(name)) {\n throw new Error(`the CA cannot share the IndexedDB database ${name}`);\n }\n return name;\n}\n\nasync function stores(\n deps: ServeDeps,\n name: string | false,\n media: string | false | undefined\n): Promise<{ meta?: MetaStore | undefined; media?: MediaStore | undefined }> {\n const handles = media ?? (name === false ? false : `${name}:media`);\n if (handles !== false && handles === name) {\n throw new Error(`media and metadata cannot share the IndexedDB database ${name}`);\n }\n return {\n ...(name === false ? {} : { meta: await deps.metadata?.(name) }),\n ...(handles === false ? {} : { media: await deps.media?.(handles) }),\n };\n}\n\nfunction cdpOption(req: InitRequest, port: KernelPort): { cdp?: CdpHook } {\n if (!req.cdp) return {};\n return {\n cdp: portCdpHook((request, cdp) =>\n port.postMessage({ cdpOpen: request, port: cdp }, [cdp as unknown as MessagePort])\n ),\n };\n}\n\nfunction remotes(\n port: KernelPort,\n req: InitRequest\n): { transport?: RemoteTransport; uplink?: RemoteUplink } {\n return {\n ...(req.transport ? { transport: new RemoteTransport(port, req.transport) } : {}),\n ...(req.uplink ? { uplink: new RemoteUplink(port, req.uplink.traits, req.uplink.routes) } : {}),\n };\n}\n\nfunction answered(\n data: { net?: unknown; uplink?: unknown },\n remote: RemoteTransport | undefined,\n uplink: RemoteUplink | undefined\n): boolean {\n if (data.net !== undefined) remote?.receive(data as TransportReply);\n else if (typeof data.uplink === 'string') uplink?.receive(data as UplinkReply);\n else return false;\n return true;\n}\n\nexport interface GrantReply {\n id: number;\n grant?: HostfsGrant;\n error?: string;\n}\n\nexport function serveKernel(port: KernelPort, deps: ServeDeps): void {\n let launcher: Promise<Launcher> | undefined;\n let remote: RemoteTransport | undefined;\n let uplink: RemoteUplink | undefined;\n const terminals = new Map<number, TerminalSession>();\n const reply = (id: number, body: object, transfer?: Transferable[]) =>\n port.postMessage({ id, ...body }, transfer);\n const clients = new Set<ServedClient>();\n\n const locks = deps.locks === null ? undefined : (deps.locks ?? locksOf());\n let holding: Promise<string> | undefined;\n\n function holdLock(locks: LockManagerLike): Promise<string> {\n holding ??= new Promise<string>((resolve) => {\n const name = `slicc-kernel:${crypto.randomUUID()}`;\n void locks.request(name, () => {\n resolve(name);\n return new Promise(() => {});\n });\n });\n return holding;\n }\n\n async function connect(): Promise<MessagePort> {\n await ready();\n const { port1, port2 } = new MessageChannel();\n const held = locks ? await holdLock(locks) : undefined;\n const served = serveClient(port1, {\n launcher: ready,\n signal: signalNumber,\n ...(locks ? { locks } : {}),\n ...(held ? { lock: held } : {}),\n });\n clients.add(served);\n void served.closed.then(() => clients.delete(served));\n return port2;\n }\n\n async function dial(req: DialRequest): Promise<MessagePort> {\n const socket = dialSocket((await ready()).net, req.port, req.host);\n const { port1, port2 } = new MessageChannel();\n serveSocket(socket, port1);\n return port2;\n }\n\n async function ready(): Promise<Launcher> {\n if (!launcher) throw new Error('the kernel is not initialized');\n return launcher;\n }\n\n async function terminal(req: OpenTerminalRequest): Promise<number> {\n const onData = (bytes: Uint8Array) => reply(req.id, { fd: 1, bytes });\n const session = await (await ready()).openTerminal(req.argv, { ...req.options, onData });\n terminals.set(req.id, session);\n reply(req.id, { started: session.pid });\n try {\n return await session.exited;\n } finally {\n terminals.delete(req.id);\n }\n }\n\n async function init(req: InitRequest): Promise<boolean> {\n launcher = (req.root ? Promise.resolve(req.root) : deps.storage()).then(async (root) => {\n const name = req.metadata ?? META_DB;\n const { meta, media } = await stores(deps, name, req.media);\n const net = remotes(port, req);\n ({ transport: remote, uplink } = net);\n const ranged = await inOpfs(deps, root);\n const fs = new OpfsFs(root, meta, dirsChannel(name), { ranged });\n await fs.reconcile();\n const started = new Launcher({\n fs,\n createWorker: deps.createWorker,\n ...(deps.createDriverWorker ? { createDriverWorker: deps.createDriverWorker } : {}),\n ...(req.modules ? { modules: req.modules } : {}),\n ...(req.env ? { env: req.env } : {}),\n ...(req.hostname !== undefined ? { hostname: req.hostname } : {}),\n ...net,\n ...(media ? { media } : {}),\n onMountPending: (medium) => port.postMessage({ medium }),\n ...(req.hostfs ? { hostfs: askGrant } : {}),\n ...cdpOption(req, port),\n ...mountPolicy(req.processMounts),\n caStore: caStore(deps.metadata ? caDb(req) : false),\n });\n await started.prepare();\n return started;\n });\n await launcher;\n return true;\n }\n\n async function mountOp(req: MountRequest): Promise<unknown> {\n const l = await ready();\n if (req.op === 'mount') return l.mount(req.spec);\n if (req.op === 'umount') return l.umount(req.target);\n if (req.op === 'insert') return l.insert(req.target, req.handle, req.source);\n return l.mounts.list();\n }\n\n async function handle(req: KernelRequest): Promise<unknown> {\n if (req.op === 'init') return init(req);\n if (req.op === 'open-terminal') return terminal(req);\n if (req.op === 'connect') return connect();\n if (req.op === 'routes') {\n (await ready()).setRoutes(req.routes);\n return true;\n }\n if (req.op === 'dial') return dial(req);\n if (req.op === 'mount' || req.op === 'umount' || req.op === 'mounts' || req.op === 'insert')\n return mountOp(req);\n if (req.op === 'terminal') {\n const session = terminals.get(req.terminal);\n if (!session) throw new Error(`no terminal ${req.terminal}`);\n act(session, req);\n return true;\n }\n return (await ready()).run(req.argv, {\n ...req.options,\n onStdout: (bytes) => reply(req.id, { fd: 1, bytes }),\n onStderr: (bytes) => reply(req.id, { fd: 2, bytes }),\n });\n }\n\n const grants = new Map<number, PromiseWithResolvers<HostfsGrant>>();\n let nextGrant = 0;\n const askGrant: HostfsGrantHook = (source, options) => {\n const id = ++nextGrant;\n const waiting = Promise.withResolvers<HostfsGrant>();\n grants.set(id, waiting);\n port.postMessage({ hostfs: { id, source, ...options } });\n return waiting.promise;\n };\n function granted({ id, grant, error }: GrantReply): void {\n const waiting = grants.get(id);\n if (!waiting) return;\n grants.delete(id);\n if (grant) waiting.resolve(grant);\n else waiting.reject(Object.assign(new Error(error ?? 'no grant'), { code: 'EACCES' }));\n }\n\n const policies = new Map<number, (allowed: boolean) => void>();\n let nextPolicy = 0;\n const askPolicy = (req: ProcessMountRequest) =>\n new Promise<boolean>((resolve) => {\n const id = ++nextPolicy;\n policies.set(id, resolve);\n port.postMessage({ mountPolicy: { id, req } });\n });\n\n const mountPolicy = (policy: InitRequest['processMounts']) =>\n policy === undefined ? {} : { processMounts: policy === 'ask' ? askPolicy : policy };\n\n port.addEventListener('message', (event) => {\n const grant = (event.data as { hostfsGrant?: GrantReply }).hostfsGrant;\n if (grant) return granted(grant);\n const answer = (event.data as { mountAllowed?: { id: number; allowed: boolean } }).mountAllowed;\n if (answer) {\n policies.get(answer.id)?.(answer.allowed);\n policies.delete(answer.id);\n return;\n }\n if (answered(event.data, remote, uplink)) return;\n const req = event.data as KernelRequest;\n handle(req).then(\n (result) => reply(req.id, { result }, result instanceof MessagePort ? [result] : undefined),\n (err) => reply(req.id, { error: err instanceof Error ? err.message : String(err) })\n );\n });\n}\n", "export interface DialledSocket {\n readable: ReadableStream<Uint8Array>;\n writable: WritableStream<Uint8Array>;\n close(): void;\n}\n\nexport interface DialOptions {\n port: number;\n host?: string;\n}\n\ninterface StreamPort {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', handler: (event: MessageEvent) => void): void;\n start?(): void;\n close(): void;\n}\n\ntype DialMessage = Uint8Array | { end: true } | { ack: true } | { error: string };\n\nexport interface DialHandle extends DialledSocket {\n fail(error: Error): void;\n}\n\nexport function errorWithCode(message: string): Error & { code?: string } {\n const code = /^E[A-Z]+/.exec(message)?.[0];\n return Object.assign(new Error(message), code ? { code } : {});\n}\n\nexport function dialStream(port: StreamPort, onClose?: () => void): DialHandle {\n let closed = false;\n let reader: ReadableStreamDefaultController<Uint8Array> | undefined;\n const acks: Array<{ resolve: () => void; reject: (error: Error) => void }> = [];\n const readable = new ReadableStream<Uint8Array>({\n start(controller) {\n reader = controller;\n },\n pull() {\n if (!closed) port.postMessage({ more: true });\n },\n cancel() {\n reader = undefined;\n close();\n },\n });\n const finish = (fail?: Error) => {\n const controller = reader;\n reader = undefined;\n for (const ack of acks.splice(0)) {\n if (fail) ack.reject(fail);\n else ack.resolve();\n }\n if (!controller) return;\n if (fail) controller.error(fail);\n else controller.close();\n };\n function shut(): void {\n if (closed) return;\n closed = true;\n port.close();\n onClose?.();\n }\n function close(): void {\n if (!closed) port.postMessage({ close: true });\n shut();\n finish();\n }\n port.addEventListener('message', ({ data }: MessageEvent<DialMessage>) => {\n if (data instanceof Uint8Array) reader?.enqueue(data);\n else if ('ack' in data) acks.shift()?.resolve();\n else if ('end' in data) finish();\n else finish(errorWithCode(data.error));\n });\n port.start?.();\n const writable = new WritableStream<Uint8Array>({\n write(chunk) {\n if (closed) throw errorWithCode('EPIPE: the connection is closed');\n const copy = chunk.slice();\n const acked = new Promise<void>((resolve, reject) => acks.push({ resolve, reject }));\n port.postMessage(copy, [copy.buffer]);\n return acked;\n },\n close() {\n if (!closed) port.postMessage({ end: true });\n },\n abort() {\n close();\n },\n });\n const fail = (error: Error) => {\n shut();\n finish(error);\n };\n return { readable, writable, close, fail };\n}\n", "import { type DialledSocket, type DialOptions, errorWithCode } from './dial-stream.ts';\n\nexport interface LoopbackFetchOptions extends DialOptions {\n signal?: AbortSignal;\n}\n\nconst OWN_HEADERS = new Set(['host', 'connection', 'content-length', 'transfer-encoding']);\nconst encoder = new TextEncoder();\nconst latin1 = new TextDecoder('latin1');\n\nclass ByteSource {\n private buffered = new Uint8Array(0);\n private readonly reader: ReadableStreamDefaultReader<Uint8Array>;\n\n constructor(reader: ReadableStreamDefaultReader<Uint8Array>) {\n this.reader = reader;\n }\n\n private async more(): Promise<boolean> {\n const { done, value } = await this.reader.read();\n if (done) return false;\n const joined = new Uint8Array(this.buffered.length + value.length);\n joined.set(this.buffered);\n joined.set(value, this.buffered.length);\n this.buffered = joined;\n return true;\n }\n\n async until(marker: string): Promise<Uint8Array | undefined> {\n const needle = encoder.encode(marker);\n for (;;) {\n const at = indexOf(this.buffered, needle);\n if (at >= 0) return this.take(at + needle.length);\n if (!(await this.more())) return undefined;\n }\n }\n\n async some(max: number): Promise<Uint8Array | undefined> {\n if (this.buffered.length === 0 && !(await this.more())) return undefined;\n return this.take(Math.min(max, this.buffered.length));\n }\n\n async exactly(count: number): Promise<Uint8Array | undefined> {\n while (this.buffered.length < count) if (!(await this.more())) return undefined;\n return this.take(count);\n }\n\n private take(count: number): Uint8Array {\n const out = this.buffered.slice(0, count);\n this.buffered = this.buffered.slice(count);\n return out;\n }\n}\n\nfunction indexOf(haystack: Uint8Array, needle: Uint8Array): number {\n outer: for (let i = 0; i + needle.length <= haystack.length; i++) {\n for (let j = 0; j < needle.length; j++) if (haystack[i + j] !== needle[j]) continue outer;\n return i;\n }\n return -1;\n}\n\ninterface ResponseHead {\n status: number;\n statusText: string;\n headers: Array<[string, string]>;\n}\n\nfunction parseHead(bytes: Uint8Array): ResponseHead {\n const [statusLine = '', ...lines] = latin1.decode(bytes).split('\\r\\n');\n const match = /^HTTP\\/1\\.[01] (\\d{3})(?: (.*))?$/.exec(statusLine);\n if (!match) throw errorWithCode(`EPROTO: not an HTTP/1.x response: ${statusLine.slice(0, 80)}`);\n const headers: Array<[string, string]> = [];\n for (const line of lines) {\n const colon = line.indexOf(':');\n if (colon > 0) headers.push([line.slice(0, colon).trim(), line.slice(colon + 1).trim()]);\n }\n return { status: Number(match[1]), statusText: match[2] ?? '', headers };\n}\n\nfunction header(head: ResponseHead, name: string): string | undefined {\n return head.headers.find(([key]) => key.toLowerCase() === name)?.[1];\n}\n\nasync function* chunked(source: ByteSource): AsyncGenerator<Uint8Array> {\n for (;;) {\n const line = await source.until('\\r\\n');\n if (!line) throw errorWithCode('EPROTO: the chunked body ended early');\n const size = Number.parseInt(latin1.decode(line).trim().split(';')[0] ?? '', 16);\n if (!Number.isFinite(size)) throw errorWithCode('EPROTO: a malformed chunk size');\n if (size === 0) return;\n const data = await source.exactly(size);\n if (!data || !(await source.exactly(2))) throw errorWithCode('EPROTO: a chunk ended early');\n yield data;\n }\n}\n\nasync function* counted(source: ByteSource, length: number): AsyncGenerator<Uint8Array> {\n let left = length;\n while (left > 0) {\n const data = await source.some(left);\n if (!data) throw errorWithCode('EPROTO: the body ended early');\n left -= data.length;\n yield data;\n }\n}\n\nasync function* untilClose(source: ByteSource): AsyncGenerator<Uint8Array> {\n for (let data = await source.some(65536); data; data = await source.some(65536)) yield data;\n}\n\nfunction bodyOf(source: ByteSource, head: ResponseHead, method: string) {\n if (method === 'HEAD' || head.status === 204 || head.status === 304) return undefined;\n if (header(head, 'transfer-encoding')?.toLowerCase().includes('chunked')) return chunked(source);\n const length = header(head, 'content-length');\n if (length === undefined) return untilClose(source);\n const size = Number(length);\n if (!/^\\d+$/.test(length.trim()) || !Number.isSafeInteger(size)) {\n throw errorWithCode(`EPROTO: a malformed Content-Length: ${length}`);\n }\n return counted(source, size);\n}\n\nfunction stream(chunks: AsyncGenerator<Uint8Array>, socket: DialledSocket, signal?: AbortSignal) {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n signal?.addEventListener('abort', () => controller.error(signal.reason), { once: true });\n },\n async pull(controller) {\n try {\n const next = await chunks.next();\n if (next.done) {\n controller.close();\n socket.close();\n } else controller.enqueue(next.value);\n } catch (err) {\n controller.error(err);\n socket.close();\n }\n },\n cancel() {\n socket.close();\n },\n });\n}\n\nasync function requestBytes(request: Request): Promise<Uint8Array> {\n const url = new URL(request.url);\n const body = request.body ? new Uint8Array(await request.arrayBuffer()) : undefined;\n const lines = [`${request.method} ${url.pathname}${url.search} HTTP/1.1`, `Host: ${url.host}`];\n request.headers.forEach((value, name) => {\n if (!OWN_HEADERS.has(name)) lines.push(`${name}: ${value}`);\n });\n if (body) lines.push(`Content-Length: ${body.length}`);\n lines.push('Connection: close', '', '');\n const head = encoder.encode(lines.join('\\r\\n'));\n const out = new Uint8Array(head.length + (body?.length ?? 0));\n out.set(head);\n if (body) out.set(body, head.length);\n return out;\n}\n\nexport async function loopbackFetch(\n dial: (options: DialOptions) => Promise<DialledSocket>,\n input: RequestInfo | URL,\n options: LoopbackFetchOptions\n): Promise<Response> {\n options.signal?.throwIfAborted();\n const request = input instanceof Request ? input : new Request(input);\n const bytes = await requestBytes(request);\n const socket = await dial({\n port: options.port,\n ...(options.host ? { host: options.host } : {}),\n });\n options.signal?.addEventListener('abort', () => socket.close(), { once: true });\n try {\n const writer = socket.writable.getWriter();\n await writer.write(bytes);\n writer.releaseLock();\n const source = new ByteSource(socket.readable.getReader());\n let head: ResponseHead;\n do {\n const raw = await source.until('\\r\\n\\r\\n');\n if (!raw) throw errorWithCode('ECONNRESET: the connection closed before a response');\n head = parseHead(raw);\n } while (head.status >= 100 && head.status < 200);\n const chunks = bodyOf(source, head, request.method);\n if (!chunks) socket.close();\n return new Response(chunks ? stream(chunks, socket, options.signal) : null, {\n status: head.status,\n statusText: head.statusText,\n headers: head.headers,\n });\n } catch (err) {\n socket.close();\n throw err;\n }\n}\n", "import { type CdpOpen, serveCdpPort } from '../cdp/port.ts';\nimport type { CdpHook } from '../cdp/types.ts';\nimport type { FsStat } from '../fs/types.ts';\nimport type { WatchChange } from '../fs/watch.ts';\nimport { RemoteTransport, type TransportReply } from '../kernel/net/remote-transport.ts';\nimport type {\n RealmTransport,\n RealmTransportRequest,\n RealmTransportResponse,\n} from '../kernel/net/transport.ts';\nimport type { MountEntry, MountSpec } from '../mount/mount-fs.ts';\nimport { type DialledSocket, type DialOptions, dialStream } from './dial-stream.ts';\nimport { type LoopbackFetchOptions, loopbackFetch } from './loopback-fetch.ts';\nimport {\n type ClientCall,\n type ClientReply,\n type FsMethod,\n type KernelHello,\n type LockManagerLike,\n locksOf,\n type MessagePortLike,\n PROTOCOL,\n type ProcessEntry,\n type TerminalAction,\n versionError,\n} from './protocol.ts';\n\nexport type { WatchChange } from '../fs/watch.ts';\nexport type { ProcessEntry } from './protocol.ts';\n\nexport class KernelGoneError extends Error {\n constructor(message = 'the slicc-kernel this client was attached to is gone') {\n super(message);\n this.name = 'KernelGoneError';\n }\n}\n\nexport class KernelCallError extends Error {\n readonly code: string | undefined;\n\n constructor(message: string, code?: string) {\n super(message);\n this.name = 'KernelCallError';\n this.code = code;\n }\n}\n\nexport interface AttachOptions {\n timeoutMs?: number;\n locks?: LockManagerLike | null;\n}\n\nexport interface SpawnOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: string | Uint8Array;\n group?: 'new';\n pgid?: number;\n onStdout?: (bytes: Uint8Array) => void;\n onStderr?: (bytes: Uint8Array) => void;\n}\n\nexport interface SpawnedProcess {\n readonly pid: number;\n readonly pgid: number;\n readonly exited: Promise<number>;\n signal(name?: string): Promise<void>;\n}\n\nexport interface ClientRunOptions {\n cwd?: string;\n env?: Record<string, string>;\n stdin?: string | Uint8Array;\n onStdout?: (text: string) => void;\n onStderr?: (text: string) => void;\n}\n\nexport interface ClientRunResult {\n pid: number;\n status: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface ClientTerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n onData?: (bytes: Uint8Array) => void;\n}\n\nexport interface ClientTerminal {\n readonly pid: number;\n readonly exited: Promise<number>;\n onData: ((bytes: Uint8Array) => void) | null;\n write(data: string | Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(name: string): void;\n close(): void;\n}\n\nexport interface ClientFs {\n readFile(path: string): Promise<Uint8Array>;\n readText(path: string): Promise<string>;\n writeFile(path: string, data: string | Uint8Array): Promise<void>;\n stat(path: string): Promise<FsStat>;\n lstat(path: string): Promise<FsStat>;\n readdir(path: string): Promise<string[]>;\n mkdir(path: string): Promise<void>;\n rm(path: string, options?: { force?: boolean }): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n realpath(path: string): Promise<string>;\n symlink(target: string, path: string): Promise<void>;\n readlink(path: string): Promise<string>;\n exists(path: string): Promise<boolean>;\n watch(\n paths: string[],\n options: { recursive?: boolean },\n onChange: (change: WatchChange) => void\n ): Promise<{ close(): void }>;\n}\n\nexport type ClientFetchRequest = Omit<RealmTransportRequest, 'signal'> & { signal?: AbortSignal };\n\nexport interface KernelClient {\n readonly protocol: readonly [number, number];\n readonly transport: RealmTransport;\n readonly closed: Promise<Error>;\n spawn(argv: string[], options?: SpawnOptions): Promise<SpawnedProcess>;\n run(argv: string[], options?: ClientRunOptions): Promise<ClientRunResult>;\n openTerminal(argv: string[], options?: ClientTerminalOptions): Promise<ClientTerminal>;\n ps(): Promise<ProcessEntry[]>;\n mount(spec: MountSpec): Promise<MountEntry>;\n umount(target: string): Promise<void>;\n mounts(): Promise<MountEntry[]>;\n kill(pid: number, signal?: string): Promise<void>;\n fetch(request: ClientFetchRequest): Promise<RealmTransportResponse>;\n dial(options: DialOptions): Promise<DialledSocket>;\n loopbackFetch(input: RequestInfo | URL, options: LoopbackFetchOptions): Promise<Response>;\n readonly fs: ClientFs;\n serveCdp(hook: CdpHook, options?: { runtime?: string }): Promise<{ close(): void }>;\n close(options?: { kill?: boolean }): Promise<void>;\n}\n\ninterface Pending {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n output?: (fd: 1 | 2, bytes: Uint8Array) => void;\n started?: (pid: number) => void;\n}\n\ntype Handlers = Omit<Pending, 'resolve' | 'reject'>;\n\nconst encoder = new TextEncoder();\nconst bytesOf = (data: string | Uint8Array) =>\n typeof data === 'string' ? encoder.encode(data) : data;\n\nconst UNAVAILABLE = {\n manualRedirects: false,\n encodedBodies: false,\n maxRequestBody: 0,\n unavailable: true,\n} as const;\n\nasync function holdLock(\n locks: LockManagerLike | undefined\n): Promise<{ name?: string; release(): void }> {\n if (!locks) return { release() {} };\n const name = `slicc-kernel-client:${crypto.randomUUID()}`;\n const granted = Promise.withResolvers<void>();\n const held = Promise.withResolvers<void>();\n void locks.request(name, () => {\n granted.resolve();\n return held.promise;\n });\n await granted.promise;\n return { name, release: () => held.resolve() };\n}\n\nfunction concat(chunks: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.length, 0));\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.length;\n }\n return out;\n}\n\nclass Channel {\n readonly greeted = Promise.withResolvers<KernelHello>();\n readonly ended = Promise.withResolvers<Error>();\n remote: RemoteTransport | undefined;\n failure: Error | undefined;\n private readonly pending = new Map<number, Pending>();\n readonly watching = new Map<number, (change: WatchChange) => void>();\n readonly cdpHooks = new Map<number, CdpHook>();\n private readonly cdpOpen = new Set<() => void>();\n protocol: readonly [number, number] = PROTOCOL;\n private nextId = 0;\n private readonly port: MessagePortLike;\n private readonly release: () => void;\n\n constructor(port: MessagePortLike, release: () => void) {\n this.port = port;\n this.release = release;\n this.greeted.promise.catch(() => undefined);\n port.addEventListener('message', (event) => this.receive(event.data));\n port.addEventListener('close', () => this.end(new KernelGoneError()));\n port.start?.();\n }\n\n post(message: object): void {\n if (!this.failure) this.port.postMessage(message);\n }\n\n end(error: Error): void {\n if (this.failure) return;\n this.failure = error;\n this.greeted.reject(error);\n this.remote?.fail(error);\n for (const close of [...this.cdpOpen]) close();\n this.cdpOpen.clear();\n for (const call of this.pending.values()) call.reject(error);\n this.pending.clear();\n this.release();\n this.port.close?.();\n this.ended.resolve(error);\n }\n\n request(call: ClientCall, handlers: Handlers = {}): { id: number; done: Promise<unknown> } {\n const id = ++this.nextId;\n const { failure } = this;\n if (failure) return { id, done: Promise.reject(failure) };\n const done = new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, ...handlers });\n this.port.postMessage({ ...call, id });\n });\n return { id, done };\n }\n\n call(call: ClientCall): Promise<unknown> {\n return this.request(call).done;\n }\n\n private receive(data: {\n hello?: KernelHello;\n net?: unknown;\n bye?: string;\n watch?: number;\n change?: WatchChange;\n cdpOpen?: CdpOpen['cdpOpen'];\n port?: CdpOpen['port'];\n }): void {\n if (data.cdpOpen && data.port) {\n this.openCdp(data as CdpOpen);\n return;\n }\n if (data.watch !== undefined) {\n this.watching.get(data.watch)?.(data.change as WatchChange);\n return;\n }\n if (data.bye !== undefined) {\n this.end(new KernelGoneError(data.bye));\n return;\n }\n if (data.hello) {\n this.greeted.resolve(data.hello);\n return;\n }\n if (data.net !== undefined) {\n this.remote?.receive(data as TransportReply);\n return;\n }\n const reply = data as ClientReply;\n const call = this.pending.get(reply.id);\n if (!call) return;\n if (reply.fd !== undefined) {\n call.output?.(reply.fd, reply.bytes as Uint8Array);\n return;\n }\n if (reply.started !== undefined) {\n call.started?.(reply.started);\n return;\n }\n this.pending.delete(reply.id);\n if (reply.error !== undefined) call.reject(new KernelCallError(reply.error, reply.code));\n else call.resolve(reply.result);\n }\n\n private openCdp({ cdpOpen: { registration, ...request }, port }: CdpOpen): void {\n const hook = registration === undefined ? undefined : this.cdpHooks.get(registration);\n if (!hook || this.failure) {\n port.postMessage({ error: 'this client no longer serves CDP' });\n port.close();\n return;\n }\n const close = serveCdpPort(port, hook, request, () => this.cdpOpen.delete(close));\n this.cdpOpen.add(close);\n }\n}\n\nasync function serveCdpOn(\n channel: Channel,\n hook: CdpHook,\n options: { runtime?: string }\n): Promise<{ close(): void }> {\n await since(channel, 5, 'CDP serving', async () => {});\n const req = {\n op: 'serve-cdp' as const,\n ...(options.runtime ? { runtime: options.runtime } : {}),\n };\n const { id, done } = channel.request(req);\n channel.cdpHooks.set(id, hook);\n try {\n await done;\n } catch (error) {\n channel.cdpHooks.delete(id);\n throw error;\n }\n return {\n close: () => {\n if (!channel.cdpHooks.delete(id)) return;\n void channel.call({ op: 'unserve-cdp', registration: id }).catch(() => undefined);\n },\n };\n}\n\nasync function dialOn(channel: Channel, { port, host }: DialOptions): Promise<DialledSocket> {\n const req = { op: 'dial' as const, port, ...(host ? { host } : {}) };\n return dialStream((await since(channel, 4, 'dial', () => channel.call(req))) as MessagePort);\n}\n\nasync function spawnOn(\n channel: Channel,\n argv: string[],\n opts: SpawnOptions\n): Promise<SpawnedProcess> {\n const { onStdout, onStderr, stdin, group: _, ...rest } = opts;\n if (opts.pgid !== undefined)\n await since(channel, 3, 'spawn into a process group', async () => {});\n const started = Promise.withResolvers<number>();\n const options = { ...rest, ...(stdin !== undefined ? { stdin: bytesOf(stdin) } : {}) };\n const { done } = channel.request(\n { op: 'spawn', argv, options },\n {\n output: (fd, bytes) => (fd === 1 ? onStdout : onStderr)?.(bytes),\n started: started.resolve,\n }\n );\n done.catch(started.reject);\n const pid = await started.promise;\n const pgid = opts.pgid ?? pid;\n return {\n pid,\n pgid,\n exited: done as Promise<number>,\n signal: async (name = 'SIGTERM') =>\n void (await channel.call({ op: 'kill', pid: -pgid, signal: name })),\n };\n}\n\nasync function runOn(\n channel: Channel,\n argv: string[],\n opts: ClientRunOptions\n): Promise<ClientRunResult> {\n const { onStdout, onStderr, ...rest } = opts;\n const chunks: Record<1 | 2, Uint8Array[]> = { 1: [], 2: [] };\n const live = { 1: new TextDecoder(), 2: new TextDecoder() };\n const tee = (fd: 1 | 2, on?: (text: string) => void) => (bytes: Uint8Array) => {\n chunks[fd].push(bytes);\n on?.(live[fd].decode(bytes, { stream: true }));\n };\n const child = await spawnOn(channel, argv, {\n ...rest,\n onStdout: tee(1, onStdout),\n onStderr: tee(2, onStderr),\n });\n const status = await child.exited;\n const text = (fd: 1 | 2) => new TextDecoder().decode(concat(chunks[fd]));\n return { pid: child.pid, status, stdout: text(1), stderr: text(2) };\n}\n\nasync function terminalOn(\n channel: Channel,\n argv: string[],\n opts: ClientTerminalOptions\n): Promise<ClientTerminal> {\n const { onData, ...options } = opts;\n let listener = onData ?? null;\n const backlog: Uint8Array[] = [];\n const started = Promise.withResolvers<number>();\n const { id, done } = channel.request(\n { op: 'open-terminal', argv, options },\n {\n output: (_fd, bytes) => (listener ? listener(bytes) : backlog.push(bytes)),\n started: started.resolve,\n }\n );\n done.catch(started.reject);\n const pid = await started.promise;\n const send = (action: TerminalAction) =>\n void channel.call({ op: 'terminal', terminal: id, ...action }).catch(() => undefined);\n return {\n pid,\n exited: done as Promise<number>,\n get onData() {\n return listener;\n },\n set onData(next) {\n listener = next;\n if (next) for (const bytes of backlog.splice(0)) next(bytes);\n },\n write: (data) => send({ action: 'write', bytes: bytesOf(data) }),\n resize: (cols, rows) => send({ action: 'resize', cols, rows }),\n signal: (name) => send({ action: 'signal', signal: name }),\n close: () => send({ action: 'close' }),\n };\n}\n\nfunction fsOn(channel: Channel): ClientFs {\n const fs = (method: FsMethod, ...args: unknown[]) => channel.call({ op: 'fs', method, args });\n const done = async (method: FsMethod, ...args: unknown[]) => void (await fs(method, ...args));\n return {\n readFile: (path) => fs('readFile', path) as Promise<Uint8Array>,\n readText: async (path) => new TextDecoder().decode((await fs('readFile', path)) as Uint8Array),\n writeFile: (path, data) => done('writeFile', path, data),\n stat: (path) => fs('stat', path) as Promise<FsStat>,\n lstat: (path) => fs('lstat', path) as Promise<FsStat>,\n readdir: (path) => fs('readdir', path) as Promise<string[]>,\n mkdir: (path) => done('mkdir', path),\n rm: (path, o = {}) => done('rm', path, o.force === true),\n rename: (from, to) => done('rename', from, to),\n realpath: (path) => fs('realpath', path) as Promise<string>,\n symlink: (target, path) => done('symlink', target, path),\n readlink: (path) => fs('readlink', path) as Promise<string>,\n exists: (path) => fs('exists', path) as Promise<boolean>,\n async watch(paths, options, onChange) {\n if (channel.protocol[1] < 1) {\n throw new KernelCallError(\n `this kernel speaks protocol ${channel.protocol.join('.')}, which has no watch`,\n 'ENOSYS'\n );\n }\n const { id, done } = channel.request({\n op: 'watch',\n paths,\n recursive: options.recursive === true,\n });\n channel.watching.set(id, onChange);\n try {\n await done;\n } catch (error) {\n channel.watching.delete(id);\n throw error;\n }\n return {\n close: () => {\n if (!channel.watching.delete(id)) return;\n void channel.call({ op: 'unwatch', watch: id }).catch(() => undefined);\n },\n };\n },\n };\n}\n\nfunction since(channel: Channel, minor: number, what: string, run: () => Promise<unknown>) {\n if (channel.protocol[1] < minor) {\n return Promise.reject(\n new KernelCallError(\n `this kernel speaks protocol ${channel.protocol.join('.')}, which has no ${what}`,\n 'ENOSYS'\n )\n );\n }\n return run();\n}\n\nasync function greet(\n channel: Channel,\n lock: string | undefined,\n timeoutMs: number\n): Promise<KernelHello> {\n channel.post({ hello: { protocol: PROTOCOL, ...(lock ? { lock } : {}) } });\n const timer = setTimeout(\n () =>\n channel.end(\n new KernelGoneError(`no slicc-kernel answered on this port within ${timeoutMs} ms`)\n ),\n timeoutMs\n );\n let hello: KernelHello;\n try {\n hello = await channel.greeted.promise;\n } finally {\n clearTimeout(timer);\n }\n const refused = hello.error ?? versionError(hello.protocol);\n if (refused) {\n const error = new Error(refused);\n channel.end(error);\n throw error;\n }\n return hello;\n}\n\nexport async function attachKernel(\n port: MessagePortLike,\n options: AttachOptions = {}\n): Promise<KernelClient> {\n const locks = options.locks === null ? undefined : (options.locks ?? locksOf());\n const own = await holdLock(locks);\n const channel = new Channel(port, own.release);\n const hello = await greet(channel, own.name, options.timeoutMs ?? 10_000);\n channel.protocol = hello.protocol;\n if (hello.lock && locks) void locks.request(hello.lock, () => channel.end(new KernelGoneError()));\n const transport = new RemoteTransport(\n { postMessage: (call) => channel.post(call) },\n hello.traits ?? UNAVAILABLE\n );\n channel.remote = transport;\n return {\n protocol: hello.protocol,\n transport,\n closed: channel.ended.promise,\n spawn: (argv, opts = {}) => spawnOn(channel, argv, opts),\n run: (argv, opts = {}) => runOn(channel, argv, opts),\n openTerminal: (argv, opts = {}) => terminalOn(channel, argv, opts),\n ps: () => channel.call({ op: 'ps' }) as Promise<ProcessEntry[]>,\n mount: (spec) =>\n since(channel, 2, 'mount', () => channel.call({ op: 'mount', spec })) as Promise<MountEntry>,\n umount: async (target) =>\n void (await since(channel, 2, 'umount', () => channel.call({ op: 'umount', target }))),\n mounts: () =>\n since(channel, 2, 'mounts', () => channel.call({ op: 'mounts' })) as Promise<MountEntry[]>,\n kill: async (pid, signal = 'SIGTERM') => void (await channel.call({ op: 'kill', pid, signal })),\n fetch: (req) => {\n const { signal, ...rest } = req;\n return transport.fetch({ ...rest, signal: signal ?? new AbortController().signal });\n },\n dial: (options) => dialOn(channel, options),\n loopbackFetch: (input, options) => loopbackFetch((o) => dialOn(channel, o), input, options),\n fs: fsOn(channel),\n serveCdp: (hook, options = {}) => serveCdpOn(channel, hook, options),\n async close(o = {}) {\n if (channel.failure) return;\n await channel\n .call({ op: 'detach', ...(o.kill ? { kill: true } : {}) })\n .catch(() => undefined);\n channel.end(new KernelGoneError('this client is closed'));\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,kBAAAA,iBAAkC,cAAc;;;ACgBlD,SAAS,aACd,MACA,MACA,SACA,QACY;AACZ,MAAI;AACJ,MAAIC,QAAO;AACX,QAAM,MAAM,MAAM;AAChB,IAAAA,QAAO;AACP,SAAK,MAAM;AACX,aAAS;AAAA,EACX;AACA,QAAM,SAAS,CAAC,WAA0B;AACxC,QAAIA,MAAM;AACV,SAAK,YAAY,EAAE,OAAO,OAAO,CAAC;AAClC,QAAI;AAAA,EACN;AACA,OAAK,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAkD;AACzF,QAAI,KAAK,MAAM,OAAW,OAAM,KAAK,KAAK,CAAC;AAAA,aAClC,KAAK,SAAS,CAACA,OAAM;AAC5B,UAAI;AACJ,YAAM,MAAM;AAAA,IACd;AAAA,EACF,CAAC;AACD,OAAK,QAAQ;AACb,MAAI,QAAuB,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC,CAAC,EAAE;AAAA,IAC9D,CAACC,YAAW;AACV,aAAOA;AACP,UAAID,MAAM,QAAOC,QAAO,MAAM;AAC9B,MAAAA,QAAO,YAAY,CAAC,MAAM;AACxB,YAAI,CAACD,MAAM,MAAK,YAAY,EAAE,EAAE,CAAC;AAAA,MACnC;AACA,MAAAC,QAAO,UAAU,CAAC,WAAW,OAAO,UAAU,IAAI;AAClD,WAAK,YAAY,EAAE,MAAM,KAAK,CAAC;AAAA,IACjC;AAAA,IACA,CAAC,MAAe;AACd,UAAID,MAAM;AACV,WAAK,YAAY,EAAE,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE,CAAC;AACtE,UAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO,MAAM;AACX,QAAIA,MAAM;AACV,UAAM,MAAM;AACZ,WAAO,sBAAsB;AAAA,EAC/B;AACF;AAEO,SAAS,YACd,KACA,MACS;AACT,SAAO,CAAC,YACN,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,UAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAC5C,QAAI,SAAS;AACb,UAAM,OAAsB;AAAA,MAC1B,MAAM,CAAC,MAAM;AACX,YAAI,CAAC,OAAQ,OAAM,YAAY,EAAE,EAAE,CAAC;AAAA,MACtC;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO,MAAM;AACX,YAAI,OAAQ;AACZ,iBAAS;AACT,cAAM,YAAY,EAAE,OAAO,KAAK,CAAC;AACjC,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AACA,UAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAA6B;AACrE,UAAI,OAAO,KAAM,MAAK,YAAY,KAAK,CAAC;AAAA,eAC/B,UAAU,KAAM,SAAQ,IAAI;AAAA,eAC5B,WAAW,MAAM;AACxB,iBAAS;AACT,cAAM,MAAM;AACZ,eAAO,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,MAC9B,WAAW,CAAC,QAAQ;AAClB,iBAAS;AACT,cAAM,MAAM;AACZ,aAAK,UAAU,KAAK,SAAS,MAAS;AAAA,MACxC;AAAA,IACF,CAAC;AACD,UAAM,MAAM;AACZ,SAAK,MAAM,KAAK,MAAM;AACpB,UAAI,OAAQ;AACZ,eAAS;AACT,YAAM,MAAM;AACZ,aAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,WAAK,UAAU,sBAAsB;AAAA,IACvC,CAAC;AACD,QAAI,SAAS,KAA+B;AAAA,EAC9C,CAAC;AACL;;;ACjEO,SAAS,UAAU,IAA+C;AACvE,QAAM,EAAE,OAAO,QAAQ,SAAS,IAAI;AACpC,MAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAU,QAAO;AAC3C,SAAO,EAAE,OAAO,MAAM,KAAK,EAAE,GAAG,QAAQ,OAAO,KAAK,EAAE,GAAG,UAAU,SAAS,KAAK,EAAE,EAAE;AACvF;AAEA,eAAsB,UACpB,IACA,MACA,OACA,OACe;AACf,MAAI,GAAG,QAAS,QAAO,GAAG,QAAQ,MAAM,OAAO,KAAK;AACpD,OAAK,MAAM,GAAG,MAAM,IAAI,GAAG,eAAgB,OAAM,QAAQ,cAAc,IAAI;AAC3E,SAAO,GAAG,OAAO,MAAM,OAAO,KAAK;AACrC;AAEO,SAAS,QAAQ,MAAc,MAAwC;AAC5E,SAAO,OAAO,OAAO,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;AAC9D;AAEO,SAAS,cAAc,MAAsB;AAClD,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,KAAK,MAAM,GAAG,GAAG;AAClC,QAAI,SAAS,MAAM,SAAS,IAAK;AACjC,QAAI,SAAS,KAAM,OAAM,IAAI;AAAA,QACxB,OAAM,KAAK,IAAI;AAAA,EACtB;AACA,SAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAC5B;AAEO,SAAS,YAAY,MAAc,MAAsB;AAC9D,SAAO,cAAc,KAAK,WAAW,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE;AACtE;AAEO,SAAS,QAAQ,MAAsB;AAC5C,MAAI,KAAK;AACT,MAAI,KAAK;AACT,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,WAAW,CAAC;AAC3B,SAAK,KAAK,KAAK,KAAK,GAAG,UAAU;AACjC,SAAK,KAAK,KAAK,KAAK,GAAG,UAAU;AAAA,EACnC;AACA,OAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU,IAAI,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AACrF,OAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU,IAAI,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AACrF,SAAO,cAAc,UAAU,OAAO,OAAO,MAAM;AACrD;;;AC1FO,IAAM,gBAAgB,KAAK;AAE3B,IAAM,YAAN,cAAwB,MAAM;AAAA,EAC1B;AAAA,EAET,YAAY,MAAyB;AACnC,UAAM,IAAI;AACV,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA,EACd,SAAuB,CAAC;AAAA,EACxB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAA6B,CAAC;AAAA,EAE7B;AAAA,EAET,YAAY,WAAmB,eAAe;AAC5C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,OAAO,KAAK,KAAK,YAAY;AAAA,EAC3C;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,OAAO,KAAK,YAAY,KAAK,YAAY;AAAA,EACvD;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,WAAiB;AACf,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,YAAkB;AAChB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,YAAkB;AAChB,QAAI,KAAK,UAAU,EAAG,MAAK,WAAW;AACtC,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,SAAS,CAAC;AACf,WAAK,OAAO;AAAA,IACd;AACA,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,aAAmB;AACjB,QAAI,KAAK,UAAU,EAAG,MAAK,WAAW;AACtC,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAM,KAAK,KAAa,QAA2C;AACjE,WAAO,KAAK,SAAS,GAAG;AACtB,UAAI,KAAK,YAAY,EAAG,QAAO,IAAI,WAAW,CAAC;AAC/C,YAAM,KAAK,QAAQ,MAAM;AAAA,IAC3B;AACA,UAAM,MAAM,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC;AAC9C,SAAK,KAAK;AACV,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,KAAa,QAA2C;AACjE,WAAO,KAAK,SAAS,GAAG;AACtB,UAAI,KAAK,YAAY,EAAG,QAAO,IAAI,WAAW,CAAC;AAC/C,YAAM,KAAK,QAAQ,MAAM;AAAA,IAC3B;AACA,UAAM,MAAM,IAAI,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC;AACnD,QAAI,SAAS;AACb,eAAWE,UAAS,KAAK,QAAQ;AAC/B,UAAI,WAAW,IAAI,OAAQ;AAC3B,YAAM,QAAQ,KAAK,IAAIA,OAAM,QAAQ,IAAI,SAAS,MAAM;AACxD,UAAI,IAAIA,OAAM,SAAS,GAAG,KAAK,GAAG,MAAM;AACxC,gBAAU;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,OAAmB,QAAuC;AACpE,QAAI,SAAS;AACb,WAAO,SAAS,MAAM,QAAQ;AAC5B,UAAI,KAAK,YAAY,EAAG,OAAM,IAAI,UAAU,OAAO;AACnD,YAAM,OAAO,KAAK,WAAW,KAAK;AAClC,UAAI,SAAS,GAAG;AACd,YAAI;AACF,gBAAM,KAAK,QAAQ,MAAM;AAAA,QAC3B,SAAS,GAAG;AACV,cAAI,SAAS,EAAG,QAAO;AACvB,gBAAM;AAAA,QACR;AACA;AAAA,MACF;AACA,YAAM,IAAI,KAAK,IAAI,MAAM,MAAM,SAAS,MAAM;AAC9C,WAAK,OAAO,KAAK,MAAM,MAAM,QAAQ,SAAS,CAAC,CAAC;AAChD,WAAK,QAAQ;AACb,gBAAU;AACV,WAAK,KAAK;AAAA,IACZ;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EAEQ,KAAK,GAAuB;AAClC,UAAM,MAAM,IAAI,WAAW,CAAC;AAC5B,QAAI,SAAS;AACb,WAAO,SAAS,GAAG;AACjB,YAAM,OAAO,KAAK,OAAO,CAAC;AAC1B,YAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,IAAI,MAAM;AAC9C,UAAI,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,MAAM;AACvC,gBAAU;AACV,UAAI,UAAU,KAAK,OAAQ,MAAK,OAAO,MAAM;AAAA,UACxC,MAAK,OAAO,CAAC,IAAI,KAAK,SAAS,KAAK;AAAA,IAC3C;AACA,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAqC;AAC3C,QAAI,QAAQ,QAAS,QAAO,QAAQ,OAAO,IAAI,UAAU,OAAO,CAAC;AACjE,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU,MAAY;AAC1B,aAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,MAAM,MAAM;AACtD,eAAO,IAAI,UAAU,OAAO,CAAC;AAAA,MAC/B;AACA,YAAM,SAAS,MAAY;AACzB,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,gBAAQ;AAAA,MACV;AACA,WAAK,QAAQ,KAAK,MAAM;AACxB,cAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEQ,OAAa;AACnB,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,CAAC;AAChB,eAAW,WAAW,QAAS,SAAQ;AAAA,EACzC;AACF;;;AC7GO,IAAM,cAAN,cAA0B,MAAM;AAAA,EAC5B;AAAA,EAET,YAAY,MAAmB;AAC7B,UAAM,IAAI;AACV,SAAK,OAAO;AAAA,EACd;AACF;AAuDO,SAAS,SAAS,MAA6B;AACpD,SAAO,KAAK,OAAO,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,MAAM,UAAU,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM;AACzF;AAEO,IAAM,WAAN,MAAe;AAAA,EACZ,OAAO;AAAA,EAEN;AAAA,EAET,YAAY,MAAkB;AAC5B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAe;AACb,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEA,UAAgC;AAC9B,SAAK,QAAQ;AACb,QAAI,KAAK,SAAS,EAAG,QAAO,KAAK,KAAK,MAAM;AAAA,EAC9C;AACF;AAEO,SAAS,SAAS,UAAwD;AAC/E,QAAM,OAAO,IAAI,WAAW,QAAQ;AACpC,OAAK,SAAS;AACd,OAAK,UAAU;AACf,SAAO;AAAA,IACL,MAAM,IAAI,SAAS;AAAA,MACjB,MAAM,OAAO,KAAK,WAAW;AAC3B,YAAI;AACF,iBAAO,MAAM,KAAK,KAAK,KAAK,MAAM;AAAA,QACpC,SAAS,GAAG;AACV,gBAAM,IAAI,YAAa,EAAgB,IAAI;AAAA,QAC7C;AAAA,MACF;AAAA,MACA,OAAO,MAAM,KAAK,UAAU;AAAA,MAC5B,MAAM,OAAO,EAAE,UAAU,KAAK,WAAW,UAAU,OAAO,QAAQ,KAAK,YAAY;AAAA,MACnF,SAAS,CAAC,WAAW,KAAK,QAAQ,MAAM;AAAA,IAC1C,CAAC;AAAA,IACD,OAAO,IAAI,SAAS;AAAA,MAClB,OAAO,OAAO,OAAO,WAAW;AAC9B,YAAI;AACF,iBAAO,MAAM,KAAK,MAAM,OAAO,MAAM;AAAA,QACvC,SAAS,GAAG;AACV,gBAAM,IAAI,YAAa,EAAgB,IAAI;AAAA,QAC7C;AAAA,MACF;AAAA,MACA,OAAO,MAAM,KAAK,WAAW;AAAA,MAC7B,MAAM,OAAO,EAAE,UAAU,OAAO,UAAU,KAAK,YAAY,QAAQ,KAAK,YAAY;AAAA,MACpF,SAAS,CAAC,WAAW,KAAK,QAAQ,MAAM;AAAA,IAC1C,CAAC;AAAA,EACH;AACF;AAEO,SAAS,YAAY,MAA4B;AACtD,MAAI,SAAS;AACb,SAAO,IAAI,SAAS;AAAA,IAClB,MAAM,OAAO,QAAQ;AACnB,YAAM,MAAM,KAAK,SAAS,QAAQ,SAAS,GAAG;AAC9C,gBAAU,IAAI;AACd,aAAO;AAAA,IACT;AAAA,IACA,OAAO,MAAM;AAAA,IAAC;AAAA,EAChB,CAAC;AACH;AAEO,SAAS,SAAS,QAA+C;AACtE,SAAO,IAAI,SAAS;AAAA,IAClB,OAAO,OAAO,UAAU;AACtB,aAAO,MAAM,MAAM,CAAC;AACpB,aAAO,MAAM;AAAA,IACf;AAAA,IACA,OAAO,MAAM;AAAA,IAAC;AAAA,EAChB,CAAC;AACH;AAUA,SAAS,QAAQ,QAAsB,OAA2B;AAChE,MAAI,WAAW,UAAU,MAAM,SAAS,EAAG,OAAM,IAAI,YAAY,QAAQ;AACzE,SAAO,MAAM;AACf;AAEO,SAAS,WAAW,QAAsB,QAAiC;AAChF,QAAM,OAAO,OAAO,QAAqC;AACvD,QAAI,WAAW,OAAQ,QAAO,IAAI,WAAW,CAAC;AAC9C,UAAM,MAAM,IAAI,WAAW,GAAG;AAC9B,QAAI,WAAW,WAAW;AACxB,eAAS,KAAK,GAAG,KAAK,KAAK,MAAM,OAAO;AACtC,eAAO,gBAAgB,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,MACpE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO,IAAI,SAAS;AAAA,IAClB,GAAI,WAAW,UAAU,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC,GAAI,WAAW,SAAS,EAAE,OAAO,OAAO,UAAsB,QAAQ,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,IAC1F,MAAM,YAAY;AAAA,IAClB,UAAU,EAAE,QAAQ,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG;AAAA,IAClD,OAAO,MAAM;AAAA,IAAC;AAAA,EAChB,CAAC;AACH;AAEO,SAAS,SAAS,MAA2B;AAClD,SAAO,IAAI,SAAS,EAAE,MAAM,MAAM,GAAI,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,GAAI,OAAO,MAAM;AAAA,EAAC,EAAE,CAAC;AAC1F;AAIO,SAAS,aAAa,MAAmD;AAC9E,MAAI,KAAK,KAAM,QAAO;AACtB,MAAI,KAAK,YAAY,YAAY,KAAK,SAAU,QAAO;AACvD,MAAI,KAAK,IAAK,QAAO;AACrB,SAAO,KAAK,OAAO,SAAS;AAC9B;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EACnB,OAAgB,UAAU;AAAA,EAClB,MAAM,oBAAI,IAAsB;AAAA,EACvB,UAAU,oBAAI,IAAY;AAAA,EAE1B,SAAS,oBAAI,IAAoB;AAAA,EAElD,IAAI,IAAsB;AACxB,UAAM,OAAO,KAAK,IAAI,IAAI,EAAE;AAC5B,QAAI,CAAC,KAAM,OAAM,IAAI,YAAY,OAAO;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,gBAAuC;AACrC,eAAW,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG;AAC1B,YAAM,MAAM,KAAK,IAAI,IAAI,EAAE,GAAG,KAAK;AACnC,UAAI,IAAK,QAAO;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAoB;AAClB,WAAO,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAClD;AAAA,EAEA,IAAI,IAAqB;AACvB,WAAO,KAAK,IAAI,IAAI,EAAE;AAAA,EACxB;AAAA,EAEA,eAAe,IAAkB;AAC/B,SAAK,IAAI,EAAE;AACX,SAAK,QAAQ,IAAI,EAAE;AAAA,EACrB;AAAA,EAEA,iBAAiB,IAAkB;AACjC,SAAK,IAAI,EAAE;AACX,SAAK,QAAQ,OAAO,EAAE;AAAA,EACxB;AAAA,EAEA,aAAa,IAAqB;AAChC,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA,EAEA,eAAe,IAAY,OAAqB;AAC9C,SAAK,IAAI,EAAE;AACX,SAAK,OAAO,IAAI,IAAI,KAAK;AAAA,EAC3B;AAAA,EAEA,YAAY,IAAgC;AAC1C,WAAO,KAAK,OAAO,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,QAAQ,MAAgB,MAAM,GAAW;AACvC,aAAS,KAAK,KAAK,KAAK,SAAQ,SAAS,MAAM;AAC7C,UAAI,CAAC,KAAK,IAAI,IAAI,EAAE,GAAG;AACrB,aAAK,IAAI,IAAI,IAAI,IAAI;AACrB,eAAO;AAAA,MACT;AAAA,IACF;AACA,SAAK,QAAQ,QAAQ,KAAK,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAS;AAC1D,UAAM,IAAI,YAAY,QAAQ;AAAA,EAChC;AAAA,EAEA,UAAU,IAAY,MAAsB;AAC1C,QAAI,KAAK,KAAK,MAAM,SAAQ,SAAS;AACnC,WAAK,QAAQ,QAAQ,KAAK,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAS;AAC1D,YAAM,IAAI,YAAY,OAAO;AAAA,IAC/B;AACA,UAAM,WAAW,KAAK,IAAI,IAAI,EAAE;AAChC,SAAK,IAAI,IAAI,IAAI,IAAI;AACrB,SAAK,QAAQ,OAAO,EAAE;AACtB,SAAK,OAAO,OAAO,EAAE;AACrB,SAAK,QAAQ,QAAQ,UAAU,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EACjE;AAAA,EAEA,IAAI,IAAY,MAAM,GAAW;AAC/B,WAAO,KAAK,QAAQ,KAAK,IAAI,EAAE,EAAE,OAAO,GAAG,GAAG;AAAA,EAChD;AAAA,EAEA,KAAK,OAAe,OAAuB;AACzC,UAAM,OAAO,KAAK,IAAI,KAAK;AAC3B,QAAI,UAAU,MAAO,MAAK,UAAU,OAAO,KAAK,OAAO,CAAC;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAkC;AACtC,UAAM,OAAO,KAAK,IAAI,EAAE;AACxB,SAAK,IAAI,OAAO,EAAE;AAClB,SAAK,QAAQ,OAAO,EAAE;AACtB,SAAK,OAAO,OAAO,EAAE;AACrB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,OAAgB;AACd,UAAM,QAAQ,IAAI,SAAQ;AAC1B,eAAW,CAAC,IAAI,IAAI,KAAK,KAAK,IAAK,OAAM,IAAI,IAAI,IAAI,KAAK,OAAO,CAAC;AAClE,eAAW,MAAM,KAAK,QAAS,OAAM,QAAQ,IAAI,EAAE;AACnD,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,OAAQ,OAAM,OAAO,IAAI,IAAI,KAAK;AACjE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,QAAQ,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC;AACnC,SAAK,IAAI,MAAM;AACf,SAAK,QAAQ,MAAM;AACnB,SAAK,OAAO,MAAM;AAClB,UAAM,QAAQ,WAAW,MAAM,IAAI,CAAC,SAAS,QAAQ,QAAQ,EAAE,KAAK,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC;AAAA,EAC5F;AACF;;;AChVO,IAAM,IAAI;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,cAAc;AAAA,EACd,aAAa;AAAA,EACb,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AACd;AAsBO,IAAM,SAAS;AAAA,EACpB,aAAa,MAAM;AAAA,EACnB,SAAS,MAAM;AAAA,EACf,SAAS,MAAM;AAAA,EACf,qBAAqB,MAAM;AAAA,EAC3B,SAAS,MAAM;AAAA,EACf,SAAS,MAAM;AAAA,EACf,UAAU,MAAM;AAAA,EAEhB,MAAM,MAAM,OAAO;AACrB;AA0BO,IAAM,uBAAyD,OAAO;AAAA,EAC3E,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC;AAC1E;;;ACxIA,IAAM,aAAwD;AAAA,EAC5D,GAAG,OAAO,YAAY,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAACC,OAAM,KAAK,MAAM,CAAC,IAAIA,KAAI,IAAI,KAAK,CAAC,CAAC;AAAA,EACnF,aAAa,EAAE;AAAA,EACf,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACb;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,WAAW,IAAI,KAAK,EAAE;AAC/B;;;ACTA,IAAM,QAAQ,KAAK;AAOZ,SAAS,SAAS,MAA0D;AACjF,QAAM,QAAQ,8BAA8B,KAAK,IAAI;AACrD,QAAM,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9B,QAAM,OAAO,QAAQ,CAAC;AACtB,MAAI,CAAC,QAAQ,OAAO,MAAO,QAAO;AAClC,SAAO,EAAE,MAAM,KAAK;AACtB;AAEA,eAAe,QAAQ,MAAkB,IAA+B;AACtE,aAAS;AACP,WAAO,CAAC,GAAG,WAAY,OAAM,GAAG,QAAQ;AACxC,QAAI,GAAG,YAAa;AACpB,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,CAAC,MAAO;AACZ,UAAM,GAAG,MAAM,KAAK;AAAA,EACtB;AACF;AAEA,eAAe,SAAS,MAAkB,IAA+B;AACvE,aAAS;AACP,UAAM,QAAQ,MAAM,GAAG,KAAK,KAAK;AACjC,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,WAAW;AAChB;AAAA,IACF;AACA,aAAS,KAAK,GAAG,KAAK,MAAM,UAAU;AACpC,YAAM,IAAI,MAAM,KAAK,MAAM,MAAM,SAAS,EAAE,CAAC;AAC7C,UAAI,EAAE,IAAI,GAAI,OAAM,IAAI,MAAM,0BAA0B;AACxD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAe,SAAS,IAAgB,IAA+B;AACrE,SAAO,EAAE,GAAG,eAAe,GAAG,aAAc,OAAM,QAAQ,KAAK,CAAC,GAAG,QAAQ,GAAG,GAAG,QAAQ,CAAC,CAAC;AAC7F;AAEO,SAAS,WAAW,MAAkB,SAAiC;AAC5E,QAAM,KAAK,IAAI,WAAW;AAC1B,QAAM,KAAK,IAAI,WAAW;AAC1B,aAAW,QAAQ,CAAC,IAAI,EAAE,GAAG;AAC3B,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AACA,MAAI,OAAO;AACX,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,KAAM;AACX,WAAO;AACP,SAAK,MAAM;AAAA,EACb;AACA,OAAK,QAAQ,MAAM,EAAE,EAClB,MAAM,MAAM;AACX,YAAQ;AACR,UAAM;AACN,OAAG,UAAU;AAAA,EACf,CAAC,EACA,QAAQ,MAAM,GAAG,WAAW,CAAC;AAChC,OAAK,SAAS,MAAM,EAAE,EACnB,MAAM,KAAK,EACX,QAAQ,MAAM,GAAG,UAAU,CAAC;AAC/B,OAAK,SAAS,IAAI,EAAE,EAAE,KAAK,KAAK;AAChC,SAAO,EAAE,IAAI,GAAG;AAClB;;;ACvDA,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,aAAa;AACnB,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,gBAAgB;AACtB,IAAM,YAAY;AAClB,IAAM,cAAc;AACpB,IAAM,UAAU;AAChB,IAAM,UAAU;AACT,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AAC/B,IAAM,cAAsC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,SAAS,UAAU,GAAY,UAAmB,QAA8B;AAC9E,MAAI,SAAU,QAAO,IAAI,YAAY,WAAW;AAChD,MAAI,OAAQ,QAAO,IAAI,YAAY,cAAc;AACjD,QAAM,OAAQ,GAAiC;AAC/C,QAAM,QAAQ,YAAY,KAAK,CAAC,UAAU,UAAU,IAAI;AACxD,SAAO,IAAI,YAAY,SAAS,cAAc;AAChD;AACA,SAAS,WAAW,MAAuB;AACzC,SAAO,mCAAmC,KAAK,IAAI;AACrD;AACA,eAAe,SAAY,IAAkC;AAC3D,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,GAAG;AACV,QAAI,aAAa,UAAW,OAAM,IAAI,YAAY,EAAE,IAAI;AACxD,UAAM;AAAA,EACR;AACF;AACA,IAAM,UAAN,MAAc;AAAA,EACJ,UAA6B,CAAC;AAAA,EACtC,KAAK,QAAqC;AACxC,QAAI,QAAQ,QAAS,QAAO,QAAQ,OAAO,IAAI,YAAY,OAAO,CAAC;AACnE,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU,MAAY;AAC1B,aAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,MAAM,MAAM;AACtD,eAAO,IAAI,YAAY,OAAO,CAAC;AAAA,MACjC;AACA,YAAM,SAAS,MAAY;AACzB,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,gBAAQ;AAAA,MACV;AACA,WAAK,QAAQ,KAAK,MAAM;AACxB,cAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EACA,OAAa;AACX,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,CAAC;AAChB,eAAW,WAAW,QAAS,SAAQ;AAAA,EACzC;AACF;AAKA,SAAS,KAAK,GAAiB,GAAuB;AACpD,QAAM,KAAK,IAAI,WAAW;AAC1B,QAAM,KAAK,IAAI,WAAW;AAC1B,aAAW,QAAQ,CAAC,IAAI,EAAE,GAAG;AAC3B,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AACA,IAAE,OAAO,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC;AAC3B,IAAE,OAAO,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC;AAC7B;AACO,IAAM,eAAN,MAAM,cAAmC;AAAA,EAC7B;AAAA,EACR;AAAA,EACD,QAAsE;AAAA,EACtE;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EAChB;AAAA,EACA;AAAA,EACQ;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACH,QAAwB,CAAC;AAAA,EAClC,UAAU;AAAA,EACV;AAAA,EACS,UAAU,IAAI,QAAQ;AAAA,EACtB,UAAU,oBAAI,IAAoB;AAAA,EACnD,YAAY,KAAkB,QAAsB;AAClD,SAAK,MAAM;AACX,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,OAAOC,OAAkB;AACvB,SAAK,OAAOA;AACZ,SAAK,QAAQ;AACb,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA,EACA,IAAI,YAAqB;AACvB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EACQ,aAAmB;AACzB,QAAI,CAAC,KAAK,QAAQ,KAAK,UAAU,YAAa,OAAM,IAAI,YAAY,UAAU;AAC9E,WAAO,KAAK;AAAA,EACd;AAAA,EACA,MAAM,KAAK,KAAa,QAA2C;AACjE,UAAM,EAAE,GAAG,IAAI,KAAK,WAAW;AAC/B,QAAI,KAAK,YAAY,OAAO,EAAG,QAAO,IAAI,WAAW,CAAC;AACtD,UAAM,QAAQ,MAAM,SAAS,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;AACvD,QAAI,MAAM,WAAW,KAAK,KAAK,MAAO,OAAM,IAAI,YAAY,YAAY;AACxE,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,KAAa,QAA2C;AACjE,UAAM,EAAE,GAAG,IAAI,KAAK,WAAW;AAC/B,QAAI,KAAK,YAAY,OAAO,EAAG,QAAO,IAAI,WAAW,CAAC;AACtD,UAAM,QAAQ,MAAM,SAAS,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;AACvD,QAAI,MAAM,WAAW,KAAK,KAAK,MAAO,OAAM,IAAI,YAAY,YAAY;AACxE,WAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,OAAmB,QAAuC;AACpE,UAAM,EAAE,GAAG,IAAI,KAAK,WAAW;AAC/B,QAAI,KAAK,UAAW,OAAM,IAAI,YAAY,OAAO;AACjD,WAAO,SAAS,MAAM,GAAG,MAAM,OAAO,MAAM,CAAC;AAAA,EAC/C;AAAA,EACA,OAAkB;AAChB,QAAI,KAAK,UAAU,aAAa;AAC9B,aAAO,EAAE,UAAU,KAAK,MAAM,SAAS,GAAG,UAAU,OAAO,QAAQ,MAAM;AAAA,IAC3E;AACA,QAAI,KAAK,UAAU,aAAc,QAAO,EAAE,UAAU,OAAO,UAAU,OAAO,QAAQ,MAAM;AAC1F,QAAI,KAAK,OAAQ,QAAO,EAAE,UAAU,MAAM,UAAU,MAAM,QAAQ,KAAK;AACvE,QAAI,KAAK,UAAU,eAAe,CAAC,KAAK,MAAM;AAC5C,aAAO,EAAE,UAAU,OAAO,UAAU,OAAO,QAAQ,KAAK;AAAA,IAC1D;AACA,UAAM,EAAE,IAAI,GAAG,IAAI,KAAK;AACxB,WAAO;AAAA,MACL,UAAU,KAAK,YAAY,GAAG;AAAA,MAC9B,UAAU,KAAK,aAAa,GAAG;AAAA,MAC/B,QAAQ,GAAG,eAAe,GAAG;AAAA,IAC/B;AAAA,EACF;AAAA,EACA,QAAQ,QAAqC;AAC3C,UAAM,MAAM,KAAK,QAAQ,KAAK,MAAM;AACpC,QAAI,KAAK,UAAU,eAAe,CAAC,KAAK,KAAM,QAAO;AACrD,UAAM,QAAQ,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ,MAAM,GAAG,KAAK,KAAK,GAAG,QAAQ,MAAM,CAAC;AAC9E,eAAWC,SAAQ,MAAO,CAAAA,MAAK,MAAM,MAAM,MAAS;AACpD,WAAO,SAAS,MAAM,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC3C;AAAA,EACA,KAAK,MAAsB;AACzB,QAAI,KAAK,UAAU,UAAU,KAAK,MAAO,OAAM,IAAI,YAAY,QAAQ;AACvE,QAAI,KAAK,WAAW,KAAK,OAAQ,OAAM,IAAI,YAAY,cAAc;AACrE,SAAK,QAAQ,KAAK,IAAI,KAAK,MAAM,IAAI;AACrC,SAAK,UAAU,KAAK;AAAA,EACtB;AAAA,EACA,OAAO,SAAuB;AAC5B,QAAI,KAAK,UAAU,YAAa,OAAM,IAAI,YAAY,SAAS;AAC/D,QAAI,KAAK,UAAU,UAAU,KAAK,UAAU,YAAa,OAAM,IAAI,YAAY,QAAQ;AACvF,QAAI,CAAC,KAAK,OAAO;AACf,UAAI,KAAK,WAAW,OAAQ,OAAM,IAAI,YAAY,QAAQ;AAC1D,WAAK,KAAK,EAAE,QAAQ,QAAQ,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,IACxD;AACA,SAAK,UAAU,KAAK,IAAI,KAAK,IAAI,SAAS,CAAC,GAAG,SAAS;AACvD,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,MAAM,OAAO,QAAsB,WAAW,OAA8B;AAC1E,eAAS;AACP,UAAI,KAAK,UAAU,YAAa,OAAM,IAAI,YAAY,QAAQ;AAC9D,YAAMC,QAAO,KAAK,MAAM,MAAM;AAC9B,UAAIA,MAAM,QAAOA;AACjB,UAAI,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC5C,YAAM,KAAK,QAAQ,KAAK,MAAM;AAAA,IAChC;AAAA,EACF;AAAA,EACA,MAAM,QAA+B;AACnC,QAAI,KAAK,UAAU,eAAe,KAAK,MAAM,UAAU,KAAK,QAAS,QAAO;AAC5E,SAAK,MAAM,KAAK,MAAM;AACtB,SAAK,QAAQ,KAAK;AAClB,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,MAAgB,YAAY,MAAiC;AACnE,QAAI,KAAK,UAAU,YAAa,OAAM,IAAI,YAAY,SAAS;AAC/D,QAAI,KAAK,UAAU,aAAc,OAAM,IAAI,YAAY,UAAU;AACjE,QAAI,KAAK,UAAU,OAAQ,OAAM,IAAI,YAAY,QAAQ;AACzD,QAAI,KAAK,WAAW,KAAK,OAAQ,OAAM,IAAI,YAAY,cAAc;AACrE,SAAK,SAAS;AACd,UAAM,QAAQ,aAAa,KAAK,WAAW,SAAS,KAAK,IAAI,UAAU,KAAK,IAAI,IAAI;AACpF,QAAI,MAAO,QAAO,KAAK,KAAK,MAA+C,KAAK;AAChF,UAAM,SAAS,KAAK,IAAI,OAAO,IAAI;AACnC,QAAI,CAAC,KAAK,OAAO;AACf,UAAI,KAAK,WAAW,QAAQ;AAC1B,aAAK,QAAQ,KAAK,IAAI,KAAK,MAAM,EAAE,QAAQ,QAAQ,MAAM,aAAa,MAAM,EAAE,CAAC;AAC/E,aAAK,UAAU,KAAK;AAAA,MACtB,MAAO,MAAK,QAAQ,EAAE,QAAQ,QAAQ,MAAM,GAAG;AAAA,IACjD;AACA,UAAM,SAAS,IAAI,cAAa,KAAK,KAAK,KAAK,MAAM;AACrD,WAAO,QAAQ,KAAK,WAAW,SAAS,EAAE,GAAG,MAAM,MAAM,cAAc,KAAK,IAAI,EAAE,IAAI;AACtF,WAAO,OAAO,KAAK;AACnB,SAAK,OAAO,OAAO;AACnB,SAAK,MAAM,MAAM;AACjB,QAAI,CAAC,OAAO,MAAM,MAAM,GAAG;AACzB,WAAK,OAAO;AACZ,aAAO,MAAM;AACb,YAAM,IAAI,YAAY,cAAc;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EACQ,KAAK,MAA6C,OAAmC;AAC3F,SAAK,QAAQ;AACb,UAAM,QAAQ,IAAI,gBAAgB;AAClC,SAAK,UAAU;AACf,QAAI,WAAW;AACf,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW;AACX,YAAM,MAAM,IAAI,YAAY,WAAW,CAAC;AAAA,IAC1C,GAAG,MAAM,aAAa,eAAe;AACrC,UAAM,YAAY,IAAI,QAAe,CAAC,GAAG,WAAW;AAClD,YAAM,OAAO,iBAAiB,SAAS,MAAM,OAAO,MAAM,OAAO,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IAC1F,CAAC;AACD,UAAM,EAAE,MAAM,KAAK,IAAI;AACvB,UAAM,UAAU,IAAI;AAAA,MAAoB,CAAC,YACvC,QAAQ,MAAM,OAAO,KAAK,EAAE,SAAS,OAAO,MAAM,MAAM,QAAQ,MAAM,OAAO,CAAC,CAAC;AAAA,IACjF;AACA,YAAQ;AAAA,MACN,CAAC,SAAS,MAAM,OAAO,WAAW,KAAK,MAAM;AAAA,MAC7C,MAAM;AAAA,IACR;AACA,WAAO,QAAQ,KAAK,CAAC,SAAS,SAAS,CAAC,EACrC;AAAA,MACC,CAAC,SAAS;AACR,YAAI,MAAM,OAAO,QAAS,OAAM,UAAU,MAAM,OAAO,QAAQ,UAAU,IAAI;AAC7E,aAAK,QAAQ,EAAE,QAAQ,QAAQ,MAAM,WAAW,MAAM,GAAG,GAAG,SAAS,KAAK,SAAS,EAAE;AACrF,aAAK,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,KAAK,UAAU,EAAE;AACpD,aAAK,UAAU;AACf,aAAK;AAAA,UACH,WAAW,MAAM,MAAM;AACrB,iBAAK,QAAQ;AACb,iBAAK,QAAQ,KAAK;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,CAAC,MAAe;AACd,cAAM,QAAQ,UAAU,GAAG,UAAU,MAAM,OAAO,OAAO;AACzD,YAAI,KAAK,YAAY,OAAO;AAC1B,eAAK,UAAU;AACf,eAAK,SAAS,MAAM;AACpB,eAAK,QAAQ;AACb,eAAK,QAAQ,KAAK;AAAA,QACpB;AACA,cAAM;AAAA,MACR;AAAA,IACF,EACC,QAAQ,MAAM,aAAa,KAAK,CAAC;AAAA,EACtC;AAAA,EACQ,SAAe;AACrB,UAAMF,QAAO,KAAK;AAClB,QAAIA,OAAM;AACR,MAAAA,MAAK,GAAG,UAAU;AAClB,MAAAA,MAAK,GAAG,WAAW;AAAA,IACrB;AACA,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,SAAS,KAAmB;AAC1B,UAAM,EAAE,IAAI,GAAG,IAAI,KAAK,WAAW;AACnC,QAAI,QAAQ,WAAW,QAAQ,WAAW,QAAQ,UAAW,OAAM,IAAI,YAAY,QAAQ;AAC3F,QAAI,QAAQ,WAAW,CAAC,KAAK,UAAU;AACrC,WAAK,WAAW;AAChB,SAAG,UAAU;AAAA,IACf;AACA,QAAI,QAAQ,WAAW,CAAC,KAAK,WAAW;AACtC,WAAK,YAAY;AACjB,SAAG,WAAW;AAAA,IAChB;AACA,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA,EACA,UAAU,OAAeG,OAAsB;AAC7C,QAAI,UAAU,YAAY;AACxB,cAAQA,OAAM;AAAA,QACZ,KAAK;AACH,iBAAO;AAAA,QACT,KAAK,UAAU;AACb,gBAAM,SAAS,KAAK;AACpB,eAAK,SAAS;AACd,iBAAO,SAAS,UAAU,MAAM,IAAI;AAAA,QACtC;AAAA,QACA,KAAK;AACH,iBAAO,KAAK,UAAU,cAAc,IAAI;AAAA,QAC1C,KAAK;AACH,iBAAO,KAAK,WAAW,SAAS,UAAU;AAAA,QAC5C,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAIA,KAAI,EAAE,KAAK;AAAA,MACnD;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAIA,KAAI,EAAE,KAAK;AAAA,EACjD;AAAA,EACA,UAAU,OAAeA,OAAc,OAAqB;AAC1D,SAAK,QAAQ,IAAI,GAAG,KAAK,IAAIA,KAAI,IAAI,KAAK;AAAA,EAC5C;AAAA,EACA,QAAc;AACZ,UAAM,MAAM,KAAK;AACjB,SAAK,QAAQ;AACb,SAAK,SAAS,MAAM,IAAI,YAAY,cAAc,CAAC;AACnD,SAAK,UAAU;AACf,QAAI,QAAQ,aAAa;AACvB,iBAAW,WAAW,KAAK,MAAM,OAAO,CAAC,EAAG,SAAQ,MAAM;AAAA,IAC5D;AACA,QAAI,KAAK,MAAM;AACb,UAAI,CAAC,KAAK,SAAU,MAAK,KAAK,GAAG,UAAU;AAC3C,UAAI,CAAC,KAAK,UAAW,MAAK,KAAK,GAAG,WAAW;AAC7C,WAAK,WAAW;AAChB,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,KAAK,QAAS,MAAK,IAAI,QAAQ,KAAK,SAAS,IAAI;AACrD,SAAK,UAAU;AACf,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA,EACA,OAAO,KAAK,KAAkB,QAAoD;AAChF,UAAM,IAAI,IAAI,cAAa,KAAK,MAAM;AACtC,UAAM,IAAI,IAAI,cAAa,KAAK,MAAM;AACtC,UAAMA,QACJ,WAAW,SACP,EAAE,QAAQ,QAAQ,MAAM,aAAa,MAAM,EAAE,IAC7C,EAAE,QAAQ,QAAQ,MAAM,GAAG;AACjC,MAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAOA;AACtC,SAAK,GAAG,CAAC;AACT,WAAO,CAAC,GAAG,CAAC;AAAA,EACd;AACF;AACA,SAAS,cAAc,MAAsB;AAC3C,SAAO,SAAS,YAAY,cAAc;AAC5C;AACA,SAAS,MAAM,MAAwB;AACrC,SAAO,KAAK,WAAW,SAAS,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI;AACzE;AACO,IAAM,cAAN,MAAkB;AAAA,EACN,QAAQ,oBAAI,IAA0B;AAAA,EACtC,aAAa,oBAAI,IAAwB;AAAA,EACzC,WAAW,oBAAI,IAAY;AAAA,EACpC,gBAAgB;AAAA,EAChB;AAAA,EACR,UAAU,OAA0B;AAClC,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,UAAU,MAAuC;AAC/C,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,OAAO,SAAS,IAAI,MAAM,WAAW,QAAQ;AAAA,EAC5D;AAAA,EACA,WAAW,MAAc,UAAU,OAAgB;AACjD,QAAI,QAAS,MAAK,SAAS,IAAI,IAAI;AACnC,WAAO,KAAK,SAAS,IAAI,IAAI;AAAA,EAC/B;AAAA,EACA,SAAS,MAAgBC,QAAyB;AAChD,SAAK,WAAW,IAAI,MAAM,IAAI,GAAGA,MAAK;AAAA,EACxC;AAAA,EACA,OAAO,QAAoC;AACzC,WAAO,IAAI,aAAa,MAAM,MAAM;AAAA,EACtC;AAAA,EACA,OAAO,MAAgB,UAAU,KAAmB;AAClD,UAAM,SAAS,KAAK,OAAO,KAAK,MAAM;AACtC,WAAO,KAAK,IAAI;AAChB,WAAO,OAAO,OAAO;AACrB,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,MAA8B;AACpC,UAAM,SAAS,KAAK,OAAO,KAAK,MAAM;AACtC,SAAK,OAAO,QAAQ,MAAM,KAAK;AAC/B,WAAO;AAAA,EACT;AAAA,EACA,KAAK,QAAsB,MAA0B;AACnD,QAAI,KAAK,WAAW,QAAQ;AAC1B,UAAI,KAAK,SAAS,GAAI,OAAM,IAAI,YAAY,QAAQ;AAAA,IACtD,WAAW,KAAK,SAAS,aAAa,CAAC,WAAW,KAAK,IAAI,GAAG;AAC5D,YAAM,IAAI,YAAY,eAAe;AAAA,IACvC;AACA,UAAM,QACJ,KAAK,WAAW,UAAU,KAAK,SAAS,IAAI,EAAE,GAAG,MAAM,MAAM,KAAK,UAAU,EAAE,IAAI;AACpF,UAAM,MAAM,MAAM,KAAK;AACvB,QAAI,KAAK,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,YAAY;AAC3D,SAAK,MAAM,IAAI,KAAK,MAAM;AAC1B,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,MAAgB,QAA4B;AAClD,UAAM,MAAM,MAAM,IAAI;AACtB,QAAI,KAAK,MAAM,IAAI,GAAG,MAAM,OAAQ,MAAK,MAAM,OAAO,GAAG;AAAA,EAC3D;AAAA,EACA,OAAO,MAA8B;AACnC,QAAI,KAAK,WAAW,UAAU,CAAC,WAAW,cAAc,KAAK,IAAI,CAAC,GAAG;AACnE,YAAM,IAAI,YAAY,aAAa;AAAA,IACrC;AACA,UAAM,MAAM,MAAM,IAAI;AACtB,QAAI,CAAC,KAAK,MAAM,IAAI,GAAG,EAAG,MAAK,WAAW,IAAI,GAAG,IAAI;AACrD,UAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AACjC,QAAI,CAAC,QAAQ,UAAW,OAAM,IAAI,YAAY,cAAc;AAC5D,WAAO;AAAA,EACT;AAAA,EACQ,YAAoB;AAC1B,UAAM,OAAO,iBAAiB,kBAAkB;AAChD,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAM,OAAO,KAAK;AAClB,WAAK,gBAAgB,SAAS,iBAAiB,kBAAkB,OAAO;AACxE,UAAI,CAAC,KAAK,MAAM,IAAI,QAAQ,IAAI,EAAE,EAAG,QAAO;AAAA,IAC9C;AACA,UAAM,IAAI,YAAY,YAAY;AAAA,EACpC;AACF;;;ACjaA,IAAMC,SAAQ,KAAK;AAEnB,IAAM,iBAAiB,oBAAI,IAAI,CAAC,aAAa,aAAa,OAAO,OAAO,CAAC;AAElE,SAAS,WAAW,KAAkB,MAAc,OAAO,aAA2B;AAC3F,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,MAAO,OAAM,IAAI,YAAY,QAAQ;AACvF,QAAM,SAAS,eAAe,IAAI,KAAK,YAAY,CAAC,IAAI,cAAc;AACtE,MAAI,IAAI,WAAW,IAAI,GAAG;AACxB,UAAM,OAAO;AAAA,MACX,IAAI,MAAM,sBAAsB,IAAI,gDAAgD;AAAA,MACpF;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,KAAK,CAAC;AAC3D;AAEA,IAAM,SAAS,CAAC,QAAiB;AAC/B,QAAM,OAAQ,KAAmC;AACjD,SAAO,OAAO,SAAS,WAAW,OAAO;AAC3C;AAEO,SAAS,YACd,QACA,MACA,SACY;AACZ,MAAI,SAAS;AACb,MAAI,SAAS,QAAQ,QAAQ;AAC7B,MAAI,SAAS;AACb,MAAIC;AACJ,QAAM,OAAO,CAACC,UAAsB,aAA8B;AAChE,QAAI,CAAC,OAAQ,MAAK,YAAYA,UAAS,QAAQ;AAAA,EACjD;AACA,QAAM,QAAQ,CAAC,QAAQ,UAAU;AAC/B,QAAI,OAAQ;AACZ,QAAI,MAAO,MAAK,EAAE,OAAO,aAAa,CAAC;AACvC,aAAS;AACT,IAAAD,WAAU;AACV,WAAO,MAAM;AACb,SAAK,MAAM;AACX,cAAU;AAAA,EACZ;AACA,QAAM,QAAQ,CAAC,SAAqB;AAClC,aAAS,OAAO,KAAK,YAAY;AAC/B,UAAI,OAAQ;AACZ,UAAI;AACF,cAAM,OAAO,MAAM,IAAI;AACvB,aAAK,EAAE,KAAK,KAAK,CAAC;AAAA,MACpB,SAAS,KAAK;AACZ,aAAK,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AACA,OAAK,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAiC;AACxE,QAAI,gBAAgB,WAAY,OAAM,IAAI;AAAA,aACjC,UAAU,MAAM;AACvB;AACA,MAAAA,WAAU;AAAA,IACZ,WAAW,SAAS,MAAM;AACxB,eAAS,OAAO,KAAK,MAAM;AACzB,YAAI,CAAC,OAAQ,QAAO,SAAS,OAAO;AAAA,MACtC,CAAC;AAAA,IACH,WAAW,WAAW,KAAM,OAAM;AAAA,EACpC,CAAC;AACD,OAAK,QAAQ;AACb,QAAM,OAAO,MACX,SAAS,KAAK,SAAS,QAAQ,QAAQ,IAAI,IAAI,QAAc,CAAC,MAAOA,WAAU,CAAE;AACnF,QAAM,YAAY;AAChB,QAAI;AACF,iBAAS;AACP,cAAM,KAAK;AACX,YAAI,OAAQ;AACZ,cAAME,SAAQ,MAAM,OAAO,KAAKH,MAAK;AACrC,YAAIG,OAAM,WAAW,EAAG;AACxB;AACA,aAAKA,QAAO,CAACA,OAAM,MAAqB,CAAC;AAAA,MAC3C;AACA,WAAK,EAAE,KAAK,KAAK,CAAC;AAAA,IACpB,SAAS,KAAK;AACZ,WAAK,EAAE,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,IAC7B;AAAA,EACF,GAAG;AACH,SAAO,MAAM,MAAM,IAAI;AACzB;;;ACvGO,IAAM,MAAM;AAAA,EACjB,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP;AAIA,IAAM,qBAA0C,oBAAI,IAAI,CAAC,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;AACtF,IAAM,WAAgC,oBAAI,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC;AAE/E,SAAS,cAAc,KAA4B;AACxD,MAAI,QAAQ,IAAI,KAAM,QAAO;AAC7B,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO;AAC9B,SAAO,mBAAmB,IAAI,GAAG,IAAI,WAAW;AAClD;AAEO,SAAS,SAAS,KAAsB;AAC7C,SAAO,OAAO,UAAU,GAAG,KAAK,OAAO,KAAK,OAAO;AACrD;AAEO,SAAS,OAAO,KAAqB;AAC1C,SAAO,KAAK;AACd;AAQO,IAAM,iBAET;AAAA,EACF,QAAQ,IAAI;AAAA,EACZ,SAAS,IAAI;AAAA,EACb,SAAS,IAAI;AAAA,EACb,SAAS,IAAI;AAAA,EACb,SAAS,IAAI;AACf;;;ACnEO,IAAM,eAAe,IAAI,KAAK;AAE9B,SAAS,YAAY,IAAmB;AAC7C,SAAO,OAAO,OAAO,IAAI,MAAM,sCAAsC,EAAE,KAAK,GAAG;AAAA,IAC7E,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAsB,WACpB,QACA,IACsC;AACtC,MAAI,EAAE,KAAK,KAAK,KAAK,OAAO,mBAAoB,QAAO,OAAO,KAAK;AACnE,MAAI;AACJ,QAAM,OAAO,IAAI,QAAe,CAAC,GAAG,WAAW;AAC7C,YAAQ,WAAW,MAAM,OAAO,YAAY,EAAE,CAAC,GAAG,EAAE;AAAA,EACtD,CAAC;AACD,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC;AAAA,EACjD,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;;;ACpBO,IAAM,gBAAgB,KAAK,OAAO;AAClC,IAAM,gBAAgB,KAAK,OAAO;AAClC,IAAM,UAAU;AAEhB,SAAS,YAAYC,UAAwC;AAClE,SAAO,OAAOA,aAAY,WAAW,IAAI,YAAY,EAAE,OAAOA,QAAO,EAAE,SAASA,SAAQ;AAC1F;AAEO,IAAM,eAAN,MAAmE;AAAA,EACvD,QAAiC,CAAC;AAAA,EAClC;AAAA,EACT;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACC;AAAA,EACA;AAAA,EACR;AAAA,EACD;AAAA,EAER,YAAY,UAAsB,QAAQ,eAAe,OAA6B;AACpF,SAAK,WAAW;AAChB,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,SAAS,IAAI,QAAQ,CAAC,YAAY;AACrC,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,KAAKA,UAAsC;AACzC,QAAI,KAAK,MAAO;AAChB,UAAM,OAAO,YAAYA,QAAO;AAChC,UAAM,OAAO,OAAO;AACpB,QAAI,QAAS,KAAK,MAAM,SAAS,KAAK,KAAK,OAAO,OAAO,KAAK,OAAQ;AACpE,YAAM,SAAS,OACX,qBAAqB,aAAa,WAClC,QAAQ,KAAK,KAAK;AACtB,WAAK,IAAI,EAAE,MAAM,SAAS,OAAO,CAAC;AAClC,WAAK,SAAS;AACd;AAAA,IACF;AACA,SAAK,QAAQ;AACb,SAAK,MAAM,KAAKA,QAAO;AACvB,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,IAAI,OAAkC;AACpC,QAAI,KAAK,MAAO;AAChB,SAAK,QAAQ;AACb,SAAK,OAAO,KAAK;AACjB,SAAK,KAAK;AAAA,EACZ;AAAA,EAEQ,OAAa;AACnB,UAAM,SAAS,KAAK;AACpB,SAAK,SAAS;AACd,aAAS;AAAA,EACX;AAAA,EAEA,QAAQ,OAAO,aAAa,IAA0C;AACpE,eAAS;AACP,YAAMC,QAAO,KAAK,MAAM,MAAM;AAC9B,UAAIA,UAAS,QAAW;AACtB,cAAM,IAAI,YAAYA,KAAI;AAC1B,aAAK,QAAQ;AACb,aAAK,QAAQ,CAAC;AACd,cAAMA;AACN;AAAA,MACF;AACA,UAAI,KAAK,MAAO;AAChB,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,aAAK,SAAS;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACzDA,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,aAAa,SAA6C;AACjE,QAAM,MAA8B,CAAC;AACrC,aAAW,CAACC,OAAM,KAAK,KAAK,SAAS;AACnC,QAAI,CAAC,kBAAkB,IAAIA,MAAK,YAAY,CAAC,EAAG,KAAIA,KAAI,IAAI;AAAA,EAC9D;AACA,SAAO;AACT;AAEO,SAAS,cAAc,MAAuB;AACnD,SAAO,SAAS,OAAS,SAAS,UAAa,QAAQ,OAAQ,QAAQ,OAAQ,OAAO;AACxF;AAEA,SAAS,cAAc,KAAa,GAAoB;AACtD,QAAMA,QAAQ,GAAiC;AAC/C,MAAIA,UAAS,mBAAmB,IAAI,WAAW,KAAK,GAAG;AACrD,WAAO,GAAG,GAAG;AAAA,EACf;AACA,SAAO,GAAG,GAAG,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAC9D;AAEO,SAAS,cACd,QACA,SACA,aACyB;AACzB,QAAM,EAAE,KAAK,WAAW,OAAO,IAAI;AACnC,SAAO,eAAe;AACtB,MAAI;AACJ,MAAI;AACF,aAAS,cACL,IAAI,OAAO,KAAK,EAAE,WAAW,SAAS,aAAa,QAAQ,OAAO,EAAE,CAAC,IACrE,IAAI,OAAO,KAAK,SAAS;AAAA,EAC/B,SAAS,GAAG;AACV,WAAO,QAAQ,OAAO,OAAO,OAAO,IAAI,MAAM,cAAc,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC;AAAA,EACxF;AACA,SAAO,aAAa;AACpB,QAAM,QAAQ,IAAI,aAAa,MAAM,OAAO,MAAM,KAAM,2BAA2B,CAAC;AACpF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO;AACX,UAAM,QAAQ,MAAM;AAClB,aAAO,MAAM,KAAM,SAAS;AAC5B,aAAO,OAAO,MAAM;AAAA,IACtB;AACA,WAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACtD,WAAO,iBAAiB,QAAQ,MAAM;AACpC,aAAO;AACP,aAAO,oBAAoB,SAAS,KAAK;AACzC,cAAQ;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,IAAI,WAAW;AACb,iBAAO,OAAO;AAAA,QAChB;AAAA,QACA,MAAM,CAAC,SAAgC,OAAO,KAAK,IAAI;AAAA,QACvD,UAAU;AAAA,QACV,OAAO,CAAC,MAAe,WAAoB,OAAO,MAAM,cAAc,IAAI,GAAG,MAAM;AAAA,QACnF,QAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AACD,WAAO,iBAAiB,WAAW,CAAC,UAA0C;AAC5E,YAAM,KAAK,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,IAAI,WAAW,MAAM,IAAI,CAAC;AAAA,IACrF,CAAC;AACD,WAAO,iBAAiB,SAAS,CAAC,UAA4C;AAC5E,YAAM,IAAI,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,CAAC;AACpD,UAAI,KAAM;AACV,aAAO,oBAAoB,SAAS,KAAK;AACzC;AAAA,QACE,OAAO,OAAO,IAAI,MAAM,GAAG,GAAG,2BAA2B,MAAM,IAAI,oBAAoB,GAAG;AAAA,UACxF,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;ACpEO,IAAM,cAAc,OAAO;AAClC,IAAM,gBAAgB;AAEtB,IAAM,eACJ;AAEF,IAAM,mBAAmB,KAAK,OAAO;AAErC,SAAS,YAAY,SAA8B;AACjD,QAAM,MAAM,IAAI,QAAQ;AACxB,aAAW,CAACC,OAAM,KAAK,KAAK,SAAS;AACnC,QAAI;AACF,UAAI,OAAOA,OAAM,KAAK;AAAA,IACxB,QAAQ;AAAA,IAAC;AAAA,EACX;AACA,SAAO;AACT;AAEA,gBAAgB,OACd,MACA,QAC4B;AAC5B,MAAI,CAAC,KAAM;AACX,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI;AACF,aACMC,QAAO,MAAM,WAAW,QAAQ,MAAM,GAC1C,CAACA,MAAK,MACNA,QAAO,MAAM,WAAW,QAAQ,MAAM,GACtC;AACA,UAAIA,MAAK,MAAM,aAAa,EAAG,OAAMA,MAAK;AAAA,IAC5C;AAAA,EACF,UAAE;AACA,UAAM,OAAO,OAAO,EAAE,MAAM,MAAM,MAAS;AAAA,EAC7C;AACF;AAEO,SAAS,eAAe,UAAiC,CAAC,GAAmB;AAClF,QAAM,OAAO,QAAQ,SAAS,WAAW,MAAM,KAAK,UAAU;AAC9D,QAAM,SACJ,QAAQ,cAAc,OACjB,WAAoD,YACrD,QAAQ,aAAa;AAC3B,QAAM,UAAU,QAAQ,qBAAqB;AAC7C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,gBAAgB,QAAQ,kBAAkB;AAAA,MAC1C,aAAa;AAAA,MACb,GAAI,SAAS,EAAE,WAAW,KAAc,IAAI,CAAC;AAAA,IAC/C;AAAA,IACA,GAAI,SAAS,EAAE,WAAW,CAAC,YAAY,cAAc,QAAQ,SAAS,OAAO,EAAE,IAAI,CAAC;AAAA,IACpF,MAAM,MAAM,SAAiE;AAC3E,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,KAAK,QAAQ,KAAK;AAAA,UACjC,QAAQ,QAAQ;AAAA,UAChB,SAAS,YAAY,QAAQ,OAAO;AAAA,UACpC,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAiB,IAAI,CAAC;AAAA,UACzD,QAAQ,QAAQ;AAAA,UAChB,UAAU;AAAA,UACV,aAAa;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH,SAAS,GAAG;AACV,YAAI,QAAQ,OAAO,QAAS,OAAM;AAClC,cAAM,OAAO;AAAA,UACX,IAAI;AAAA,YACF,SAAS,QAAQ,GAAG,gDAAgD,QAAQ,OAAO,KAAK,QAAQ,IAAI,KAAK,EAAE;AAAA,UAC7G;AAAA,UACA,EAAE,QAAQ,IAAI;AAAA,QAChB;AAAA,MACF;AACA,YAAMC,WAAmC,CAAC;AAC1C,eAAS,QAAQ,QAAQ,CAAC,OAAOF,UAAS;AACxC,QAAAE,SAAQ,KAAK,CAACF,OAAM,KAAK,CAAC;AAAA,MAC5B,CAAC;AACD,YAAM,OAAO,OAAO,SAAS,MAAM,QAAQ,cAAc,YAAY;AACrE,aAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,SAAAE;AAAA,QACA;AAAA,QACA,QAAQ,YAAY;AAClB,gBAAM,KAAK,OAAO,MAAS;AAC3B,gBAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAkBO,SAAS,eACd,MACA,WACA,EAAE,cAAc,cAAc,IAA8B,CAAC,GAC5C;AACjB,QAAM,OAAO,oBAAI,IAGf;AACF,QAAMC,QAAO,CAAC,KAAa,MAAe;AACxC,SAAK,OAAO,GAAG;AACf,UAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,SAAK,YAAY;AAAA,MACf,KAAK;AAAA,MACL;AAAA,MACA,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,MAClD,GAAI,OAAO,WAAW,WAAW,EAAE,OAAO,IAAI,CAAC;AAAA,MAC/C,GAAI,OAAO,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA,IAC7C,CAAC;AAAA,EACH;AACA,QAAMC,SAAQ,OAAO,SAAmD;AACtE,UAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAM,QAAsE,EAAE,MAAM;AACpF,SAAK,IAAI,KAAK,KAAK,KAAK;AACxB,QAAI;AACF,YAAM,WAAW,MAAM,UAAU,MAAM;AAAA,QACrC,KAAK,KAAK;AAAA,QACV,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,QACvC,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,UAAI,CAAC,KAAK,IAAI,KAAK,GAAG,GAAG;AACvB,cAAM,SAAS,OAAO;AACtB;AAAA,MACF;AACA,WAAK,IAAI,KAAK,KAAK,EAAE,OAAO,MAAM,SAAS,KAAK,OAAO,aAAa,EAAE,GAAG,SAAS,CAAC;AACnF,WAAK,YAAY;AAAA,QACf,KAAK;AAAA,QACL,KAAK,KAAK;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,SAAS,SAAS;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,GAAG;AACV,MAAAD,MAAK,KAAK,KAAK,CAAC;AAAA,IAClB;AAAA,EACF;AACA,QAAM,UAAU,oBAAI,IAA4B;AAChD,QAAM,SAAS,oBAAI,IAAkB;AACrC,QAAM,SAAS,CAAC,KAAa,GAAW,UAAU,UAAU;AAC1D,UAAM,OAAO,OAAO,IAAI,GAAG;AAC3B,QAAI,CAAC,KAAM;AACX,SAAK,YAAY;AACjB,QAAI,WAAW,CAAC,KAAK,SAAS;AAC5B,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,OAAO;AAAA,EACd;AACA,QAAM,aAAa,OAAO,SAAqD;AAC7E,UAAM,QAAQ,IAAI,gBAAgB;AAClC,SAAK,IAAI,KAAK,KAAK,EAAE,MAAM,CAAC;AAC5B,QAAI;AACF,UAAI,CAAC,UAAU,UAAW,OAAM,IAAI,MAAM,YAAY;AACtD,YAAM,SAAS,MAAM,UAAU,UAAU;AAAA,QACvC,KAAK,KAAK;AAAA,QACV,WAAW,KAAK;AAAA,QAChB,SAAS,KAAK;AAAA,QACd,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,UAAI,CAAC,KAAK,OAAO,KAAK,GAAG,GAAG;AAC1B,eAAO,MAAM,KAAM,WAAW;AAC9B;AAAA,MACF;AACA,cAAQ,IAAI,KAAK,KAAK,MAAM;AAC5B,WAAK,YAAY,EAAE,KAAK,aAAa,KAAK,KAAK,KAAK,UAAU,OAAO,SAAS,CAAC;AAC/E,WAAK,MAAM,KAAK,KAAK,MAAM;AAAA,IAC7B,SAAS,GAAG;AACV,MAAAA,MAAK,KAAK,KAAK,CAAC;AAAA,IAClB;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,KAAa,WAA2B;AAC3D,QAAI;AACJ,QAAI;AACJ,UAAM,aAAa,IAAI,QAAgB,CAAC,YAAY;AAClD,aAAO,MAAM,QAAQ,MAAM;AAAA,IAC7B,CAAC;AACD,UAAM,OAAa;AAAA,MACjB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU,MACR,YAAY,QAAQ,WAAW,EAAE,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,IACnF;AACA,WAAO,IAAI,KAAK,IAAI;AACpB,UAAM,WAAW,EAAE,MAAM,MAAM,QAAQ,uCAAuC;AAC9E,QAAI,WAAW;AACf,QAAI;AACF,YAAM,WAAW,OAAO,SAAS,OAAO,aAAa,EAAE;AACvD,iBAAS;AACP,cAAMF,QAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,KAAK,GAAG,UAAU,CAAC;AAC7D,YAAIA,UAAS,UAAUA,MAAK,KAAM;AAClC,cAAM,OAAOA,MAAK;AAClB,YAAI,KAAK,QAAS;AAClB,YAAI,YAAY,IAAI,IAAI,eAAe;AACrC,qBAAW;AACX;AAAA,QACF;AACA,YAAI,OAAO,SAAS,SAAU,MAAK,YAAY,EAAE,KAAK,cAAc,KAAK,KAAK,CAAC;AAAA,aAC1E;AACH,gBAAM,QAAQ,KAAK,MAAM;AACzB,eAAK,YAAY,EAAE,KAAK,cAAc,KAAK,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,QAC1E;AACA,aAAK,YAAY,YAAY,IAAI;AACjC,eAAO,KAAK,WAAW,iBAAiB,CAAC,KAAK,SAAS;AACrD,gBAAM,IAAI,QAAc,CAAC,YAAY;AACnC,iBAAK,OAAO;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,SAAU,QAAO,MAAM,KAAM,sBAAsB;AACvD,eAAS,WACL,EAAE,MAAM,MAAM,QAAQ,qBAAqB,aAAa,SAAS,IACjE,MAAM,QAAQ,KAAK,CAAC,OAAO,QAAQ,WAAW,KAAK,MAAM,QAAQ,CAAC,CAAC;AAAA,IACzE,SAAS,GAAG;AACV,aAAO,MAAM,KAAM,kBAAkB;AACrC,eAAS,EAAE,MAAM,MAAM,QAAQ,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,EAAE;AAAA,IAC5E;AACA,YAAQ,OAAO,GAAG;AAClB,WAAO,OAAO,GAAG;AACjB,SAAK,YAAY,EAAE,KAAK,aAAa,KAAK,GAAG,OAAO,CAAC;AAAA,EACvD;AACA,QAAM,SAAS,OAAO,SAAqD;AACzE,UAAM,SAAS,QAAQ,IAAI,KAAK,GAAG;AACnC,QAAI,CAAC,OAAQ;AACb,WAAO,KAAK,KAAK,IAAI;AACrB,WAAO,OAAO,WAAW,eAAe,QAAQ,IAAI,KAAK,GAAG,GAAG;AAC7D,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,IACxD;AACA,SAAK,YAAY,EAAE,KAAK,YAAY,KAAK,KAAK,KAAK,GAAG,YAAY,KAAK,IAAI,EAAE,CAAC;AAAA,EAChF;AACA,QAAM,OAAO,OAAO,QAAgB;AAClC,UAAM,OAAO,KAAK,IAAI,GAAG,GAAG;AAC5B,QAAI,CAAC,KAAM;AACX,QAAI;AACF,YAAMA,QAAO,MAAM,KAAK,KAAK;AAC7B,UAAIA,MAAK,MAAM;AACb,aAAK,OAAO,GAAG;AACf,aAAK,YAAY,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA,MACtC,OAAO;AACL,cAAM,QAAQA,MAAK,MAAM,MAAM;AAC/B,aAAK,YAAY,EAAE,KAAK,SAAS,KAAK,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,MAC/D;AAAA,IACF,SAAS,GAAG;AACV,MAAAE,MAAK,KAAK,CAAC;AAAA,IACb;AAAA,EACF;AACA,QAAM,OAAO,CAAC,QAAgB;AAC5B,YAAQ,IAAI,GAAG,GAAG,MAAM,KAAM,WAAW;AACzC,WAAO,KAAK,GAAG,IAAI;AACnB,UAAM,QAAQ,KAAK,IAAI,GAAG;AAC1B,SAAK,OAAO,GAAG;AACf,WAAO,MAAM,MAAM;AACnB,SAAK,OAAO,UAAU,OAAO,EAAE,MAAM,MAAM,MAAS;AAAA,EACtD;AACA,SAAO;AAAA,IACL,OAAO,MAAM;AACX,UAAI,KAAK,QAAQ,QAAS,MAAKC,OAAM,IAAI;AAAA,eAChC,KAAK,QAAQ,OAAQ,MAAK,KAAK,KAAK,GAAG;AAAA,eACvC,KAAK,QAAQ,UAAW,MAAK,WAAW,IAAI;AAAA,eAC5C,KAAK,QAAQ,UAAW,MAAK,OAAO,IAAI;AAAA,eACxC,KAAK,QAAQ,YAAY;AAChC,gBAAQ,IAAI,KAAK,GAAG,GAAG,MAAM,KAAK,MAAM,KAAK,MAAM;AACnD,eAAO,KAAK,KAAK,GAAG,IAAI;AAAA,MAC1B,WAAW,KAAK,QAAQ,cAAe,QAAO,KAAK,KAAK,KAAK,CAAC;AAAA,UACzD,MAAK,KAAK,GAAG;AAAA,IACpB;AAAA,IACA,QAAQ;AACN,iBAAW,OAAO,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,QAAQ,KAAK,CAAC,EAAG,MAAK,GAAG;AAAA,IACjE;AAAA,EACF;AACF;;;AC9TO,IAAM,WAAsC,CAAC,GAAG,CAAC;AAkCjD,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAiEO,SAAS,QAAQ,QAAgB,YAAyC;AAC/E,QAAM,QAAS,MAAsD,WAAW;AAChF,SAAO,OAAO,OAAO,YAAY,aAAa,QAAQ;AACxD;AAEO,SAAS,aAAa,QAAqC;AAChE,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,OAAO,CAAC,IAAI;AAClD,MAAI,UAAU,SAAS,CAAC,EAAG,QAAO;AAClC,QAAM,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AACzD,SAAO,gCAAgC,KAAK,uCAAuC,SAAS,KAAK,GAAG,CAAC;AACvG;;;ACxFA,IAAM,YAAY;AAElB,SAAS,IAAI,SAA0B,KAAqB,QAAkC;AAC5F,MAAI,IAAI,WAAW,QAAS,SAAQ,MAAM,IAAI,KAAK;AAAA,WAC1C,IAAI,WAAW,SAAU,SAAQ,OAAO,IAAI,MAAM,IAAI,IAAI;AAAA,WAC1D,IAAI,WAAW,SAAU,SAAQ,OAAO,OAAO,IAAI,MAAM,CAAC;AAAA,MAC9D,SAAQ,MAAM;AACrB;AAEA,eAAe,SAAS,IAAc,MAA+B;AACnE,MAAI,QAAQ,GAAG,YAAY,KAAK,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/D,MAAI,WAAW;AACf,WAAS,OAAO,GAAG,MAAM,SAAS,KAAK;AACrC,UAAM,CAACC,OAAM,GAAGC,KAAI,IAAI;AACxB,UAAMC,QAAO,GAAG,QAAQ,IAAIF,KAAI;AAChC,QAAI,EAAE,MAAM,GAAG,MAAME,KAAI,GAAG,gBAAgB;AAC1C,iBAAWA;AACX,cAAQD;AACR;AAAA,IACF;AACA,QAAI,EAAE,OAAO,UAAW,OAAM,QAAQ,SAAS,IAAI;AACnD,UAAM,SAAS,MAAM,GAAG,SAASC,KAAI;AACrC,UAAM,OAAO,OAAO,WAAW,GAAG,IAAI,MAAM,YAAY;AACxD,YAAQ,CAAC,GAAG,GAAG,YAAY,MAAM,MAAM,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,GAAG,GAAGD,KAAI;AAC5E,eAAW;AAAA,EACb;AACA,SAAO,YAAY;AACrB;AAEA,eAAe,OAAO,IAAc,QAAgB,MAAkC;AACpF,QAAM,OAAO,CAAC,MAAc,GAAG,YAAY,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;AAC/D,UAAQ,QAAQ;AAAA,IACd,KAAK,YAAY;AACf,YAAM,SAAS,MAAM,GAAG,eAAe,KAAK,CAAC,CAAC,GAAG,MAAM;AACvD,aAAO,EAAE,QAAQ,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE;AAAA,IACnD;AAAA,IACA,KAAK;AACH,YAAM,GAAG,UAAU,KAAK,CAAC,GAAG,KAAK,CAAC,CAAwB;AAC1D,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,EAAE,QAAQ,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,EAAE;AAAA,IAC1C,KAAK;AACH,aAAO,EAAE,QAAQ,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,EAAE;AAAA,IAC3C,KAAK;AACH,aAAO,EAAE,QAAQ,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,EAAE;AAAA,IAC7C,KAAK;AACH,YAAM,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3C,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB,KAAK;AACH,YAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACjE,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB,KAAK;AACH,YAAM,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAChC,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,EAAE,QAAQ,MAAM,SAAS,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE;AAAA,IACvD,KAAK;AACH,YAAM,GAAG,QAAQ,OAAO,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AACzC,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,EAAE,QAAQ,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,EAAE;AAAA,IAC9C;AACE,aAAO,EAAE,QAAQ,MAAM,GAAG,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,EAC9C;AACF;AAEA,SAAS,SAAS,MAA4C;AAC5D,SACE,KAAK,WACJ,CAACD,UAAS;AACT,UAAM,QAAQ,UAAU,+BAA+BA,KAAI,EAAE;AAAA,EAC/D;AAEJ;AAEA,SAAS,QACP,GACA,KACA,MACQ;AACR,QAAM,SAAS,WAAW,EAAE,KAAK,IAAI,MAAM,IAAI,IAAI;AACnD,QAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAC5C,OAAK;AAAA,IACH,IAAI;AAAA,IACJ,YAAY,QAAQ,OAAO,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,EACtD;AACA,SAAO,EAAE,QAAQ,OAAO,UAAU,CAAC,KAAK,EAAE;AAC5C;AAEA,SAAS,WAAW,MAAkB,OAAuB;AAC3D,MAAI,MAAM,WAAW,EAAG;AACxB,OAAK,KAAK,SAAS,EAAE,KAAK,CAAC,aAAa;AACtC,eAAW,QAAQ,MAAO,UAAS,KAAK,CAAC,MAAM,IAAI,IAAI;AAAA,EACzD,CAAC;AACH;AAEA,SAAS,SAAS,GAAa,MAAc,MAAsC;AACjF,QAAM,MAAM,EAAE,aAAa,IAAI;AAC/B,MAAI,QAAQ,OAAW,OAAM,QAAQ,SAAS,oBAAoB,IAAI,EAAE;AACxE,MAAI,CAAC,KAAK,GAAG,EAAG,OAAM,QAAQ,SAAS,iBAAiB,IAAI,wBAAwB;AACtF;AAEA,SAAS,YACP,MACA,MACA;AACA,QAAM,aAAa,oBAAI,IAAwB;AAC/C,QAAM,OAAO,CAAC,OAAe;AAC3B,eAAW,IAAI,EAAE,IAAI;AACrB,WAAO,WAAW,OAAO,EAAE;AAAA,EAC7B;AACA,SAAO;AAAA,IACL,MAAM,GAAa,KAA0D;AAC3E,YAAM,OAAO;AAAA,QACX,CAAC,SAAS,QACR,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,cAAc,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG;AAAA,UACjE;AAAA,QACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,iBAAW,IAAI,IAAI,IAAI,EAAE,IAAI,SAAS,MAAM,IAAI,OAAO,CAAC;AACxD,aAAO,IAAI;AAAA,IACb;AAAA,IACA;AAAA,IACA,OAAO,MAAM;AACX,iBAAW,MAAM,CAAC,GAAG,WAAW,KAAK,CAAC,EAAG,MAAK,EAAE;AAAA,IAClD;AAAA,EACF;AACF;AAEA,SAAS,QACP,GACA,KACA,SACA,MACQ;AACR,MAAI,IAAI,OAAO,WAAW;AACxB,YAAQ,IAAI,IAAI,KAAK,IAAI;AACzB,YAAQ,OAAO,IAAI,KAAK;AACxB,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AACA,QAAM,UAAU,EAAE,SAAS;AAAA,IAAM,IAAI;AAAA,IAAO,EAAE,WAAW,IAAI,UAAU;AAAA,IAAG,CAAC,WACzE,KAAK,EAAE,OAAO,IAAI,IAAI,OAAO,CAAC;AAAA,EAChC;AACA,UAAQ,IAAI,IAAI,IAAI,OAAO;AAC3B,SAAO,EAAE,QAAQ,IAAI,GAAG;AAC1B;AAEO,SAAS,YAAY,MAAuB,MAAgC;AACjF,MAAI,QAAmC;AACvC,QAAM,YAAY,oBAAI,IAA6B;AACnD,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,UAAU,oBAAI,IAAwB;AAC5C,MAAI;AACJ,QAAM,QAAQ,QAAQ,cAAoB;AAC1C,QAAM,OAAO,CAACG,UAAiB,WAA2B,CAAC,MAAM;AAC/D,QAAI,UAAU,SAAU,MAAK,YAAYA,UAAS,QAAQ;AAAA,EAC5D;AACA,QAAM,QAAQ,CAAC,IAAY,MAAc,aACvC,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,QAAQ;AAChC,QAAM,OAAO,YAAY,MAAM,MAAM,OAAO;AAE5C,WAAS,OAAO,OAAO,OAAO,MAAM,yCAA+C;AACjF,QAAI,UAAU,SAAU;AACxB,SAAK,EAAE,IAAI,CAAC;AACZ,YAAQ;AACR,SAAK,MAAM;AACX,eAAW,WAAW,QAAQ,OAAO,EAAG,SAAQ;AAChD,YAAQ,MAAM;AACd,SAAK,MAAM;AACX,eAAW,WAAW,UAAU,OAAO,EAAG,SAAQ,MAAM;AACxD,cAAU,MAAM;AAChB,QAAI,KAAM,YAAW,MAAM,CAAC,GAAG,MAAM,CAAC;AACtC,WAAO,MAAM;AACb,SAAK,QAAQ;AACb,UAAM,QAAQ;AAAA,EAChB;AAEA,iBAAe,MAAMA,UAAqC;AACxD,UAAM,UAAU,aAAaA,SAAQ,QAAQ;AAC7C,QAAI,SAAS;AACX,WAAK,EAAE,OAAO,EAAE,UAAU,UAAU,OAAO,QAAQ,EAAE,CAAC;AACtD,aAAO;AACP;AAAA,IACF;AACA,UAAM,WAAW,MAAM,KAAK,SAAS;AACrC,UAAM,YAAY,KAAK,YAAY,KAAK,SAAS;AACjD,UAAM,eAAe,EAAE,aAAa,CAAC,GAAG,MAAM,KAAK,GAAG,CAAC,EAAE,GAAG,SAAS;AACrE,YAAQ;AACR,QAAIA,SAAQ,QAAQ,KAAK,MAAO,MAAK,KAAK,MAAM,QAAQA,SAAQ,MAAM,MAAM,OAAO,CAAC;AACpF,SAAK;AAAA,MACH,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,UAAU;AAAA,QAClB,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACzC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,iBAAe,SAAS,KAAsD,GAAa;AACzF,UAAM,UAAU,MAAM,EAAE,aAAa,IAAI,MAAM;AAAA,MAC7C,GAAG,IAAI;AAAA,MACP,QAAQ,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG,OAAO,MAAM,MAAM,EAAE,CAAC;AAAA,IAClE,CAAC;AACD,QAAI,UAAU,UAAU;AACtB,cAAQ,MAAM;AAAA,IAChB,OAAO;AACL,gBAAU,IAAI,IAAI,IAAI,OAAO;AAC7B,eAAS,IAAI,QAAQ,GAAG;AACxB,YAAM,IAAI,IAAI,EAAE,SAAS,QAAQ,IAAI,CAAC;AAAA,IACxC;AACA,QAAI;AACF,aAAO,EAAE,QAAQ,MAAM,QAAQ,OAAO;AAAA,IACxC,UAAE;AACA,gBAAU,OAAO,IAAI,EAAE;AAAA,IACzB;AAAA,EACF;AAEA,iBAAe,MAAM,KAA8C,GAAa;AAC9E,UAAM,MAAM,CAAC,OAAc,CAAC,UAAsB,MAAM,IAAI,IAAI,EAAE,IAAI,OAAO,MAAM,MAAM,EAAE,CAAC;AAC5F,QAAI,IAAI,QAAQ,SAAS,OAAW,UAAS,GAAG,IAAI,QAAQ,MAAM,CAAC,QAAQ,SAAS,IAAI,GAAG,CAAC;AAC5F,QAAI;AACJ,UAAM,SAAS,MAAM,EAAE,IAAI,IAAI,MAAM;AAAA,MACnC,GAAG,IAAI;AAAA,MACP,SAAS;AAAA,MACT,UAAU,IAAI,CAAC;AAAA,MACf,UAAU,IAAI,CAAC;AAAA,MACf,WAAW,CAAC,QAAQ;AAClB,iBAAS;AACT,YAAI,UAAU,SAAU;AACxB,eAAO,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAClC,YAAI,IAAI,QAAQ,SAAS,OAAW,UAAS,IAAI,GAAG;AACpD,cAAM,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,MAChC;AAAA,IACF,CAAC;AACD,QAAI,WAAW,OAAW,OAAM,QAAQ,UAAU,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,qBAAqB;AAC3F,QAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAG,QAAO,OAAO,MAAM;AAClE,WAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,EACjC;AAEA,iBAAe,OAAO,KAAqC;AACzD,QAAI,KAAK,UAAU,eAAe,IAAI,OAAO,UAAU;AACrD,YAAM,QAAQ,SAAS,GAAG,IAAI,EAAE,kDAAkD;AAAA,IACpF;AACA,UAAM,IAAI,MAAM,KAAK,SAAS;AAC9B,YAAQ,IAAI,IAAI;AAAA,MACd,KAAK;AACH,eAAO,MAAM,KAAK,CAAC;AAAA,MACrB,KAAK;AACH,eAAO,SAAS,KAAK,CAAC;AAAA,MACxB,KAAK,YAAY;AACf,cAAM,UAAU,UAAU,IAAI,IAAI,QAAQ;AAC1C,YAAI,CAAC,QAAS,OAAM,IAAI,MAAM,eAAe,IAAI,QAAQ,EAAE;AAC3D,YAAI,SAAS,KAAK,SAAS,IAAI,CAAC;AAChC,eAAO,EAAE,QAAQ,KAAK;AAAA,MACxB;AAAA,MACA,KAAK;AACH,YAAI,CAAC,EAAE,KAAK,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,MAAM,CAAC,EAAG,OAAM,QAAQ,SAAS,OAAO,IAAI,GAAG,EAAE;AACzF,eAAO,EAAE,QAAQ,KAAK;AAAA,MACxB,KAAK;AACH,eAAO;AAAA,UACL,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,GAAG,MAAM,MAAoB,KAAK;AAAA,QACpE;AAAA,MACF,KAAK;AACH,YAAI,CAAE,WAAiC,SAAS,IAAI,MAAM,GAAG;AAC3D,gBAAM,IAAI,MAAM,4BAA4B,IAAI,MAAM,EAAE;AAAA,QAC1D;AACA,eAAO,OAAO,EAAE,IAAI,IAAI,QAAQ,IAAI,IAAI;AAAA,MAC1C,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ,GAAG,KAAK,SAAS,IAAI;AAAA,MACtC,KAAK;AACH,eAAO,EAAE,QAAQ,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE;AAAA,MAC3C,KAAK;AACH,UAAE,OAAO,IAAI,MAAM;AACnB,eAAO,EAAE,QAAQ,KAAK;AAAA,MACxB,KAAK;AACH,eAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,EAAE;AAAA,MACnC,KAAK;AACH,eAAO,QAAQ,GAAG,KAAK,OAAO;AAAA,MAChC,KAAK;AACH,eAAO,EAAE,QAAQ,KAAK,MAAM,GAAG,GAAG,EAAE;AAAA,MACtC,KAAK;AACH,eAAO,EAAE,QAAQ,KAAK,KAAK,IAAI,YAAY,EAAE;AAAA,MAC/C,KAAK;AACH,eAAO,EAAE,QAAQ,KAAK;AAAA,MACxB;AACE,cAAM,IAAI,MAAM,cAAe,IAAuB,EAAE,EAAE;AAAA,IAC9D;AAAA,EACF;AAEA,OAAK,iBAAiB,WAAW,CAAC,UAAU;AAC1C,UAAM,OAAO,MAAM;AACnB,QAAI,UAAU,SAAU;AACxB,QAAI,KAAK,OAAO;AACd,UAAI,UAAU,OAAO;AACnB,cAAM,KAAK,KAAK,EAAE,MAAM,CAAC,QAAiB;AACxC,eAAK,EAAE,OAAO,EAAE,UAAU,UAAU,OAAO,OAAQ,KAAe,WAAW,GAAG,EAAE,EAAE,CAAC;AACrF,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,UAAU,OAAQ;AACtB,QAAI,KAAK,QAAQ,QAAW;AAC1B,WAAK,OAAO,IAAqB;AACjC;AAAA,IACF;AACA,UAAM,MAAM;AACZ,WAAO,GAAG,EAAE;AAAA,MACV,CAAC,EAAE,QAAQ,SAAS,MAAM;AACxB,cAAM,IAAI,IAAI,EAAE,OAAO,GAAG,QAAQ;AAClC,YAAI,IAAI,OAAO,SAAU,QAAO,IAAI,SAAS,IAAI;AAAA,MACnD;AAAA,MACA,CAAC,QAAiB;AAChB,cAAM,OAAQ,KAA4B;AAC1C,cAAM,IAAI,IAAI;AAAA,UACZ,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACtD,GAAI,OAAO,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACD,OAAK,iBAAiB,SAAS,MAAM,OAAO,CAAC;AAC7C,OAAK,QAAQ;AACb,SAAO,EAAE,QAAQ,QAAQ,MAAM,QAAQ;AACzC;;;AClVA,SAAS,SAAS,MAAsB;AACtC,SAAO,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AACjD;AAEA,SAAS,MAAM,OAAkB,MAAyB;AACxD,SAAO,MAAM,SAAS,SAAY,EAAE,GAAG,OAAO,KAAK,IAAI,EAAE,GAAG,OAAO,MAAM,KAAK,SAAS,IAAI,EAAE;AAC/F;AAEA,SAAS,MAAM,MAAc,MAAuB;AAClD,SAAO,SAAS,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG;AACpD;AAEO,IAAM,aAAN,MAAsC;AAAA,EAC1B,UAAU,oBAAI,IAAuB;AAAA,EAEtD,MAAM,IAAI,OAAiE;AACzE,WAAO,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,OAAO,MAAc,QAAmC;AAC5D,SAAK,IAAI,MAAM,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC;AAAA,EAC/C;AAAA,EAEQ,IAAI,MAAc,OAAoC;AAC5D,QAAI,MAAO,MAAK,QAAQ,IAAI,MAAM,KAAK;AAAA,QAClC,MAAK,QAAQ,OAAO,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAK,MAAc,IAAY,MAAmD;AACtF,UAAM,KAAK,OAAO,CAAC,EAAE,CAAC;AACtB,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,MAAM,MAAM,IAAI,CAAC;AACpF,eAAW,SAAS,QAAS,MAAK,QAAQ,OAAO,MAAM,IAAI;AAC3D,eAAW,SAAS,SAAS;AAC3B,YAAM,OAAO,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM;AAC9C,UAAI,SAAS,GAAI,MAAK,QAAQ,IAAI,MAAM,MAAM,OAAO,IAAI,CAAC;AAAA,IAC5D;AACA,SAAK,QAAQ,IAAI,IAAI,MAAM,KAAK,QAAQ,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC;AAAA,EACpF;AAAA,EAEA,MAAM,OAAO,OAAyC;AACpD,eAAW,OAAO,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC,GAAG;AAC1C,UAAI,MAAM,KAAK,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC,EAAG,MAAK,QAAQ,OAAO,GAAG;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAAmC;AAC7C,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,QAAQ,GAAG;AAAA,EACvE;AAAA,EAEA,MAAM,MAAM,MAAoC;AAC9C,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,MAA4B;AAChC,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC;AAAA,EAClC;AACF;;;ACjFA,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,YAAY;AAClB,IAAM,gBAAgB;AACtB,IAAMC,aAAY;AAClB,IAAM,WAAW;AACjB,IAAM,aAAa;AAcnB,IAAM,qBAAuD;AAAA,EAC3D,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,WAAW;AAAA,EACX,iBAAiB;AACnB;AAEA,SAAS,UAAU,KAAc,MAAqB;AACpD,MAAI,OAAQ,KAA4B,SAAS,SAAU,QAAO;AAClE,QAAMC,QAAQ,KAA4B;AAC1C,SAAO,QAAS,OAAOA,UAAS,YAAY,mBAAmBA,KAAI,KAAM,OAAO,IAAI;AACtF;AAEA,SAAS,QAAQ,KAAuB;AACtC,QAAM,OAAQ,KAA4B;AAC1C,SAAO,SAAS,YAAY,SAAS;AACvC;AAEA,SAAS,MAAM,MAAwB;AACrC,SAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AACvC;AAEA,SAASC,UAAS,MAAsB;AACtC,SAAO,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AACjD;AAEA,SAAS,OAAO,MAAsB;AACpC,SAAO,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AAC7C;AAEA,SAAS,SAAS,MAAwB;AACxC,QAAM,QAAQ,MAAM,IAAI;AACxB,SAAO,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE;AAClE;AAEA,SAAS,OAAO,MAAc,MAAuB;AACnD,SAAO,SAAS,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG;AACpD;AAkBA,IAAM,SAAS,oBAAI,IAAI,CAAC,oBAAoB,8BAA8B,mBAAmB,CAAC;AAE9F,IAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE;AAE1C,eAAe,SAAS,QAA+D;AACrF,QAAM,OAAQ,OAAuB;AACrC,MAAI,CAAC,KAAM,QAAO;AAClB,WAAS,UAAU,KAAK,WAAW;AACjC,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,YAAM,QAAQ,gBAAgB,OAAO;AACrC,UAAI,CAAC,OAAO,IAAK,KAA4B,IAAc,EAAG,OAAM;AACpE,UAAI,UAAU,OAAW,QAAO;AAChC,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,SAAS,QAAoB,IAAY,OAAyB;AACzE,WAASC,QAAO,GAAGA,QAAO,MAAM,UAAU;AACxC,UAAM,IAAI,OAAO,MAAM,MAAM,SAASA,KAAI,GAAG,EAAE,IAAI,KAAKA,MAAK,CAAC;AAC9D,QAAI,EAAE,IAAI;AACR,YAAM,OAAO,OAAO,IAAI,MAAM,oCAAoC,GAAG,EAAE,MAAM,SAAS,CAAC;AACzF,IAAAA,SAAQ;AAAA,EACV;AACF;AAEA,eAAe,WAAW,QAA8B,IAAiC;AACvF,QAAM,SAAS,MAAM,SAAS,MAAM;AACpC,MAAI,QAAQ;AACV,QAAI;AACF,SAAG;AAAA,QACD,OAAO,CAAC,IAAI,UAAU,SAAS,QAAQ,IAAI,KAAK;AAAA,QAChD,UAAU,CAAC,MAAM,OAAO,SAAS,CAAC;AAAA,MACpC,CAAC;AACD,aAAO,MAAM;AAAA,IACf,UAAE;AACA,aAAO,MAAM;AAAA,IACf;AACA;AAAA,EACF;AACA,QAAM,WAAW,MAAM,OAAO,eAAe,EAAE,kBAAkB,KAAK,CAAC;AACvE,MAAI;AACF,UAAM,GAAG;AAAA,MACP,OAAO,CAAC,IAAI,UACV,SAAS,MAAM,EAAE,MAAM,SAAS,UAAU,IAAI,MAAM,MAAiC,CAAC;AAAA,MACxF,UAAU,CAAC,MAAM,SAAS,SAAS,CAAC;AAAA,IACtC,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,SAAS,MAAM;AACrB,UAAM;AAAA,EACR;AACA,QAAM,SAAS,MAAM;AACvB;AAaA,SAAS,SAAS,OAA4C;AAC5D,SAAO,UAAU;AACnB;AAEO,IAAM,SAAN,MAAiC;AAAA,EACrB;AAAA,EACA;AAAA,EACA,OAAO,oBAAI,IAAuC;AAAA,EAClD,UAAU,oBAAI,QAA2C;AAAA,EAEzD;AAAA,EACA;AAAA,EAEjB,YACE,MACA,OAAkB,IAAI,WAAW,GACjC,SACA,UAAgC,CAAC,GACjC;AACA,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ,WAAW;AACjC,SAAK,UAAU,YAAY,SAAY,SAAY,IAAI,iBAAiB,OAAO;AAC/E,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,YAAY,CAAC,EAAE,KAAK,MAAM;AACrC,mBAAW,QAAQ,KAAkB,MAAK,OAAO,IAAI;AAAA,MACvD;AACA,MAAC,KAAK,QAAsD,QAAQ;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,WAAW,OAAuB;AACxC,eAAW,QAAQ,MAAO,MAAK,OAAO,IAAI;AAC1C,SAAK,SAAS,YAAY,KAAK;AAAA,EACjC;AAAA,EAEA,YAAY,MAAc,MAAsB;AAC9C,WAAO,YAAY,MAAM,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAc,KAAK,OAAiB,MAAcC,QAAkC;AAClF,QAAI,MAAMA;AACV,aAAS,KAAK,MAAM,KAAK,MAAM,QAAQ,MAAM;AAC3C,YAAM,MAAM,IAAI,mBAAmB,MAAM,EAAE,CAAW;AACtD,WAAK,KAAK,IAAI,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,GAAG;AACzD,WAAK,QAAQ,IAAI,KAAK,YAAY,IAAI,CAAC;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,IAAI,MAAkD;AAClE,UAAM,QAAQ,MAAM,IAAI;AACxB,QAAI,OAAO,MAAM;AACjB,QAAI;AACJ,WAAO,OAAO,KAAK,CAAC,QAAQ;AAC1B,eAAS,KAAK,KAAK,IAAI,IAAI,MAAM,MAAM,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;AAC7D,QAAI,OAAQ;AACZ,UAAM,KAAK,IAAI,MAAM,MAAM,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;AAC7C,QAAI,UAAU,CAAE,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAI;AAC/C,WAAK,OAAO,EAAE;AACd,eAAS;AACT,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,OAAO,MAAM,UAAU,KAAK,IAAI;AAAA,IACzD,SAAS,KAAK;AACZ,YAAM,UAAU,KAAK,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,MAAc,KAAkD;AACpF,QAAI,YAAY,IAAI,KAAK,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,YAAY,SAAU,QAAO;AAChF,UAAM,QAAQ,MAAM,KAAK,KAAK,QAAQ,GAAG,EAAE,MAAM,MAAM,IAAI;AAC3D,QAAI,UAAU,QAAQ,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,KAAM,QAAO;AAC7D,SAAK,QAAQ,IAAI,KAAK,YAAY,IAAI,CAAC;AACvC,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,MAAoB;AACjC,eAAW,OAAO,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,EAAG,KAAI,OAAO,KAAK,IAAI,EAAG,MAAK,KAAK,OAAO,GAAG;AAAA,EACtF;AAAA,EAEA,MAAc,MAAS,MAAc,IAAoD;AACvF,UAAM,MAAM,MAAM,KAAK,IAAI,IAAI;AAC/B,QAAI;AACF,aAAO,MAAM,GAAG,GAAG;AAAA,IACrB,SAAS,KAAK;AACZ,UAAK,KAA4B,SAAS,mBAAoB,MAAM,KAAK,QAAQ,MAAM,GAAG;AACxF,cAAM;AACR,WAAK,OAAO,IAAI;AAChB,aAAO,GAAG,MAAM,KAAK,IAAI,IAAI,CAAC;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAc,MACZ,QACAC,OACA,MACiB;AACjB,WAAO,SAAS,SAAS,OAAO,cAAcA,KAAI,IAAI,OAAO,mBAAmBA,KAAI;AAAA,EACtF;AAAA,EAEA,MAAc,OAAO,MAAyC;AAC5D,UAAM,QAAQ,MAAM,IAAI;AACxB,UAAMA,QAAO,MAAM,IAAI;AACvB,QAAIA,UAAS,OAAW,OAAM,QAAQ,SAAS,IAAI;AACnD,WAAO,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,IAAIA,KAAI;AAAA,EACrC;AAAA,EAEA,MAAc,OAAO,MAA+B;AAClD,QAAI,MAAM,IAAI,EAAE,WAAW,EAAG,QAAO,KAAK;AAC1C,UAAM,CAAC,KAAKA,KAAI,IAAI,MAAM,KAAK,OAAO,IAAI;AAC1C,UAAM,QAAQ,KAAK,KAAK,IAAI,IAAI;AAChC,WAAO,KAAK,MAAM,KAAK,OAAO,WAA4B;AACxD,YAAM,CAAC,OAAO,MAAM,IAAI,QACnB,CAAC,aAAa,MAAM,IACpB,CAAC,QAAQ,WAAW;AACzB,UAAI;AACF,eAAO,MAAM,KAAK,MAAM,QAAQA,OAAM,KAAK;AAAA,MAC7C,SAAS,KAAK;AACZ,YAAK,KAA4B,SAAS,oBAAqB,OAAM;AAAA,MACvE;AACA,aAAO,KAAK,MAAM,QAAQA,OAAM,MAAM;AAAA,IACxC,CAAC,EAAE,MAAM,CAAC,QAAQ;AAChB,YAAM,UAAU,KAAK,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEQ,KAAK,MAAgC;AAC3C,WAAO,KAAK,OAAO,IAAI,EAAE;AAAA,MACvB,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,MAA8C;AACpE,eAAW,SAAS,MAAM,KAAK,KAAK,IAAI,SAAS,IAAI,CAAC,GAAG;AACvD,UAAI,OAAO,SAAS,OAAW;AAC/B,UAAI,CAAE,MAAM,KAAK,KAAK,MAAM,IAAI,KAAO,MAAM,KAAK,KAAKC,UAAS,MAAM,IAAI,CAAC,EAAI,QAAO;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,OAAO,MAAcC,SAAmC;AACpE,QAAI,UAAU;AACd,aAAS,OAAO,GAAG,QAAQC,YAAW,QAAQ;AAC5C,UAAI;AACF,eAAO,EAAE,MAAM,SAAS,QAAQ,MAAM,KAAK,OAAO,OAAO,EAAE;AAAA,MAC7D,SAAS,KAAK;AACZ,YAAI,CAAC,QAAQ,GAAG,EAAG,OAAM;AACzB,cAAMC,QAAO,MAAM,KAAK,UAAU,OAAO;AACzC,YAAI,CAACA,MAAM,OAAM;AACjB,YAAIA,MAAK,SAAS,WAAW,CAACF,QAAQ,QAAO,EAAE,MAAM,SAAS,MAAAE,MAAK;AACnE,cAAMC,QAAO,QAAQ,MAAMD,MAAK,KAAK,MAAM;AAC3C,kBAAU,YAAYH,UAASG,MAAK,IAAI,GAAG,GAAGA,MAAK,IAAI,GAAGC,KAAI,EAAE;AAAA,MAClE;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,IAAI;AAAA,EAC7B;AAAA,EAEQ,KAAK,MAAc,WAAoB,MAAqC;AAClF,UAAM,WAAW,aAAa,WAAW,KAAK,IAAI,IAAI,MAAQ;AAC9D,YAAQ,YAAY,UAAU,YAAY,MAAM,QAAQ;AAAA,EAC1D;AAAA,EAEiB,WAAW,oBAAI,IAAoB;AAAA,EACnC,WAAW,oBAAI,IAAY;AAAA,EACpC;AAAA,EAEA,SAAS,MAAsB;AACrC,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,OAAO,MAAM;AACtB,WAAK,SAAS,IAAI,KAAK,GAAG;AAC1B,WAAK,SAAS,IAAI,GAAG;AAAA,IACvB;AACA,SAAK,aAAa,QAAQ,QAAQ,EAC/B,KAAK,MAAM,KAAK,cAAc,CAAC,EAC/B,MAAM,MAAM,MAAS,EACrB,QAAQ,MAAM;AACb,WAAK,WAAW;AAAA,IAClB,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,gBAA+B;AAC3C,eAAW,QAAQ,KAAK,UAAU;AAChC,WAAK,SAAS,OAAO,IAAI;AACzB,YAAM,KAAK,KAAK,SAAS,IAAI,IAAI;AACjC,UAAI,OAAO,OAAW;AACtB,YAAM,KAAK,KAAK,OAAO,MAAM,CAAC,WAAW;AAAA,QACvC,GAAG;AAAA,QACH;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,SAAS;AAAA,MACX,EAAE;AACF,UAAI,KAAK,SAAS,IAAI,IAAI,MAAM,GAAI,MAAK,SAAS,OAAO,IAAI;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,MAAc,QAAgB,MAA8C;AAC/F,UAAM,YAAY,OAAO,SAAS;AAClC,UAAM,OAAO,YAAY,SAAY,MAAO,OAAgC,QAAQ;AACpF,UAAM,WAAW,MAAM,gBAAgB;AACvC,UAAM,UAAU,YAAY,KAAK,SAAS,IAAI,IAAI,IAAI;AACtD,UAAM,OACJ,MAAM,YAAY,UAAa,KAAK,aAAa,WAAW,KAAK,UAAU;AAC7E,UAAM,QAAQ,WAAW;AACzB,WAAO;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,MAAM,MAAM,QAAQ;AAAA,MACpB,MAAM,KAAK,KAAK,MAAM,WAAW,IAAI;AAAA,MACrC,OAAO,IAAI,KAAK,KAAK;AAAA,MACrB,OAAO,IAAI,KAAK,MAAM,WAAW,KAAK;AAAA,MACtC,OAAO,IAAI,KAAK,KAAK,IAAI,WAAW,MAAM,WAAW,OAAO,QAAQ,CAAC;AAAA,MACrE,KAAK,MAAM,OAAO,QAAQ,IAAI;AAAA,MAC9B,GAAI,KAAK,UAAU,CAAC,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,SAAS,OAA0B;AACzC,UAAMC,QAAO,IAAI,KAAK,MAAM,WAAW,CAAC;AACxC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,IAAI,EAAE;AAAA,MAC3C,MAAM,UAAU;AAAA,MAChB,OAAOA;AAAA,MACP,OAAO,MAAM,YAAY,SAAYA,QAAO,IAAI,KAAK,MAAM,OAAO;AAAA,MAClE,OAAO,IAAI,KAAK,MAAM,WAAW,CAAC;AAAA,MAClC,KAAK,MAAM,OAAO,QAAQ,MAAM,IAAI;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,OAAiC;AACtD,QAAI,MAAM,KAAM,QAAO,KAAK,SAAS,MAAM,IAAI;AAC/C,UAAM,CAAC,IAAI,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC;AAC/C,WAAO,KAAK,OAAO,MAAM,MAAM,MAAM,QAAkB,IAAI;AAAA,EAC7D;AAAA,EAEA,MAAM,KAAK,MAA+B;AACxC,WAAO,KAAK,SAAS,MAAM,KAAK,OAAO,MAAM,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,MAAM,MAA+B;AACzC,WAAO,KAAK,SAAS,MAAM,KAAK,OAAO,MAAM,KAAK,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,OAAO,MAAgC;AAC3C,WAAO,KAAK,OAAO,MAAM,IAAI,EAAE;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,SAAY,MAAc,IAAsB,OAA4B;AACxF,aAAS,UAAU,KAAK,WAAW;AACjC,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,SAAS,KAAK;AACZ,cAAMN,QAAQ,KAA4B;AAC1C,cAAM,QAAQA,UAAS,sBAAuB,SAAS,OAAO,IAAIA,KAAc;AAChF,YAAI,CAAC,SAAS,WAAW,cAAe,OAAM,UAAU,KAAK,IAAI;AACjE,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,UAAU,EAAE,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,MAA6C;AAClE,UAAM,UAAU,MAAM,KAAK,OAAO,MAAM,IAAI,GAAG;AAC/C,QAAI,OAAO,SAAS,YAAa,OAAM,QAAQ,UAAU,IAAI;AAC7D,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,MAAmC;AACtD,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI;AACvC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,IAAI,WAAW,OAAO,MAAM,OAAO,QAAQ,GAAG,YAAY,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAc,QAAgBO,SAAqC;AAC7E,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI;AACvC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YACE,IAAI,WAAW,OAAO,MAAM,OAAO,QAAQ,GAAG,MAAM,QAAQ,SAASA,OAAM,EAAE,YAAY,CAAC;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAc,QAAgB,OAAkC;AAC3E,UAAM,UAAU,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC;AAC3C,UAAM,KAAK,SAAS,MAAM,MAAM,WAAW,QAAQ,CAAC,OAAO,GAAG,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI;AAAA,EAC3F;AAAA,EAEA,MAAM,SAAS,MAAc,MAA6B;AACxD,UAAM,SAAS,MAAM,KAAK,SAAS,IAAI;AACvC,UAAM,KAAK,SAAS,MAAM,MAAM,WAAW,QAAQ,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,GAAG,IAAI;AAAA,EACrF;AAAA,EAEA,MAAM,aAAa,MAAc,UAA0C;AACzE,UAAM,UAAU,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC;AAC3C,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA,MAAM,OAAO,eAAe,EAAE,kBAAkB,CAAC,SAAS,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO,CAAC,IAAI,UACV,SAAS,MAAM,EAAE,MAAM,SAAS,UAAU,IAAI,MAAM,MAAiC,CAAC;AAAA,MACxF,UAAU,CAAC,SAAS,SAAS,SAAS,IAAI;AAAA,MAC1C,OAAO,MAAM,SAAS,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAA+B;AAC5C,WAAO,IAAI,YAAY,EAAE,OAAO,MAAM,KAAK,eAAe,IAAI,CAAC;AAAA,EACjE;AAAA,EAEA,MAAc,YAAY,MAA0C;AAClE,QAAI;AACF,aAAO,EAAE,MAAM,KAAK,OAAO,MAAM,IAAI,GAAG,MAAM,IAAI;AAAA,IACpD,SAAS,KAAK;AACZ,UAAI,CAAC,QAAQ,GAAG,EAAG,OAAM;AAAA,IAC3B;AACA,UAAM,CAAC,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC;AAC1C,UAAM,SAAS,OAAO,SAAS,SAAY,OAAO,YAAYN,UAAS,IAAI,GAAG,MAAM,IAAI;AACxF,WAAO,CAAC,aAAa,MAAM,KAAK,OAAOA,UAAS,MAAM,GAAG,IAAI,GAAG,MAAM,OAAO,MAAM,CAAC,GAAG,KAAK;AAAA,EAC9F;AAAA,EAEA,MAAc,QAAQ,MAAwD;AAC5E,UAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,KAAK,YAAY,IAAI;AACrD,UAAM,CAAC,KAAKD,KAAI,IAAI,MAAM,KAAK,OAAO,MAAM;AAC5C,QAAI;AACF,YAAM,SAAS,MAAM,KAAK;AAAA,QAAM;AAAA,QAAK,CAAC,WACpC,OAAO,cAAcA,OAAM,EAAE,QAAQ,KAAK,CAAC;AAAA,MAC7C;AACA,UAAI,CAAC,QAAS,MAAK,MAAMC,UAAS,MAAM,CAAC;AACzC,aAAO,CAAC,QAAQ,OAAO;AAAA,IACzB,SAAS,KAAK;AACZ,YAAM,OAAQ,KAA4B,SAAS,sBAAsB,WAAW;AACpF,YAAM,OAAO,QAAQ,MAAM,IAAI,IAAI,UAAU,KAAK,IAAI;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAAc,SAA6C;AACzE,UAAM,CAAC,MAAM,OAAO,IAAI,MAAM,KAAK,QAAQ,IAAI;AAC/C,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AACtC,UAAM,WAAW,MAAM,KAAK,eAAe;AAC3C,UAAM,SAAS,MAAM,OAAmC;AACxD,UAAM,SAAS,MAAM;AAAA,EACvB;AAAA,EAEA,MAAc,QAAQ,MAAsE;AAC1F,UAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,IAAI;AAC1C,UAAM,SAAS,MAAM;AACrB,QAAI,OAAO,SAAS,YAAa,OAAM,QAAQ,WAAW,IAAI;AAC9D,UAAMO,YAAW,oBAAI,IAAgC;AACrD,qBAAiB,SAAS,OAAO,OAAO,EAAG,CAAAA,UAAS,IAAI,MAAM,MAAM,KAAK;AACzE,eAAWJ,SAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI,GAAG;AACpD,YAAMJ,QAAO,OAAOI,MAAK,IAAI;AAC7B,UAAI,CAACI,UAAS,IAAIR,KAAI,EAAG,CAAAQ,UAAS,IAAIR,OAAMI,KAAI;AAAA,IAClD;AACA,WAAO,CAAC,MAAM,MAAM,CAAC,GAAGI,SAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,IAAI,IAAI,KAAK,CAAE,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,QAAQ,MAAiC;AAC7C,YAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAACR,KAAI,MAAMA,KAAI;AAAA,EAC3D;AAAA,EAEA,MAAM,YAAY,MAAuD;AACvE,UAAM,CAAC,KAAKQ,SAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI;AAC/C,UAAM,OAAO,QAAQ,MAAM,KAAK;AAChC,UAAM,QAAQ,MAAM,KAAK,KAAK,IAAIA,UAAS,IAAI,CAAC,CAACR,KAAI,MAAM,GAAG,IAAI,IAAIA,KAAI,EAAE,CAAC;AAC7E,WAAO,QAAQ;AAAA,MACbQ,UAAS,IAAI,OAAO,CAACR,OAAM,KAAK,GAAG,MAAwC;AACzE,YAAI,CAAC,SAAS,KAAK,EAAG,QAAO,CAACA,OAAM,KAAK,SAAS,KAAK,CAAC;AACxD,cAAM,OAAO,MAAM,KAAK,OAAO,GAAG,IAAI,IAAIA,KAAI,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,MAAM,MAAM,IAAI;AACnF,eAAO,CAACA,OAAM,IAAI;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAc,UAAmC,CAAC,GAAkB;AAC9E,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,KAAK,OAAO,MAAM,IAAI;AAAA,IACtC,SAAS,KAAK;AACZ,UAAI,CAAC,QAAQ,GAAG,EAAG,OAAM;AAAA,IAC3B;AACA,QAAI,OAAO;AACT,YAAM,YAAY,MAAM,QAAQ,SAAS;AACzC,UAAI,QAAQ,aAAa,UAAW;AACpC,YAAM,QAAQ,QAAQ,YAAY,YAAY,UAAU,IAAI;AAAA,IAC9D;AACA,UAAM,CAAC,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC;AAC1C,QAAI,OAAO,SAAS,OAAW,OAAM,QAAQ,UAAU,IAAI;AAC3D,QAAI,QAAQ,UAAW,OAAM,KAAK,MAAMC,UAAS,IAAI,GAAG,OAAO;AAC/D,UAAM,SAAS,MAAM,KAAK,OAAOA,UAAS,IAAI,GAAG,IAAI;AACrD,QAAI,OAAO,QAAQ,SAAS,YAAa,OAAM,QAAQ,WAAW,IAAI;AACtE,UAAM,OAAO,OAAO,mBAAmB,OAAO,IAAI,GAAG,EAAE,QAAQ,KAAK,CAAC;AACrE,SAAK,MAAM,OAAO,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,GAAG,MAAc,UAAoD,CAAC,GAAkB;AAC5F,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,KAAK,OAAO,MAAM,KAAK;AAAA,IACvC,SAAS,KAAK;AACZ,YAAM,QAAQ,UAAU,KAAK,IAAI;AACjC,UAAI,QAAQ,SAAS,MAAM,SAAS,SAAU;AAC9C,YAAM;AAAA,IACR;AACA,QAAI,MAAM,QAAQ;AAChB,YAAM,CAAC,KAAKD,KAAI,IAAI,MAAM,KAAK,OAAO,MAAM,IAAI;AAChD,UAAI;AACF,cAAM,KAAK;AAAA,UAAM;AAAA,UAAK,CAAC,WACrB,OAAO,YAAYA,OAAM,EAAE,WAAW,QAAQ,cAAc,KAAK,CAAC;AAAA,QACpE;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,UAAU,KAAK,IAAI;AAAA,MAC3B;AACA,WAAK,QAAQ,MAAM,IAAI;AAAA,IACzB;AACA,UAAM,KAAK,KAAK,OAAO,CAAC,MAAM,IAAI,CAAC;AACnC,SAAK,MAAMC,UAAS,MAAM,IAAI,CAAC;AAAA,EACjC;AAAA,EAEA,MAAM,OAAO,MAAc,IAA2B;AACpD,QAAI,SAAS,GAAI;AACjB,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM,KAAK;AAC5C,SAAK,OAAO,OAAO,IAAI;AACvB,UAAM,SAAS,MAAM,KAAK,OAAOA,UAAS,EAAE,GAAG,IAAI;AACnD,UAAM,cAAc,YAAY,OAAO,MAAM,OAAO,EAAE,CAAC;AACvD,UAAM,aAAa,MAAM,KAAK,SAAS,MAAM;AAC7C,QAAI,WAAW,eAAe,OAAO,aAAa,OAAO,IAAI,EAAG,OAAM,QAAQ,UAAU,EAAE;AAC1F,UAAM,SAAS,MAAM,KAAK,OAAO,aAAa,KAAK,EAAE,MAAM,CAAC,QAAQ;AAClE,UAAI,QAAQ,GAAG,EAAG,QAAO;AACzB,YAAM;AAAA,IACR,CAAC;AACD,UAAM,aAAa,UAAW,MAAM,KAAK,SAAS,MAAM;AACxD,QAAI,YAAY,eAAe,CAAC,WAAW,YAAa,OAAM,QAAQ,UAAU,EAAE;AAClF,QAAI,cAAc,CAAC,WAAW,eAAe,WAAW,aAAa;AACnE,YAAM,QAAQ,WAAW,EAAE;AAAA,IAC7B;AACA,QAAI,YAAY,gBAAgB,MAAM,KAAK,QAAQ,WAAW,GAAG,SAAS,GAAG;AAC3E,YAAM,QAAQ,aAAa,EAAE;AAAA,IAC/B;AACA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,QAAQ,CAAC,WAA6C;AAAA,MAC1D,KAAK,QAAQ,OAAO,IAAI;AAAA,MACxB,GAAG;AAAA,MACH,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AACA,QAAI,OAAO,MAAM;AACf,UAAI,QAAQ,OAAQ,OAAM,KAAK,GAAG,WAAW;AAC7C,YAAM,KAAK,KAAK,KAAK,OAAO,MAAM,aAAa,KAAK;AACpD,WAAK,MAAMA,UAAS,OAAO,IAAI,GAAG,OAAO,IAAI;AAC7C;AAAA,IACF;AACA,UAAM,MAAM,OAAO;AACnB,UAAMD,QAAO,OAAO,WAAW;AAC/B,UAAM,OAAO,YAAY,gBAAgB;AACzC,UAAM,UAAU,OAAO,IAAIA,KAAI,IAAI,OAAO,WAAW,CAAC,KAAKA;AAC3D,SAAK,OAAO,WAAW;AACvB,UAAM,QAAQ,MAAM,KAAK,cAAc,OAAO,IAAI;AAClD,UAAMS,SAAQ,MAAM,KAAK,MAAM,OAAO,QAAkB,KAAK,OAAO;AACpE,QAAI,KAAM,OAAM,KAAK,GAAG,aAAa,EAAE,WAAW,KAAK,CAAC;AACxD,UAAM,KAAK,KAAK,KAAK,OAAO,MAAM,aAAa,KAAK;AACpD,QAAI,CAACA,OAAO,OAAM,KAAK,GAAG,OAAO,MAAM,EAAE,WAAW,KAAK,CAAC;AAC1D,QAAI,SAAS,CAACA;AACd,QAAI,MAAM;AACR,YAAM,SAAS,MAAM,IAAI,mBAAmB,OAAO;AACnD,YAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,KAAKT,KAAI;AACjD,UAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,SAAS,EAAE,WAAW,KAAK,CAAC;AAC/D,iBAAW,CAAC;AAAA,IACd;AACA,QAAI,OAAQ,OAAM,KAAK,QAAQ,aAAa,KAAK;AACjD,SAAK,QAAQ,OAAO,MAAM,WAAW;AACrC,SAAK,MAAMC,UAAS,OAAO,IAAI,GAAG,OAAO,IAAI;AAAA,EAC/C;AAAA,EAEA,MAAc,SAAS,MAA+B;AACpD,UAAM,SAAS,MAAM,KAAK,OAAO,IAAI;AACrC,WAAO,OAAO,SAAS,UAAU,MAAM,OAAO,QAAQ,GAAG,eAAe;AAAA,EAC1E;AAAA,EAEA,MAAc,cAAc,MAAiC;AAC3D,UAAM,QAAkB,CAAC;AACzB,eAAW,SAAS,MAAM,KAAK,KAAK,MAAM,IAAI,GAAG;AAC/C,UAAI,MAAM,aAAa,UAAa,MAAM,SAAS,OAAW;AAC9D,YAAM,UAAU,MAAM,KAAK,SAAS,MAAM,IAAI,EAAE,MAAM,MAAM,MAAS;AACrE,UAAI,YAAY,MAAM,SAAU,OAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QAAQ,MAAc,OAAgC;AAClE,eAAWI,SAAQ,OAAO;AACxB,YAAM,WAAW,MAAM,KAAK,SAAS,OAAOA,KAAI;AAChD,YAAM,KAAK,KAAK,OAAO,OAAOA,OAAM,CAAC,UAAU,SAAS,EAAE,GAAG,OAAO,SAAS,CAAC;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,QAAgB,KAAgCL,OAAc;AAChF,UAAMS,SAAQ,MAAO,OAAkC,OAAO,KAAKT,KAAI,EAAE;AAAA,MACvE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,QAAIS,OAAO,QAAO;AAClB,QAAI;AACF,YAAM,KAAK,KAAK,QAAQ,KAAKT,KAAI;AAAA,IACnC,SAAS,KAAK;AACZ,UAAI,OAAO,SAAS,YAAa,OAAM,IAAI,YAAYA,OAAM,EAAE,WAAW,KAAK,CAAC;AAChF,YAAM,UAAU,KAAKA,KAAI;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,KAAK,QAAgB,KAAgCA,OAA6B;AAC9F,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,WAAW,OAAO,MAAM,IAAI,cAAcA,OAAM,EAAE,QAAQ,KAAK,CAAC,GAAG,eAAe;AACxF,YAAM,SAAS,MAAM,MAAM,OAAO,QAAQ,CAAC;AAC3C,YAAM,SAAS,MAAM;AACrB;AAAA,IACF;AACA,UAAM,SAAS,MAAM,IAAI,mBAAmBA,OAAM,EAAE,QAAQ,KAAK,CAAC;AAClE,qBAAiB,SAAS,OAAO,OAAO,EAAG,OAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,IAAI;AAAA,EACtF;AAAA,EAEA,MAAM,QAAQ,QAAgB,MAA6B;AACzD,UAAM,SAAS,MAAM,KAAK,OAAOC,UAAS,IAAI,GAAG,IAAI;AACrD,QAAI,OAAO,QAAQ,SAAS,YAAa,OAAM,QAAQ,WAAW,IAAI;AACtE,UAAM,KAAK,YAAY,OAAO,MAAM,OAAO,IAAI,CAAC;AAChD,QACE,MAAM,KAAK,OAAO,IAAI,KAAK,EAAE;AAAA,MAC3B,MAAM;AAAA,MACN,CAAC,QAAQ,CAAC,QAAQ,GAAG;AAAA,IACvB,GACA;AACA,YAAM,QAAQ,UAAU,IAAI;AAAA,IAC9B;AACA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,KAAK,KAAK,OAAO,IAAI,OAAO;AAAA,MAChC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK,OAAO;AAAA,MACZ,KAAK,QAAQ,EAAE;AAAA,MACf,SAAS;AAAA,MACT,SAAS;AAAA,IACX,EAAE;AACF,SAAK,MAAM,OAAO,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,SAAS,MAAcC,SAAkC;AAC7D,YAAQ,MAAM,KAAK,OAAO,MAAMA,OAAM,GAAG;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAS,MAA+B;AAC5C,UAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,KAAK;AAC3C,QAAI,MAAM,KAAM,QAAO,MAAM,KAAK;AAClC,UAAM,QAAQ,UAAU,IAAI;AAAA,EAC9B;AAAA,EAEA,MAAM,MAAM,MAAc,MAA6B;AACrD,UAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,IAAI;AAC1C,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,KAAK,KAAK,OAAO,MAAM,MAAM,CAAC,WAAW;AAAA,MAC7C,GAAG;AAAA,MACH,MAAM,MAAM;AAAA,MACZ,MAAM,OAAO;AAAA,MACb;AAAA,IACF,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,OAAO,MAAc,OAAa,OAA4B;AAClE,UAAM,KAAK,SAAS,MAAM,KAAK,OAAO,MAAM,IAAI,GAAG,OAAO,KAAK;AAAA,EACjE;AAAA,EAEA,MAAM,QAAQ,MAAc,OAAa,OAA4B;AACnE,UAAM,KAAK,SAAS,MAAM,KAAK,OAAO,MAAM,KAAK,GAAG,OAAO,KAAK;AAAA,EAClE;AAAA,EAEA,MAAc,SAAS,OAAgB,OAAa,OAA4B;AAC9E,UAAM,EAAE,MAAAE,MAAK,IAAI;AACjB,QAAIA,OAAM;AACR,YAAMM,WAAU,KAAK,IAAI;AACzB,YAAM,KAAK,KAAK,OAAO,MAAM,MAAM,CAAC,WAAW;AAAA,QAC7C,GAAGN;AAAA,QACH,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ;AAAA,QACvB,SAAS,MAAM,QAAQ;AAAA,QACvB,SAAAM;AAAA,MACF,EAAE;AACF;AAAA,IACF;AACA,UAAM,SAAS,MAAM;AACrB,UAAM,OAAO,OAAO,SAAS,SAAS,MAAM,OAAO,QAAQ,IAAI;AAC/D,SAAK,SAAS,OAAO,MAAM,IAAI;AAC/B,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,KAAK,KAAK,OAAO,MAAM,MAAM,CAAC,WAAW;AAAA,MAC7C,GAAG;AAAA,MACH,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,QAAQ;AAAA,MACvB,SAAS,MAAM,QAAQ;AAAA,MACvB,UAAU,MAAM,gBAAgB;AAAA,MAChC;AAAA,IACF,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,YAA6B;AACjC,QAAI,UAAU;AACd,eAAW,SAAS,MAAM,KAAK,KAAK,IAAI,GAAG;AACzC,YAAM,OAAO,MAAM,KAAK,KAAK,MAAM,IAAI;AACvC,YAAM,QACJ,MAAM,SAAS,SAAY,CAAC,OAAO,QAAQ,CAAE,MAAM,KAAK,KAAKT,UAAS,MAAM,IAAI,CAAC;AACnF,UAAI,CAAC,MAAO;AACZ,YAAM,KAAK,KAAK,OAAO,MAAM,MAAM,MAAM,MAAS;AAClD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACtwBO,IAAM,eAAe;AAyBrB,SAAS,SAAS,MAGT;AACd,SAAO;AAAA,IACL,IAAI,IAAI,KAAK,GAAG;AAAA,IAChB,MAAM,IAAI;AACR,UAAI;AACF,aAAK,KAAK,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC;AAChC,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,eAAQ,IAA0B,SAAS;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,WAAoC;AAClD,SAAQ,WAAuD,WAAW;AAC5E;AAEA,IAAMU,UAAS,CAAC,MAAc,WAC5B,SAAS,UAAU,WAAW,OAAO,KAAK,WAAW,GAAG,MAAM,GAAG;AAEnE,IAAMC,YAAW,CAAC,SAAiB,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AAE3E,IAAM,WAAW,CAAC,aAAqB,kBAAkB,QAAQ;AAEjE,IAAM,QAAQ,CAAC,SAAkB,SAAS,MAAM,IAAI,YAAY,KAAK,GAAG,IAAI,IAAI,YAAY;AAErF,IAAM,WAAN,MAAe;AAAA,EACH,QAAQ,oBAAI,IAA2B;AAAA,EAExD,MAAM,QAAQ,MAAmC;AAC/C,UAAM,OAAO,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,QAAQ;AACrD,UAAM,EAAE,SAAS,QAAQ,IAAI,QAAQ,cAAoB;AACzD,UAAM,OAAO,KAAK,KAAK,MAAM,OAAO;AACpC,SAAK,MAAM,IAAI,MAAM,IAAI;AACzB,UAAM;AACN,WAAO,MAAM;AACX,cAAQ;AACR,UAAI,KAAK,MAAM,IAAI,IAAI,MAAM,KAAM,MAAK,MAAM,OAAO,IAAI;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAM,IAAO,MAAc,IAAkC;AAC3D,UAAM,UAAU,MAAM,KAAK,QAAQ,IAAI;AACvC,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACF;AAQO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,oBAAI,IAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACR,OAAO,IAAI,SAAS;AAAA,EACrB,QAA0B,QAAQ,QAAQ;AAAA,EAC1C,QAAQ;AAAA,EAEhB,YACE,IACA,SACA,QACA,UAII,CAAC,GACL;AACA,UAAM,EAAE,OAAO,MAAM,IAAI;AACzB,SAAK,KAAK;AACV,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,OAAO,QAAQ,SAAS,MAAM;AACnC,SAAK,QAAQ;AACb,SAAK,WAAW,QAAQ,GAAG,MAAM,EAAE,IAAI,OAAO,WAAW,CAAC,KAAK,OAAO,WAAW;AACjF,SAAK,OAAO,QAAQ,SAAS,KAAK,QAAQ,GAAG,MAAM,IAAI,QAAQ,MAAM,MAAS,CAAC;AAAA,EACjF;AAAA,EAEQ,OAAU,IAAkC;AAClD,UAAMC,QAAO,KAAK,MAAM,KAAK,EAAE;AAC/B,SAAK,QAAQA,MAAK,MAAM,MAAM,MAAS;AACvC,WAAOA;AAAA,EACT;AAAA,EAEA,KAAK,KAAe,KAAK,IAAc;AACrC,UAAM,SAAS;AACf,UAAM,UAAU,CAAC,UAAoB,MAAM,OAAO,CAACC,UAASA,UAAS,YAAY;AACjF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,GAAG,MAAM,SAAS;AACtB,cAAM,SAAS,GAAG,YAAY,KAAK,IAAI;AACvC,cAAM,SAAS,MAAM,OAAO,IAAI,MAAM;AACtC,YAAI,OAAO,MAAM,IAAI,MAAM,EAAG,QAAO,OAAO;AAAA,YACvC,OAAM,OAAO,OAAO,QAAQ,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;AAAA,MAC7D;AAAA,MACA,MAAM,OAAO,MAAM,IAAI;AACrB,cAAM,SAAS,GAAG,YAAY,KAAK,EAAE;AACrC,YAAI,WAAW,GAAG,YAAY,KAAK,IAAI,EAAG,QAAO,GAAG,OAAO,MAAM,EAAE;AACnE,cAAM,SAAS,MAAM,OAAO,IAAI,MAAM;AACtC,cAAM,OAAO,OAAO,QAAQ,MAAM,GAAG,OAAO,MAAM,EAAE,CAAC;AAAA,MACvD;AAAA,MACA,SAAS,OAAO,SAAS,QAAQ,MAAM,GAAG,QAAQ,IAAI,CAAC;AAAA,MACvD,aAAa,OAAO,UACjB,MAAM,GAAG,YAAY,IAAI,GAAG,OAAO,CAAC,CAACA,KAAI,MAAMA,UAAS,YAAY;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAAgB,IAAwC;AACnE,QAAI;AACF,YAAM,GAAG;AAAA,IACX,SAAS,KAAK;AACZ,YAAM,OAAO,SAAS;AACtB,YAAM;AAAA,IACR;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,IAAI,QAAiC;AACzC,UAAM,OAAO,oBAAI,IAA4B;AAC7C,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,OAAO,KAAK,MAAM,EAAG;AACzB,iBAAW,QAAQ,OAAO,KAAK,GAAG;AAChC,YAAI,CAACH,QAAO,MAAM,MAAM,KAAK,OAAO,OAAO,IAAI,EAAG;AAClD,aAAK,IAAI,MAAM,CAAC,GAAI,KAAK,IAAI,IAAI,KAAK,CAAC,GAAI,MAAM,CAAC;AAAA,MACpD;AAAA,IACF;AACA,UAAM,QAAQ,CAAC,GAAG,KAAK,KAAK,CAAC,EAAE,KAAK;AACpC,UAAM,WAA8B,CAAC;AACrC,eAAW,QAAQ,MAAO,UAAS,KAAK,MAAM,KAAK,KAAK,QAAQ,IAAI,CAAC;AACrE,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,MAAM,KAAK,KAAK,IAAI;AAC/B,UAAI,OAAO,OAAW,QAAO,IAAI,MAAM,EAAE;AAAA,IAC3C;AACA,UAAMI,QAAO,MAAM;AACjB,iBAAW,WAAW,SAAU,SAAQ;AAAA,IAC1C;AACA,UAAM,QAAQ,oBAAI,IAAsB;AACxC,eAAW,CAAC,MAAM,EAAE,KAAK,QAAQ;AAC/B,YAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,YAAM,OAAO,KAAK,SAAS,IAAI,EAAE,MAAM,QAAQ,SAAS,EAAE,CAAC;AAC3D,YAAM,IAAI,MAAM,IAAI;AACpB,iBAAW,UAAU,QAAS,QAAO,KAAK,MAAM,IAAI;AAAA,IACtD;AACA,WAAO;AAAA,MACL,OAAO,IAAI,IAAI,OAAO,KAAK,CAAC;AAAA,MAC5B,QAAQ,MAAM;AACZ,mBAAW,QAAQ,MAAM,OAAO,EAAG,MAAK,QAAQ;AAChD,QAAAA,MAAK;AAAA,MACP;AAAA,MACA,UAAU,YAAY;AACpB,mBAAW,CAAC,MAAM,IAAI,KAAK,OAAO;AAChC,qBAAW,UAAU,KAAK,IAAI,IAAI,EAAqB,QAAO,OAAO,MAAM,IAAI;AAC/E,gBAAM,KAAK,OAAO,YAAY;AAC5B,kBAAM,QAAQ,WAAW,CAAC,KAAK,GAAG,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC;AAC5D,kBAAM,KAAK,KAAKH,UAAS,KAAK,MAAM,CAAC;AAAA,UACvC,CAAC;AAAA,QACH;AACA,QAAAG,MAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAS,QAAgB,OAAmC;AAClE,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AACb,YAAI,EAAE,MAAM,SAAS,EAAG,MAAK,KAAK,OAAO,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,KAAK,MAA2C;AACtD,WAAO,KAAK,OAAO,YAAY;AAC7B,YAAM,MAAM,MAAM,KAAK,OAAO,IAAI,CAAC;AACnC,YAAM,SAAS,GAAG,GAAG,IAAI,KAAK,QAAQ,IAAI,EAAE,KAAK,KAAK;AACtD,UAAI;AACF,cAAM,KAAK,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAC5C,cAAM,KAAK,GAAG,OAAO,MAAM,MAAM;AACjC,eAAO;AAAA,MACT,QAAQ;AACN,cAAM,KAAK,KAAK,GAAG;AACnB,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAoB;AACzB,QAAI,KAAK,QAAQ,OAAO,IAAI,EAAG,MAAK,KAAK,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA,EAEA,MAAc,KAAK,QAA+B;AAChD,QAAI,KAAK,KAAK,MAAM,GAAG;AACrB,WAAK,QAAQ,IAAI,MAAM;AACvB;AAAA,IACF;AACA,UAAM,KAAK,GAAG,GAAG,MAAM,EAAE,MAAM,MAAM,MAAS;AAC9C,UAAM,KAAK,KAAKH,UAAS,MAAM,CAAC;AAAA,EAClC;AAAA,EAEA,MAAc,KAAK,KAA4B;AAC7C,UAAM,OAAO,MAAM,KAAK,GAAG,QAAQ,GAAG,EAAE,MAAM,MAAM,CAAC,YAAY,CAAC;AAClE,QAAI,KAAK,WAAW,EAAG,OAAM,KAAK,GAAG,GAAG,KAAK,EAAE,WAAW,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EACzF;AAAA,EAEA,MAAM,MAA6B;AACjC,UAAM,QAAQ,KAAK,OAAO,OAAO,KAAK,KAAK,KAAK;AAChD,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,SAAS,CAAC,MAAO,QAAO,QAAQ,QAAQ;AAC7C,WAAO,KAAK,OAAO,YAAY;AAC7B,YAAM,MAAM,MAAM,IAAI;AACtB,YAAM,QAAQ,MAAM,KAAK,GAAG,QAAQ,GAAG,EAAE,MAAM,MAAM,MAAS;AAC9D,UAAI,CAAC,MAAO;AACZ,YAAM,OAAO,SAAS,IAAI,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AACnF,iBAAWE,SAAQ,OAAO;AACxB,cAAM,KAAKA,MAAK,MAAM,GAAGA,MAAK,YAAY,GAAG,CAAC;AAC9C,cAAM,KAAK,GAAG,QAAQ,GAAG;AACzB,cAAM,OACJ,OAAO,KAAK,aACX,KAAK,IACF,SAAS,UAAa,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,IAC5C,OAAO,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM;AACxC,YAAI,KAAM,OAAM,KAAK,GAAG,GAAG,GAAG,GAAG,IAAIA,KAAI,IAAI,EAAE,WAAW,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,MACzF;AACA,YAAM,KAAK,KAAK,GAAG;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;AC3QO,IAAM,YAAN,cAAwB,MAAM;AAAA,EAC1B;AAAA,EACT,YAAY,QAAgBE,UAAiB;AAC3C,UAAMA,QAAO;AACb,SAAK,SAAS;AAAA,EAChB;AACF;AACA,IAAM,KAAK;AACX,IAAM,KAAK;AACX,IAAM,YAAY,KAAK;AACvB,IAAM,QAAQ;AACP,IAAM,SAA2C;AAAA,EACtD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AACO,IAAM,WAAN,MAAe;AAAA,EACH;AAAA,EACT,MAAM,IAAI,WAAW,CAAC;AAAA,EACtB,MAAM;AAAA,EACd,YAAY,QAAoB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,IAAI,WAAmB;AACrB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EACA,MAAc,KAAK,QAAwC;AACzD,QAAI,KAAK,IAAK,QAAO;AACrB,UAAMC,SAAQ,MAAM,KAAK,OAAO,KAAK,WAAW,MAAM;AACtD,QAAIA,OAAM,WAAW,GAAG;AACtB,WAAK,MAAM;AACX,aAAO;AAAA,IACT;AACA,UAAMC,QAAO,IAAI,WAAW,KAAK,IAAI,SAASD,OAAM,MAAM;AAC1D,IAAAC,MAAK,IAAI,KAAK,GAAG;AACjB,IAAAA,MAAK,IAAID,QAAO,KAAK,IAAI,MAAM;AAC/B,SAAK,MAAMC;AACX,WAAO;AAAA,EACT;AAAA,EACQ,KAAK,GAAuB;AAClC,UAAM,MAAM,KAAK,IAAI,MAAM,GAAG,CAAC;AAC/B,SAAK,MAAM,KAAK,IAAI,SAAS,CAAC;AAC9B,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAmD;AAC5D,QAAI,KAAK,IAAI,WAAW,EAAG,OAAM,KAAK,KAAK,MAAM;AACjD,WAAO,KAAK,IAAI,CAAC;AAAA,EACnB;AAAA,EACA,MAAM,KAAK,KAAa,QAA2C;AACjE,QAAI,KAAK,IAAI,SAAS,EAAG,QAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC;AACxE,QAAI,KAAK,IAAK,QAAO,IAAI,WAAW,CAAC;AACrC,UAAMD,SAAQ,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM;AAChD,QAAIA,OAAM,WAAW,EAAG,MAAK,MAAM;AACnC,WAAOA;AAAA,EACT;AAAA,EACA,MAAM,KAAK,OAAe,QAAkD;AAC1E,QAAI,OAAO;AACX,eAAS;AACP,YAAM,MAAM,QAAQ,KAAK,KAAK,IAAI;AAClC,UAAI,MAAM,GAAG;AACX,YAAI,MAAM,MAAO,OAAM,IAAI,UAAU,KAAK,wBAAwB;AAClE,eAAO,KAAK,KAAK,GAAG;AAAA,MACtB;AACA,UAAI,KAAK,IAAI,SAAS,MAAO,OAAM,IAAI,UAAU,KAAK,wBAAwB;AAC9E,aAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,CAAC;AACtC,UAAI,CAAE,MAAM,KAAK,KAAK,MAAM,GAAI;AAC9B,YAAI,KAAK,IAAI,WAAW,EAAG,QAAO;AAClC,cAAM,IAAI,UAAU,KAAK,yCAAyC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,KAAK,OAAe,QAAuC;AAC/D,QAAI,OAAO;AACX,eAAS;AACP,YAAM,KAAK,KAAK,IAAI,QAAQ,IAAI,IAAI;AACpC,UAAI,MAAM,GAAG;AACX,cAAM,OAAO,KAAK,KAAK,KAAK,CAAC;AAC7B,cAAM,OAAO,OAAO,KAAK,SAAS,GAAG,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,EAAE,CAAC;AACvE,eAAO;AAAA,MACT;AACA,UAAI,KAAK,IAAI,SAAS,MAAO,OAAM,IAAI,UAAU,KAAK,eAAe;AACrE,aAAO,KAAK,IAAI;AAChB,UAAI,CAAE,MAAM,KAAK,KAAK,MAAM,EAAI,OAAM,IAAI,UAAU,KAAK,iCAAiC;AAAA,IAC5F;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,GAAW,QAA2C;AAClE,WAAO,KAAK,IAAI,SAAS,GAAG;AAC1B,UAAI,CAAE,MAAM,KAAK,KAAK,MAAM,EAAI,OAAM,IAAI,UAAU,KAAK,iCAAiC;AAAA,IAC5F;AACA,WAAO,KAAK,KAAK,CAAC;AAAA,EACpB;AACF;AACA,SAAS,QAAQ,KAAiB,MAAsB;AACtD,WAAS,IAAI,MAAM,IAAI,IAAI,QAAQ,KAAK;AACtC,QAAI,IAAI,CAAC,MAAM,GAAI;AACnB,QAAI,IAAI,IAAI,CAAC,MAAM,GAAI,QAAO,IAAI;AAClC,QAAI,IAAI,IAAI,CAAC,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,GAAI,QAAO,IAAI;AAAA,EACzD;AACA,SAAO;AACT;AACO,SAAS,OAAO,OAA2B;AAChD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,OAAQ;AAC7C,WAAO,OAAO,aAAa,GAAG,MAAM,SAAS,GAAG,IAAI,KAAM,CAAC;AAAA,EAC7D;AACA,SAAO;AACT;AACO,SAAS,YAAY,MAA0B;AACpD,QAAM,MAAM,IAAI,WAAW,KAAK,MAAM;AACtC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAI,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;AACpE,SAAO;AACT;AAOO,SAAS,iBAAiB,OAAgC;AAC/D,QAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,OAAO;AACzC,SAAO,MAAM,SAAS,KAAK,MAAM,CAAC,MAAM,GAAI,OAAM,MAAM;AACxD,QAAM,QAAQ,0DAA0D,KAAK,MAAM,MAAM,KAAK,EAAE;AAChG,MAAI,CAAC,MAAO,OAAM,IAAI,UAAU,KAAK,wBAAwB;AAC7D,MAAI,MAAM,CAAC,MAAM,IAAK,OAAM,IAAI,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,mBAAmB;AAC9F,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,QAAQ,MAAM,CAAC;AAAA,IACf,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,IACtB,SAAS,YAAY,KAAK;AAAA,EAC5B;AACF;AACA,SAAS,YAAY,OAA6B;AAChD,QAAM,UAA4C,CAAC;AACnD,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,GAAI;AACjB,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAI,GAAG;AACjD,YAAM,IAAI,UAAU,KAAK,uBAAuB;AAAA,IAClD;AACA,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAME,QAAO,QAAQ,IAAI,KAAK,MAAM,GAAG,KAAK,IAAI;AAChD,QAAI,CAAC,MAAM,KAAKA,KAAI,EAAG,OAAM,IAAI,UAAU,KAAK,wBAAwB;AACxE,YAAQ,KAAK,CAACA,OAAM,KAAK,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAAA,EACnD;AACA,SAAO;AACT;AACO,SAAS,YAAY,SAAqBA,OAAwB;AACvE,QAAM,QAAQA,MAAK,YAAY;AAC/B,SAAO,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAC5E;AACO,SAAS,YAAY,SAAqBA,OAAwB;AACvE,SAAO,YAAY,SAASA,KAAI,EAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAC3B,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,EACjC,OAAO,CAAC,MAAM,MAAM,EAAE;AAC3B;AAYO,SAAS,eAAe,SAAkC;AAC/D,QAAM,UAAU,YAAY,SAAS,mBAAmB;AACxD,QAAM,UAAU,YAAY,SAAS,gBAAgB;AACrD,MAAI,QAAQ,SAAS,GAAG;AACtB,QAAI,QAAQ,SAAS,EAAG,OAAM,IAAI,UAAU,KAAK,2CAA2C;AAC5F,QAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,MAAM,WAAW;AACpD,YAAM,IAAI,UAAU,KAAK,kCAAkC,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IACjF;AACA,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,MAAM,OAAO;AAChD,QAAM,WAAW,IAAI,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAClF,QAAM,CAAC,IAAI,IAAI;AACf,MAAI,SAAS,SAAS,KAAK,CAAC,aAAa,KAAK,IAAI,GAAG;AACnD,UAAM,IAAI,UAAU,KAAK,wBAAwB;AAAA,EACnD;AACA,QAAMC,UAAS,OAAO,IAAI;AAC1B,SAAOA,YAAW,IAAI,EAAE,MAAM,OAAO,IAAI,EAAE,MAAM,UAAU,QAAAA,QAAO;AACpE;AACA,IAAM,iBAAiB;AACvB,IAAM,eAAe,KAAK;AAC1B,eAAsB,SACpB,UACA,SACA,KACA,QACiC;AACjC,MAAI,QAAQ,SAAS,OAAQ,QAAO;AACpC,MAAI,QAAQ,SAAS,UAAU;AAC7B,QAAI,QAAQ,SAAS,IAAK,OAAM,IAAI,UAAU,KAAK,qBAAqB,GAAG,QAAQ;AACnF,WAAO,SAAS,QAAQ,QAAQ,QAAQ,MAAM;AAAA,EAChD;AACA,QAAMC,UAAuB,CAAC;AAC9B,MAAI,QAAQ;AACZ,aAAS;AACP,UAAM,WAAW,MAAM,SAAS,KAAK,gBAAgB,MAAM;AAC3D,UAAM,OAAO,oCAAoC,KAAK,QAAQ;AAC9D,QAAI,CAAC,KAAM,OAAM,IAAI,UAAU,KAAK,sBAAsB;AAC1D,UAAM,IAAI,OAAO,SAAS,KAAK,CAAC,GAAG,EAAE;AACrC,QAAI,MAAM,EAAG;AACb,aAAS;AACT,QAAI,QAAQ,IAAK,OAAM,IAAI,UAAU,KAAK,qBAAqB,GAAG,QAAQ;AAC1E,IAAAA,QAAO,KAAK,MAAM,SAAS,QAAQ,GAAG,MAAM,CAAC;AAC7C,QAAK,MAAM,SAAS,KAAK,GAAG,MAAM,MAAO,GAAI,OAAM,IAAI,UAAU,KAAK,iBAAiB;AAAA,EACzF;AACA,MAAI,WAAW;AACf,WAAS,OAAO,MAAM,SAAS,KAAK,cAAc,MAAM,GAAG,SAAS,MAAM;AACxE,gBAAY,KAAK;AACjB,QAAI,WAAW,aAAc,OAAM,IAAI,UAAU,KAAK,oBAAoB;AAC1E,WAAO,MAAM,SAAS,KAAK,cAAc,MAAM;AAAA,EACjD;AACA,SAAO,OAAOA,SAAQ,KAAK;AAC7B;AACO,SAAS,OAAOA,SAAsB,QAAQA,QAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,GAAG;AAC7F,QAAM,MAAM,IAAI,WAAW,KAAK;AAChC,MAAI,KAAK;AACT,aAAWJ,UAASI,SAAQ;AAC1B,QAAI,IAAIJ,QAAO,EAAE;AACjB,UAAMA,OAAM;AAAA,EACd;AACA,SAAO;AACT;AACA,SAAS,UAAU,OAAwB;AACzC,SAAO,CAAC,WAAW,KAAK,KAAK;AAC/B;AACO,SAAS,aAAa,QAAgB,QAAgB,SAAiC;AAC5F,QAAM,SAAS,4BAA4B,KAAK,MAAM,IAAI,SAAS;AACnE,MAAI,OAAO,YAAY,MAAM,IAAI,MAAM;AAAA;AACvC,aAAW,CAACE,OAAM,KAAK,KAAK,SAAS;AACnC,QAAI,MAAM,KAAKA,KAAI,KAAK,UAAU,KAAK,EAAG,SAAQ,GAAGA,KAAI,KAAK,KAAK;AAAA;AAAA,EACrE;AACA,SAAO,YAAY,GAAG,IAAI;AAAA,CAAM;AAClC;AACO,SAAS,MAAM,OAA+B;AACnD,QAAM,OAAO,YAAY,GAAG,MAAM,OAAO,SAAS,EAAE,CAAC;AAAA,CAAM;AAC3D,QAAM,MAAM,IAAI,WAAW,KAAK,SAAS,MAAM,SAAS,CAAC;AACzD,MAAI,IAAI,IAAI;AACZ,MAAI,IAAI,OAAO,KAAK,MAAM;AAC1B,MAAI,IAAI,SAAS,CAAC,IAAI;AACtB,MAAI,IAAI,SAAS,CAAC,IAAI;AACtB,SAAO;AACT;AACO,IAAM,aAAa,YAAY,WAAW;;;AC7P1C,IAAM,WAAW;AAEjB,IAAM,cACX;;;ACbF,IAAM,OAAO;AAEN,IAAM,cAAc,MAAM,OAAO;AAEjC,IAAM,QAAQ;AAAA,EACnB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AACT;AAEO,IAAM,UAAU;AAChB,IAAM,YAAY;AAEzB,IAAM,KAAK;AAAA,EACT,cAAc;AAAA,EACd,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAaO,IAAM,UAAN,cAAsB,MAAM;AAAA,EACxB;AAAA,EACT,YAAY,MAAcG,UAAiB;AACzC,UAAMA,QAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,aAAa,MAAuB;AAClD,MAAI,QAAQ,OAAQ,QAAQ,KAAM,QAAO;AACzC,SAAO,QAAQ,OAAQ,QAAQ,QAAQ,SAAS,QAAQ,SAAS,QAAQ,SAAS;AACpF;AAEA,SAAS,MAAM,SAAqBC,OAAkC;AACpE,SAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,MAAMA,KAAI,IAAI,CAAC;AAC5D;AAEA,eAAsB,UAAU,SAAsC;AACpE,QAAM,SAAS,CAACA,WACb,MAAM,SAASA,KAAI,KAAK,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AAC3E,MAAI,CAAC,OAAO,SAAS,EAAE,SAAS,WAAW,KAAK,CAAC,OAAO,YAAY,EAAE,SAAS,SAAS,GAAG;AACzF,UAAM,IAAI,UAAU,KAAK,8BAA8B;AAAA,EACzD;AACA,MAAI,MAAM,SAAS,uBAAuB,MAAM,MAAM;AACpD,UAAM,IAAI,UAAU,KAAK,kCAAkC;AAAA,EAC7D;AACA,QAAM,MAAM,MAAM,SAAS,mBAAmB,KAAK;AACnD,MAAI,CAAC,wBAAwB,KAAK,GAAG,EAAG,OAAM,IAAI,UAAU,KAAK,uBAAuB;AACxF,QAAM,SAAS,MAAM,OAAO,OAAO,OAAO,SAAS,IAAI,YAAY,EAAE,OAAO,MAAM,IAAI,CAAC;AACvF,SAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW,MAAM,CAAC,CAAC;AAC5D;AAEO,SAAS,UAAU,SAA8B;AACtD,UAAQ,MAAM,SAAS,SAAS,KAAK,IAAI,YAAY,EAAE,SAAS,WAAW;AAC7E;AAEO,SAAS,MAAM,QAAgB,SAAiC;AACrE,QAAM,IAAI,QAAQ;AAClB,QAAM,OAAO,IAAI,MAAM,IAAI,IAAI,QAAU,IAAI;AAC7C,QAAM,MAAM,IAAI,WAAW,OAAO,CAAC;AACnC,QAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AACpC,MAAI,CAAC,IAAI,MAAO;AAChB,MAAI,IAAI,IAAK,KAAI,CAAC,IAAI;AAAA,WACb,IAAI,OAAS;AACpB,QAAI,CAAC,IAAI;AACT,SAAK,UAAU,GAAG,CAAC;AAAA,EACrB,OAAO;AACL,QAAI,CAAC,IAAI;AACT,SAAK,aAAa,GAAG,OAAO,CAAC,CAAC;AAAA,EAChC;AACA,MAAI,IAAI,SAAS,IAAI;AACrB,SAAO;AACT;AAEO,SAAS,WAAW,MAAc,SAAS,IAAgB;AAChE,MAAI,QAAQ,IAAI,YAAY,EAAE,OAAO,MAAM;AAC3C,MAAI,MAAM,SAAS,KAAK;AACtB,QAAI,MAAM;AACV,YAAQ,MAAM,GAAG,IAAI,SAAU,IAAM;AACrC,YAAQ,MAAM,SAAS,GAAG,GAAG;AAAA,EAC/B;AACA,QAAM,UAAU,IAAI,WAAW,IAAI,MAAM,MAAM;AAC/C,MAAI,SAAS,QAAQ,MAAM,EAAE,UAAU,GAAG,IAAI;AAC9C,UAAQ,IAAI,OAAO,CAAC;AACpB,SAAO,MAAM,GAAG,OAAO,OAAO;AAChC;AAEO,SAAS,UAAU,SAAiC;AACzD,SAAO,MAAM,GAAG,MAAM,OAAO;AAC/B;AAEA,eAAe,KAAK,UAAoB,KAAiB,QAAqC;AAC5F,WAAS,KAAK,GAAG,KAAK,IAAI,UAAU;AAClC,UAAM,QAAQ,MAAM,SAAS,KAAK,IAAI,SAAS,IAAI,MAAM;AACzD,QAAI,MAAM,WAAW,EAAG,OAAM,IAAI,QAAQ,MAAM,UAAU,iCAAiC;AAC3F,QAAI,IAAI,OAAO,EAAE;AACjB,UAAM,MAAM;AAAA,EACd;AACF;AAEA,IAAM,QAAQ,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC;AAEtD,SAAS,OAAO,OAA2B;AACzC,MAAI;AACF,WAAO,MAAM,OAAO,KAAK;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,QAAQ,MAAM,SAAS,6BAA6B;AAAA,EAChE;AACF;AAEO,IAAM,WAAN,MAA+C;AAAA,EACnC;AAAA,EACA;AAAA,EACT,QAAsB,CAAC;AAAA,EACvB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,gBAAgB;AAAA,EACP;AAAA,EAEjB,YAAY,UAAoB,MAAM,aAAa,QAAiB;AAClE,SAAK,WAAW;AAChB,SAAK,MAAM;AACX,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KACJ,QACyE;AACzE,eAAS;AACP,YAAM,QAAQ,MAAM,KAAK,SAAS,KAAK,GAAG,MAAM;AAChD,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,YAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,WAAK,CAAC,IAAI,MAAM,CAAC;AACjB,YAAM,KAAK,KAAK,UAAU,KAAK,SAAS,CAAC,GAAG,MAAM;AAClD,YAAM,OAAO,KAAK,CAAC,IAAI,SAAU;AACjC,YAAM,SAAS,KAAK,CAAC,IAAI;AACzB,WAAK,KAAK,CAAC,IAAI,SAAU,EAAG,OAAM,IAAI,QAAQ,MAAM,UAAU,uBAAuB;AACrF,WAAK,KAAK,CAAC,IAAI,SAAU,EAAG,OAAM,IAAI,QAAQ,MAAM,UAAU,8BAA8B;AAC5F,YAAMC,UAAS,MAAM,KAAK,OAAO,KAAK,CAAC,IAAI,KAAM,MAAM;AACvD,YAAM,UAAU,UAAU;AAC1B,UAAI,YAAYA,UAAS,OAAO,CAAC,MAAM;AACrC,cAAM,IAAI,QAAQ,MAAM,UAAU,2CAA2C;AAAA,MAC/E;AACA,UAAI,CAAC,WAAW,KAAK,OAAOA,UAAS,KAAK,KAAK;AAC7C,cAAM,IAAI,QAAQ,MAAM,QAAQ,qBAAqB,KAAK,GAAG,QAAQ;AAAA,MACvE;AACA,YAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,YAAM,KAAK,KAAK,UAAU,MAAM,MAAM;AACtC,YAAM,UAAU,IAAI,WAAWA,OAAM;AACrC,YAAM,KAAK,KAAK,UAAU,SAAS,MAAM;AACzC,eAAS,IAAI,GAAG,IAAIA,SAAQ,IAAK,SAAQ,CAAC,KAAK,KAAK,IAAI,CAAC;AACzD,YAAM,QAAQ,KAAK,KAAK,QAAQ,KAAK,OAAO;AAC5C,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,KACN,QACA,KACA,SACqC;AACrC,QAAK,WAAW,GAAG,iBAAkB,KAAK,YAAY;AACpD,YAAM,IAAI,QAAQ,MAAM,UAAU,+BAA+B;AAAA,IACnE;AACA,QAAI,WAAW,GAAG,aAAc,MAAK,gBAAgB,WAAW,GAAG;AACnE,SAAK,MAAM,KAAK,OAAO;AACvB,SAAK,QAAQ,QAAQ;AACrB,SAAK,aAAa,CAAC;AACnB,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,QAAQ,KAAK,MAAM,WAAW,IAAI,UAAU,OAAO,KAAK,OAAO,KAAK,IAAI;AAC9E,SAAK,QAAQ,CAAC;AACd,SAAK,OAAO;AACZ,WAAO,KAAK,gBACR,EAAE,MAAM,UAAU,OAAO,MAAM,IAC/B,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE;AAAA,EAC1C;AAAA,EAEA,MAAc,OAAO,OAAe,QAAuC;AACzE,QAAI,QAAQ,IAAK,QAAO;AACxB,UAAM,MAAM,IAAI,WAAW,UAAU,MAAM,IAAI,CAAC;AAChD,UAAM,KAAK,KAAK,UAAU,KAAK,MAAM;AACrC,UAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AACpC,QAAI,UAAU,IAAK,QAAO,KAAK,UAAU,CAAC;AAC1C,UAAM,OAAO,KAAK,aAAa,CAAC;AAChC,WAAO,OAAO,OAAO,KAAK,GAAG,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI;AAAA,EAC7D;AAAA,EAEQ,KACN,QACA,KACA,SACqC;AACrC,YAAQ,QAAQ;AAAA,MACd,KAAK,GAAG;AACN,eAAO,EAAE,MAAM,QAAQ,QAAQ;AAAA,MACjC,KAAK,GAAG;AACN,eAAO;AAAA,MACT,KAAK,GAAG,OAAO;AACb,YAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,QAAQ,MAAM,UAAU,4BAA4B;AACxF,cAAM,OAAO,QAAQ,UAAU,IAAI,IAAI,SAAS,QAAQ,MAAM,EAAE,UAAU,CAAC,IAAI;AAC/E,YAAI,QAAQ,UAAU,KAAK,CAAC,aAAa,IAAI,GAAG;AAC9C,gBAAM,IAAI,QAAQ,MAAM,UAAU,cAAc,IAAI,kBAAkB;AAAA,QACxE;AACA,eAAO,EAAE,MAAM,SAAS,MAAM,QAAQ,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE;AAAA,MACpE;AAAA,MACA,KAAK,GAAG;AACN,YAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,QAAQ,MAAM,aAAa,uBAAuB;AAC9E,eAAO,KAAK,KAAK,QAAQ,KAAK,OAAO;AAAA,MACvC,KAAK,GAAG;AAAA,MACR,KAAK,GAAG;AACN,eAAO,KAAK,KAAK,QAAQ,KAAK,OAAO;AAAA,MACvC;AACE,cAAM,IAAI,QAAQ,MAAM,UAAU,kBAAkB,MAAM,EAAE;AAAA,IAChE;AAAA,EACF;AACF;AAEO,SAAS,cAAcC,SAAgB,WAAW,IAAgB;AACvE,QAAM,SAAS,WAAW,2BAA2B,QAAQ;AAAA,IAAS;AACtE,SAAO;AAAA,IACL;AAAA;AAAA;AAAA,wBAA0GA,OAAM;AAAA,EAAO,MAAM;AAAA;AAAA,EAC/H;AACF;;;ACxNA,IAAM,WAAW,KAAK;AACtB,IAAM,eAAe;AAErB,IAAMC,iBAAgB;AAmBtB,SAAS,QAAQ,QAAgB,MAAc,OAAO,6BAAyC;AAC7F,QAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,IAAI;AAC3C,QAAM,OAAO;AAAA,IACX,YAAY,MAAM,IAAI,OAAO,MAAM,CAAC;AAAA,gBAAqB,IAAI;AAAA,kBAAuB,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA,EAClG;AACA,QAAM,MAAM,IAAI,WAAW,KAAK,SAAS,MAAM,MAAM;AACrD,MAAI,IAAI,IAAI;AACZ,MAAI,IAAI,OAAO,KAAK,MAAM;AAC1B,SAAO;AACT;AAEA,SAAS,KAAK,OAA4B;AACxC,SAAO,QAAQ,KAAK,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,iCAAiC;AAC9F;AAEO,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACA,OAAO,IAAI,gBAAgB;AAAA,EAC3B,cAAc,oBAAI,IAAkB;AAAA,EAC5C;AAAA,EAET,YAAY,SAA2B;AACrC,SAAK,UAAU;AACf,SAAK,WAAW,QAAQ,IAAI,OAAO;AAAA,MACjC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,QAAQ,QAAQ;AAAA,IACxB,CAAC;AACD,SAAK,SAAS,KAAK,WAAW;AAAA,EAChC;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,KAAK,OAAO,QAAS;AAC9B,SAAK,KAAK,MAAM;AAChB,SAAK,SAAS,MAAM;AACpB,eAAW,QAAQ,KAAK,YAAa,MAAK,MAAM;AAAA,EAClD;AAAA,EAEA,MAAc,aAA4B;AACxC,UAAM,SAAS,oBAAI,IAAmB;AACtC,eAAS;AACP,UAAI;AACJ,UAAI;AACF,eAAO,MAAM,KAAK,SAAS,OAAO,KAAK,KAAK,MAAM;AAAA,MACpD,QAAQ;AACN;AAAA,MACF;AACA,YAAMC,QAAO,KAAK,MAAM,IAAI,EAAE,QAAQ,MAAM,OAAO,OAAOA,KAAI,CAAC;AAC/D,aAAO,IAAIA,KAAI;AAAA,IACjB;AACA,UAAM,QAAQ,WAAW,CAAC,GAAG,MAAM,CAAC;AAAA,EACtC;AAAA,EAEA,MAAc,MAAM,MAAmC;AACrD,SAAK,YAAY,IAAI,IAAI;AACzB,UAAM,WAAW,IAAI,SAAS,IAAI;AAClC,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,KAAK,UAAU,KAAK,KAAK,MAAM;AAC3D,UAAI,KAAM,OAAM,KAAK,MAAM,MAAM,UAAU,iBAAiB,IAAI,CAAC;AAAA,IACnE,SAAS,GAAG;AACV,UAAI,aAAa,UAAW,OAAM,KAAK,MAAM,MAAM,QAAQ,EAAE,QAAQ,GAAG,EAAE,OAAO;AAAA,CAAI,CAAC;AAAA,IACxF,UAAE;AACA,WAAK,YAAY,OAAO,IAAI;AAC5B,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,MAAoB,OAAkC;AACxE,QAAI;AACF,YAAM,KAAK,MAAM,OAAO,KAAK,KAAK,MAAM;AAAA,IAC1C,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,MAAc,MAAM,MAAoB,UAAoB,KAAiC;AAC3F,UAAM,MAAM,IAAI,IAAI,IAAI,QAAQ,kBAAkB;AAClD,UAAM,UAAU,IAAI,aAAa,IAAI,SAAS,KAAK;AACnD,UAAM,OAAO,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,MAAM,MAAM,IAAI,CAAC,KAAK;AAC3E,QAAI,IAAI,WAAW,MAAO,OAAM,IAAI,UAAU,KAAK,GAAG,IAAI,MAAM,wBAAwB;AACxF,UAAM,EAAE,MAAM,IAAI,KAAK;AACvB,QAAI,IAAI,aAAa,MAAM,QAAQ,UAAU,IAAI,OAAO,GAAG;AACzD,aAAO,KAAK,QAAQ,MAAM,UAAU,KAAK,OAAO;AAAA,IAClD;AACA,UAAM,OAAO,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAC5C,QAAI,SAAS,mBAAmB,SAAS,gBAAgB,SAAS,SAAS;AACzE,YAAM,IAAI,UAAU,KAAK,8BAA8B;AAAA,IACzD;AACA,QAAI,CAAC,KAAK,QAAQ,MAAM,UAAU,OAAO,GAAG;AAC1C,YAAM,IAAI,UAAU,KAAK,WAAW;AAAA,IACtC;AACA,QAAI,SAAS,iBAAiB;AAC5B,YAAM,KAAK;AAAA,QACT;AAAA,QACA,KAAK;AAAA,UACH,SAAS;AAAA,UACT,oBAAoB;AAAA,UACpB,sBAAsB,QAAQ,IAAI,GAAG,MAAM,IAAI,GAAG,IAAI,MAAM;AAAA,QAC9D,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,UAAM,KAAK,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,OAAO,CAAC,CAAC;AAAA,EACvD;AAAA,EAEA,MAAc,KAAK,SAAiD;AAClE,UAAM,OAAO,MAAM,KAAK,KAAK,OAAO;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,IAAI;AAAA,QACtB,CAAC,SAAS,WAAW;AACnB,gBAAM,QAAQ;AAAA,YACZ,MAAM,OAAO,IAAI,UAAU,KAAK,+CAA+C,CAAC;AAAA,YAChF,KAAK,QAAQ,eAAe;AAAA,UAC9B;AACA,eAAK,UAAU,CAAC,WAAW;AACzB,yBAAa,KAAK;AAClB,mBAAO,IAAI,UAAU,KAAK,wBAAwB,UAAU,WAAW,EAAE,CAAC;AAAA,UAC5E;AACA,eAAK,YAAY,CAACC,aAAY;AAC5B,kBAAM,SAAS,KAAK,MAAMA,QAAO;AACjC,gBAAI,OAAO,OAAO,EAAG;AACrB,yBAAa,KAAK;AAClB,oBAAQ,MAAe;AAAA,UACzB;AACA,eAAK,KAAK,KAAK,UAAU,EAAE,IAAI,GAAG,QAAQ,oBAAoB,CAAC,CAAC;AAAA,QAClE;AAAA,MACF;AACA,UAAI,CAAC,MAAM,QAAQ;AACjB,cAAM,IAAI,UAAU,KAAK,6BAA6B,KAAK,UAAU,MAAM,KAAK,CAAC,EAAE;AAAA,MACrF;AACA,cAAQ,MAAM,OAAO,eAAe,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,QAClD,aAAa;AAAA,QACb,IAAI,EAAE;AAAA,QACN,OAAO,EAAE;AAAA,QACT,MAAM,EAAE;AAAA,QACR,KAAK,EAAE;AAAA,MACT,EAAE;AAAA,IACJ,UAAE;AACA,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEQ,KAAK,SAAqD;AAChE,WAAO,KAAK,QAAQ,MAAM,QAAQ,UAAU,EAAE,QAAQ,IAAI,CAAC,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAc,QACZ,MACA,UACA,KACA,SACe;AACf,UAAMC,UAAS,MAAM,UAAU,IAAI,OAAO;AAC1C,UAAM,OAAO,MAAM,KAAK,KAAK,OAAO;AACpC,UAAM,SAAS;AAAA,MACb,KAAK,KAAK,QAAQ,cAAc;AAAA,MAChC,aAAa,KAAK,QAAQ,eAAeH;AAAA,IAC3C;AACA,UAAM,IAAI,MAAM,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,MAAM,EAC3D,MAAM,cAAcG,OAAM,CAAC,EAC3B,QAAQ,MAAM,KAAK,MAAM,CAAC;AAAA,EAC/B;AACF;AAEA,IAAM,QAAN,MAAY;AAAA,EACF,SAA2B,QAAQ,QAAQ;AAAA,EAC3C,QAAQ;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YACE,MACA,UACA,MACA,QACA,MACA;AACA,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,OAAO;AACZ,SAAK,MAAM,OAAO;AAClB,SAAK,cAAc,OAAO;AAC1B,SAAK,OAAO;AAAA,EACd;AAAA,EAEQ,KAAK,OAAqC;AAChD,SAAK,SAAS,KAAK,OAAO,KAAK,MAAM,KAAK,KAAK,MAAM,OAAO,KAAK,IAAI,CAAC,EAAE,MAAM,MAAM,MAAS;AAC7F,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,IAAI,MAAc,QAAkC;AAC1D,QAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,SAAK,QAAQ;AACb,WAAO,KAAK,KAAK,WAAW,MAAM,MAAM,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAM,MAAiC;AAC3C,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,WAAW,IAAI,QAAc,CAAC,YAAY;AAC9C,WAAK,KAAK,UAAU,CAAC,WAAW;AAC9B,aAAK,KAAK,IAAI,SAAS,MAAM,QAAQ,MAAM,QAAQ,UAAU,EAAE,EAAE,KAAK,MAAM,QAAQ,CAAC;AAAA,MACvF;AAAA,IACF,CAAC;AACD,SAAK,KAAK,YAAY,CAACD,aAAY;AACjC,UAAI,KAAK,MAAO;AAChB,YAAM,QAAQ,IAAI,YAAY,EAAE,OAAOA,QAAO;AAC9C,UAAI,MAAM,SAAS,KAAK;AACtB,aAAK,KAAK,IAAI,MAAM,QAAQ,qBAAqB,KAAK,GAAG,QAAQ;AAAA,UAC9D,MAAK,KAAK,KAAK,MAAM,SAAS,KAAK,CAAC;AAAA,IAC3C;AACA,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,QAAQ,KAAK,CAAC,SAAS,QAAQ,CAAC;AACtC,UAAM,KAAK;AACX,QAAI;AACJ,UAAM,SAAS,IAAI,QAAc,CAAC,YAAY;AAC5C,cAAQ,WAAW,SAAS,KAAK,WAAW;AAAA,IAC9C,CAAC;AACD,UAAM,QAAQ,KAAK,CAAC,SAAS,MAAM,CAAC;AACpC,iBAAa,KAAK;AAAA,EACpB;AAAA,EAEA,MAAc,OAAsB;AAClC,UAAM,SAAS,IAAI,SAAS,KAAK,UAAU,KAAK,GAAG;AACnD,QAAI;AACF,iBAAS;AACP,cAAM,QAAQ,MAAM,OAAO,KAAK,KAAK,IAAI;AACzC,YAAI,CAAC,MAAO;AACZ,YAAI,MAAM,SAAS,OAAQ,MAAK,KAAK,KAAK,MAAM,IAAI;AAAA,iBAC3C,MAAM,SAAS,OAAQ,MAAK,KAAK,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,aAClE;AACH,gBAAM,KAAK,IAAI,MAAM,SAAS,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE;AAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AACV,UAAI,aAAa,QAAS,OAAM,KAAK,IAAI,EAAE,MAAM,EAAE,OAAO;AAAA,IAC5D;AAAA,EACF;AACF;AAEO,SAAS,UAAU,KAAkB,OAA8C;AACxF,MAAI;AACJ,MAAI,WAAW,UAAU,IAAI;AAC7B,MAAI,SAAS,EAAE,QAAQ,QAAQ,MAAM,aAAa,MAAM,SAAS,GAAG,MAAM;AACxE,UAAM,UAAU,IAAI,UAAU,EAAE,KAAK,MAAM,CAAC;AAC5C,aAAS;AACT,SAAK,QAAQ,OAAO,KAAK,MAAM;AAC7B,UAAI,WAAW,QAAS,UAAS;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AACD,SAAO,MAAM;AACf;;;AC/RO,IAAM,WAAN,MAAe;AAAA,EACH;AAAA,EACA,UAA0B,CAAC;AAAA,EACpC,SAAS;AAAA,EACR,OAAO,qBAAqB,OAAO,WAAW,CAAC;AAAA,EAC/C,MAAM,kBAAkB,QAAQ,GAAG,KAAK,IAAI;AAAA,EAErD,YAAY,MAAgB;AAC1B,SAAK,WAAW,OAAO,EAAE,MAAM,SAAS,QAAW,MAAM,oBAAI,IAAI,EAAE,IAAI;AAAA,EACzE;AAAA,EAEA,SAAS,MAAe,SAA8B;AACpD,UAAM,QAAsB,EAAE,MAAM,SAAS,MAAM,oBAAI,IAAI,EAAE;AAC7D,SAAK,QAAQ,KAAK,KAAK;AACvB,WAAO,MAAM;AACX,YAAM,KAAK,KAAK,QAAQ,QAAQ,KAAK;AACrC,UAAI,MAAM,EAAG,MAAK,QAAQ,OAAO,IAAI,CAAC;AACtC,eAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,KAAK,SAAuD;AAClE,QAAI,KAAK,OAAQ,QAAO;AACxB,UAAM,QAAQ,UAAU,KAAK,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,OAAO,IAAI;AAC9E,WAAO,SAAS,KAAK,YAAY,KAAK,QAAQ,GAAG,EAAE;AAAA,EACrD;AAAA,EAEA,UAAU,SAA2B;AACnC,WAAO,KAAK,KAAK,OAAO,MAAM;AAAA,EAChC;AAAA,EAEA,MAAM,QAAQ,SAA6C;AACzD,UAAM,QAAQ,KAAK,KAAK,QAAQ,OAAO;AACvC,QAAI,CAAC,MAAO,OAAM,IAAI,UAAU,KAAK,WAAW;AAChD,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,MAAM,KAAK,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC7E,SAAS,GAAG;AACV,YAAM,IAAI,UAAU,KAAK,aAAa,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IACpF;AACA,QAAI,KAAK,UAAU,EAAE,UAAU,KAAK,YAAY,KAAK,QAAQ,SAAS,KAAK,IAAI;AAC7E,WAAK,MAAM;AACX,YAAM,IAAI,UAAU,KAAK,WAAW;AAAA,IACtC;AACA,UAAM,KAAK,IAAI,IAAI;AACnB,UAAM,QAAQ,KAAK,MAAM,KAAK,IAAI;AAClC,SAAK,QAAQ,MAAM;AACjB,UAAI,MAAM,KAAK,OAAO,IAAI,EAAG,OAAM;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS;AACd,eAAW,SAAS,CAAC,KAAK,UAAU,GAAG,KAAK,OAAO,EAAG,KAAI,MAAO,UAAS,KAAK;AAAA,EACjF;AACF;AAEA,SAAS,SAAS,OAA2B;AAC3C,aAAW,QAAQ,CAAC,GAAG,MAAM,IAAI,GAAG;AAClC,SAAK,MAAM;AACX,SAAK,UAAU,sBAAsB;AAAA,EACvC;AACF;;;ACnCA,IAAM,OAAO;AACb,IAAM,UAAU;AAChB,IAAM,UAAU;AAEhB,SAAS,OAAO,KAAaE,MAAkC;AAC7D,MAAI,OAAOA,SAAQ,YAAYA,SAAQ,GAAI,QAAO;AAClD,QAAM,QAAQA,KAAI,QAAQ,SAAS,EAAE;AACrC,MAAI,MAAM,WAAW,GAAG,KAAK,MAAM,MAAM,GAAG,EAAE,SAAS,IAAI,EAAG,QAAO;AACrE,SAAO,GAAG,GAAG,IAAI,KAAK;AACxB;AAIA,SAAS,MAAM,KAAa,KAA2B;AACrD,QAAM,MAAmB,CAAC;AAC1B,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,CAAC,QAAQ,KAAK,GAAG,EAAG;AACxB,QAAI,OAAO,UAAU,SAAU,KAAI,GAAG,IAAI,MAAM,QAAQ,SAAS,GAAG;AAAA,aAC3D,UAAU,KAAM,KAAI,GAAG,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,UAAU,QAAyE;AAC1F,QAAM,MAA8B,CAAC;AACrC,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,KAAM,OAAM,KAAK,GAAG;AAAA,QAC7B,KAAI,GAAG,IAAI;AAAA,EAClB;AACA,SAAO;AAAA,IACL,GAAI,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,IAC7C,GAAI,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,EACtC;AACF;AAEA,SAAS,OAAO,KAAa,KAAoC;AAC/D,MAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,EAAG,QAAO;AACpD,MAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,OAAO,QAAQ,QAAQ,EAAG,QAAO;AACzD,SAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,SAAS,GAAG,CAAC;AACnD;AAEA,SAAS,MAAM,KAAc,UAAgC;AAC3D,QAAM,MAAM,OAAO;AACnB,SAAO,QAAQ,gBAAgB,QAAQ,UAAU,QAAQ,OAAO,MAAM;AACxE;AAEA,SAAS,UACP,KACAC,OACA,KACA,YACA,QACqB;AACrB,QAAM,UAAU,UAAU,EAAE,GAAG,QAAQ,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;AAC/D,QAAM,SAAS,OAAO,KAAK,IAAI,MAAM;AACrC,MAAI,QAAQ;AACV,WAAO,EAAE,MAAAA,OAAM,KAAK,YAAY,MAAM,QAAQ,MAAM,QAAQ,OAAOA,OAAM,QAAQ,GAAG,QAAQ;AAAA,EAC9F;AACA,QAAM,MAAM,MAAM,IAAI,KAAK,UAAU;AACrC,QAAM,QAAQ,OAAO,IAAI,UAAU,YAAY,IAAI,QAAQ,IAAI,QAAQA;AACvE,QAAM,OAAO,OAAO,KAAK,IAAI,IAAI;AACjC,MAAI,QAAQ,MAAM;AAChB,UAAM,SAAS,OAAO,KAAK,IAAI,MAAM;AACrC,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO;AAAA,MACL,MAAAA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,GAAI,IAAI,cAAc,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,MACpD,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,GAAG;AAAA,IACL;AAAA,EACF;AACA,QAAM,OAAO,OAAO,KAAK,IAAI,IAAI;AACjC,QAAM,OAAO,QAAQ,SAAS,OAAO,OAAO,KAAK,IAAI,IAAI;AACzD,MAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAM,QAAO;AACnC,QAAM,UAAU,QAAQ,SAAS,OAAO,KAAK,IAAI,OAAO,IAAI;AAC5D,SAAO;AAAA,IACL,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,IAAI,cAAc,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IACpD,GAAI,QAAQ,UAAU,IAAI,gBAAgB,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IAC1E,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACvB,GAAG;AAAA,IACH,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,WAAW,KAAa,UAA+B;AACrE,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AACjD,QAAM,aAAa,MAAM,MAAM,KAAK,YAAY;AAChD,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,cAAc,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO,CAAC;AACpE,QAAM,SAAS,MAAM,KAAK,MAAM,GAAG;AACnC,QAAM,MAAiB,CAAC;AACxB,aAAW,CAACA,OAAM,GAAG,KAAK,OAAO,QAAQ,OAAuC,GAAG;AACjF,QAAI,CAAC,KAAK,KAAKA,KAAI,KAAKA,UAAS,OAAOA,UAAS,QAAQ,CAAC,OAAO,OAAO,QAAQ,UAAU;AACxF;AAAA,IACF;AACA,UAAM,UAAU,UAAU,KAAKA,OAAM,KAAK,YAAY,MAAM;AAC5D,QAAI,QAAS,KAAI,KAAK,OAAO;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,eAAe,iBAAiB,IAAc,KAAa,SAAoC;AAC7F,MAAI,CAAC,QAAQ,IAAK,QAAO;AACzB,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,UAAM,OAAO,CAAC,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,OAAO,KAAK,KAAK;AAC/E,QAAI,GAAG,IAAI,QAAS,MAAM,GAAG,OAAO,IAAI,IAAK,OAAO;AAAA,EACtD;AACA,SAAO,EAAE,GAAG,SAAS,IAAI;AAC3B;AAEA,eAAe,SAAS,IAAc,SAAoC;AACxE,QAAM,QAAQ,MAAM,GAAG,QAAQ,OAAO,EAAE,MAAM,MAAM,CAAC,CAAC;AACtD,QAAM,eAAyB,CAAC;AAChC,aAAWA,SAAQ,OAAO;AACxB,QAAIA,MAAK,WAAW,GAAG,EAAG;AAC1B,QAAI,CAACA,MAAK,WAAW,GAAG,GAAG;AACzB,mBAAa,KAAKA,KAAI;AACtB;AAAA,IACF;AACA,eAAW,SAAS,MAAM,GAAG,QAAQ,GAAG,OAAO,IAAIA,KAAI,EAAE,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG;AAC1E,mBAAa,KAAK,GAAGA,KAAI,IAAI,KAAK,EAAE;AAAA,IACtC;AAAA,EACF;AACA,eAAa,KAAK;AAClB,SAAO,aAAa,IAAI,CAACA,UAAS,GAAG,OAAO,IAAIA,KAAI,EAAE;AACxD;AAEA,eAAsB,gBAAgB,IAAc,MAAiC;AACnF,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAS,GAAG,IAAI;AACtB,aAAW,YAAY,MAAM,GAAG,QAAQ,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG;AACvE,eAAW,UAAU,MAAM,GAAG,QAAQ,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG;AACrF,YAAM,MAAM,GAAG,MAAM,IAAI,OAAO,IAAI,KAAK;AACzC,YAAM,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,MAAM,MAAM,MAAS;AACpD,UAAI,IAAI,eAAgB,MAAM,GAAG,OAAO,GAAG,GAAG,eAAe;AAC3D,cAAM,KAAK,GAAG,GAAG,eAAe;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,WAAW,IAAc,OAA6C;AACnF,QAAM,OAAiB,CAAC;AACxB,aAAW,QAAQ,OAAO,UAAU,WAAW,CAAC,KAAK,IAAI;AACvD,SAAK,KAAK,GAAI,MAAM,SAAS,IAAI,IAAI,CAAE;AACzC,SAAO;AACT;AAEA,eAAsB,aACpB,IACA,SAC+B;AAC/B,QAAM,QAAQ,oBAAI,IAAqB;AACvC,aAAW,OAAO,MAAM,WAAW,IAAI,OAAO,GAAG;AAC/C,QAAI;AACJ,QAAI;AACF,iBAAW,KAAK,MAAM,MAAM,GAAG,SAAS,GAAG,GAAG,eAAe,CAAC;AAAA,IAChE,QAAQ;AACN;AAAA,IACF;AACA,eAAW,WAAW,WAAW,KAAK,QAAQ,GAAG;AAC/C,UAAI,CAAC,MAAM,IAAI,QAAQ,IAAI;AACzB,cAAM,IAAI,QAAQ,MAAM,MAAM,iBAAiB,IAAI,KAAK,OAAO,CAAC;AAAA,IACpE;AAAA,EACF;AACA,MAAI,CAAC,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,GAAG;AACzC,UAAM,IAAI,MAAM,EAAE,GAAI,MAAM,IAAI,MAAM,GAAe,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,EAChF;AACA,SAAO;AACT;AAEA,eAAsB,gBACpB,IACA,SAC8B;AAC9B,QAAM,QAAQ,oBAAI,IAAoB;AACtC,aAAW,OAAO,MAAM,WAAW,IAAI,OAAO,GAAG;AAC/C,QAAI;AACJ,QAAI;AACF,iBAAW,KAAK,MAAM,MAAM,GAAG,SAAS,GAAG,GAAG,eAAe,CAAC;AAAA,IAChE,QAAQ;AACN;AAAA,IACF;AACA,UAAM,WAAW,SAAS,OAAO;AACjC,QAAI,CAAC,YAAY,OAAO,aAAa,SAAU;AAC/C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACpD,YAAM,SAAS,OAAO,KAAM,OAAuC,MAAM;AACzE,UAAI,KAAK,KAAK,IAAI,KAAK,UAAU,CAAC,MAAM,IAAI,IAAI,EAAG,OAAM,IAAI,MAAM,MAAM;AAAA,IAC3E;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,SAAS;AAEf,eAAsB,YACpB,IACA,SACA,OAAkC,MAAM;AAAC,GACX;AAC9B,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,OAAO,MAAM,WAAW,IAAI,OAAO,GAAG;AAC/C,QAAI;AACJ,QAAI;AACF,iBAAW,KAAK,MAAM,MAAM,GAAG,SAAS,GAAG,GAAG,eAAe,CAAC;AAAA,IAChE,QAAQ;AACN;AAAA,IACF;AACA,UAAM,WAAW,SAAS,OAAO;AACjC,QAAI,CAAC,YAAY,OAAO,aAAa,SAAU;AAC/C,eAAW,CAAC,QAAQ,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACxD,UAAI,CAAC,OAAO,KAAK,MAAM,KAAK,OAAO,YAAY,YAAY,CAAC,KAAK,KAAK,OAAO,EAAG;AAChF,YAAM,QAAQ,OAAO,IAAI,MAAM;AAC/B,UAAI,UAAU,QAAW;AACvB,cAAM,IAAI,QAAQ,OAAO;AACzB,eAAO,IAAI,QAAQ,GAAG;AAAA,MACxB,WAAW,MAAM,IAAI,MAAM,MAAM,SAAS;AACxC;AAAA,UACE,UAAU,MAAM,KAAK,KAAK,eAAe,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,OAAO;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,SAAS,SAAsC,MAAkC;AAC/F,QAAMA,QAAO,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AACjD,MAAI;AACJ,aAAW,UAAU,QAAQ,KAAK,GAAG;AACnC,QAAIA,MAAK,SAAS,OAAO,UAAUA,MAAK,SAAS,MAAM,GAAG;AACxD,UAAI,SAAS,UAAa,OAAO,SAAS,KAAK,OAAQ,QAAO;AAAA,IAChE;AAAA,EACF;AACA,SAAO,SAAS,SAAY,SAAY,QAAQ,IAAI,IAAI;AAC1D;;;AClSA,IAAMC,WAAU;AAChB,IAAMC,WAAU;AAChB,IAAM,UAAU;AAChB,IAAMC,aAAY;AAElB,SAASC,SAAQ,KAAuB;AACtC,SAAQ,KAA4B,SAAS;AAC/C;AAEA,SAAS,UAAU,WAAoB,MAAsB;AAC3D,QAAM,QAAQ,oBAAI,KAAK,CAAC;AACxB,SAAO;AAAA,IACL,QAAQ,CAAC;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,OAAO,YAAYH,WAAUC,YAAW;AAAA,IACxC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK,QAAQ,IAAI;AAAA,EACnB;AACF;AAEA,eAAsB,YAAY,IAAc,MAA+B;AAC7E,MAAI,UAAU;AACd,WAAS,OAAO,GAAG,OAAOC,YAAW,QAAQ;AAC3C,UAAM,KAAK,MAAM,GAAG,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACxD,QAAI,CAAC,IAAI,eAAgB,QAAO;AAChC,UAAM,SAAS,QAAQ,MAAM,GAAG,QAAQ,YAAY,GAAG,CAAC,KAAK;AAC7D,cAAU,GAAG,YAAY,QAAQ,MAAM,GAAG,SAAS,OAAO,CAAC;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,IAAc,OAAqD;AACjG,iBAAeE,UAAS,MAA6C;AACnE,QAAI,SAAS,IAAK,QAAO,CAAC,OAAO,KAAK;AACtC,QAAI,SAAS,OAAQ,QAAO,CAAC,KAAK;AAClC,QAAI,SAAS,UAAU,SAAS,WAAY,QAAO,CAAC,GAAI,MAAM,MAAM,CAAE;AACtE,WAAO;AAAA,EACT;AAEA,iBAAe,QAAQ,MAA2C;AAChE,QAAI,SAAS,UAAU,SAAS,UAAU,SAAS,WAAY,QAAO,UAAU,MAAM,IAAI;AAC1F,UAAMC,QAAO,QAAQ,KAAK,IAAI,IAAI,CAAC;AACnC,WAAOA,UAAS,WAAc,MAAM,MAAM,GAAG,IAAIA,KAAI,IAAI,UAAU,OAAO,IAAI,IAAI;AAAA,EACpF;AAEA,iBAAe,OAAO,MAA2C;AAC/D,WAAQ,MAAM,QAAQ,IAAI,KAAM,QAAQ,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,EACrE;AAEA,iBAAe,KAAK,MAAc,MAA0D;AAC1F,QAAI;AACF,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,SAAS,KAAK;AACZ,YAAM,QAAQF,SAAQ,GAAG,IAAI,MAAM,OAAO,IAAI,IAAI;AAClD,UAAI,MAAO,QAAO;AAClB,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,CAAC,MAAM,SAAS,GAAG,YAAY,MAAM,IAAI;AAAA,IACtD,UAAU,CAAC,SAAS,GAAG,SAAS,IAAI;AAAA,IACpC,MAAM,eAAe,MAAM;AACzB,UAAI;AACF,eAAO,MAAM,GAAG,eAAe,IAAI;AAAA,MACrC,SAAS,KAAK;AACZ,YAAIA,SAAQ,GAAG,MAAM,MAAM,OAAO,IAAI,IAAI,OAAQ,QAAO,IAAI,WAAW,CAAC;AACzE,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,WAAW,CAAC,MAAM,YAAY,GAAG,UAAU,MAAM,OAAO;AAAA,IACxD,MAAM,OAAO,MAAM;AACjB,aAAQ,MAAM,GAAG,OAAO,IAAI,KAAO,MAAM,OAAO,IAAI,MAAO;AAAA,IAC7D;AAAA,IACA,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,IAC5C,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,IAC9C,MAAM,QAAQ,MAAM;AAClB,YAAM,QAAQ,MAAMC,UAAS,IAAI;AACjC,UAAI,CAAC,MAAO,QAAO,GAAG,QAAQ,IAAI;AAClC,YAAM,OAAO,MAAM,GAAG,QAAQ,IAAI,EAAE,MAAM,CAAC,QAAQ;AACjD,YAAID,SAAQ,GAAG,EAAG,QAAO,CAAC;AAC1B,cAAM;AAAA,MACR,CAAC;AACD,aAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK;AAAA,IAChD;AAAA,IACA,MAAM,YAAY,MAAM;AACtB,YAAM,QAAQ,MAAMC,UAAS,IAAI;AACjC,UAAI,CAAC,MAAO,QAAO,GAAG,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,GAAG,YAAY,IAAI,EAAE,MAAM,CAAC,QAAQ;AACrD,YAAID,SAAQ,GAAG,EAAG,QAAO,CAAC;AAC1B,cAAM;AAAA,MACR,CAAC;AACD,YAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,CAACE,KAAI,MAAMA,KAAI,CAAC;AAC/C,YAAM,OAAO,SAAS,MAAM,KAAK;AACjC,YAAM,QAAQ,MAAM,OAAO,CAACA,UAAS,CAAC,KAAK,IAAIA,KAAI,CAAC;AACpD,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC7B,MAAM;AAAA,UACJ,OAAOA,UAA2C;AAAA,YAChDA;AAAA,YACC,MAAM,QAAQ,GAAG,IAAI,IAAIA,KAAI,EAAE;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AACA,aAAO,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,IAAI,IAAI,KAAK,CAAE;AAAA,IACnE;AAAA,IACA,OAAO,CAAC,MAAM,YAAY,GAAG,MAAM,MAAM,OAAO;AAAA,IAChD,IAAI,CAAC,MAAM,YAAY,GAAG,GAAG,MAAM,OAAO;AAAA,IAC1C,QAAQ,CAAC,MAAM,OAAO,GAAG,OAAO,MAAM,EAAE;AAAA,IACxC,SAAS,CAAC,QAAQ,SAAS,GAAG,QAAQ,QAAQ,IAAI;AAAA,IAClD,UAAU,CAAC,SAAS,GAAG,SAAS,IAAI;AAAA,IACpC,GAAI,GAAG,WAAW,EAAE,UAAU,GAAG,SAAS,KAAK,EAAE,EAAE,IAAI,CAAC;AAAA,IACxD,OAAO,CAAC,MAAM,SAAS,GAAG,MAAM,MAAM,IAAI;AAAA,IAC1C,QAAQ,CAAC,MAAM,OAAO,UAAU,GAAG,OAAO,MAAM,OAAO,KAAK;AAAA,IAC5D,SAAS,CAAC,MAAM,OAAO,UAAU,UAAU,IAAI,MAAM,OAAO,KAAK;AAAA,IACjE,GAAI,UAAU,EAAE,KAAK,CAAC;AAAA,EACxB;AACF;;;AC1HA,IAAM,WAAW;AAQjB,SAAS,MAAM,MAAoB;AACjC,SAAO,EAAE,MAAM,CAAC,GAAG,MAAM,KAAK,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,GAAG,MAAM,EAAE;AAC5E;AAEA,SAAS,KAAK,MAAgC;AAC5C,SAAO,KAAK,KAAK,SAAS,GAAG;AAC3B,UAAM,OAAO,KAAK,KAAK,MAAM;AAC7B,QAAI,SAAS,IAAK;AAClB,QAAI,SAAS,MAAM;AACjB,WAAK,KAAK,IAAI;AACd;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,MAAsB;AACrC,QAAM,OAAO,MAAM,IAAI;AACvB,WAAS,OAAO,KAAK,IAAI,GAAG,SAAS,QAAW,OAAO,KAAK,IAAI,EAAG,MAAK,KAAK,KAAK,IAAI;AACtF,SAAO,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC;AAChC;AAEA,SAAS,KAAK,MAAY,MAAsB;AAC9C,SAAO,QAAQ,IAAI,CAAC,GAAG,KAAK,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;AACnE;AAEA,SAAS,OAAO,MAAY,QAAyB;AACnD,MAAI,EAAE,KAAK,OAAO,SAAU,QAAO;AACnC,MAAI,OAAO,WAAW,GAAG,EAAG,MAAK,KAAK,SAAS;AAC/C,OAAK,OAAO,CAAC,GAAG,OAAO,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI;AACvE,SAAO;AACT;AA8BA,eAAsB,kBAAkB,IAAqB,MAA+B;AAC1F,QAAM,OAAO,MAAM,IAAI;AACvB,WAAS,OAAO,KAAK,IAAI,GAAG,SAAS,QAAW,OAAO,KAAK,IAAI,GAAG;AACjE,UAAM,KAAK,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,EAAE,KAAK,GAAG,CAAC;AAC7C,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,GAAG,MAAM,EAAE,GAAG,iBAAiB,MAAM,GAAG,SAAS,EAAE,IAAI;AAAA,IACzE,QAAQ;AACN,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB;AACA,QAAI,WAAW,OAAW,MAAK,KAAK,KAAK,IAAI;AAAA,aACpC,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO,QAAQ,IAAI;AAAA,EACrD;AACA,SAAO,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC;AAChC;;;ACpEO,IAAM,oBAAoB;AAEjC,IAAMC,SAAQ,CAAC,MAAc,QAAgB,QAAQ,OAAO,KAAK,WAAW,GAAG,GAAG,GAAG;AACrF,IAAMC,YAAW,CAAC,SAAiB,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AAE3E,SAAS,QAAQ,SAAkB,SAA0B;AAC3D,SAAO,QAAQ,MAAM;AAAA,IACnB,CAAC,YACC,YAAY,WACZD,OAAM,SAAS,OAAO,MACrB,QAAQ,YAAYA,OAAM,SAAS,OAAO,IAAIC,UAAS,OAAO,MAAM;AAAA,EACzE;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA,EACL,WAAW,oBAAI,IAAa;AAAA,EAE7C,MAAM,OAAiB,SAAuB,QAAmD;AAC/F,UAAM,UAAmB;AAAA,MACvB,OAAO,MAAM,IAAI,aAAa;AAAA,MAC9B,WAAW,QAAQ,cAAc;AAAA,MACjC;AAAA,MACA,SAAS,oBAAI,IAAI;AAAA,MACjB,WAAW;AAAA,IACb;AACA,SAAK,SAAS,IAAI,OAAO;AACzB,WAAO,MAAM;AACX,WAAK,SAAS,OAAO,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,WAAW,OAAuB;AAChC,eAAW,WAAW,KAAK,UAAU;AACnC,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAU,cAAc,IAAI;AAClC,YAAI,QAAQ,SAAS,OAAO,EAAG,SAAQ,QAAQ,IAAI,OAAO;AAAA,MAC5D;AACA,UAAI,QAAQ,QAAQ,SAAS,KAAK,QAAQ,UAAW;AACrD,cAAQ,YAAY;AACpB,iBAAW,MAAM,KAAK,MAAM,OAAO,GAAG,CAAC;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,MAAM,SAAwB;AACpC,YAAQ,YAAY;AACpB,UAAM,QAAQ,CAAC,GAAG,QAAQ,OAAO;AACjC,YAAQ,QAAQ,MAAM;AACtB,QAAI,CAAC,KAAK,SAAS,IAAI,OAAO,EAAG;AACjC,YAAQ,OAAO,MAAM,SAAS,oBAAoB,EAAE,UAAU,KAAK,IAAI,EAAE,MAAM,CAAC;AAAA,EAClF;AAAA,EAEA,KAAK,IAAwB;AAC3B,UAAM,QACJ,CACEC,MACA,YAEF,UAAU,SAAY;AACpB,UAAI;AACF,cAAMA,KAAI,GAAG,IAAI;AAAA,MACnB,UAAE;AACA,aAAK,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;AAAA,MAClC;AAAA,IACF;AACF,UAAM,YAAsD;AAAA,MAC1D,WAAW,MAAM,GAAG,UAAU,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MACxD,OAAO,OAAO,MAAc,YAAsC;AAChE,cAAM,UAAoB,CAAC;AAC3B,YAAI,SAAS,WAAW;AACtB,gBAAM,QAAQ,cAAc,IAAI,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3D,mBAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM;AACxC,kBAAM,WAAW,IAAI,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC;AACjD,gBAAI,QAAQ,SAAS,KAAK,CAAE,MAAM,GAAG,OAAO,QAAQ,EAAI,SAAQ,KAAK,QAAQ;AAAA,UAC/E;AAAA,QACF;AACA,YAAI;AACF,gBAAM,GAAG,MAAM,MAAM,OAAO;AAAA,QAC9B,UAAE;AACA,eAAK,QAAQ,GAAG,SAAS,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,IAAI,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MAC1C,QAAQ,MAAM,GAAG,OAAO,KAAK,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;AAAA,MAC1D,SAAS,MAAM,GAAG,QAAQ,KAAK,EAAE,GAAG,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC;AAAA,MAC7D,OAAO,MAAM,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MAChD,QAAQ,MAAM,GAAG,OAAO,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MAClD,SAAS;AAAA,QACP,CAAC,MAAc,OAAa,UAAgB,UAAU,IAAI,MAAM,OAAO,KAAK;AAAA,QAC5E,CAAC,SAAS,CAAC,IAAI;AAAA,MACjB;AAAA,IACF;AACA,UAAMC,UAAS,UAAU,EAAE;AAC3B,QAAIA,SAAQ;AACV,gBAAU,SAAS,MAAMA,QAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;AACxD,gBAAU,WAAW,MAAMA,QAAO,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,IAC9D;AACA,WAAO,IAAI,MAAM,IAAI;AAAA,MACnB,IAAI,QAAQ,KAAK,UAAU;AACzB,YAAI,OAAO,OAAO,WAAW,GAAG,EAAG,QAAO,UAAU,GAAqB;AACzE,cAAM,QAAQ,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAC/C,eAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACjEO,IAAM,aAAN,cAAyB,MAAM;AAAA,EAC3B;AAAA,EAET,YAAY,MAAmB;AAC7B,UAAM,IAAI;AACV,SAAK,OAAO;AAAA,EACd;AACF;AAmBA,SAAS,YAAY,QAInB;AACA,QAAM,EAAE,SAAS,OAAO,IAAI,QAAQ,cAAqB;AACzD,QAAMC,QAAO,MAAY,OAAO,IAAI,YAAY,OAAO,CAAC;AACxD,MAAI,QAAQ,QAAS,CAAAA,MAAK;AAAA,MACrB,SAAQ,iBAAiB,SAASA,OAAM,EAAE,MAAM,KAAK,CAAC;AAC3D,SAAO,EAAE,SAAS,MAAM,MAAM,QAAQ,oBAAoB,SAASA,KAAI,EAAE;AAC3E;AAEO,SAAS,cAAc,KAAqB;AACjD,UAAS,MAAM,QAAS,IAAK;AAC/B;AAEO,IAAM,mBAAmB;AAEzB,SAAS,WAAW,MAAc,SAA0B;AACjE,SAAO,UAAU,UAAU,OAAQ,OAAO,QAAS;AACrD;AAEA,SAASC,QAAOC,SAAkC;AAChD,QAAM,MAAM,IAAI,WAAWA,QAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,CAAC;AACnE,MAAI,SAAS;AACb,aAAWC,UAASD,SAAQ;AAC1B,QAAI,IAAIC,QAAO,MAAM;AACrB,cAAUA,OAAM;AAAA,EAClB;AACA,SAAO;AACT;AAEO,IAAM,aAAN,MAAiB;AAAA,EACL,WAAW,oBAAI,IAAmB;AAAA,EAElC,YAAY,oBAAI,IAAuC;AAAA,EAExE;AAAA,EAEA;AAAA,EAEQ,eAAkC,CAAC;AAAA,EAE1B,WAAW,oBAAI,IAAgC;AAAA,EAE/C;AAAA,EAEA;AAAA,EAEA;AAAA,EAEjB,YACE,WAEA,SAEA,QACA;AACA,SAAK,YAAY;AAEjB,SAAK,UAAU;AAEf,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAAmC;AAC5C,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,WAAW,QAAQ;AAC/C,WAAO,KAAK,MAAM,OAAO,KAAK,UAAU,KAAK,GAAG,oBAAI,IAAI,GAAG,KAAK,MAAM;AAAA,EACxE;AAAA,EAEA,MAAM,MACJ,KACA,OACA,UAAoC,CAAC,GACpB;AACjB,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,WAAW,QAAQ;AAChD,UAAM,MAAM,IAAI,QAAQ;AACxB,UAAM,WAAW,oBAAI,IAA0B;AAC/C,QAAI;AACF,iBAAW,CAAC,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAG,KAAI,UAAU,GAAG,KAAK,SAAS,MAAM,GAAG,QAAQ,CAAC;AAE1F,iBAAW,QAAQ,SAAS;AAC1B,YAAI,KAAK,MAAM,EAAG;AAClB,YAAI,YAAY,MAAM;AACpB,cAAI,UAAU,KAAK,IAAI,WAAW,KAAK,QAAQ,KAAK,MAAM,CAAC;AAC3D;AAAA,QACF;AACA,YAAI,UAAU,KAAK,IAAI,KAAK,UAAU,IAAI,KAAK,MAAM,EAAE,OAAO,CAAC;AAC/D,YAAI,KAAK,UAAU,OAAW,KAAI,eAAe,KAAK,IAAI,KAAK,KAAK;AAAA,MACtE;AAAA,IACF,SAAS,GAAG;AACV,YAAM,IAAI,SAAS;AACnB,YAAM;AAAA,IACR;AACA,WAAO,KAAK,MAAM,KAAK,KAAK,UAAU,KAAK,OAAO;AAAA,EACpD;AAAA,EAEA,MAAc,MACZ,KACA,KACA,UACAC,QACiB;AACjB,QAAI;AACJ,QAAI;AACF,eAAS,MAAMA,OAAM,KAAK,GAAG;AAAA,IAC/B,SAAS,GAAG;AACV,YAAM,IAAI,SAAS;AACnB,YAAM;AAAA,IACR;AACA,UAAM,QAAe,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,SAAS,SAAS;AAChF,SAAK,OAAO,OAAO,KAAK,CAAC,SAAS;AAChC,YAAM,OAAO;AACb,WAAK,SAAS,OAAO,OAAO,GAAG;AAC/B,WAAK,eAAe;AAAA,IACtB,CAAC;AACD,WAAO,UAAU,CAAC,OAAO,QAAQ;AAC/B,YAAM,aAAa,UAAU,YAAY,MAAM;AAC/C,YAAM,iBAAiB,UAAU;AACjC,WAAK,SAAS,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG;AAC1C,YAAM,UAAU,KAAK;AACrB,WAAK,eAAe,CAAC;AACrB,iBAAW,QAAQ,QAAS,MAAK;AACjC,WAAK,eAAe;AAAA,IACtB,CAAC;AACD,SAAK,SAAS,IAAI,OAAO,KAAK,KAAK;AACnC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,KAAa,UAAoC;AACrD,QAAI,KAAK,SAAS,IAAI,GAAG,EAAG,MAAK,SAAS,IAAI,KAAK,QAAQ;AAAA,EAC7D;AAAA,EAEQ,SAAS,MAAkB,GAAW,UAA+C;AAC3F,QAAI,QAAQ,KAAM,QAAO,KAAK,UAAU,IAAI,KAAK,EAAE,EAAE,OAAO;AAC5D,QAAI,WAAW,KAAM,QAAO,YAAY,KAAK,KAAK;AAClD,QAAI,YAAY,KAAM,QAAO,WAAW,KAAK,QAAQ,KAAK,MAAM;AAChE,QAAI,SAAS,KAAM,QAAO,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC;AACpD,QAAI,aAAa,MAAM;AACrB,YAAMF,UAAuB,CAAC;AAC9B,eAAS,IAAI,GAAGA,OAAM;AACtB,aAAO,SAAS,CAAC,UAAUA,QAAO,KAAK,KAAK,CAAC;AAAA,IAC/C;AACA,WAAO,WAAW,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,KACJ,KACA,QACA,QACA,QAAmB,CAAC,GACO;AAC3B,QAAI;AACJ,QAAI;AACF,iBAAS;AACP,cAAM,aAAa,KAAK,WAAW,KAAK,KAAK;AAC7C,YAAI,WAAW,WAAW,EAAG,OAAM,IAAI,YAAY,QAAQ;AAC3D,cAAMG,QAAO,WAAW,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,SAAS,MAAS;AACpE,YAAIA,MAAM,QAAO,KAAK,KAAKA,MAAK,CAAC,GAAGA,MAAK,CAAC,EAAE,IAAc;AAC1D,cAAM,UAAU,KAAK,YAAY,YAAY,KAAK;AAClD,YAAI,QAAS,QAAO;AACpB,YAAI,OAAQ,QAAO,CAAC,GAAG,CAAC;AACxB,sBAAc,YAAY,MAAM;AAChC,cAAM,KAAK,WAAW,YAAY,OAAO,UAAU,OAAO;AAAA,MAC5D;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,WAAW,KAAa,OAAqC;AACnE,UAAM,MAAM,CAAC,GAAG,KAAK,QAAQ;AAC7B,QAAI,MAAM,EAAG,QAAO,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,GAAG;AACjD,UAAM,UAAU,MAAM;AACtB,WAAO,QAAQ,MAAM,CAAC,UAAU,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC;AAAA,EACtE;AAAA,EAEA,MAAc,WACZ,YACA,OACA,WACe;AACf,QAAI;AACJ,UAAM,cAAc,IAAI,QAAc,CAAC,YAAa,OAAO,OAAQ;AACnE,UAAM,WAAW,MAAM,YAAY,MAAM;AACzC,QAAI,YAAY,KAAM,MAAK,aAAa,KAAK,IAAI;AACjD,QAAI;AACF,YAAM,QAAQ,KAAK;AAAA,QACjB,GAAG,WAAW,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,MAAM;AAAA,QAC7C,GAAI,WAAW,CAAC,WAAW,IAAI,CAAC;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH,UAAE;AACA,WAAK,eAAe,KAAK,aAAa,OAAO,CAAC,MAAM,MAAM,IAAI;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,YAAY,YAA+B,OAA2C;AAC5F,eAAW,CAAC,GAAG,KAAK,KAAK,YAAY;AACnC,UAAI,MAAM,YAAY,MAAM,eAAe,QAAW;AACpD,cAAM,MAAM,MAAM;AAClB,cAAM,aAAa;AACnB,eAAO,CAAC,GAAG,cAAc,GAAG,CAAC;AAAA,MAC/B;AACA,UAAI,MAAM,aAAa,MAAM,gBAAgB;AAC3C,cAAM,iBAAiB;AACvB,eAAO,CAAC,GAAG,gBAAgB;AAAA,MAC7B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,KAAa,MAAgC;AACxD,UAAM,QAAQ,KAAK,SAAS,IAAI,GAAG;AACnC,SAAK,SAAS,OAAO,GAAG;AACxB,SAAK,SAAS,GAAG;AACjB,QAAI,SAAS,MAAM,SAAS,OAAO,EAAG,MAAK,UAAU,IAAI,KAAK,MAAM,QAAQ;AAC5E,WAAO,CAAC,KAAK,WAAW,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,EACnD;AAAA,EAEA,OAAiB;AACf,WAAO,CAAC,GAAG,KAAK,SAAS,KAAK,CAAC;AAAA,EACjC;AAAA,EAEA,SAAS,KAAa,MAA0B;AAC9C,UAAM,QAAQ,KAAK,UAAU,IAAI,GAAG;AACpC,UAAMH,UAAS,OAAO,IAAI,IAAI;AAC9B,QAAI,CAAC,SAAS,CAACA,QAAQ,QAAO,IAAI,WAAW,CAAC;AAC9C,UAAM,OAAO,IAAI;AACjB,QAAI,MAAM,SAAS,EAAG,MAAK,UAAU,OAAO,GAAG;AAC/C,WAAOD,QAAOC,OAAM;AAAA,EACtB;AACF;;;ACzTO,IAAM,kBAA6C,CAAC,GAAG,CAAC;AA6FxD,SAAS,mBAAmB,QAAqC;AACtE,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,OAAO,CAAC,IAAI;AAClD,MAAI,UAAU,gBAAgB,CAAC,EAAG,QAAO;AACzC,QAAM,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AACzD,SAAO,gCAAgC,KAAK,uCAAuC,gBAAgB,KAAK,GAAG,CAAC;AAC9G;;;ACrEO,IAAM,oBAAoB;AAEjC,SAAS,MAAM,OAAqE;AAClF,EAAC,MAAiC,QAAQ;AAC1C,SAAO;AACT;AAEO,SAAS,WAAW,MAAcI,UAA2C;AAClF,SAAO,OAAO,OAAO,IAAI,MAAM,GAAG,IAAI,KAAKA,QAAO,EAAE,GAAG,EAAE,KAAK,CAAC;AACjE;AAEO,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EACnB;AAAA,EACT;AAAA,EACiB;AAAA,EACA;AAAA,EACA;AAAA,EACT,SAAS;AAAA,EACA;AAAA,EAET,YACN,MACA,cACA,SACA,WACA,QACA;AACA,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,YAAY;AACjB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,aAAa,KACX,MACA,OACA,UAA6B,CAAC,GACH;AAC3B,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,UAAU,oBAAI,IAAqB;AACzC,UAAM,UAAU,QAAQ,cAA2B;AACnD,SAAK,iBAAiB,WAAW,CAAC,UAAU;AAC1C,YAAM,OAAO,MAAM;AAInB,UAAI,KAAK,MAAO,QAAO,QAAQ,QAAQ,KAAK,KAAK;AACjD,UAAI,KAAK,eAAe,OAAW,QAAO,QAAQ,eAAe,KAAK,UAAU;AAChF,YAAM,OAAO,QAAQ,IAAI,KAAK,EAAE;AAChC,UAAI,CAAC,KAAM;AACX,cAAQ,OAAO,KAAK,EAAE;AACtB,mBAAa,KAAK,KAAK;AACvB,UAAI,KAAK,MAAO,MAAK,OAAO,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,KAAK,CAAC;AAAA,UACzE,MAAK,QAAQ,KAAK,MAAM;AAAA,IAC/B,CAAC;AACD,SAAK,QAAQ;AACb,SAAK,YAAY,EAAE,OAAO,EAAE,UAAU,iBAAiB,MAAM,EAAE,CAAC;AAChE,UAAM,QAAQ;AAAA,MACZ;AAAA,QACE,MAAM,QAAQ,OAAO,WAAW,OAAO,oCAAoC,SAAS,KAAK,CAAC;AAAA,QAC1F;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,QAAQ;AAAA,IACxB,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AACA,UAAM,UAAU,mBAAmB,MAAM,QAAQ;AACjD,QAAI,QAAS,OAAM,WAAW,UAAU,OAAO;AAC/C,QAAI,MAAM,MAAO,OAAM,WAAW,MAAM,SAAS,OAAO,MAAM,KAAK;AACnE,WAAO,IAAI,kBAAiB,MAAM,MAAM,gBAAgB,CAAC,GAAG,SAAS,WAAW,QAAQ,MAAM;AAAA,EAChG;AAAA,EAEA,KAAK,MAAkB,WAA2B,CAAC,GAAqB;AACtE,QAAI,KAAK,QAAS,QAAO,QAAQ,OAAO,KAAK,OAAO;AACpD,UAAM,KAAK,EAAE,KAAK;AAClB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,QAAQ;AAAA,QACZ,WAAW,MAAM;AACf,eAAK,QAAQ,OAAO,EAAE;AACtB,gBAAM,QAAQ;AAAA,YACZ;AAAA,YACA,6BAA6B,KAAK,EAAE,WAAW,KAAK,SAAS;AAAA,UAC/D;AACA,iBAAO,KAAK;AACZ,eAAK,KAAK,KAAK;AACf,eAAK,SAAS,KAAK;AAAA,QACrB,GAAG,KAAK,SAAS;AAAA,MACnB;AACA,WAAK,QAAQ,IAAI,IAAI,EAAE,SAAS,QAAQ,MAAM,CAAC;AAC/C,WAAK,KAAK,YAAY,EAAE,GAAG,MAAM,GAAG,GAAG,QAAQ;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,OAAoB;AACvB,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,eAAW,QAAQ,KAAK,QAAQ,OAAO,GAAG;AACxC,mBAAa,KAAK,KAAK;AACvB,WAAK,OAAO,KAAK;AAAA,IACnB;AACA,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEA,QAAc;AACZ,SAAK,KAAK,WAAW,OAAO,8BAA8B,CAAC;AAC3D,SAAK,KAAK,QAAQ;AAAA,EACpB;AACF;;;ACzFA,IAAMC,aAAY;AAClB,IAAM,gBAAgB;AACtB,IAAM,aAAa,IAAI,OAAO;AAC9B,IAAM,QAAgC,EAAE,IAAI,GAAG,GAAG,MAAM,GAAG,QAAQ,GAAG,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE;AAE1F,SAAS,UAAU,MAAsB;AAC9C,QAAM,QAAQ,qCAAqC,KAAK,KAAK,KAAK,CAAC;AACnE,MAAI,CAAC,MAAO,OAAM,WAAW,UAAU,eAAe,IAAI,EAAE;AAC5D,SAAO,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC,IAAK,MAAO,MAAM,CAAC,EAAa,YAAY,CAAC,CAAY;AAC5F;AAEA,IAAMC,UAAS,CAAC,MAAc,WAC5B,SAAS,UAAU,WAAW,OAAO,KAAK,WAAW,GAAG,MAAM,GAAG;AAC5D,IAAM,UAAN,cAAsB,IAAe;AAAA,EACzB;AAAA,EAEjB,YAAY,MAA8B;AACxC,UAAM;AACN,SAAK,OAAO;AAAA,EACd;AAAA,EAES,IAAI,OAAwB;AACnC,UAAM,SAAS,KAAK;AACpB,WAAO,MAAM,IAAI,KAAK;AAAA,EACxB;AAAA,EAES,OAAO,OAA2B;AACzC,UAAM,UAAU,MAAM,OAAO,KAAK;AAClC,eAAW,QAAQ,oBAAI,IAAI,CAAC,GAAG,MAAM,KAAK,GAAG,GAAG,MAAM,MAAM,KAAK,CAAC,CAAC,EAAG,MAAK,KAAK,IAAI;AACpF,UAAM,WAAW;AACjB,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAU,MAAqC,QAAyB;AACtF,aAAW,SAAS,KAAM,YAAW,QAAQ,MAAM,KAAK,EAAG,KAAIA,QAAO,MAAM,MAAM,EAAG,QAAO;AAC5F,SAAO;AACT;AAEO,IAAM,YAAN,cAAwB,IAA4C;AAAA,EACxD,UAAU,oBAAI,IAAY;AAAA,EAClC,QAAQ,oBAAI,IAAoB;AAAA,EAChC,WAAW,oBAAI,IAAsB;AAAA,EAC7B,UAAU,oBAAI,IAAoB;AAAA,EAClC,UAAU,oBAAI,IAAoB;AAAA,EAClC,cAAc,oBAAI,IAAsB;AAAA,EACxC,OAAO,oBAAI,IAAsB;AAAA,EAC1C,aAAa;AAAA,EACb;AAAA,EAER;AAAA,EAEA,MAAM,MAAsB;AAC1B,WAAO,KAAK,QAAQ,IAAI,IAAI,KAAK;AAAA,EACnC;AAAA,EAEA,OAAO,MAAoC;AACzC,WAAO,KAAK,SAAS,IAAI,KAAK,MAAM,IAAI,CAAC;AAAA,EAC3C;AAAA,EAEA,QAAQ,MAAuB;AAC7B,WAAO,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAAA,EACxC;AAAA,EAEA,OAAyB;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,MAAuB;AAC5B,UAAM,MAAM,KAAK,UAAU,IAAI;AAC/B,WAAO,IAAI,WAAW,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,IAAI,EAAE,CAAC;AAAA,EAChG;AAAA,EAEQ,UAAU,MAAwB;AACxC,WAAO,CAAC,GAAG,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;AAAA,EAC7E;AAAA,EAEA,QAAQ,QAAsC;AAC5C,WAAO,KAAK,YAAY,IAAI,MAAM;AAAA,EACpC;AAAA,EAEA,KAAK,MAAc,MAAsB;AACvC,UAAM,QAAQ,KAAK,UAAU,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,YAAY,IAAI,EAAE,CAAC;AAC3E,eAAW,MAAM,MAAO,MAAK,YAAY,IAAI,IAAI,IAAI;AACrD,SAAK,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC,CAAC;AAC7C,SAAK,SAAS,IAAI,MAAM,IAAI;AAAA,EAC9B;AAAA,EAEA,OAAO,MAAc,MAAsB;AACzC,eAAW,CAAC,IAAI,IAAI,KAAK,KAAK,YAAa,KAAI,SAAS,KAAM,MAAK,YAAY,OAAO,EAAE;AACxF,SAAK,KAAK,OAAO,IAAI;AACrB,QAAI,KAAK,SAAS,IAAI,IAAI,MAAM,KAAM,MAAK,SAAS,OAAO,IAAI;AAAA,EACjE;AAAA,EAEQ,MAAM,MAAgB,MAAM,OAAa;AAC/C,UAAM,OAAO,MAAM,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK;AACpD,QAAI,OAAO,GAAG;AACZ,WAAK,KAAK,IAAI,MAAM,IAAI;AACxB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,KAAK,OAAO,IAAI,EAAG;AAC7B,SAAK,QAAQ;AACb,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,SAAU,KAAI,SAAS,KAAM,MAAK,SAAS,OAAO,IAAI;AAAA,EACxF;AAAA,EAEA,aAAmB;AACjB,eAAW,QAAQ,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,EAAG,MAAK,MAAM,MAAM,IAAI;AAC/D,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEA,KACE,MACA,IACA,OAAO,OACP,MACA,QACoB;AACpB,QAAI,KAAM,QAAO,KAAK,SAAS,MAAM,IAAI,MAAM,MAAM;AACrD,SAAK,UAAU,MAAM,EAAE;AACvB,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAc,IAAa,MAAe,QAAqC;AAC9F,UAAM,QAAQ,WAAW,SAAY,SAAY,KAAK,QAAQ,IAAI,MAAM;AACxE,UAAM,MAAM,SAAS,QAAQ,KAAK,MAAM,IAAI;AAC5C,QAAI,QAAQ,KAAM,MAAK,QAAQ,IAAI,MAAM,GAAG;AAC5C,QAAI,WAAW,QAAW;AACxB,YAAM,OAAO,KAAK,YAAY,IAAI,MAAM;AACxC,WAAK,QAAQ,OAAO,MAAM;AAC1B,WAAK,YAAY,OAAO,MAAM;AAC9B,UAAI,KAAM,MAAK,MAAM,IAAI;AAAA,IAC3B;AACA,UAAM,SAAS,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI;AACrD,QAAI,QAAQ,EAAG,MAAK,MAAM,IAAI,KAAK,KAAK;AAAA,SACnC;AACH,WAAK,MAAM,OAAO,GAAG;AACrB,iBAAW,MAAM,KAAK,UAAU,GAAG,EAAG,MAAK,QAAQ,OAAO,EAAE;AAC5D,YAAM,OAAO,KAAK,SAAS,IAAI,GAAG;AAClC,UAAI,KAAM,MAAK,MAAM,MAAM,IAAI;AAC/B,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAK,QAAS,KAAI,WAAW,IAAK,MAAK,QAAQ,OAAO,KAAK;AACzF,WAAK,SAAS,GAAG;AAAA,IACnB;AACA,QAAI,CAAC,GAAI,QAAO;AAChB,SAAK,QAAQ,IAAI,EAAE,KAAK,YAAY,GAAG;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,UAAU,MAAc,IAAmB;AACjD,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI;AAChD,QAAI,QAAQ,EAAG,MAAK,IAAI,MAAM,KAAK;AAAA,SAC9B;AACH,WAAK,OAAO,IAAI;AAChB,WAAK,QAAQ,OAAO,IAAI;AACxB,WAAK,SAAS,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,IAAO,MAAc,IAAkC;AAC3D,SAAK,SAAS;AACd,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,KAAK,MAAuB;AAC1B,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,OAAO,QAAsB;AAC3B,eAAW,QAAQ,KAAK,KAAK,EAAG,KAAIA,QAAO,MAAM,MAAM,EAAG,MAAK,QAAQ,IAAI,IAAI;AAAA,EACjF;AAAA,EAEA,QAAQ,MAAc,IAAkB;AACtC,eAAW,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,IAAI,GAAG;AACrC,UAAI,CAACA,QAAO,MAAM,IAAI,EAAG;AACzB,YAAMC,SAAQ,KAAK,KAAK,MAAM,KAAK,MAAM;AACzC,WAAK,OAAO,IAAI;AAChB,WAAK,IAAIA,SAAQ,KAAK,IAAIA,MAAK,KAAK,KAAK,KAAK;AAC9C,UAAI,KAAK,QAAQ,OAAO,IAAI,EAAG,MAAK,QAAQ,IAAIA,MAAK;AAAA,IACvD;AACA,eAAW,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,GAAG;AAC3C,UAAI,CAACD,QAAO,MAAM,IAAI,EAAG;AACzB,YAAMC,SAAQ,KAAK,KAAK,MAAM,KAAK,MAAM;AACzC,WAAK,MAAM,OAAO,IAAI;AACtB,WAAK,MAAM,IAAIA,SAAQ,KAAK,MAAM,IAAIA,MAAK,KAAK,KAAK,KAAK;AAAA,IAC5D;AACA,eAAW,CAAC,IAAI,GAAG,KAAK,KAAK,SAAS;AACpC,UAAID,QAAO,KAAK,IAAI,EAAG,MAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,UAAU,MAAuB;AAC/B,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AACF;AAEA,IAAME,YAAW,CAAC,SAAiB,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AAE3E,IAAM,WAAW,CAAC,UAChB,MAAM,KAAK,aAAa,QAAQ,MAAM,QAAQ,OAAO;AAEvD,SAAS,OAAO,MAAkB,MAAc,OAAsB;AACpE,QAAM,QAAQ,IAAI,KAAK,KAAK,KAAK;AACjC,QAAM,WACJ,KAAK,SAAS,cAAc,QAAU,KAAK,SAAS,YAAY,QAAW;AAC7E,SAAO;AAAA,IACL,QAAQ,KAAK,SAAS;AAAA,IACtB,aAAa,KAAK,SAAS;AAAA,IAC3B,gBAAgB,KAAK,SAAS;AAAA,IAC9B,MAAM,KAAK;AAAA,IACX,MAAM,KAAK,QAAQ;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK,KAAK,OAAO,QAAQ,IAAI;AAAA,IAC7B,KAAK,MAAM;AAAA,IACX,GAAI,SAAS,KAAK,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,IAC5C,GAAI,MAAM,UAAU,IAAI,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,MAAM,KAAK,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC5C,GAAI,KAAK,SAAS,SAAY,EAAE,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA,EAC1D;AACF;AAEA,SAASC,QAAOC,SAAsB,OAA2B;AAC/D,MAAIA,QAAO,WAAW,KAAKA,QAAO,CAAC,GAAG,WAAW,MAAO,QAAOA,QAAO,CAAC;AACvE,QAAM,MAAM,IAAI,WAAW,KAAK;AAChC,MAAI,KAAK;AACT,aAAWC,UAASD,SAAQ;AAC1B,QAAI,IAAIC,QAAO,EAAE;AACjB,UAAMA,OAAM;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,OAAmB,MAA0B;AAC5D,MAAI,QAAQ,MAAM,OAAQ,QAAO,MAAM,SAAS,GAAG,IAAI;AACvD,QAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,MAAI,IAAI,KAAK;AACb,SAAO;AACT;AAEA,SAAS,OAAO,OAAmB,UAAmBA,QAAwB;AAC5E,QAAM,QAAQ,MAAM,eAAe,KAAK,MAAM,eAAe,MAAM,OAAO;AAC1E,SAAO,YAAY,SAAS,MAAM,UAAUA,UAAS,MAAM,kBAAkB;AAC/E;AAEA,SAAS,QAAQ,OAAmB,QAAgB,MAA8B;AAChF,QAAM,MAAM,QAAQ,OAAO,KAAK,IAAI,MAAM,QAAQ,SAAS,KAAK,MAAM,CAAC;AACvE,MAAI,IAAI,MAAM,MAAM;AACpB,SAAO;AACT;AASO,IAAM,aAAN,MAAiB;AAAA,EACL,SAAS,oBAAI,IAAmB;AAAA,EAChC,WAAW,oBAAI,IAA0B;AAAA,EACzC,aAAa,oBAAI,IAAmD;AAAA,EAC7E,UAAU;AAAA,EACD,UAAU,oBAAI,IAAY;AAAA,EAC1B,QAAQ,oBAAI,IAAwB;AAAA,EACpC;AAAA,EAEjB,YAAY,MAAiB;AAC3B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,QAAQ,QAAwC;AAC9C,WAAO,KAAK,OAAO,IAAI,MAAM;AAAA,EAC/B;AAAA,EAEA,OAAqB;AACnB,UAAM,UAAU,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE;AAAA,MACxC,CAAC,EAAE,MAAM,QAAQ,QAAQ,SAAS,OAAO,OAAO,SAAAC,SAAQ,OAAmB;AAAA,QACzE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,EAAE,GAAG,QAAQ;AAAA,QACtB,OAAO,UAAU,QAAQA,WAAU,MAAM,QAAQ,aAAa;AAAA,QAC9D,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,QAAQ,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,IAAI,KAAK,MAAM,CAAC;AACrF,WAAO,CAAC,GAAG,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,EAAE,GAAG,KAAK,QAAQ,EAAE,EAAE,CAAC;AAAA,EACzF;AAAA,EAEA,KAAK,MAAiB,OAA6B,OAAsB;AACvE,UAAM,SAAS,cAAc,KAAK,MAAM;AACxC,SAAK,MAAM,IAAI,QAAQ;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,SAAS,EAAE,GAAG,KAAK,QAAQ;AAAA,MAC3B;AAAA,MACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAyD;AAC9D,QAAI;AACJ,eAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,UAAIN,QAAO,MAAM,MAAM,MAAM,MAAM,CAAC,QAAQ,MAAM,OAAO,SAAS,KAAK,OAAO;AAC5E,eAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAM,QAAO;AAClB,UAAMO,OAAM,KAAK,WAAW,MAAM,OAAO,KAAK,MAAM,KAAK,OAAO,MAAM;AACtE,WAAO,EAAE,OAAO,MAAM,KAAKA,QAAO,IAAI;AAAA,EACxC;AAAA,EAEA,MAAM,MAAM,MAAiB,IAAmC;AAC9D,UAAM,SAAS,cAAc,KAAK,MAAM;AACxC,QAAI,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK,QAAQ,IAAI,MAAM,GAAG;AACvD,YAAM,WAAW,SAAS,GAAG,MAAM,qBAAqB;AAAA,IAC1D;AACA,SAAK,QAAQ,IAAI,MAAM;AACvB,QAAI;AACF,aAAO,MAAM,KAAK,OAAO,MAAM,QAAQ,EAAE;AAAA,IAC3C,UAAE;AACA,WAAK,QAAQ,OAAO,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,MAAiB,QAAgB,IAAmC;AACvF,UAAM,KAAK,MAAM,GAAG,KAAK,MAAM;AAC/B,QAAI,CAAC,GAAG,YAAa,OAAM,WAAW,WAAW,MAAM;AACvD,UAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;AAClC,UAAM,UAAU,QAAQ,YAAY,SAAY,UAAU,QAAQ,OAAO,IAAI;AAC7E,UAAMC,UAAS,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM,EAAE,GAAG,MAAM,QAAQ,QAAQ,CAAC;AAC3E,QAAI;AACJ,UAAM,UAAU,QAAQ,cAAqB;AAC7C,IAAAA,QAAO,UAAU,CAAC,UAAU;AAC1B,UAAI,QAAS,MAAK,QAAQ,SAAS,KAAK;AAAA;AAEtC,gBAAQ;AAAA,UACN,WAAW,OAAO,OAAO,KAAK,IAAI,4BAA4B,MAAM,OAAO,EAAE;AAAA,QAC/E;AAAA,IACJ,CAAC;AACD,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,QAAQ,KAAK;AAAA,QACxB,iBAAiB;AAAA,UACfA,QAAO;AAAA,UACP,EAAE,QAAQ,KAAK,QAAQ,QAAQ;AAAA,UAC/B;AAAA,YACE,GAAI,KAAK,KAAK,YAAY,EAAE,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC;AAAA,YAChE,cAAc,CAAC,UAAU,KAAK,YAAY,QAAQ,KAAK;AAAA,YACvD,QAAQ,CAAC,UAAU;AACjB,kBAAI,QAAS,MAAK,QAAQ,SAAS,KAAK;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,MAAAA,QAAO,QAAQ;AACf,YAAM;AAAA,IACR;AACA,UAAM,OAAO,KAAK;AAClB,UAAM,QAAe;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,KAAK,MAAM,EAAE,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA,SAAS,WAAW,KAAK,WAAW;AAAA,MACpC,OAAO,oBAAI,IAAI;AAAA,MACf,OAAO,oBAAI,IAAI;AAAA,MACf,SAAS,MAAMA,QAAO,QAAQ;AAAA,MAC9B,GAAIA,QAAO,UAAU,EAAE,SAASA,QAAO,QAAQ,IAAI,CAAC;AAAA,IACtD;AACA,cAAU;AACV,SAAK,OAAO,IAAI,QAAQ,KAAK;AAC7B,SAAK,MAAM,OAAO,MAAM;AACxB,WAAO,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,EACpD;AAAA,EAEA,OAAO,QAAsB;AAC3B,SAAK,MAAM,OAAO,cAAc,MAAM,CAAC;AAAA,EACzC;AAAA,EAEA,OAAO,QAAgB,SAAS,OAAa;AAC3C,UAAM,KAAK,cAAc,MAAM;AAC/B,UAAM,QAAQ,KAAK,OAAO,IAAI,EAAE;AAChC,QAAI,CAAC,SAAS,KAAK,MAAM,OAAO,EAAE,EAAG;AACrC,QAAI,CAAC,MAAO,OAAM,WAAW,UAAU,GAAG,EAAE,iBAAiB;AAC7D,QAAI,CAAC,UAAU,KAAK,KAAK,KAAK,EAAE,EAAG,OAAM,WAAW,SAAS,GAAG,EAAE,iBAAiB;AACnF,SAAK,MAAM,OAAO,EAAE;AACpB,SAAK,OAAO,OAAO,EAAE;AACrB,UAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,EACnC,IAAI,CAAC,CAAC,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC;AACpC,eAAW,KAAK,KAAK,WAAW,OAAO,EAAG,KAAI,EAAE,UAAU,MAAO,OAAM,KAAK,EAAE,IAAI;AAClF,UAAM,QAAQ,MAAM;AAClB,YAAM,KAAK,MAAM;AACjB,YAAM,QAAQ;AAAA,IAChB;AACA,QAAI,MAAM,WAAW,EAAG,OAAM;AAAA,QACzB,MAAK,QAAQ,WAAW,KAAK,EAAE,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,QAAQ,OAAc,MAAcD,MAA2B;AAC7D,QAAI,UAAU,KAAK,SAAS,IAAI,IAAI;AACpC,QAAI,CAAC,SAAS;AACZ,YAAM,OAAO,MACX,MAAM,KAAK,KAAK;AAAA,QACd,IAAI;AAAA,QACJ,MAAMA;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AACH,YAAM,SAAS,KAAK,WAAW,IAAI,IAAI,GAAG,QAAQ,QAAQ,QAAQ;AAClE,YAAM,KAAK,OAAO,KAAK,MAAM,IAAI;AACjC,gBAAU,EAAE,OAAO,IAAI,SAAS,CAAC,GAAG,WAAW,MAAM;AACrD,WAAK,SAAS,IAAI,MAAM,OAAO;AAC/B,SAAG,MAAM,MAAM,KAAK,SAAS,OAAO,IAAI,CAAC;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAwC;AAC9C,WAAO,KAAK,SAAS,IAAI,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,MAA6B;AACxC,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,CAAC,QAAS,QAAO,KAAK,WAAW,IAAI,IAAI,GAAG;AAChD,SAAK,SAAS,OAAO,IAAI;AACzB,UAAME,SAAQ,YAAY;AACxB,UAAI;AACF,cAAM,QAAQ,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,IAAI,MAAM,QAAQ,GAAG,CAAC;AAAA,MACvE,UAAE;AACA,aAAK,OAAO,QAAQ,OAAO,IAAI;AAAA,MACjC;AAAA,IACF,GAAG;AACH,UAAM,QAAQ,EAAE,OAAO,QAAQ,OAAO,MAAAA,MAAK;AAC3C,SAAK,WAAW,IAAI,MAAM,KAAK;AAC/B,UAAM,SAAS,MAAM;AACnB,UAAI,KAAK,WAAW,IAAI,IAAI,MAAM,MAAO,MAAK,WAAW,OAAO,IAAI;AAAA,IACtE;AACA,IAAAA,MAAK,KAAK,QAAQ,MAAM;AACxB,WAAOA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,QAA+B;AAC/C,UAAM,KAAK,cAAc,MAAM;AAC/B,UAAM,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAK,SAAS,KAAK,CAAC,EAAE,OAAO,CAAC,MAAMT,QAAO,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;AAAA,IAClF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,MAAc,QAAgBU,SAA+B;AACnF,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,CAAC,QAAS;AACd,UAAM,MAAM,SAASA;AACrB,QAAI,QAAQ,aAAa,QAAQ,QAAQ,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,SAAS,CAAC,GAAG;AAChF,YAAM,KAAK,OAAO,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,QAAQ,OAAc,OAAoB;AAChD,UAAM,QAAQ;AACd,UAAM,MAAM,MAAM;AAClB,UAAM,MAAM,MAAM;AAClB,UAAM,QAAQ,MAAM;AACpB,UAAM,KAAK;AAAA,MACT,WAAW,OAAO,OAAO,MAAM,IAAI,eAAe,MAAM,MAAM,YAAY,MAAM,OAAO,EAAE;AAAA,IAC3F;AAAA,EACF;AAAA,EAEQ,YAAY,QAAgB,OAA8B;AAChE,UAAM,QAAQ,KAAK,OAAO,IAAI,MAAM;AACpC,QAAI,CAAC,MAAO;AACZ,QAAI,UAAU,MAAM;AAClB,YAAM,MAAM,MAAM;AAClB,YAAM,MAAM,MAAM;AAClB,WAAK,KAAK,UAAU,MAAM;AAC1B;AAAA,IACF;AACA,UAAM,OAAO,MAAM,IAAI,CAAC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC;AAC7D,eAAW,QAAQ,KAAM,MAAK,OAAO,OAAO,IAAI;AAChD,SAAK,KAAK,UAAU,GAAG,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAO,OAAc,MAAoB;AACvC,eAAW,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,EAAG,KAAIV,QAAO,KAAK,IAAI,EAAG,OAAM,MAAM,OAAO,GAAG;AACxF,UAAM,MAAM,OAAO,IAAI;AACvB,UAAM,MAAM,OAAOE,UAAS,IAAI,CAAC;AACjC,eAAW,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,EAAG,KAAIF,QAAO,KAAK,IAAI,EAAG,OAAM,MAAM,OAAO,GAAG;AAAA,EAC1F;AAAA,EAEA,MAAM,QAAQ,OAAc,MAAcO,MAAkC;AAC1E,QAAI,MAAM,KAAK,QAAS,OAAM,MAAM,KAAK;AACzC,UAAM,SAAS,MAAM,MAAM,IAAI,IAAI;AACnC,QAAI,UAAU,OAAO,UAAU,KAAK,IAAI,EAAG,QAAO,OAAO;AACzD,UAAM,OAAQ,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,MAAMA,KAAI,CAAC;AAChE,UAAM,MAAM,MAAM,KAAK,WAAW;AAClC,QAAI,MAAM,EAAG,OAAM,MAAM,IAAI,MAAM,EAAE,OAAO,MAAM,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC;AAC7E,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAc,MAAcA,MAAqC;AAC7E,QAAI,MAAM,KAAK,QAAS,OAAM,MAAM,KAAK;AACzC,UAAM,SAAS,MAAM,MAAM,IAAI,IAAI;AACnC,QAAI,UAAU,OAAO,UAAU,KAAK,IAAI,EAAG,QAAO,OAAO;AACzD,UAAM,UAAW,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,MAAMA,KAAI,CAAC;AACnE,UAAM,MAAM,MAAM,KAAK,YAAY,MAAM,KAAK,WAAW;AACzD,QAAI,MAAM,EAAG,OAAM,MAAM,IAAI,MAAM,EAAE,OAAO,SAAS,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC;AAChF,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,MAAqE;AAChF,UAAM,QAAQ,KAAK,OAAO,cAAc,IAAI,CAAC;AAC7C,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,KAAM,MAAM,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,SAAS,CAAC;AACxD,QAAI,CAAC,GAAI,QAAO,EAAE,OAAO,GAAG,OAAO,EAAE;AACrC,WAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM;AAAA,EACjF;AAAA,EAEA,KAAK,MAA0B;AAC7B,WAAO,IAAI,QAAQ,MAAM,IAAI;AAAA,EAC/B;AACF;AAIA,SAAS,WAAW,SAAkC,MAAc,IAAkB;AACpF,QAAM,OAAO,QAAQ,GAAG,EAAE;AAC1B,MAAI,QAAQ,QAAQ,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,GAAG;AAC5C,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI;AAChC,SAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE;AAAA,EAChC,MAAO,SAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;AAChC;AAEA,IAAM,UAAN,MAAkC;AAAA,EACf;AAAA,EACA;AAAA,EAEjB,YAAY,OAAmB,MAAgB;AAC7C,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EACd;AAAA,EAEQ,GAAG,MAAmC;AAC5C,WAAO,KAAK,MAAM,OAAO,cAAc,IAAI,CAAC;AAAA,EAC9C;AAAA,EAEQ,SAAS,OAAc,MAAoB;AACjD,QAAI,SAAS,KAAK,EAAG,OAAM,WAAW,SAAS,IAAI;AAAA,EACrD;AAAA,EAEA,MAAc,OAAO,MAAc,OAAO,GAAG,SAAS,OAAwB;AAC5E,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,OAAO,cAAc,IAAI;AAC/B,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,GAAG;AAAA,IAC9D,SAAS,KAAK;AACZ,UAAI,UAAW,IAA2B,SAAS,SAAU,QAAO;AACpE,YAAM;AAAA,IACR;AACA,QAAI,KAAK,SAAS,UAAW,QAAO;AACpC,QAAI,QAAQR,WAAW,OAAM,WAAW,SAAS,IAAI;AACrD,UAAM,SAAU,MAAM,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,YAAY,MAAM,MAAM,IAAI,CAAC;AAC/E,WAAO,KAAK,OAAO,KAAK,KAAK,YAAYG,UAAS,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM;AAAA,EACpF;AAAA,EAEA,MAAc,KAAK,OAAcK,MAAa,OAAiC;AAC7E,WAAQ,MAAM,MAAM,KAAK,KAAK;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAMA;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,MAAc,MAAsB;AAC9C,WAAO,KAAK,KAAK,YAAY,MAAM,IAAI;AAAA,EACzC;AAAA,EAEA,MAAM,SAAS,MAA+B;AAC5C,WAAO,IAAI,YAAY,EAAE,OAAO,MAAM,KAAK,eAAe,IAAI,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,eAAe,MAAmC;AACtD,UAAM,OAAO,MAAM,KAAK,OAAO,IAAI;AACnC,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,eAAe,IAAI;AAChD,aAAS,UAAU,KAAK,WAAW;AACjC,UAAI;AACF,eAAO,MAAM,KAAK,UAAU,MAAM,OAAO,MAAM,MAAM,GAAG;AAAA,MAC1D,SAAS,KAAK;AACZ,YAAK,IAA2B,SAAS,YAAY,WAAW,cAAe,OAAM;AACrF,aAAK,MAAM,OAAO,MAAM,OAAO,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,OAAc,MAAcA,MAAkC;AACpF,UAAM,KAAK,MAAM,OAAO,IAAI;AAC5B,UAAM,OAAO,MAAM,KAAK,MAAM,QAAQ,OAAO,MAAMA,IAAG;AACtD,QAAI,KAAK,SAAS,YAAa,OAAM,WAAW,UAAU,IAAI;AAC9D,QAAI,MAAM,UAAU,KAAK,KAAK,OAAO,MAAM,SAAS;AAClD,YAAM,WAAW,SAAS,GAAG,IAAI,yCAAyC,MAAM,OAAO,GAAG;AAAA,IAC5F;AACA,UAAM,KAAK,MAAM,KAAK,KAAK,OAAOA,MAAK,KAAK;AAC5C,UAAMF,SAAQ,MAAM,KAAK,SAAS;AAClC,UAAMD,UAAuB,CAAC;AAC9B,QAAI,QAAQ;AACZ,QAAI;AACF,iBAAS;AACP,cAAM,QAAS,MAAM,MAAM,KAAK,KAAK;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,MAAMC;AAAA,QACR,CAAC;AACD,YAAI,MAAM,WAAW,EAAG;AACxB,QAAAD,QAAO,KAAK,KAAK;AACjB,iBAAS,MAAM;AACf,YAAI,MAAM,SAASC,UAAS,SAAS,KAAK,KAAM;AAAA,MAClD;AAAA,IACF,UAAE;AACA,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,GAAG,CAAC;AAAA,IAC7C;AACA,WAAOF,QAAOC,SAAQ,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,UAAU,MAAc,SAA6C;AACzE,UAAM,OAAO,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI;AAC5C,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,UAAU,MAAM,OAAO;AACpD,UAAM,EAAE,OAAO,KAAAG,KAAI,IAAI;AACvB,SAAK,SAAS,OAAO,IAAI;AACzB,UAAM,QAAQ,OAAO,YAAY,WAAW,IAAI,YAAY,EAAE,OAAO,OAAO,IAAI;AAChF,QAAI,MAAM,UAAU,KAAK,MAAM,SAAS,MAAM,SAAS;AACrD,YAAM;AAAA,QACJ;AAAA,QACA,GAAG,IAAI,+CAA+C,MAAM,OAAO;AAAA,MACrE;AAAA,IACF;AACA,aAAS,UAAU,KAAK,WAAW;AACjC,UAAI;AACF,eAAO,MAAM,KAAK,WAAW,OAAO,MAAMA,MAAK,KAAK;AAAA,MACtD,SAAS,KAAK;AACZ,YAAK,IAA2B,SAAS,YAAY,WAAW,cAAe,OAAM;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,OAAc,MAAcA,MAAa,OAAmB;AACnF,UAAM,KAAK,MAAM,OAAO,IAAI;AAC5B,SAAK,MAAM,OAAO,OAAO,IAAI;AAC7B,UAAM,KAAK,MAAM,KAAK,KAAK,OAAOA,MAAK,IAAI;AAC3C,UAAMF,SAAQ,MAAM,KAAK,SAAS;AAClC,QAAI;AACF,eAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAUA,QAAO;AAC3D,cAAM,OAAO,MAAM,MAAM,QAAQ,SAASA,MAAK;AAC/C,cAAM,MAAM,KAAK,KAAK,EAAE,IAAI,SAAS,IAAI,QAAQ,OAAO,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC;AAAA,MAC/E;AAAA,IACF,UAAE;AACA,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,GAAG,CAAC;AAC3C,WAAK,MAAM,OAAO,OAAO,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAc,QAAgBK,SAAgB,SAAuC;AAC/F,UAAM,OAAO,MAAM,KAAK,OAAO,IAAI;AACnC,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,SAAS,KAAK,KAAK,MAAO,QAAO,KAAK,KAAK,MAAM,MAAM,QAAQA,OAAM;AAC1E,QAAI,CAAC,MAAO,SAAQ,MAAM,KAAK,KAAK,eAAe,IAAI,GAAG,MAAM,QAAQ,SAASA,OAAM;AACvF,UAAM,EAAE,OAAO,KAAAH,KAAI,IAAI;AACvB,SAAK,MAAM,KAAK,MAAM,QAAQ,OAAO,MAAMA,IAAG,GAAG,SAAS,aAAa;AACrE,YAAM,WAAW,UAAU,IAAI;AAAA,IACjC;AACA,UAAM,KAAK,MAAM,kBAAkB,MAAM,QAAQG,OAAM;AACvD,UAAM,KAAM,MAAM,MAAM,KACrB,KAAK;AAAA,MACJ,IAAI;AAAA,MACJ,MAAMH;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,GAAI,YAAY,SAAY,EAAE,SAAS,QAAQ,IAAI,CAAC;AAAA,IACtD,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,YAAM,OAAO,YAAY,UAAc,IAA2B,SAAS;AAC3E,YAAM,OAAO,WAAW,UAAU,GAAG,IAAI,wBAAwB,IAAI;AAAA,IACvE,CAAC;AACH,UAAMF,SAAQ,MAAM,KAAK,SAAS;AAClC,UAAMD,UAAuB,CAAC;AAC9B,QAAI,QAAQ;AACZ,QAAI;AACF,aAAO,QAAQM,SAAQ;AACrB,cAAM,QAAS,MAAM,MAAM,KAAK,KAAK;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ,SAAS;AAAA,UACjB,MAAM,KAAK,IAAIL,QAAOK,UAAS,KAAK;AAAA,QACtC,CAAC;AACD,YAAI,MAAM,WAAW,EAAG;AACxB,QAAAN,QAAO,KAAK,KAAK;AACjB,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF,UAAE;AACA,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,GAAG,CAAC;AAAA,IAC7C;AACA,WAAOD,QAAOC,SAAQ,KAAK;AAAA,EAC7B;AAAA,EAEQ,KAAK,OAAc,MAAc,KAAmB;AAC1D,QAAI,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS;AAC5C,YAAM;AAAA,QACJ;AAAA,QACA,GAAG,IAAI,+CAA+C,MAAM,OAAO;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAc,QAAgB,OAAmB,WAAW,OAAsB;AAC7F,UAAM,OAAO,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI;AAC5C,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,SAAS,KAAK,KAAK,OAAQ,QAAO,KAAK,KAAK,OAAO,MAAM,QAAQ,KAAK;AAC3E,QAAI,CAAC;AACH,aAAO,KAAK,KAAK;AAAA,QACf;AAAA,QACA,QAAQ,MAAM,KAAK,KAAK,eAAe,IAAI,GAAG,QAAQ,KAAK;AAAA,MAC7D;AACF,UAAM,EAAE,OAAO,KAAAG,KAAI,IAAI;AACvB,SAAK,SAAS,OAAO,IAAI;AACzB,SAAK,KAAK,OAAO,MAAM,SAAS,MAAM,MAAM;AAC5C,SAAK,MAAM,OAAO,OAAO,IAAI;AAC7B,QAAI,MAAM,KAAK,UAAU;AACvB,YAAM,UAAU,KAAK,MAAM,QAAQ,OAAO,MAAMA,IAAG;AACnD,YAAM,MAAM,SAAS,MAAM;AAC3B,YAAM,KAAK,UAAU,OAAO,MAAM,QAAQ,IAAI,QAAQ,OAAO,QAAQ;AACrE,iBAAW,QAAQ,SAAS,QAAQ,GAAG;AACvC,WAAK,MAAM,OAAO,OAAO,IAAI;AAC7B;AAAA,IACF;AACA,UAAM,KAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MAChC,IAAI;AAAA,MACJ,MAAMA;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AACD,QAAI;AACF,YAAM,KAAK,UAAU,OAAO,IAAI,QAAQ,OAAO,QAAQ;AAAA,IACzD,UAAE;AACA,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,GAAG,CAAC;AAC3C,WAAK,MAAM,OAAO,OAAO,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAc,UACZ,OACA,IACA,QACA,OACA,UACe;AACf,UAAMF,SAAQ,MAAM,KAAK,SAAS;AAClC,aAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAMA,QAAO;AAC/C,YAAM,OAAO,OAAO,OAAO,UAAUA,MAAK,IAAI,QAAQ,MAAM,MAAM,IAAI,KAAKA,MAAK;AAChF,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,SAAS,IAAI,QAAQ,SAAS,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC;AAAA,IAC5F;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAc,MAA6B;AACxD,UAAM,OAAO,MAAM,KAAK,OAAO,IAAI;AACnC,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,SAAS,KAAK,KAAK,SAAU,QAAO,KAAK,KAAK,SAAS,MAAM,IAAI;AACtE,QAAI,CAAC,OAAO,MAAM,KAAK,QAAQ;AAC7B,aAAO,KAAK,UAAU,MAAM,QAAQ,MAAM,KAAK,eAAe,IAAI,GAAG,IAAI,CAAC;AAAA,IAC5E;AACA,UAAM,EAAE,OAAO,KAAAE,KAAI,IAAI;AACvB,SAAK,SAAS,OAAO,IAAI;AACzB,SAAK,KAAK,OAAO,MAAM,IAAI;AAC3B,SAAK,MAAM,OAAO,OAAO,IAAI;AAC7B,UAAM,UAAU,KAAK,MAAM,QAAQ,IAAI;AACvC,QAAI,QAAS,SAAQ,YAAY;AACjC,QAAI;AACF,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,MAAMA,MAAK,KAAK,CAAC;AAAA,IAC1D,UAAE;AACA,WAAK,MAAM,OAAO,OAAO,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAgC;AAC3C,QAAI,CAAC,KAAK,GAAG,IAAI,EAAG,QAAO,KAAK,KAAK,OAAO,IAAI;AAChD,QAAI;AACF,YAAM,KAAK,KAAK,IAAI;AACpB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,OAAQ,IAA2B;AACzC,UAAI,SAAS,YAAY,SAAS,UAAW,QAAO;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAA+B;AACzC,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,MAAM,IAAI;AACvC,UAAM,OAAO,cAAc,IAAI;AAC/B,QAAI,KAAK,MAAM,QAAQ,IAAI,GAAG,UAAW,OAAM,KAAK,MAAM,OAAO,IAAI;AACrE,WAAO,KAAK;AAAA,MACV,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,GAAG;AAAA,MACrD;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,YAAY,MAAkB,MAAc,OAAsB;AACxE,UAAM,QAAQ,KAAK,MAAM,QAAQ,IAAI,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG;AAC3E,WAAO,OAAO,EAAE,GAAG,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,GAAG,IAAI,EAAE,GAAG,MAAM,KAAK;AAAA,EAC5E;AAAA,EAEA,MAAM,KAAK,MAA+B;AACxC,UAAM,OAAO,MAAM,KAAK,OAAO,IAAI;AACnC,WAAO,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI;AAAA,EAC/D;AAAA,EAEA,MAAc,QACZ,MAC8D;AAC9D,UAAM,OAAO,MAAM,KAAK,OAAO,IAAI;AACnC,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,OAAM,WAAW,WAAW,IAAI;AAC5C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,MAAM;AAAA,MACb,MAAM,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,GAAG;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAiC;AAC7C,QAAI,CAAC,KAAK,GAAG,IAAI,EAAG,QAAO,KAAK,KAAK,QAAQ,IAAI;AACjD,YAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EAC1D;AAAA,EAEA,MAAM,YAAY,MAAuD;AACvE,QAAI,CAAC,KAAK,GAAG,IAAI,EAAG,QAAO,KAAK,KAAK,YAAY,IAAI;AACrD,UAAM,EAAE,MAAM,OAAO,KAAK,IAAI,MAAM,KAAK,QAAQ,IAAI;AACrD,WAAO,QAAQ;AAAA,MACb,KAAK,IAAI,OAAO,UAA4C;AAC1D,cAAM,QAAQ,cAAc,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE;AACnD,YAAI,MAAM,QAAQ,MAAM,KAAK,cAAc;AACzC,iBAAO,CAAC,MAAM,MAAM,KAAK,YAAY,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,QAChE;AACA,eAAO,CAAC,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAc,UAAmC,CAAC,GAAkB;AAC9E,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,MAAM,MAAM,OAAO;AAChD,UAAM,EAAE,OAAO,KAAAA,KAAI,IAAI;AACvB,UAAM,OAAO,cAAc,IAAI;AAC/B,SAAK,SAAS,OAAO,IAAI;AACzB,QAAI,CAAC,QAAQ,WAAW;AACtB,UAAIA,SAAQ,IAAK,OAAM,WAAW,UAAU,IAAI;AAChD,WAAK,MAAM,OAAO,OAAO,IAAI;AAC7B,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,SAAS,MAAMA,KAAI,CAAC;AAChD;AAAA,IACF;AACA,UAAM,QAAQA,KAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3C,aAAS,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK;AACtC,YAAM,MAAM,IAAI,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAC3C,YAAM,OAAO,cAAc,GAAG,MAAM,MAAM,GAAG,GAAG,EAAE;AAClD,YAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,OAAO,MAAM,GAAG,EAAE,MAAM,MAAM,MAAS;AAC/E,UAAI,QAAQ,SAAS,YAAa;AAClC,UAAI,OAAQ,OAAM,WAAW,WAAW,IAAI;AAC5C,WAAK,MAAM,OAAO,OAAO,IAAI;AAC7B,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,SAAS,MAAM,IAAI,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,GAAG,MAAc,UAAoD,CAAC,GAAkB;AAC5F,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,GAAG,MAAM,OAAO;AAC7C,UAAM,EAAE,OAAO,KAAAA,KAAI,IAAI;AACvB,UAAM,OAAO,cAAc,IAAI;AAC/B,QAAIA,SAAQ,IAAK,OAAM,WAAW,SAAS,GAAG,IAAI,mBAAmB;AACrE,SAAK,SAAS,OAAO,IAAI;AACzB,UAAM,KAAK,MAAM,YAAY,IAAI;AACjC,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,KAAK,MAAM,QAAQ,OAAO,MAAMA,IAAG;AAAA,IAClD,SAAS,KAAK;AACZ,UAAI,QAAQ,SAAU,IAA2B,SAAS,SAAU;AACpE,YAAM;AAAA,IACR;AACA,SAAK,MAAM,OAAO,OAAO,IAAI;AAC7B,QAAI,KAAK,SAAS,eAAe,QAAQ,WAAW;AAClD,iBAAW,SAAS,MAAM,KAAK,MAAM,QAAQ,OAAO,MAAMA,IAAG,GAAG;AAC9D,cAAM,KAAK,GAAG,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,OAAO,QAAQ,SAAS,MAAM,CAAC;AAAA,MAC3F;AACA,WAAK,MAAM,OAAO,OAAO,IAAI;AAAA,IAC/B;AACA,UAAM,MAAM,KAAK,KAAK,EAAE,IAAI,KAAK,SAAS,cAAc,UAAU,UAAU,MAAMA,KAAI,CAAC;AACvF,SAAK,MAAM,OAAO,OAAO,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,MAAc,IAA2B;AACpD,UAAM,IAAI,KAAK,GAAG,IAAI;AACtB,UAAM,IAAI,KAAK,GAAG,EAAE;AACpB,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO,KAAK,KAAK,OAAO,MAAM,EAAE;AAC9C,QAAI,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAO,OAAM,WAAW,SAAS,GAAG,IAAI,OAAO,EAAE,EAAE;AACjF,SAAK,SAAS,EAAE,OAAO,cAAc,EAAE,CAAC;AACxC,UAAM,KAAK,MAAM,YAAY,IAAI;AACjC,UAAM,KAAK,MAAM,YAAY,EAAE;AAC/B,SAAK,MAAM,OAAO,EAAE,OAAO,cAAc,IAAI,CAAC;AAC9C,SAAK,MAAM,OAAO,EAAE,OAAO,cAAc,EAAE,CAAC;AAC5C,QAAI;AACF,YAAM,EAAE,MAAM,KAAK,KAAK,EAAE,IAAI,UAAU,MAAM,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,IAClE,UAAE;AACA,WAAK,MAAM,OAAO,EAAE,OAAO,cAAc,IAAI,CAAC;AAC9C,WAAK,MAAM,OAAO,EAAE,OAAO,cAAc,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAgB,MAA6B;AACzD,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,QAAQ,QAAQ,IAAI;AACjD,SAAK,SAAS,MAAM,OAAO,cAAc,IAAI,CAAC;AAC9C,QAAI,CAAC,MAAM,MAAM,KAAK;AACpB,YAAM,WAAW,SAAS,GAAG,IAAI,oCAAoC;AACvE,SAAK,MAAM,OAAO,MAAM,OAAO,cAAc,IAAI,CAAC;AAClD,UAAM,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,QAAQ,MAAM,MAAM,IAAI,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,SAAS,MAAcI,SAAkC;AAC7D,QAAI,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK,SAAU,OAAM,WAAW,UAAU,IAAI;AACzE,UAAM,OAAO,MAAM,KAAK,KAAK,SAAS,MAAMA,OAAM;AAClD,QAAI,KAAK,GAAG,IAAI,EAAG,OAAM,WAAW,UAAU,IAAI;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,MAA+B;AAC5C,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,SAAS,IAAI;AAC1C,WAAQ,MAAM,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,YAAY,MAAM,MAAM,IAAI,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,MAAM,MAAc,MAA6B;AACrD,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,MAAM,MAAM,IAAI;AAC7C,SAAK,SAAS,MAAM,OAAO,cAAc,IAAI,CAAC;AAC9C,QAAI,CAAC,MAAM,MAAM,KAAK,MAAO;AAC7B,SAAK,MAAM,OAAO,MAAM,OAAO,cAAc,IAAI,CAAC;AAClD,UAAM,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,EACtE;AAAA,EAEA,MAAM,OAAO,MAAc,OAAa,OAA4B;AAClE,UAAM,OAAO,MAAM,KAAK,OAAO,IAAI;AACnC,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK;AACtD,UAAM,KAAK,SAAS,OAAO,MAAM,KAAK;AAAA,EACxC;AAAA,EAEA,MAAM,QAAQ,MAAc,OAAa,OAA4B;AACnE,UAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,QAAI,CAAC,MAAO,QAAO,UAAU,KAAK,MAAM,MAAM,OAAO,KAAK;AAC1D,UAAM,OAAO,cAAc,IAAI;AAC/B,QAAI,CAAC,MAAM,MAAM,KAAK,cAAc,MAAM,KAAK,MAAM,IAAI,GAAG,gBAAgB;AAC1E,YAAM,WAAW,cAAc,IAAI;AAAA,IACrC;AACA,UAAM,KAAK,SAAS,OAAO,MAAM,KAAK;AAAA,EACxC;AAAA,EAEA,MAAc,SAAS,OAAgB,MAAc,OAA4B;AAC/E,SAAK,SAAS,MAAM,OAAO,IAAI;AAC/B,SAAK,MAAM,OAAO,MAAM,OAAO,IAAI;AACnC,UAAM,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,WAAW,MAAM,MAAM,KAAK,OAAO,MAAM,QAAQ,EAAE,CAAC;AAAA,EACxF;AACF;;;AC9/BA,IAAM,WAAW,oBAAI,IAA8B;AAE5C,SAAS,gBAAgB,OAAiC;AAC/D,QAAM,QAAQ,OAAO,WAAW;AAChC,WAAS,IAAI,OAAO,KAAK;AACzB,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAwC;AACzE,SAAO,SAAS,IAAI,KAAK,KAAK;AAChC;AAEO,SAAS,kBAAkB,OAAqB;AACrD,WAAS,OAAO,KAAK;AACvB;;;ACcO,IAAM,6BAA6B;AA+DnC,SAAS,UAAU,MAAc,OAAyC;AAC/E,SAAO,OAAO,OAAO,IAAI,MAAM,GAAG,IAAI,KAAK,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;AAC/D;;;ACzGO,SAAS,QAAQ,KAA4B;AAClD,QAAMC,WAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,QAAM,OAAQ,KAA4B;AAC1C,MAAI,OAAO,SAAS,YAAY,YAAY,KAAK,IAAI,GAAG;AACtD,WAAO,EAAE,IAAI,OAAO,OAAO,MAAM,SAAAA,SAAQ;AAAA,EAC3C;AACA,SAAO,EAAE,IAAI,OAAO,OAAO,OAAO,SAAAA,SAAQ;AAC5C;AAmBA,SAAS,SAAS,GAA2B;AAC3C,SAAO;AAAA,IACL,aAAa,EAAE;AAAA,IACf,QAAQ,EAAE;AAAA,IACV,gBAAgB,EAAE;AAAA,IAClB,MAAM,EAAE;AAAA,IACR,MAAM,EAAE;AAAA,IACR,SAAS,EAAE,MAAM,QAAQ;AAAA,IACzB,SAAS,EAAE,MAAM,QAAQ;AAAA,IACzB,SAAS,EAAE,MAAM,QAAQ;AAAA,IACzB,KAAK,EAAE;AAAA,IACP,GAAI,EAAE,QAAQ,SAAY,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;AAAA,IAC5C,GAAI,EAAE,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,IACvC,GAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC1C,GAAI,EAAE,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IACnC,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC1D;AACF;AAEA,eAAe,YACb,IACA,KACiD;AACjD,UAAQ,MAAM,GAAG,YAAY,GAAG,GAAG,IAAI,CAAC,CAACC,OAAM,IAAI,MAAM,CAACA,OAAM,QAAQ,SAAS,IAAI,CAAC,CAAC;AACzF;AAEA,eAAe,eAA4C;AACzD,QAAM,WAAW,MAAM,WAAW,WAAW,SAAS,WAAW;AACjE,MAAI,OAAO,UAAU,UAAU,SAAU,QAAO;AAChD,SAAO,EAAE,OAAO,SAAS,OAAO,OAAO,SAAS,SAAS,EAAE;AAC7D;AAEA,IAAM,OAAqB,EAAE,IAAI,MAAM,MAAM,OAAO;AAEpD,SAASC,MAAK,OAA8B;AAC1C,SAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM;AAC/C;AAEA,eAAe,IACb,OACA,MACA,KACuB;AACvB,QAAM,EAAE,IAAI,IAAI,IAAI;AACpB,UAAQ,IAAI,IAAI;AAAA,IACd,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,MAAM,SAAS,OAAO,MAAM,GAAG,eAAe,IAAI,EAAE;AAAA,IACzE,KAAK;AACH,YAAM,GAAG,UAAU,MAAM,IAAI,QAAQ,IAAI,WAAW,CAAC,CAAC;AACtD,aAAO;AAAA,IACT,KAAK;AACH,aAAOA,MAAK,MAAM,GAAG,OAAO,IAAI,CAAC;AAAA,IACnC,KAAK;AACH,aAAOA,MAAK,SAAS,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC;AAAA,IAC3C,KAAK;AACH,aAAOA,MAAK,SAAS,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,IAC5C,KAAK;AACH,aAAOA,MAAK,MAAM,GAAG,QAAQ,IAAI,CAAC;AAAA,IACpC,KAAK;AACH,aAAOA,MAAK,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,IACzC,KAAK;AACH,YAAM,GAAG,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACxC,aAAO;AAAA,IACT,KAAK;AACH,YAAM,GAAG,GAAG,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,aAAO;AAAA,IACT,KAAK,UAAU;AACb,YAAM,KAAK,GAAG,YAAY,KAAK,IAAI,QAAQ,EAAE;AAC7C,YAAM,GAAG,OAAO,MAAM,EAAE;AACxB,YAAM,UAAU,MAAM,EAAE;AACxB,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,WAAK,MAAM,GAAG,MAAM,IAAI,GAAG,YAAa,OAAM,UAAU,UAAU,IAAI;AACtE,YAAM,GAAG,GAAG,IAAI;AAChB,aAAO;AAAA,IACT,KAAK;AACH,UAAI,EAAE,MAAM,GAAG,MAAM,IAAI,GAAG,YAAa,OAAM,UAAU,WAAW,IAAI;AACxE,WAAK,MAAM,GAAG,QAAQ,IAAI,GAAG,SAAS,EAAG,OAAM,UAAU,aAAa,IAAI;AAC1E,YAAM,GAAG,GAAG,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,aAAO;AAAA,IACT,KAAK;AACH,YAAM,GAAG,QAAQ,IAAI,QAAQ,IAAI,IAAI;AACrC,aAAO;AAAA,IACT,KAAK;AACH,YAAM,gBAAgB,IAAI,IAAI;AAC9B,aAAO;AAAA,IACT,KAAK;AACH,aAAOA,MAAK,MAAM,GAAG,SAAS,IAAI,CAAC;AAAA,IACrC,KAAK;AACH,YAAM,GAAG,MAAM,MAAM,IAAI,QAAQ,CAAC;AAClC,aAAO;AAAA,IACT,KAAK;AACH,YAAM,GAAG,OAAO,MAAM,IAAI,KAAK,IAAI,WAAW,CAAC,GAAG,IAAI,KAAK,IAAI,WAAW,CAAC,CAAC;AAC5E,aAAO;AAAA,IACT,KAAK;AACH,YAAM,UAAU,IAAI,MAAM,IAAI,KAAK,IAAI,WAAW,CAAC,GAAG,IAAI,KAAK,IAAI,WAAW,CAAC,CAAC;AAChF,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,IAAI,MAAM,GAAG;AAAA,IAC7B;AACE,aAAO,EAAE,IAAI,OAAO,OAAO,UAAU,SAAS,wBAAwB,IAAI,EAAY,IAAI;AAAA,EAC9F;AACF;AAEA,eAAe,gBAAgB,IAAc,MAA6B;AACxE,MAAI,GAAG,gBAAiB,QAAO,GAAG,gBAAgB,IAAI;AACtD,MACE,MAAM,GAAG,MAAM,IAAI,EAAE;AAAA,IACnB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,UAAM,UAAU,UAAU,IAAI;AAChC,QAAM,GAAG,UAAU,MAAM,IAAI,WAAW,CAAC,CAAC;AAC5C;AAEA,eAAe,OAAO,IAAc,MAAc,KAA2C;AAC3F,QAAM,MAAM,UAAU,EAAE;AACxB,MAAI,CAAC,IAAK,OAAM,UAAU,UAAU,IAAI;AACxC,QAAM,SAAS,IAAI,UAAU;AAC7B,MAAI,IAAI,OAAO;AACb,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,MAAM,IAAI,MAAM,MAAM,QAAQ,IAAI,UAAU,GAAG,IAAI,OAAO;AAAA,IACnE;AACF,MAAI,IAAI,OAAO,SAAU,OAAM,IAAI,OAAO,MAAM,QAAQ,IAAI,QAAQ,IAAI,WAAW,CAAC,GAAG,IAAI;AAAA,MACtF,OAAM,IAAI,SAAS,MAAM,IAAI,UAAU,CAAC;AAC7C,SAAO;AACT;AAEA,IAAM,eAAe,oBAAI,IAAc,CAAC,QAAQ,SAAS,UAAU,UAAU,CAAC;AAC9E,IAAM,UAAU,oBAAI,IAAc,CAAC,MAAM,UAAU,SAAS,QAAQ,CAAC;AAErE,eAAe,OAAO,OAAyB,MAAc,QAAkC;AAC7F,MAAI,WAAW,OAAW,QAAO,MAAM,UAAU,MAAM,GAAG,UAAU;AACpE,QAAM,OAAO,MAAM,WAAW,IAAI;AAClC,SAAO,QAAQ,CAAE,MAAM,MAAM,GAAG,OAAO,IAAI,IAAK,KAAK,SAAS;AAChE;AAEA,eAAsB,eAAe,KAA2C;AAC9E,QAAM,QAAQ,mBAAmB,IAAI,KAAK;AAC1C,MAAI,CAAC,MAAO,QAAO,EAAE,IAAI,OAAO,OAAO,UAAU,SAAS,oCAAoC;AAC9F,QAAM,EAAE,IAAI,IAAI,IAAI;AACpB,MAAI;AACF,UAAM,OAAO,GAAG,YAAY,KAAK,IAAI,IAAI;AACzC,QAAI,IAAI,OAAO,OAAQ,QAAOA,MAAK,MAAM,UAAU,IAAI,UAAU,EAAE,MAAM,MAAS;AAClF,QAAI,IAAI,OAAO,SAAU,QAAOA,MAAM,MAAM,MAAM,SAAS,IAAI,KAAO,MAAM,aAAa,CAAE;AAC3F,QAAI,IAAI,OAAO,QAAQ;AACrB,YAAM,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,OAAO,KAAK,IAAI,QAAQ,KAAK,OAAO,CAAC;AAC5E,UAAI,MAAM,MAAM;AACd,cAAM,OAAO,MAAM,GAAG,WAAW,MAAM,IAAI,EAAE,MAAM,MAAM,IAAI;AAC7D,eAAOA,MAAK,MAAM,OAAO,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI;AAAA,MACxD;AACA,YAAM,OAAO,MAAM,IAAI,MAAM,QAAW,IAAI,MAAM;AAClD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,UAAU,IAAI,EAAG,QAAO,EAAE,IAAI,OAAO,OAAO,OAAO,SAAS,GAAG,IAAI,iBAAiB;AAC9F,QAAK,IAAI,OAAO,WAAW,IAAI,SAAS,KAAM,aAAa,IAAI,IAAI,EAAE,GAAG;AACtE,YAAM,QAAQ,YAAY,IAAI,OAAO,MAAM,OAAO,OAAO,MAAM,IAAI,MAAM,GAAG,GAAG;AAC/E,aAAO,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM;AAAA,IAC7D;AACA,QAAI,CAAC,MAAM,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,EAAG,QAAO,MAAM,IAAI,OAAO,MAAM,GAAG;AACzE,UAAM,SAAS,IAAI,OAAO,WAAW,GAAG,YAAY,KAAK,IAAI,QAAQ,EAAE,IAAI;AAC3E,WAAO,MAAM,MAAM,IAAI,QAAQ,MAAM,IAAI,OAAO,MAAM,GAAG,CAAC;AAAA,EAC5D,SAAS,KAAK;AACZ,WAAO,QAAQ,GAAG;AAAA,EACpB;AACF;;;AC5MO,IAAM,iBAAiB;AACvB,IAAM,mBAAmB,iBAAiB;AAE1C,IAAM,cAAc;AACpB,IAAM,YAAY;AAClB,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,IAAM,gBAAgB;AAEtB,IAAM,eAAe;AAErB,IAAM,eAAe;AAErB,IAAM,iBAAiB;AAEvB,IAAM,kBAAkB;AAExB,IAAM,eAAe;AAErB,IAAM,cAAc;AAEpB,IAAM,aAAa;AAE1B,IAAM,MAAM,KAAK;AAEV,SAAS,SAASC,SAAoB,IAAY,IAAY,OAAqB;AACxF,UAAQ,MAAMA,SAAQ,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC;AACjD,UAAQ,MAAMA,SAAQ,IAAK,QAAQ,MAAO,CAAC;AAC7C;AAaO,IAAM,kBAAkB;AAExB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AAEzB,IAAM,2BAA2B,OAAO;AAExC,IAAM,gBAAgB,mBAAmB;AAEzC,IAAM,mBAAmB;AAEzB,IAAM,oBAAoB;AAoBjC,IAAM,UAAU,IAAI,YAAY;AAChC,IAAM,UAAU,IAAI,YAAY;AAEzB,SAAS,gBAAgB,QAAwC;AACtE,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,QAAQ,OAAO,KAAK,UAAU,EAAE,OAAO,OAAO,OAAO,SAAS,OAAO,QAAQ,CAAC,CAAC;AAAA,IAC1F;AAAA,EACF;AACA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,QAAQ,kBAAkB,SAAS,OAAO,MAAM;AAAA,IAC3D,KAAK;AACH,aAAO,EAAE,QAAQ,iBAAiB,SAAS,QAAQ,OAAO,KAAK,UAAU,OAAO,IAAI,CAAC,EAAE;AAAA,IACzF;AACE,aAAO,EAAE,QAAQ,iBAAiB,SAAS,IAAI,WAAW,CAAC,EAAE;AAAA,EACjE;AACF;AAsCO,SAAS,SAAS,KAAkC;AACzD,MAAI,IAAI,aAAa,eAAe;AAClC,UAAM,IAAI,MAAM,+BAA+B,IAAI,UAAU,MAAM,aAAa,GAAG;AAAA,EACrF;AACA,SAAO;AAAA,IACL,QAAQ,IAAI,WAAW,KAAK,GAAG,cAAc;AAAA,IAC7C,QAAQ,IAAI,WAAW,KAAK,gBAAgB;AAAA,EAC9C;AACF;;;ACvGA,IAAM,iBAAiB,6BAA6B;AAQ7C,SAAS,uBACd,MACA,KACA,OACA,MACwB;AACxB,QAAM,QAAkB,SAAS,GAAG;AACpC,QAAM,EAAE,QAAAC,SAAQ,OAAO,IAAI;AAC3B,QAAM,UAAU,oBAAI,IAA4B;AAChD,MAAI,WAAW;AAEf,QAAM,EAAE,UAAAC,UAAS,IAAI;AAErB,WAAS,KAAK,IAAkB;AAC9B,UAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,QAAI,CAAC,MAAO;AACZ,iBAAa,MAAM,KAAK;AACxB,YAAQ,OAAO,EAAE;AAAA,EACnB;AAEA,WAAS,QAAQ,IAAY,OAAuB,QAAsB;AACxE,QAAI,QAAQ,KAAKD,SAAQ,SAAS,MAAM,IAAI;AAC1C,WAAK,EAAE;AACP;AAAA,IACF;AACA,UAAME,SAAQ,KAAK,IAAI,OAAO,YAAY,MAAM,QAAQ,aAAa,MAAM;AAC3E,QAAIA,SAAQ,EAAG,QAAO,IAAI,MAAM,QAAQ,SAAS,QAAQ,SAASA,MAAK,CAAC;AACxE,YAAQ,MAAMF,SAAQ,cAAc,MAAM,MAAM;AAChD,aAASA,SAAQ,aAAa,gBAAgB,MAAM,QAAQ,UAAU;AACtE,YAAQ,MAAMA,SAAQ,aAAaE,MAAK;AACxC,aAASF,SAAQ,cAAc,iBAAiB,MAAM;AACtD,YAAQ,MAAMA,SAAQ,WAAW,EAAE;AACnC,YAAQ,MAAMA,SAAQ,aAAa,eAAe;AAClD,YAAQ,IAAIA,SAAQ,WAAW,CAAC;AAChC,YAAQ,OAAOA,SAAQ,SAAS;AAEhC,QAAI,SAASE,UAAS,MAAM,QAAQ,WAAY,MAAK,EAAE;AAAA,EACzD;AAEA,WAAS,OAAO,IAAY,QAA4B;AACtD,QAAI,SAAU;AACd,UAAM,EAAE,QAAQ,QAAQ,IAAI,gBAAgB,MAAM;AAElD,SAAK,EAAE;AACP,UAAM,QAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,OAAO,WAAW,MAAM,KAAK,EAAE,GAAG,cAAc;AAAA,IAClD;AACA,YAAQ,IAAI,IAAI,KAAK;AACrB,YAAQ,IAAI,OAAO,CAAC;AAAA,EACtB;AAEA,QAAM,UAAU,CAAC,UAA8B;AAC7C,UAAM,OAAO,MAAM;AAGnB,QAAI,CAAC,QAAQ,OAAO,KAAK,OAAO,SAAU;AAC1C,QAAI,KAAK,SAAS,mBAAmB;AACnC,YAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE;AACjC,YAAM,SAAU,KAAiC;AACjD,UACE,CAAC,SACD,OAAO,WAAW,YAClB,CAAC,OAAO,UAAU,MAAM,KACxB,SAAS,KACT,SAAS,MAAM,QAAQ,YACvB;AACA,eAAO,KAAK,IAAI,EAAE,IAAI,OAAO,OAAO,OAAO,SAAS,6BAA6B,CAAC;AAClF;AAAA,MACF;AACA,cAAQ,KAAK,IAAI,OAAO,MAAM;AAC9B;AAAA,IACF;AACA,QAAI,KAAK,SAAS,oBAAoB,CAAC,KAAK,OAAO,OAAO,KAAK,QAAQ,SAAU;AACjF,UAAM,KAAK,KAAK;AAEhB,UAAM,OAAQ,KAAuB;AACrC,UAAM,MAAM,EAAE,GAAG,MAAM,MAAM;AAC7B,QAAI;AACJ,QAAI;AACF,mBAAaD,UAAS,GAAG;AAAA,IAC3B,SAAS,KAAK;AACZ,aAAO,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC1D,CAAC;AACD;AAAA,IACF;AACA,SAAK,WAAW;AAAA,MACd,CAAC,WAAW,OAAO,IAAI,MAAM;AAAA,MAC7B,CAAC,QACC,OAAO,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC1D,CAAC;AAAA,IACL;AAAA,EACF;AAEA,OAAK,iBAAiB,WAAW,OAAO;AACxC,SAAO;AAAA,IACL,SAAS,MAAM;AACb,UAAI,SAAU;AACd,iBAAW;AACX,WAAK,oBAAoB,WAAW,OAAO;AAC3C,iBAAW,MAAM,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAG,MAAK,EAAE;AAAA,IAC/C;AAAA,EACF;AACF;;;ACnJO,IAAM,WAAyC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAME,QAAO,CAAC,WAAkC,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM;AACtF,IAAMC,QAAqB,EAAE,IAAI,MAAM,MAAM,OAAO;AAO7C,IAAM,YAAN,MAAgB;AAAA,EACJ,OAAO,oBAAI,IAAiC;AAAA,EAE7D,KAAK,KAAa,MAAc,WAAoB,IAAqB;AACvE,UAAM,UAAU,KAAK,KAAK,IAAI,IAAI,KAAK,oBAAI,IAAoB;AAC/D,eAAW,CAAC,OAAO,CAAC,KAAK,QAAS,KAAI,UAAU,QAAQ,aAAa,EAAE,WAAY,QAAO;AAC1F,UAAM,OAAO,QAAQ,IAAI,GAAG,KAAK,EAAE,WAAW,KAAK,oBAAI,IAAY,EAAE;AACrE,SAAK,YAAY;AACjB,SAAK,IAAI,IAAI,EAAE;AACf,YAAQ,IAAI,KAAK,IAAI;AACrB,SAAK,KAAK,IAAI,MAAM,OAAO;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KAAa,MAAoB;AACtC,UAAM,UAAU,KAAK,KAAK,IAAI,IAAI;AAClC,aAAS,OAAO,GAAG;AACnB,QAAI,SAAS,SAAS,EAAG,MAAK,KAAK,OAAO,IAAI;AAAA,EAChD;AAAA,EAEA,OAAO,KAAa,IAAkB;AACpC,eAAW,CAAC,MAAM,OAAO,KAAK,CAAC,GAAG,KAAK,IAAI,GAAG;AAC5C,YAAM,OAAO,QAAQ,IAAI,GAAG;AAC5B,UAAI,MAAM,IAAI,OAAO,EAAE,KAAK,KAAK,IAAI,SAAS,EAAG,MAAK,OAAO,KAAK,IAAI;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,QAAQ,KAAmB;AACzB,eAAW,QAAQ,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,EAAG,MAAK,OAAO,KAAK,IAAI;AAAA,EACjE;AACF;AAIO,IAAM,WAAN,MAAe;AAAA,EACZ,OAAO;AAAA,EACE,UAAU,oBAAI,IAAsC;AAAA,EACpD,QAAkB,CAAC;AAAA,EACnB,UAAU,oBAAI,IAA6B;AAAA,EAC3C,UAAU,oBAAI,IAAgB;AAAA,EACvC,SAAS;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAYC,MAAU,SAAsB;AAC1C,SAAK,MAAMA;AACX,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,KAA6B;AAClC,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,UAAU,IAAI,gBAAgB;AACpC,SAAK,QAAQ,IAAI,IAAI,OAAO;AAC5B,SAAK,IAAI,KAAK,QAAQ,MAAM,EAAE;AAAA,MAC5B,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM;AAAA,MACpC,CAAC,QAAiB,KAAK,SAAS,IAAI,EAAE,IAAI,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG,EAAE,CAAC;AAAA,IACvF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAwB;AAC9B,UAAM,KAAK,KAAK,KAAK;AACrB,SAAK,SAAS,IAAIF,MAAK,KAAK,CAAC;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,OAAe;AACb,UAAM,KAAK,KAAK;AAChB,SAAK,QAAQ,IAAI,IAAI,MAAS;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,IAA0B;AAC7B,QAAI,CAAC,KAAK,QAAQ,IAAI,EAAE,EAAG,OAAM,IAAI,YAAY,QAAQ;AACzD,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,QAAQ;AAC3C,SAAK,OAAO,EAAE;AACd,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,IAAkB;AACvB,SAAK,QAAQ,IAAI,EAAE,GAAG,MAAM;AAC5B,SAAK,OAAO,EAAE;AAAA,EAChB;AAAA,EAEQ,OAAO,IAAkB;AAC/B,SAAK,QAAQ,OAAO,EAAE;AACtB,SAAK,QAAQ,OAAO,EAAE;AACtB,UAAM,KAAK,KAAK,MAAM,QAAQ,EAAE;AAChC,QAAI,MAAM,EAAG,MAAK,MAAM,OAAO,IAAI,CAAC;AAAA,EACtC;AAAA,EAEA,MAAM,KAAK,WAA+B,QAAsC;AAC9E,eAAS;AACP,UAAI,KAAK,OAAQ,QAAO;AACxB,YAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,UAAI,OAAO,OAAW,QAAO;AAC7B,UAAI,cAAc,UAAa,aAAa,EAAG,QAAO;AACtD,YAAM,OAAO,MAAM,KAAK,MAAM,WAAW,MAAM;AAC/C,UAAI,CAAC,KAAM,QAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS;AACd,SAAK,KAAK;AAAA,EACZ;AAAA,EAEQ,MAAM,WAA+B,QAAuC;AAClF,WAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,UAAI;AACJ,YAAM,UAAU,MAAM;AACpB,qBAAa,KAAK;AAClB,aAAK,QAAQ,OAAO,IAAI;AACxB,eAAO,oBAAoB,SAAS,KAAK;AAAA,MAC3C;AACA,YAAM,OAAO,MAAM;AACjB,gBAAQ;AACR,gBAAQ,IAAI;AAAA,MACd;AACA,YAAM,QAAQ,MAAM;AAClB,gBAAQ;AACR,eAAO,IAAI,YAAY,OAAO,CAAC;AAAA,MACjC;AACA,WAAK,QAAQ,IAAI,IAAI;AACrB,aAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACtD,UAAI,cAAc,QAAW;AAC3B,gBAAQ,WAAW,MAAM;AACvB,kBAAQ;AACR,kBAAQ,KAAK;AAAA,QACf,GAAG,SAAS;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,SAAS,IAAY,QAA4B;AACvD,SAAK,QAAQ,OAAO,EAAE;AACtB,QAAI,CAAC,KAAK,QAAQ,IAAI,EAAE,EAAG;AAC3B,SAAK,QAAQ,IAAI,IAAI,MAAM;AAC3B,SAAK,MAAM,KAAK,EAAE;AAClB,SAAK,KAAK;AACV,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,OAAa;AACnB,eAAW,QAAQ,CAAC,GAAG,KAAK,OAAO,EAAG,MAAK;AAAA,EAC7C;AACF;AAUA,eAAsB,YAAY,KAAkB,KAA4C;AAC9F,UAAQ,IAAI,IAAI;AAAA,IACd,KAAK;AACH,UAAI,CAAC,IAAI,MAAO,OAAM,IAAI,YAAY,QAAQ;AAC9C,UAAI,CAAC,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,WAAW,IAAI,EAAE;AAC1D,cAAM,IAAI,YAAY,QAAQ;AAChC,aAAOC;AAAA,IACT,KAAK;AACH,UAAI,OAAO,OAAO,IAAI,KAAK,IAAI,IAAI;AACnC,aAAOA;AAAA,IACT,KAAK;AACH,UAAI,CAAC,IAAI,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,QAAQ;AACvD,aAAOD,MAAK,IAAI,IAAI,OAAO,IAAI,GAAG,CAAC;AAAA,IACrC,KAAK;AACH,aAAOA,MAAK,MAAM,IAAI,IAAI,KAAK,IAAI,WAAW,IAAI,SAAS,CAAC,CAAC;AAAA,IAC/D,KAAK;AACH,aAAO,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,IAC5B,KAAK;AACH,aAAOA,MAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,CAAC;AAAA,IACxC,KAAK;AACH,aAAOA,MAAK,IAAI,IAAI,KAAK,CAAC;AAAA,IAC5B,KAAK;AACH,UAAI,IAAI,OAAO,IAAI,EAAE;AACrB,aAAOC;AAAA,IACT,KAAK;AACH,UAAI,IAAI,MAAM;AACd,aAAOA;AAAA,EACX;AACF;;;AC3NO,IAAM,gBAAgB;AAEtB,IAAM,wBAAwB,CAAC,IAAI,GAAG,GAAG,CAAC;AAE1C,IAAM,gBAAgB;AAEtB,IAAM,oBAAoB,iBAAiB,aAAa;AAExD,SAAS,eAAe,MAAsB;AACnD,QAAM,MAAM,IAAI,IAAI,IAAI;AACxB,MAAI,IAAI,SAAS,QAAQ,OAAO,EAAE,EAAE,YAAY,MAAM,cAAe,QAAO;AAC5E,MAAI,WAAW;AACf,SAAO,IAAI;AACb;AAEO,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB;AAEzB,IAAM,iBAAoC,CAAC,cAAc,WAAW;AAE3E,IAAM,QAAQ;AAEd,SAAS,SAASE,OAAuB;AACvC,QAAM,QAAQA,MAAK,YAAY;AAC/B,SACE,UAAU,eACV,MAAM,SAAS,YAAY,KAC3B,UAAU,iBACV,UAAU,eACV,kBAAkB,KAAK,KAAK;AAEhC;AAEO,SAAS,WAAWA,OAA+B;AACxD,MAAI,OAAOA,UAAS,YAAYA,MAAK,SAAS,OAAO,SAASA,KAAI,EAAG,QAAO;AAC5E,SAAOA,MAAK,MAAM,GAAG,EAAE,MAAM,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AACnD;AAMO,SAAS,SAAS,UAA4B;AACnD,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,SAAS,YAAY,GAAG,GAAG,cAAc,CAAC,CAAC;AACjE;;;ACLA,IAAMC,eAAc,OAAO;AAC3B,IAAM,gBAAgB;AACtB,IAAMC,SAAQ;AACd,IAAMC,gBACJ;AAEK,IAAM,mBAAmB;AAQhC,IAAM,iBAA8B;AAAA,EAClC,gBAAgB;AAAA,EAChB,SAAS,KAAK;AAAA,EACd,QAAQ;AAAA,EACR,YAAY,MAAM,OAAO;AAAA,EACzB,aAAa;AACf;AAyBA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,cAAc,oBAAI,IAAI,CAAC,QAAQ,kBAAkB,QAAQ,CAAC;AAChE,IAAM,SAAN,MAAa;AAAA,EACH;AAAA,EACA,UAA6B,CAAC;AAAA,EACtC,YAAY,MAAc;AACxB,SAAK,OAAO;AAAA,EACd;AAAA,EACA,MAAM,QAAQ,GAAW,QAAoC;AAC3D,WAAO,KAAK,OAAO,GAAG;AACpB,aAAO,eAAe;AACtB,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,cAAMC,QAAO,MAAY;AACvB,iBAAO,oBAAoB,SAASA,KAAI;AACxC,kBAAQ;AAAA,QACV;AACA,aAAK,QAAQ,KAAKA,KAAI;AACtB,eAAO,iBAAiB,SAASA,OAAM,EAAE,MAAM,KAAK,CAAC;AAAA,MACvD,CAAC;AAAA,IACH;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,QAAQ,GAAiB;AACvB,SAAK,QAAQ;AACb,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,CAAC;AAChB,eAAW,QAAQ,QAAS,MAAK;AAAA,EACnC;AACF;AACO,SAASC,eAAc,MAAkC;AAC9D,QAAM,OAAO,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,IAAI,MAAM;AACzE,MAAI;AACF,WAAO,IAAI,IAAI,UAAU,IAAI,GAAG,EAAE;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AACA,SAAS,QAAQ,GAAW,GAAoB;AAC9C,SAAO,MAAM,OAAO,MAAM,KAAM,MAAM,OAAO,MAAM;AACrD;AACA,SAAS,QAAQ,SAAuC;AACtD,QAAM,CAAC,MAAM,MAAM,KAAK,IAAI,QAAQ,MAAM,IAAI;AAC9C,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,OAAO,CAAC,SACZ,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;AAC/D,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,OAAO,KAAK,IAAI;AACtB,QAAM,SACJ,SAAS,SACL,QACA,CAAC,GAAG,OAAO,GAAG,IAAI,MAAM,IAAI,MAAM,SAAS,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG,GAAG,IAAI;AAC9E,SAAO,OAAO,WAAW,KAAK,OAAO,MAAM,CAAC,MAAM,KAAK,KAAK,KAAK,KAAM,IAAI,SAAS;AACtF;AACA,SAAS,QAAQ,SAA0B;AACzC,QAAM,IAAI,QAAQ,OAAO;AACzB,MAAI,CAAC,EAAG,QAAO;AACf,OAAK,EAAE,CAAC,IAAI,WAAY,MAAQ,QAAO;AACvC,QAAM,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,MAAM,CAAC;AACrD,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,EAAE,CAAC,MAAM,SAAW,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,EAAI,QAAO,QAAQ,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,GAAI;AACxF,SAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;AAChC;AACO,SAAS,eAAe,UAA2B;AACxD,QAAM,YAAYA,eAAc,QAAQ;AACxC,MAAI,cAAc,OAAW,QAAO;AACpC,QAAM,OAAO,UAAU,QAAQ,QAAQ,EAAE;AACzC,MAAI,SAAS,eAAe,KAAK,SAAS,YAAY,EAAG,QAAO;AAChE,MAAI,KAAK,WAAW,GAAG,EAAG,QAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;AAC1D,QAAM,KAAK,2BAA2B,KAAK,IAAI;AAC/C,SAAO,KAAK,QAAQ,OAAO,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI;AACtD;AACA,SAAS,QAAQ,SAAkC;AACjD,SAAO,oBAAI,IAAI,CAAC,GAAG,YAAY,GAAG,YAAY,SAAS,YAAY,CAAC,CAAC;AACvE;AACO,SAAS,sBAAsB,SAAiC;AACrE,QAAM,OAAO,QAAQ,OAAO;AAC5B,SAAO,QAAQ,OAAO,CAAC,CAACC,KAAI,MAAM;AAChC,UAAM,QAAQA,MAAK,YAAY;AAC/B,WAAO,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,YAAY,IAAI,KAAK;AAAA,EACnD,CAAC;AACH;AACO,SAAS,uBACd,SACA,MAIkC;AAClC,QAAM,OAAO,QAAQ,OAAO;AAC5B,MAAI,CAAC,KAAK,cAAe,MAAK,IAAI,kBAAkB;AACpD,MAAI,EAAE,KAAK,iBAAiB,KAAK,UAAW,MAAK,IAAI,gBAAgB;AACrE,SAAO,QAAQ,OAAO,CAAC,CAACA,KAAI,MAAM,CAAC,KAAK,IAAIA,MAAK,YAAY,CAAC,CAAC;AACjE;AACA,SAAS,WAAW,KAA2B;AAC7C,QAAM,SAAS,YAAY,IAAI,SAAS,YAAY;AACpD,MAAI,OAAO,SAAS,OAAO,EAAG,QAAO;AACrC,SAAO,IAAI,SAAS,KAAK,OAAO,SAAS,YAAY;AACvD;AACO,SAAS,iBAAiB,KAAkB,QAAwB;AACzE,QAAM,OAAO,IAAI,IAAI,MAAM;AAC3B,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,QAAQ,IAAI,OAAO,WAAW,GAAG,IAAI,OAAO,MAAS;AAAA,EACzE,QAAQ;AACN,UAAM,IAAI,UAAU,KAAK,0BAA0B;AAAA,EACrD;AACA,QAAM,QAAQ,YAAY,IAAI,SAAS,MAAM;AAC7C,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,MAAM,IAAI,SAAS,WAAW,CAAC,EAAE,KAAK,IAAI,IAAI,WAAW,CAAC,EAAE,EAAE,SAAS,KAAK;AAAA,EAC/E;AACA,MAAI,IAAI,WAAW,KAAK,UAAU,CAAC,QAAQ;AACzC,UAAM,IAAI,UAAU,KAAK,sBAAsB,KAAK,IAAI,EAAE;AAAA,EAC5D;AACA,SAAO,IAAI;AACb;AACO,SAAS,WAAW,KAA0B;AACnD,MAAI,IAAI,OAAO,WAAW,GAAG,GAAG;AAC9B,UAAM,IAAI,UAAU,KAAK,+DAA+D;AAAA,EAC1F;AACA,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,MAAM;AAAA,EAC1B,QAAQ;AACN,UAAM,IAAI,UAAU,KAAK,0BAA0B;AAAA,EACrD;AACA,MAAI,IAAI,aAAa,WAAW,IAAI,aAAa,UAAU;AACzD,UAAM,IAAI,UAAU,KAAK,sBAAsB,IAAI,QAAQ,EAAE;AAAA,EAC/D;AACA,MAAI,eAAe,IAAI,QAAQ,GAAG;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,IAAI,QAAQ;AAAA,IACjB;AAAA,EACF;AACA,SAAO,IAAI;AACb;AACO,SAAS,aAAa,KAAgC;AAC3D,QAAM,QAAQ,kDAAkD,KAAK,IAAI,MAAM;AAC/E,QAAM,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9B,MAAI,CAAC,SAAS,OAAO,KAAK,OAAO,OAAO;AACtC,UAAM,IAAI,UAAU,KAAK,yBAAyB;AAAA,EACpD;AACA,QAAM,OAAOD,eAAc,MAAM,CAAC,CAAC;AACnC,MAAI,SAAS,OAAW,OAAM,IAAI,UAAU,KAAK,yBAAyB;AAC1E,MAAI,eAAe,IAAI,GAAG;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,IAAI;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,MAAM,KAAK;AACtB;AACA,eAAsB,YACpB,MACA,OACA,OACe;AACf,SAAO,CAAC,MAAM,WAAW,CAAC,MAAM,OAAO,SAAS;AAC9C,QAAI,KAAK,KAAK,EAAE,QAAQ;AACtB,YAAM,MAAM,IAAI,YAAY,OAAO,CAAC;AACpC;AAAA,IACF;AACA,QAAI;AACF,YAAM,KAAK,QAAQ,KAAK;AAAA,IAC1B,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AACF;AACA,SAAS,aACP,UACA,QACiC;AACjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,UAAU,MAAM;AACpB,aAAO,OAAO,UAAU,IAAI,YAAY,OAAO,CAAC;AAChD,eAAS,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IAC9D;AACA,QAAI,OAAO,QAAS,QAAO,QAAQ;AACnC,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,aAAS,KAAK,SAAS,MAAM,EAAE,QAAQ,MAAM,OAAO,oBAAoB,SAAS,OAAO,CAAC;AAAA,EAC3F,CAAC;AACH;AAYA,SAAS,cAAc,QAAgBE,UAAyC;AAC9E,QAAM,OAAO,YAAY,sBAAsBA,QAAO;AAAA,CAAI;AAC1D,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,MAAM,KAAK;AAAA,IAC9B,SAAS,CAAC,CAAC,gBAAgB,2BAA2B,CAAC;AAAA,IACvD,OAAO,mBAAmB;AACxB,YAAM;AAAA,IACR,GAAG;AAAA,IACH,QAAQ,YAAY;AAAA,EACtB;AACF;AACA,SAAS,YAAY,MAAoB,MAAY,MAA+B;AAClF,SAAO;AAAA,IACL,MAAM,CAAC,KAAK,WAAW;AACrB,YAAM,MAAM,SAAS,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI;AAC3C,UAAI,OAAO,SAAS,KAAK,EAAE,EAAG,KAAI,KAAK,YAAY,QAAQ,KAAK,EAAE,CAAC;AACnE,aAAO,KAAK,KAAK,KAAK,YAAY,IAAI,GAAG,CAAC;AAAA,IAC5C;AAAA,EACF;AACF;AACO,SAAS,gBAAgB,KAA+B;AAC7D,SAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,QAAQ,aAAa,CAAC,GAAG,MAAM,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE;AAChG;AACA,SAAS,SAAS,MAAsB;AACtC,MAAI,SAAS,KAAM,QAAO;AAC1B,SAAO,aAAa,IAAI,IAAI,OAAO;AACrC;AACA,SAAS,QAAQ,IAA2B;AAC1C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,gBAAY,QAAQ,EAAE,EAAE,iBAAiB,SAAS,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EACnF,CAAC;AACH;AACO,IAAM,aAAN,MAAiB;AAAA,EACL;AAAA,EACA;AAAA,EACA,OAAO,IAAI,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,oBAAI,IAAkB;AAAA,EAC7C,kBAAkB;AAAA,EACjB;AAAA,EACA;AAAA,EACT,YAAY,SAA4B;AACtC,SAAK,UAAU;AACf,SAAK,SAAS,EAAE,GAAG,gBAAgB,GAAG,QAAQ,OAAO;AACrD,SAAK,QAAQ,IAAI,OAAO,KAAK,OAAO,cAAc;AAClD,SAAK,SAAS,IAAI,OAAO,KAAK,OAAO,UAAU;AAC/C,SAAK,WAAW,QAAQ,IAAI,OAAO;AAAA,MACjC,QAAQ;AAAA,MACR,MAAM,QAAQ,QAAQ;AAAA,MACtB,MAAM,QAAQ,QAAQ;AAAA,IACxB,CAAC;AACD,SAAK,OAAO,KAAK,SAAS,OAAO,WAAW,SAAS,KAAK,SAAS,MAAM,OAAO;AAChF,SAAK,SAAS,KAAK,WAAW;AAAA,EAChC;AAAA,EACA,IAAI,UAAmB;AACrB,WAAO,KAAK,KAAK,OAAO;AAAA,EAC1B;AAAA,EACA,QAAc;AACZ,QAAI,KAAK,KAAK,OAAO,QAAS;AAC9B,SAAK,KAAK,MAAM;AAChB,SAAK,SAAS,MAAM;AACpB,eAAW,QAAQ,KAAK,YAAa,MAAK,MAAM;AAAA,EAClD;AAAA,EACA,MAAc,aAA4B;AACxC,UAAM,SAAS,oBAAI,IAAmB;AACtC,QAAI;AACF,iBAAS;AACP,cAAM,KAAK,MAAM,QAAQ,GAAG,KAAK,KAAK,MAAM;AAC5C,YAAI;AACJ,YAAI;AACF,iBAAO,MAAM,KAAK,SAAS,OAAO,KAAK,KAAK,MAAM;AAAA,QACpD,QAAQ;AACN,eAAK,MAAM,QAAQ,CAAC;AACpB;AAAA,QACF;AACA,cAAMH,QAAO,KAAK,MAAM,IAAI,EAAE,QAAQ,MAAM;AAC1C,eAAK,MAAM,QAAQ,CAAC;AACpB,iBAAO,OAAOA,KAAI;AAAA,QACpB,CAAC;AACD,eAAO,IAAIA,KAAI;AAAA,MACjB;AAAA,IACF,QAAQ;AAAA,IAAC;AACT,UAAM,QAAQ,WAAW,CAAC,GAAG,MAAM,CAAC;AAAA,EACtC;AAAA,EACA,MAAc,MAAM,MAAmC;AACrD,SAAK,YAAY,IAAI,IAAI;AACzB,UAAM,OAAO,EAAE,IAAI,KAAK,OAAO,OAAO;AACtC,UAAM,WAAW,IAAI,SAAS,YAAY,MAAM,MAAM,KAAK,KAAK,MAAM,CAAC;AACvE,QAAI;AACF,YAAM,KAAK,SAAS,EAAE,MAAM,MAAM,UAAU,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,IACxE,UAAE;AACA,WAAK,YAAY,OAAO,IAAI;AAC5B,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EACA,MAAc,SAAS,KAA8B;AACnD,QAAI;AACF,iBAAS;AACP,cAAM,OAAO,MAAM,IAAI,SAAS,KAAK,KAAK,OAAO,OAAO;AACxD,YAAI,CAAC,QAAQ,CAAE,MAAM,KAAK,SAAS,KAAK,IAAI,EAAI;AAAA,MAClD;AAAA,IACF,SAAS,GAAG;AACV,UAAI,aAAa,UAAW,OAAM,KAAK,OAAO,IAAI,MAAM,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA,EACA,MAAc,OAAO,MAAgB,OAAiC;AACpE,QAAI;AACF,YAAM,KAAK,MAAM,MAAM,OAAO,GAAG,cAAc,MAAM,QAAQ,MAAM,OAAO,GAAG,KAAK;AAAA,IACpF,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EACA,MAAc,SAAS,KAAe,MAAoC;AACxE,UAAM,EAAE,MAAM,MAAM,SAAS,IAAI;AACjC,UAAM,MAAM,iBAAiB,IAAI;AACjC,QAAI,IAAI,WAAW,WAAW;AAC5B,UAAI,CAAC,IAAI,KAAM,OAAM,IAAI,UAAU,KAAK,yBAAyB;AACjE,YAAM,KAAK,QAAQ,IAAI,MAAM,UAAU,KAAK,IAAI,IAAI;AACpD,aAAO;AAAA,IACT;AACA,QAAI,IAAI,WAAW,SAAS,UAAU,IAAI,OAAO,GAAG;AAClD,YAAM,KAAK,UAAU,KAAK,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,IAAI,SAAS,iBAAiB,KAAK,IAAI,MAAM,IAAI,WAAW,GAAG;AAC3E,UAAM,OAAO,WAAW,GAAG;AAC3B,UAAM,UAAU,eAAe,IAAI,OAAO;AAC1C,UAAM,UACJ,QAAQ,SAAS,WAAW,QAAQ,SAAS,QAAQ,SAAS,YAAY,KAAK,IAAI,IAAI;AACzF,QAAI,UAAU,KAAK,IAAI,EAAG,OAAM,IAAI,UAAU,KAAK,qBAAqB,KAAK,IAAI,CAAC,QAAQ;AAC1F,UAAM,KAAK,eAAe,MAAM,KAAK,QAAQ,SAAS,MAAM;AAC5D,UAAM,KAAK,OAAO,QAAQ,SAAS,KAAK,KAAK,MAAM;AACnD,QAAI;AACJ,UAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAM,eAAe,MAAM,MAAM,MAAM;AACvC,SAAK,KAAK,OAAO,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;AACvE,QAAI;AACF,UAAI;AACF,cAAM,OAAO,MAAM,SAAS,UAAU,SAAS,KAAK,IAAI,CAAC;AACzD,cAAM,UAAU,IAAI,gBAAgB;AACpC,aAAK,YAAY,IAAI,QAAQ,OAAO,QAAQ,MAAM;AAClD,YAAI;AACF,qBAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,MAAM,MAAM;AAAA,QAC7D,UAAE;AACA,kBAAQ,MAAM;AAAA,QAChB;AAAA,MACF,UAAE;AACA,aAAK,OAAO,QAAQ,OAAO;AAAA,MAC7B;AACA,aAAO,MAAM,KAAK,MAAM,MAAM,IAAI,QAAQ,IAAI,OAAO,UAAU,IAAI;AAAA,IACrE,UAAE;AACA,WAAK,KAAK,OAAO,oBAAoB,SAAS,YAAY;AAC1D,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AAAA,EACQ,MAAc;AACpB,WAAO,KAAK,IAAI,KAAK,QAAQ,UAAU,OAAO,gBAAgB,KAAK,OAAO,UAAU;AAAA,EACtF;AAAA,EACA,MAAc,eAAe,MAAgB,KAAkB,SAAiC;AAC9F,UAAM,SAAS,YAAY,IAAI,SAAS,QAAQ;AAChD,QAAI,OAAO,WAAW,EAAG;AACzB,QAAI,OAAO,WAAW,KAAK,OAAO,CAAC,MAAM,gBAAgB;AACvD,YAAM,IAAI,UAAU,KAAK,4BAA4B,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1E;AACA,QAAI,WAAW,IAAI,SAAS,GAAG;AAC7B,YAAM,KAAK,MAAM,YAAY,+BAA+B,GAAG,KAAK,KAAK,MAAM;AAAA,IACjF;AAAA,EACF;AAAA,EACA,MAAc,SACZ,KACA,KACA,MACA,QACiC;AACjC,QAAI;AACF,YAAM,WAAW,KAAK,QAAQ,UAAU,MAAM;AAAA,QAC5C,KAAK,eAAe,GAAG;AAAA,QACvB,QAAQ,IAAI,OAAO,YAAY;AAAA,QAC/B,SAAS,sBAAsB,IAAI,OAAO;AAAA,QAC1C,MAAM,IAAI,WAAW,SAAS,IAAI,WAAW,SAAS,SAAY;AAAA,QAClE;AAAA,MACF,CAAC;AACD,aAAO,MAAM,aAAa,UAAU,MAAM;AAAA,IAC5C,SAAS,GAAG;AACV,UAAI,OAAO,QAAS,OAAM;AAC1B,YAAMG,WAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,YAAM,SACJ,GAGC;AACH,YAAM,MAAM,OAAO,WAAW,YAAY,UAAU,OAAO,UAAU,MAAM,SAAS;AACpF,aAAO,cAAc,KAAKA,YAAW,yBAAyB;AAAA,IAChE;AAAA,EACF;AAAA,EACA,MAAc,MACZ,MACA,QACA,OACA,UACA,WACkB;AAClB,UAAM,SAAS,SAAS;AACxB,UAAM,WAAW,WAAW,UAAU,WAAW,OAAO,WAAW,OAAO,SAAS;AACnF,UAAM,UAAU,uBAAuB,SAAS,SAAS;AAAA,MACvD,eAAe,KAAK,QAAQ,UAAU,OAAO;AAAA,MAC7C;AAAA,IACF,CAAC;AACD,UAAMC,WAAU,CAAC,YAAY,SAAS;AACtC,UAAM,OAAO,cAAc,YAAYA;AACvC,YAAQ,KAAK,CAAC,cAAc,OAAO,eAAe,OAAO,CAAC;AAC1D,QAAIA,SAAS,SAAQ,KAAK,CAAC,qBAAqB,SAAS,CAAC;AAC1D,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,KAAK;AAAA,MACT,aAAa,QAAQ,SAAS,cAAc,OAAO,MAAM,KAAK,IAAI,OAAO;AAAA,MACzE;AAAA,IACF;AACA,QAAI,UAAU;AACZ,YAAM,SAAS,OAAO;AACtB,aAAO;AAAA,IACT;AACA,QAAI;AACF,uBAAiB,SAAS,SAAS,MAAM;AACvC,YAAI,MAAM,SAAS,EAAG,OAAM,KAAK,MAAMA,WAAU,MAAM,KAAK,IAAI,OAAO,MAAM;AAAA,MAC/E;AAAA,IACF,QAAQ;AACN,YAAM,SAAS,OAAO,EAAE,MAAM,MAAM,MAAS;AAC7C,aAAO;AAAA,IACT;AACA,QAAIA,SAAS,OAAM,KAAK,MAAM,YAAY,MAAM;AAChD,WAAO;AAAA,EACT;AAAA,EACA,MAAc,QACZ,MACA,UACA,KACA,MACe;AACf,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,UAAU,OAAO,SAAS,MAAM,MAAM,KAAK,YAAY,MAAM,IAAI;AACvE,QAAI,QAAS,OAAM;AACnB,UAAM,KAAK,MAAM,YAAY,6CAA6C,GAAG,KAAK,KAAK,MAAM;AAC7F,QAAI;AACF,YAAM,QAAQ,MAAM,SAAS,KAAK,KAAK,KAAK,MAAM;AAClD,UAAI,UAAU,OAAW;AACzB,UAAI,UAAU,eAAe;AAC3B,cAAM,SAAS,UAAU,OAAO,SAAS,KAAK,OAAO,OAAO,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE;AAC3F,cAAM,KAAK,SAAS,EAAE,MAAM,MAAM,UAAU,QAAQ,QAAQ,MAAM,KAAK,CAAC;AACxE;AAAA,MACF;AACA,YAAM,SAAS,KAAK,QAAQ;AAC5B,UAAI,CAAC,UAAW,OAAO,SAAS,OAAQ,MAAM,KAAK,YAAY,MAAM,EAAK;AAC1E,YAAM;AAAA,QAAO;AAAA,QAAM;AAAA,QAAU;AAAA,QAAQ,KAAK,KAAK;AAAA,QAAQ,CAAC,QAAQ,MAAM,WACpE,KAAK,SAAS,EAAE,MAAM,UAAU,IAAI,SAAS,MAAM,GAAG,QAAQ,QAAQ,MAAM,KAAK,CAAC;AAAA,MACpF;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EACA,MAAc,YAAY,QAAsD;AAC9E,UAAMF,QAAO,WAAW,OAAO,IAAI,IAAI,OAAO,IAAI;AAClD,QAAI,CAAC,KAAK,QAAQ,OAAQ,QAAO,IAAI,UAAU,KAAK,GAAGA,KAAI,iCAAiC;AAC5F,QAAI;AACF,YAAM,KAAK,QAAQ,cAAc;AACjC,aAAO;AAAA,IACT,SAAS,GAAG;AACV,aAAO,IAAI,UAAU,KAAK,GAAGA,KAAI,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IACpF;AAAA,EACF;AAAA,EACA,MAAc,UAAU,KAAe,KAAiC;AACtE,UAAM,OAAO,IAAI,SAAS,iBAAiB,KAAK,IAAI,MAAM,IAAI,WAAW,gBAAgB,GAAG,CAAC;AAC7F,UAAM,EAAE,UAAU,IAAI,KAAK;AAC3B,QAAI,CAAC,UAAU,OAAO,aAAa,CAAC,UAAU,WAAW;AACvD,UAAI,CAAC,KAAK,iBAAiB;AACzB,aAAK,kBAAkB;AACvB,gBAAQ,KAAK,kDAAkDH,aAAY,EAAE;AAAA,MAC/E;AACA,YAAM,IAAI,UAAU,KAAKA,aAAY;AAAA,IACvC;AACA,UAAMM,UAAS,MAAM,UAAU,IAAI,OAAO;AAC1C,UAAM,YAAY,YAAY,IAAI,SAAS,wBAAwB,EAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAC3B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,MAAM,EAAE;AACzB,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAU,IAAI,gBAAgB;AACpC,SAAK,YAAY,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AACnD,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,UAAU,UAAU;AAAA,QACjC,KAAK,eAAe,IAAI,EAAE,QAAQ,SAAS,IAAI;AAAA,QAC/C;AAAA,QACA,SAAS,sBAAsB,IAAI,OAAO;AAAA,QAC1C,QAAQ,YAAY,IAAI,CAAC,KAAK,KAAK,QAAQ,OAAO,MAAM,CAAC;AAAA,MAC3D,CAAC;AAAA,IACH,SAAS,GAAG;AACV,cAAQ,MAAM;AACd,YAAM,IAAI,UAAU,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACrE;AACA,QAAI,KAAK,KAAK,OAAO;AACrB,QAAI;AACF,UAAI,OAAO,OAAO,QAAS,OAAM,OAAO,OAAO;AAC/C,UACE,OAAO,YACP,EAAE,UAAU,SAAS,OAAO,QAAQ,KAAKP,OAAM,KAAK,OAAO,QAAQ,IACnE;AACA,cAAM,IAAI,UAAU,KAAK,0DAA0D;AAAA,MACrF;AACA,YAAM,IAAI,KAAK,MAAM,cAAcO,SAAQ,OAAO,QAAQ,GAAG,KAAK,KAAK,MAAM;AAC7E,YAAM,KAAK,OAAO,KAAK,QAAQ,OAAO,MAAM;AAAA,IAC9C,SAAS,GAAG;AACV,aAAO,MAAM,MAAM,sBAAsB;AACzC,YAAM;AAAA,IACR,UAAE;AACA,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EACA,MAAc,OAAO,KAAe,QAAwB,QAAoC;AAC9F,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,QAA0B,QAAQ,QAAQ;AAC9C,UAAM,UAAU,CAAC,UAAwC;AACvD,cAAQ,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,OAAO,IAAI,CAAC;AACpD,aAAO;AAAA,IACT;AACA,UAAML,QAAO,IAAI,gBAAgB;AACjC,UAAM,UAAU,YAAY,IAAI,CAAC,MAAMA,MAAK,QAAQ,MAAM,CAAC;AAC3D,UAAM,WAAW,MAAM,OAAO,MAAM,MAAM,uBAAuB;AACjE,SAAK,iBAAiB,SAAS,UAAU,EAAE,MAAM,KAAK,CAAC;AACvD,QAAI,YAAY;AAChB,QAAI,YAAY;AAChB,UAAMM,aAAY,YAAY;AAC5B,uBAAiB,QAAQ,OAAO,UAAU;AACxC,YAAI,UAAW;AACf,cAAM,OAAO,OAAO,SAAS;AAC7B,cAAM;AAAA,UACJ,MAAM,OAAO,UAAU,WAAW,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI,IAAI,IAAI;AAAA,QAChF;AAAA,MACF;AACA,YAAM,SAAS,MAAM,OAAO;AAC5B,UAAI,UAAW;AACf,kBAAY;AACZ,YAAM,QAAQ,WAAW,SAAS,OAAO,IAAI,GAAG,OAAO,MAAM,CAAC;AAC9D,kBAAY,QAAQ,KAAK,OAAO,WAAW,EAAE,iBAAiB,SAAS,MAAMN,MAAK,MAAM,GAAG;AAAA,QACzF,MAAM;AAAA,MACR,CAAC;AAAA,IACH,GAAG,EAAE,MAAM,MAAMA,MAAK,MAAM,CAAC;AAC7B,UAAM,SAAS,IAAI,SAAS,IAAI,UAAU,eAAe,IAAI;AAC7D,QAAI;AACF,iBAAS;AACP,cAAM,QAAQ,MAAM,OAAO,KAAK,OAAO;AACvC,YAAI,CAAC,MAAO;AACZ,YAAI,MAAM,SAAS,QAAQ;AACzB,gBAAM,QAAQ,UAAU,MAAM,OAAO,CAAC;AACtC;AAAA,QACF;AACA,YAAI,MAAM,SAAS,SAAS;AAC1B,sBAAY;AACZ,cAAI,UAAW;AACf,gBAAM,OAAO,SAAS,MAAM,IAAI;AAChC,iBAAO,MAAM,MAAM,MAAM,MAAM;AAC/B,gBAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,YAC/B,OAAO;AAAA,YACP,QAAQ,KAAK,OAAO,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,EAAE;AAAA,UAC9E,CAAC;AACD,gBAAM,QAAQ,WAAW,SAAS,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;AAC5D;AAAA,QACF;AACA,eAAO,OAAO,WAAWH,gBAAe,CAAC,QAAQ,QAAS,OAAM,QAAQ,EAAE;AAC1E,eAAO,KAAK,MAAM,SAAS,SAAS,MAAM,OAAO,MAAM,KAAK;AAAA,MAC9D;AAAA,IACF,SAAS,GAAG;AACV,UAAI,aAAa,SAAS;AACxB,oBAAY;AACZ,eAAO,MAAM,EAAE,MAAM,EAAE,OAAO;AAC9B,cAAM,QAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,MACpE;AAAA,IACF,UAAE;AACA,kBAAY;AACZ,aAAO,MAAM,KAAM,sBAAsB;AACzC,WAAK,oBAAoB,SAAS,QAAQ;AAC1C,YAAM,QAAQ,KAAK,CAACS,WAAU,QAAQ,KAAK,OAAO,WAAW,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AACF;;;AC9pBA,SAASC,QAAO,OAA0C;AACxD,QAAM,MAAM,IAAI,WAAW,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,CAAC;AAClE,MAAI,KAAK;AACT,aAAW,KAAK,OAAO;AACrB,QAAI,IAAI,GAAG,EAAE;AACb,UAAM,EAAE;AAAA,EACV;AACA,SAAO;AACT;AACA,SAAS,OAAO,GAAuB;AACrC,MAAI,IAAI,IAAM,QAAO,WAAW,GAAG,CAAC;AACpC,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,GAAG,EAAG,OAAM,QAAQ,IAAI,GAAI;AACtE,SAAO,WAAW,GAAG,MAAO,MAAM,QAAQ,GAAG,KAAK;AACpD;AACO,SAAS,IAAI,QAAgBC,WAA6C;AAC/E,QAAM,OAAOD,QAAOC,SAAQ;AAC5B,SAAOD,QAAO,CAAC,WAAW,GAAG,GAAG,GAAG,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;AAC/D;AACA,IAAM,MAAM,IAAI,UAAwB,IAAI,IAAM,GAAG,KAAK;AAC1D,IAAM,MAAM,IAAI,UAAwB,IAAI,IAAM,GAAG,KAAK;AAC1D,IAAM,SAAS,CAAC,UAAsB,IAAI,GAAM,KAAK;AACrD,IAAM,OAAO,CAAC,OAAmB,SAAS,MAAM,IAAI,GAAM,WAAW,GAAG,MAAM,GAAG,KAAK;AACtF,IAAM,OAAO,IAAI,GAAM,WAAW,GAAG,GAAI,CAAC;AACnC,SAAS,QAAQ,WAAmC;AACzD,MAAIE,SAAQ;AACZ,SAAOA,SAAQ,UAAU,SAAS,KAAK,UAAUA,MAAK,MAAM,EAAG,CAAAA;AAC/D,QAAM,UAAU,UAAU,SAASA,MAAK;AACxC,SAAO,IAAI,GAAM,QAAQ,CAAC,IAAI,MAAOF,QAAO,CAAC,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,OAAO;AACpF;AACO,SAAS,IAAI,QAA4B;AAC9C,QAAM,CAAC,GAAG,GAAG,GAAGG,KAAI,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AACpD,QAAM,MAAM,CAAC,KAAK,IAAI,CAAC;AACvB,aAAW,OAAOA,OAAM;AACtB,UAAM,SAAmB,CAAC;AAC1B,aAAS,IAAI,OAAO,IAAI,KAAK,MAAM,IAAI,GAAG,GAAG;AAC3C,aAAO,QAAQ,IAAI,GAAI;AACvB,UAAI,IAAI,IAAK;AAAA,IACf;AACA,QAAI,KAAK,GAAG,OAAO,IAAI,CAAC,GAAG,MAAO,IAAI,OAAO,SAAS,IAAI,IAAI,MAAO,CAAE,CAAC;AAAA,EAC1E;AACA,SAAO,IAAI,GAAM,WAAW,KAAK,GAAG,CAAC;AACvC;AACA,IAAM,OAAO,CAAC,SAAiB,IAAI,IAAM,IAAI,YAAY,EAAE,OAAO,IAAI,CAAC;AACvE,IAAM,QAAQ,CAAC,SAAiB,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,GAAI;AACnF,SAAS,KAAK,MAAwB;AACpC,QAAM,MAAM,KAAK,YAAY,EAAE,QAAQ,UAAU,EAAE,EAAE,MAAM,GAAG,EAAE;AAChE,QAAM,OAAO,KAAK,eAAe;AACjC,SAAO,OAAO,OAAO,IAAI,IAAM,MAAM,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAM,MAAM,GAAG,GAAG,GAAG,CAAC;AACxF;AACA,IAAM,eAAe,IAAI,IAAI,qBAAqB,CAAC;AAKnD,SAAS,KAAK,IAAmC;AAC/C,QAAM,OAAO,CAAC;AACd,MAAI,GAAG,aAAc,MAAK,KAAK,IAAI,IAAI,IAAI,UAAU,GAAG,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC;AAC/E,OAAK,KAAK,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;AACvD,SAAO,IAAI,GAAG,IAAI;AACpB;AACA,SAAS,UAAU,IAAY,UAAmB,OAA+B;AAC/E,SAAO,WAAW,IAAI,IAAI,EAAE,GAAG,MAAM,OAAO,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,OAAO,KAAK,CAAC;AAClF;AACO,SAAS,SAAS,KAA+B;AACtD,QAAM,MAAoB,CAAC;AAC3B,QAAM,CAAC,EAAE,WAAW,OAAO,IAAI,OAAO,KAAK,CAAC;AAC5C,WAAS,KAAK,WAAW,KAAK,WAAW;AACvC,UAAM,CAAC,EAAE,EAAE,GAAG,IAAI,OAAO,KAAK,EAAE;AAChC,QAAI,KAAK,IAAI,SAAS,IAAI,GAAG,CAAC;AAC9B,SAAK;AAAA,EACP;AACA,SAAO;AACT;AACA,SAAS,OAAO,KAAiB,IAAuD;AACtF,QAAM,MAAM,IAAI,EAAE;AAClB,MAAI,MAAM,IAAI,KAAK,CAAC;AACpB,MAAID,SAAQ,KAAK;AACjB,MAAI,MAAM,KAAM;AACd,UAAM,QAAQ,MAAM;AACpB,UAAM;AACN,aAAS,IAAI,GAAG,IAAI,OAAO,IAAK,OAAM,MAAM,MAAM,IAAIA,SAAQ,CAAC;AAC/D,IAAAA,UAAS;AAAA,EACX;AACA,MAAIA,SAAQ,MAAM,IAAI,OAAQ,OAAM,IAAI,MAAM,eAAe;AAC7D,SAAO,CAAC,KAAKA,QAAOA,SAAQ,GAAG;AACjC;AACO,SAAS,SAAS,SAAiC;AACxD,QAAM,CAAC,EAAEA,QAAO,GAAG,IAAI,OAAO,SAAS,CAAC;AACxC,SAAO,QAAQ,SAASA,QAAO,GAAG;AACpC;AACO,SAAS,cAAc,MAA8B;AAC1D,QAAM,MAAM,SAAS,IAAI,EAAE,CAAC;AAC5B,SAAO,SAAS,GAAG,EAAE,SAAS,CAAC;AACjC;AACA,eAAsB,MAAM,MAAuC;AACjE,SAAO,IAAI;AAAA,IACT,MAAM,OAAO,OAAO,OAAO,SAAS,cAAc,IAAI,CAA4B;AAAA,EACpF;AACF;AACO,SAAS,SAAS,KAA6B;AACpD,QAAM,OAAO,IAAI,SAAS;AAC1B,SAAO,IAAI,QAAQ,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,QAAQ,IAAI,SAAS,IAAI,CAAC,CAAC;AACxE;AACO,SAAS,eAA2B;AACzC,QAAM,SAAS,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC;AACxD,SAAO,CAAC,IAAK,OAAO,CAAC,IAAI,MAAQ;AACjC,SAAO;AACT;AACO,SAAS,KAAK,MAAsC;AACzD,QAAM,IAAI,+CAA+C,KAAK,IAAI;AAClE,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,MAAM;AACnC,SAAO,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,WAAW,KAAK,KAAK,IAAI;AACjE;AACO,SAAS,KAAK,MAAsC;AACzD,MAAI,CAAC,KAAK,SAAS,GAAG,KAAK,CAAC,mBAAmB,KAAK,IAAI,EAAG,QAAO;AAClE,QAAM,KAAK,6BAA6B,KAAK,IAAI;AACjD,MAAI,OAAO;AACX,QAAM,OAAiB,CAAC;AACxB,MAAI,IAAI;AACN,UAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AACxB,QAAI,CAAC,MAAO,QAAO;AACnB,SAAK,KAAM,MAAM,CAAC,KAAK,IAAK,MAAM,CAAC,GAAI,MAAM,CAAC,KAAK,IAAK,MAAM,CAAC,CAAC;AAChE,WAAO,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,MAAM,KAAK,SAAS,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,MAAM,EAAE;AAAA,EAC1F;AACA,QAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,QAAM,SAAS,CAAC,SAAkB,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG;AACnE,QAAM,OAAO,OAAO,OAAO,CAAC,CAAC;AAC7B,QAAM,OAAO,OAAO,WAAW,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC;AACxD,MAAI,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC,EAAG,QAAO;AAC3E,QAAM,QAAQ,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC;AAClE,QAAME,WAAU,IAAI,MAAM,SAAS,KAAK;AACxC,MAAI,OAAO,WAAW,IAAIA,WAAU,IAAIA,aAAY,EAAG,QAAO;AAC9D,QAAM,MAAM;AAAA,IACV,GAAG,KAAK,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC;AAAA,IACzC,GAAG,IAAI,MAAM,OAAO,WAAW,IAAIA,WAAU,CAAC,EAAE,KAAK,CAAC;AAAA,IACtD,GAAG,KAAK,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC;AAAA,IACzC,GAAG;AAAA,EACL;AACA,SAAO,WAAW,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,GAAI,CAAC,CAAC;AAC/D;AAmBA,eAAe,WAAW,KAA8C;AACtE,QAAM,OAAO,CAAC,UAAU,aAAa,OAAO,OAAO,MAAM,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;AAC1E,MAAI,IAAI,KAAK,IAAI;AACf,SAAK,KAAK,UAAU,aAAa,MAAM,IAAI,MAAM,QAAQ,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,SAAK,KAAK,UAAU,aAAa,MAAM,KAAK,WAAW,GAAG,GAAI,GAAG,CAAC,CAAC,CAAC;AAAA,EACtE,OAAO;AACL,SAAK,KAAK,UAAU,aAAa,OAAO,IAAI,IAAI,KAAM,MAAM,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AACpF,SAAK,KAAK,UAAU,aAAa,MAAM,IAAI,CAAC,CAAC;AAC7C,SAAK,KAAK,UAAU,aAAa,MAAM,KAAK,WAAW,GAAG,GAAI,GAAG,CAAC,CAAC,CAAC;AACpE,SAAK,KAAK,UAAU,aAAa,OAAO,IAAI,IAAI,mBAAmB,CAAC,CAAC,CAAC;AACtE,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI;AACpD,UAAM,UAAU,KAAK,IAAI,KAAM,EAAE,IAAI,IAAI,KAAM,MAAM,IAAI,KAAK,IAAI,CAAC;AACnE,SAAK,KAAK,UAAU,aAAa,OAAO,IAAI,OAAO,CAAC,CAAC;AAAA,EACvD;AACA,SAAO,IAAI,KAAM,IAAI,GAAG,IAAI,CAAC;AAC/B;AACA,eAAsB,YAAY,KAA8C;AAC9E,QAAM,MAAM;AAAA,IACV,IAAI,KAAM,QAAQ,WAAW,GAAG,CAAC,CAAC,CAAC;AAAA,IACnC,QAAQ,IAAI,MAAM;AAAA,IAClB;AAAA,IACA,KAAK,IAAI,MAAM;AAAA,IACf,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,QAAQ,CAAC;AAAA,IAC3C,KAAK,IAAI,OAAO;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM,WAAW,GAAG;AAAA,EACtB;AACA,QAAM,YAAY,SAAS,MAAM,IAAI,KAAK,GAAG,CAAC;AAC9C,SAAO,IAAI,KAAK,cAAc,KAAK,SAAS,CAAC;AAC/C;AACO,SAAS,IAAI,KAAyB;AAC3C,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,OAAQ;AAC3C,WAAO,OAAO,aAAa,GAAG,IAAI,SAAS,GAAG,IAAI,KAAM,CAAC;AAAA,EAC3D;AACA,QAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,UAAU,KAAK,CAAC;AAC9C,SAAO;AAAA,EAAgC,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AACzD;;;AC1LA,SAAS,SAAS,GAAyB,GAAkC;AAC3E,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO,MAAM;AAC3B,SAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC;AACxF;AAEO,SAAS,OACd,SACA,UACA,QACsB;AACtB,SAAO,SAAS,SAAS,QAAQ,IAAI,SAAS;AAChD;AACA,IAAM,MAAM,KAAK,KAAK,KAAK;AAC3B,IAAM,cAAc,OAAO;AAC3B,IAAM,kBAAkB,KAAK;AACtB,IAAM,gBAAgB,IAAI;AACjC,IAAM,QAAQ,EAAE,MAAM,SAAS,YAAY,QAAQ;AACnD,IAAM,OAAO,EAAE,MAAM,SAAS,MAAM,UAAU;AA6CvC,IAAM,gBAAN,cAA4B,MAAM;AAAC;AACnC,SAAS,cAAc,MAAuB;AACnD,MAAI,KAAK,IAAI,EAAG,QAAO;AACvB,MAAI,KAAK,WAAW,KAAK,KAAK,SAAS,IAAK,QAAO;AACnD,SAAO,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,UAAU,gCAAgC,KAAK,KAAK,CAAC;AACrF;AACO,IAAM,UAAN,MAAM,SAAQ;AAAA,EACF;AAAA,EACT,YAAY,QAAkB;AACpC,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,aAAa,KAAK,OAAe,OAAgB,MAAM,KAAK,IAAI,GAAqB;AACnF,UAAM,SAAS,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,MAAS;AAC3D,QAAI,UAAU,OAAO,WAAW,MAAM,gBAAiB,QAAO,IAAI,SAAQ,MAAM;AAChF,UAAM,SAAS,MAAM,SAAQ,OAAO,OAAO,GAAG;AAC9C,WAAO,IAAI,SAAQ,MAAM,MAAM,KAAK,OAAO,QAAQ,MAAM,CAAC;AAAA,EAC5D;AAAA,EACA,aAAqB,OAAO,OAAe,KAAgC;AACzE,UAAM,OAAO,MAAM,OAAO,OAAO,YAAY,OAAO,OAAO,CAAC,QAAQ,QAAQ,CAAC;AAC7E,UAAM,OAAO,IAAI,WAAW,MAAM,OAAO,OAAO,UAAU,QAAQ,KAAK,SAAS,CAAC;AACjF,UAAM,KAAK,MAAM;AAAA,MAAK,OAAO,gBAAgB,IAAI,WAAW,CAAC,CAAC;AAAA,MAAG,CAAC,MAChE,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,IAChC,EAAE,KAAK,EAAE;AACT,UAAMC,QAAO,EAAE,cAAc,SAAS,YAAY,kBAAkB,KAAK,IAAI,EAAE,GAAG;AAClF,UAAM,WAAW,MAAM;AACvB,UAAM,OAAO,MAAM,YAAY;AAAA,MAC7B,QAAQ,aAAa;AAAA,MACrB,QAAQA;AAAA,MACR,SAASA;AAAA,MACT,WAAW,IAAI,KAAK,MAAM,GAAG;AAAA,MAC7B,UAAU,IAAI,KAAK,QAAQ;AAAA,MAC3B;AAAA,MACA,YAAY;AAAA,MACZ,MAAM,EAAE,IAAI,KAAK;AAAA,MACjB,MAAM,OAAO,KAAK,UAAU;AAAA,IAC9B,CAAC;AACD,WAAO,EAAE,KAAK,KAAK,YAAY,MAAM,MAAM,UAAU,MAAAA,MAAK;AAAA,EAC5D;AAAA,EACA,IAAI,OAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EACA,IAAI,MAAc;AAChB,WAAO,IAAI,KAAK,OAAO,IAAI;AAAA,EAC7B;AAAA,EACA,MAAM,MAAM,MAAc,MAAkB,MAAM,KAAK,IAAI,GAAwB;AACjF,UAAMA,QAAO,KAAK,YAAY;AAC9B,QAAI,CAAC,cAAcA,KAAI,EAAG,OAAM,IAAI,cAAc,sBAAsB,IAAI,EAAE;AAC9E,WAAO,YAAY;AAAA,MACjB,QAAQ,aAAa;AAAA,MACrB,QAAQ,KAAK,OAAO;AAAA,MACpB,SAAS,EAAE,YAAYA,MAAK,UAAU,KAAKA,QAAO,mBAAmB;AAAA,MACrE,WAAW,IAAI,KAAK,MAAM,KAAK,KAAK,GAAI;AAAA,MACxC,UAAU,IAAI,KAAK,MAAM,aAAa;AAAA,MACtC;AAAA,MACA,YAAY,KAAK,OAAO;AAAA,MACxB,MAAM,EAAE,IAAI,OAAO,MAAMA,MAAK;AAAA,MAC9B,MAAM,OAAO,KAAK,OAAO,GAAG;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AACA,SAAS,OAAO,KAAgB;AAC9B,SAAO,OAAO,QACZ,IAAI,WAAW,MAAM,OAAO,OAAO,KAAK,MAAM,KAAK,GAA8B,CAAC;AACtF;AACA,IAAM,SAAS,oBAAI,QAAgD;AAC5D,SAAS,QAAQ,OAAe,OAAkC;AACvE,QAAM,MAAM,OAAO,IAAI,KAAK,KAAK,oBAAI,IAA8B;AACnE,SAAO,IAAI,OAAO,GAAG;AACrB,MAAI,KAAK,IAAI,IAAI,KAAK;AACtB,MAAI,CAAC,IAAI;AACP,UAAM,UAAU,QAAQ,KAAK,OAAO,KAAK;AACzC,SAAK;AACL,QAAI,IAAI,OAAO,OAAO;AACtB,YAAQ,MAAM,MAAM;AAClB,UAAI,IAAI,IAAI,KAAK,MAAM,QAAS,KAAI,OAAO,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AChIA,IAAM,UAAU,KAAK;AACrB,IAAM,MAAM;AACL,IAAM,WAAN,cAAuB,MAAM;AAAA,EACzB;AAAA,EACT,YAAY,MAAcC,UAAiB;AACzC,UAAMA,QAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AACO,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACjB,YAAY,GAAoB;AAC9B,SAAK,IAAI;AACT,SAAK,UAAU,EAAE,QAAQ,OAAO;AAChC,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,2BAA2B;AAAA,EAChE;AAAA,EACQ,IAAI,OAA2B;AACrC,UAAM,MAAM,KAAK,EAAE,QAAQ,MAAM,SAAS,CAAC;AAC3C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,2BAA2B;AACrD,SAAK,EAAE,OAAO,IAAI,OAAO,GAAG;AAC5B,SAAK,EAAE,OAAO,MAAM,MAAM,MAAM,IAAI;AACpC,WAAO;AAAA,EACT;AAAA,EACQ,MAAM,GAAuB;AACnC,WAAO,KAAK,EAAE,OAAO,MAAM,KAAK,SAAS,KAAK,UAAU,CAAC;AAAA,EAC3D;AAAA,EACA,MAAM,MAAc,MAAwB;AAC1C,SAAK,EAAE,cAAc,MAAM,KAAK,SAAS,GAAG;AAC5C,UAAM,MAAM,KAAK,EAAE,OAAO,QAAQ,GAAG,KAAK,OAAO;AACjD,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE,OAAO,SAAS,KAAK,SAAS,GAAG,CAAC;AAC/E,WAAO,IAAI,SAAS,MAAM,GAAG,IAAI,KAAK,QAAQ,IAAI,EAAE;AAAA,EACtD;AAAA,EACA,OAAgB;AACd,UAAM,MAAM,KAAK,EAAE,cAAc;AACjC,QAAI,CAAC,IAAK,OAAM,KAAK,MAAM,KAAK,EAAE,gBAAgB,GAAG,UAAU;AAC/D,WAAO,IAAI,QAAQ,MAAM,KAAK,GAAG,GAAG;AAAA,EACtC;AAAA,EACA,QAAQ,MAAe,MAA0B;AAC/C,UAAMC,QAAO,KAAK,IAAI,IAAI,YAAY,EAAE,OAAO,IAAI,CAAC;AACpD,QAAI;AACF,YAAM,MAAM,KAAK,EAAE,iBAAiB,KAAK,KAAKA,KAAI;AAClD,UAAI,CAAC,IAAK,OAAM,KAAK,MAAM,KAAK,EAAE,gBAAgB,GAAG,aAAa;AAClE,aAAO,IAAI,WAAW,MAAM,KAAK,GAAG,GAAG;AAAA,IACzC,UAAE;AACA,WAAK,EAAE,MAAMA,KAAI;AAAA,IACnB;AAAA,EACF;AAAA,EACA,UAAa,OAAmB,IAA2B;AACzD,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI;AACF,aAAO,GAAG,GAAG;AAAA,IACf,UAAE;AACA,WAAK,EAAE,MAAM,GAAG;AAAA,IAClB;AAAA,EACF;AAAA,EACA,YAAY,IAA+D;AACzE,UAAM,IAAI,GAAG,KAAK,SAAS,OAAO;AAClC,WAAO,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,EACjC;AACF;AACO,IAAM,UAAN,MAAc;AAAA,EACF;AAAA,EACA;AAAA,EACR;AAAA,EACT,YAAY,QAAmB,GAAoB,KAAa;AAC9D,SAAK,SAAS;AACd,SAAK,IAAI;AACT,SAAK,MAAM;AAAA,EACb;AAAA,EACA,OAAmB;AACjB,UAAM,MAAM,KAAK,OAAO,YAAY,CAAC,KAAK,QAAQ,KAAK,EAAE,eAAe,KAAK,KAAK,KAAK,GAAG,CAAC;AAC3F,QAAI,OAAO,QAAQ,SAAU,OAAM,KAAK,OAAO,MAAM,KAAK,iBAAiB;AAC3E,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,KAAuB;AAC7B,UAAM,MAAM,KAAK,OAAO;AAAA,MAAU;AAAA,MAAK,CAAC,QACtC,KAAK,EAAE,mBAAmB,KAAK,KAAK,KAAK,IAAI,MAAM;AAAA,IACrD;AACA,QAAI,QAAQ,EAAG,OAAM,KAAK,OAAO,MAAM,KAAK,kBAAkB;AAAA,EAChE;AAAA,EACA,UAAgB;AACd,SAAK,EAAE,eAAe,KAAK,GAAG;AAAA,EAChC;AACF;AACO,IAAM,aAAN,MAAiB;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACjB,YAAY,QAAmB,GAAoB,KAAa;AAC9D,SAAK,SAAS;AACd,SAAK,IAAI;AACT,SAAK,MAAM;AAAA,EACb;AAAA,EACA,KAAK,OAA2B;AAC9B,WAAO,KAAK,OAAO,UAAU,OAAO,CAAC,QAAQ,KAAK,EAAE,UAAU,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,EAC5F;AAAA,EACA,UAAgB;AACd,SAAK,EAAE,cAAc,KAAK,GAAG;AAAA,EAC/B;AAAA,EACA,OAAoC;AAClC,UAAM,MAAM,KAAK,OAAO,YAAY,CAAC,KAAK,QAAQ,KAAK,EAAE,UAAU,KAAK,KAAK,KAAK,GAAG,CAAC;AACtF,QAAI,eAAe,WAAY,QAAO;AACtC,QAAI,QAAQ,EAAG,QAAO;AACtB,QAAI,QAAQ,IAAK,QAAO;AACxB,UAAM,KAAK,OAAO,MAAM,KAAK,KAAK;AAAA,EACpC;AAAA,EACA,MAAM,OAA2B;AAC/B,UAAM,IAAI,KAAK,OAAO,UAAU,OAAO,CAAC,QAAQ,KAAK,EAAE,WAAW,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AAC9F,QAAI,IAAI,EAAG,OAAM,KAAK,OAAO,MAAM,GAAG,KAAK;AAC3C,WAAO;AAAA,EACT;AAAA,EACA,OAAmB;AACjB,QAAI,KAAK,EAAE,cAAc,KAAK,GAAG,MAAM,EAAG,QAAO,IAAI,WAAW,CAAC;AACjE,UAAM,MAAM,KAAK,OAAO,YAAY,CAAC,KAAK,QAAQ,KAAK,EAAE,cAAc,KAAK,KAAK,KAAK,GAAG,CAAC;AAC1F,WAAO,eAAe,aAAa,MAAM,IAAI,WAAW,CAAC;AAAA,EAC3D;AAAA,EACA,QAAc;AACZ,SAAK,EAAE,WAAW,KAAK,GAAG;AAAA,EAC5B;AAAA,EACA,OAAa;AACX,SAAK,EAAE,kBAAkB,KAAK,GAAG;AAAA,EACnC;AACF;AACA,IAAM,UAAU,oBAAI,QAA4D;AACzE,SAAS,cAAc,MAA0D;AACtF,MAAI,SAAS,QAAQ,IAAI,IAAI;AAC7B,MAAI,CAAC,QAAQ;AACX,UAAM,UAAU,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;AACnD,aAAS;AACT,YAAQ,IAAI,MAAM,OAAO;AACzB,YAAQ,MAAM,MAAM;AAClB,UAAI,QAAQ,IAAI,IAAI,MAAM,QAAS,SAAQ,OAAO,IAAI;AAAA,IACxD,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AC3JA,IAAM,aAAa,gBAAgB,KAAK,KAAK,KAAK;AAClD,IAAM,aAAa;AACnB,IAAM,cAAc,KAAK;AAClB,IAAM,YAAN,MAAgD;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAsB,IAAI,WAAW,CAAC;AAAA,EACtC,QAAQ;AAAA,EAChB,YAAY,SAAqB,UAAsB,WAAyB;AAC9E,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,YAAY;AAAA,EACnB;AAAA,EACA,MAAc,MAAM,QAAqC;AACvD,aAAS,MAAM,KAAK,QAAQ,KAAK,GAAG,IAAI,SAAS,GAAG,MAAM,KAAK,QAAQ,KAAK,GAAG;AAC7E,YAAM,KAAK,UAAU,MAAM,KAAK,MAAM;AAAA,IACxC;AAAA,EACF;AAAA,EACQ,cAAoB;AAC1B,QAAI,KAAK,QAAQ,WAAW,EAAG;AAC/B,UAAM,IAAI,KAAK,QAAQ,KAAK,KAAK,OAAO;AACxC,SAAK,UAAU,KAAK,QAAQ,SAAS,CAAC;AAAA,EACxC;AAAA,EACA,MAAM,KAAK,MAAc,QAA2C;AAClE,eAAS;AACP,WAAK,YAAY;AACjB,YAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,YAAM,KAAK,MAAM,MAAM;AACvB,UAAI,eAAe,WAAY,QAAO;AACtC,UAAI,QAAQ,MAAO,QAAO,IAAI,WAAW,CAAC;AAC1C,UAAI,KAAK,QAAQ,SAAS,EAAG;AAC7B,UAAI,KAAK,OAAO;AACd,aAAK,QAAQ,QAAQ;AACrB,cAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,cAAM,KAAK,MAAM,MAAM;AACvB,eAAO,gBAAgB,aAAa,OAAO,IAAI,WAAW,CAAC;AAAA,MAC7D;AACA,YAAM,SAAS,MAAM,KAAK,SAAS,KAAK,aAAa,MAAM;AAC3D,UAAI,OAAO,WAAW,EAAG,MAAK,QAAQ;AAAA,UACjC,MAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA,EACA,MAAM,MAAM,OAAmB,QAAuC;AACpE,aAAS,KAAK,GAAG,KAAK,MAAM,UAAU;AACpC,YAAM,IAAI,KAAK,QAAQ,MAAM,MAAM,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AAC/D,YAAM,KAAK,MAAM,MAAM;AACvB,YAAM;AAAA,IACR;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EACA,MAAM,MAAM,QAAqC;AAC/C,SAAK,QAAQ,MAAM;AACnB,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB;AACF;AAUO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA,SAAS,oBAAI,IAAwB;AAAA,EACrC;AAAA,EACjB,YAAY,SAA+B;AACzC,SAAK,UAAU;AACf,SAAK,MAAM,QAAQ,OAAO,KAAK;AAAA,EACjC;AAAA,EACQ,QAAQ,QAAmB,MAAgC;AACjE,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,KAAK,OAAO,IAAI,IAAI;AACnC,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,WAAK,OAAO,OAAO,IAAI;AACvB,WAAK,OAAO,IAAI,MAAM,MAAM;AAC5B,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,OAAQ,MAAK,KAAK,KAAK,MAAM,MAAM;AACvC,UAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,GAAG;AACzC,UAAM,QAAQ,EAAE,MAAM,SAAS,MAAM,WAAW;AAChD,SAAK,OAAO,IAAI,MAAM,KAAK;AAC3B,SAAK,MAAM,MAAM;AACf,UAAI,KAAK,OAAO,IAAI,IAAI,MAAM,MAAO,MAAK,OAAO,OAAO,IAAI;AAAA,IAC9D,CAAC;AACD,eAAW,CAAC,QAAQ,GAAG,KAAK,KAAK,QAAQ;AACvC,UAAI,KAAK,OAAO,QAAQ,WAAY;AACpC,WAAK,KAAK,KAAK,QAAQ,GAAG;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA,EACA,MAAc,KAAK,MAAc,OAAkC;AACjE,QAAI,KAAK,OAAO,IAAI,IAAI,MAAM,MAAO,MAAK,OAAO,OAAO,IAAI;AAC5D,KAAC,MAAM,MAAM,KAAK,MAAM,MAAM,MAAS,IAAI,QAAQ;AAAA,EACrD;AAAA,EACA,MAAc,MAAM,QAAmB,MAAc,KAA+B;AAClF,UAAM,KAAK,MAAM,KAAK,QAAQ,GAAG;AACjC,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI;AACF,WAAK,QAAQ,MAAM,GAAG,MAAM,MAAM,KAAK,KAAK,GAAG,GAAG,CAAC;AACnD,WAAK,QAAQ,GAAG,IAAI;AACpB,aAAO;AAAA,IACT,SAAS,GAAG;AACV,WAAK,QAAQ;AACb,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EACnF;AAAA,EACS,UAAyB,OAAO,MAAM,UAAU,QAAQ,QAAQ,cAAc;AACrF,UAAM,SAAS,MAAM,KAAK,QAAQ,OAAO;AACzC,UAAM,OAAO,OAAO,KAAK,QAAQ,YAAY,EAAE;AAC/C,UAAM,OAAO,MAAM,KAAK,QAAQ,QAAQ,IAAI;AAC5C,UAAM,UAAU,OAAO,QAAQ,MAAM,IAAI;AACzC,QAAI;AACF,YAAMC,UAAS,IAAI,UAAU,SAAS,aAAa,QAAQ,GAAG,IAAI;AAClE,YAAM,SAAS,WAAW,UAAU,MAAM,CAAC;AAC3C,YAAM,UAAUA,SAAQA,SAAQ,MAAM;AACtC,YAAMA,QAAO,MAAM,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,IAClD,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AACF;AACO,SAAS,UAAU,QAA8B;AACtD,SAAO,OAAO,SAAS,MAAM,OAAO,OAAO,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AAC1E;AACA,SAAS,aAAa,UAAgC;AACpD,SAAO,EAAE,MAAM,CAAC,KAAK,WAAW,SAAS,KAAK,KAAK,MAAM,EAAE;AAC7D;;;ACrHO,IAAM,eACX;AAEK,IAAM,qBAAqB;AAE3B,IAAM,UAAU;AAEvB,IAAM,YAAY,oBAAoB,gBAAgB;AAEtD,IAAM,WAAW;AAEjB,IAAM,WAAW;AAIV,SAAS,WAAW,WAAmB,kBAA0C;AACtF,QAAM,SAAS,CAAC,UAAU,GAAG,SAAS,QAAQ,EAAE,OAAO,CAAC,MAAM,MAAM,WAAW,CAAC,EAAE,KAAK,GAAG;AAC1F,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,EAC3B;AACF;AAEO,SAAS,mBAAmC;AACjD,SAAO;AAAA,IACL,QAAQ,EAAE,iBAAiB,MAAM,eAAe,MAAM,gBAAgB,GAAG,aAAa,KAAK;AAAA,IAC3F,OAAO,MAAM,QAAQ,OAAO,OAAO,OAAO,IAAI,MAAM,YAAY,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC;AAAA,EACrF;AACF;AAEO,SAAS,gBAAyB;AACvC,QAAM,UAAU,oBAAI,IAAsB;AAC1C,SAAO;AAAA,IACL,KAAK,OAAO,UAAU,QAAQ,IAAI,KAAK;AAAA,IACvC,MAAM,OAAO,OAAO,UAAU,WAAW;AACvC,YAAM,OAAO,OAAO,QAAQ,IAAI,KAAK,GAAG,UAAU,MAAM;AACxD,cAAQ,IAAI,OAAO,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAMA,SAAS,OAAO,OAA2B;AACzC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,OAAQ;AAC7C,YAAQ,OAAO,aAAa,GAAG,MAAM,SAAS,GAAG,IAAI,KAAM,CAAC;AAAA,EAC9D;AACA,SAAO,KAAK,IAAI;AAClB;AAEO,SAAS,iBAAiB,IAAc,SAAiD;AAC9F,QAAM,MAAM,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC,IAAI,kBAAkB;AAChE,SAAO,YAAY;AACjB,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,OAAC,MAAM,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QACrC,GAAG,eAAe,GAAG,GAAG,uBAAuB;AAAA,QAC/C,GAAG,eAAe,GAAG,GAAG,wBAAwB;AAAA,MAClD,CAAC;AAAA,IACH,QAAQ;AACN,YAAM,IAAI,MAAM,aAAa,kBAAkB,iBAAiB,OAAO,EAAE;AAAA,IAC3E;AACA,UAAM,MAAM,+BAA+B,OAAO,IAAI,CAAC;AACvD,UAAM,UAAW,MAAM,OAAO;AAM9B,WAAO,QAAQ,QAAQ,EAAE,YAAY,YAAY,CAAC,SAAS,KAAK,CAAC;AAAA,EACnE;AACF;AASO,SAAS,SAAS,OAAwC;AAC/D,SAAO,MAAM,QAAQ,UAAU,KAAK;AACtC;AAEO,SAAS,gBAAgB,MAAgE;AAC9F,SAAO,MAAM,cAAc,IAAI;AACjC;AAEA,IAAM,cAAc;AAEb,IAAM,gBAAgB;AAM7B,IAAM,eAAe;AACrB,IAAM,gBAAgB;AAEtB,eAAe,YAAY,IAAc,KAA+B;AACtE,QAAM,UAAW,MAAM,GAAG,OAAO,OAAO,IAAK,MAAM,GAAG,SAAS,OAAO,IAAI;AAC1E,QAAM,MAAM,QAAQ,MAAM,WAAW,KAAK,CAAC;AAC3C,QAAM,SAAS,IAAI,OAAO,CAAC,SAAS,SAAS,GAAG;AAChD,MAAI,OAAO,SAAS,IAAI,OAAQ,QAAO;AACvC,QAAM,SAAS,CAAC,GAAG,QAAQ,GAAG,EAAE,MAAM,CAAC,aAAa;AACpD,QAAM,GAAG,MAAM,QAAQ,MAAM,GAAG,QAAQ,YAAY,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9E,QAAM,GAAG,UAAU,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC;AAAA,CAAI;AACpD,SAAO;AACT;AAEA,eAAsB,YACpB,IACA,IACA,QAA8B,WAAW,WAAW,OACrC;AACf,QAAM,OAAO,MAAM,GAAG,GAAG,IAAI,KAAK;AAClC,QAAM,SAAS,YAAY;AACzB,aAAS,IAAI,GAAG,IAAI,iBAAiB,CAAE,MAAM,YAAY,IAAI,GAAG,GAAI,IAAI;AAAA,EAC1E;AACA,SAAO,QAAQ,MAAM,QAAQ,cAAc,MAAM,IAAI,OAAO;AAC9D;AAEO,SAAS,cACd,KACA,SAC8B;AAC9B,MAAI;AACJ,QAAM,YAAY,QAAQ,aAAa,iBAAiB;AACxD,MAAI,SAAS,EAAE,QAAQ,QAAQ,MAAM,aAAa,MAAM,iBAAiB,GAAG,MAAM;AAChF,UAAM,MAAM,IAAI,cAAc;AAAA,MAC5B,IAAI,QAAQ;AAAA,MACZ,QAAQ,QAAQ;AAAA,MAChB,GAAI,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,IAC5C,CAAC;AACD,UAAM,UAAU,IAAI,WAAW;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,QAAQ,IAAI;AAAA,MACZ,aAAa,YAAY;AACvB,cAAM,QAAQ,OAAO;AAAA,MACvB;AAAA,IACF,CAAC;AACD,YAAQ;AACR,SAAK,QAAQ,OAAO,KAAK,YAAY;AACnC,UAAI,UAAU,QAAS,SAAQ;AAC/B,YAAM,IAAI,MAAM;AAAA,IAClB,CAAC;AAAA,EACH,CAAC;AACD,SAAO,MAAM;AACf;;;AC1KO,IAAM,WAA8B,CAAC,eAAe,YAAY,aAAa,YAAY;AAmBhG,IAAM,QAAQ,IAAI,WAAW,CAAC;AAE9B,SAAS,QAAQ,GAAoB;AACnC,SAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAClD;AAEA,gBAAgB,KAAK,OAA+C;AAClE,QAAM;AACR;AAEO,IAAM,cAAN,MAAkB;AAAA,EACN;AAAA,EAEA,OAAO,oBAAI,IAAkB;AAAA,EAEtC,aAAa;AAAA,EAErB,YAAY,WAA2B;AACrC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,QAAQ,KAAyC;AAC/C,QAAI,IAAI,OAAO,cAAe,QAAO,KAAK,QAAQ,GAAG;AACrD,QAAI,IAAI,OAAO,WAAY,QAAO,KAAK,KAAK,IAAI,QAAQ,IAAI,GAAG;AAC/D,QAAI,IAAI,OAAO,aAAc,QAAO,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACjE,WAAO,KAAK,MAAM,IAAI,MAAM;AAAA,EAC9B;AAAA,EAEQ,SAAuB;AAC7B,UAAM,EAAE,aAAa,cAAc,OAAO,GAAGC,MAAK,IAAI,KAAK,UAAU;AACrE,QAAI,YAAa,QAAO,EAAE,IAAI,OAAO,OAAO,eAAe,SAAS,aAAa;AACjF,WAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,EAAE,GAAGA,OAAM,YAAY,EAAE;AAAA,EAClE;AAAA,EAEQ,IACN,OACA,MACA,QACA;AACA,UAAM,SAAS,EAAE,KAAK;AACtB,SAAK,KAAK,IAAI,QAAQ;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,OAAO,aAAa,EAAE;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,QAAQ,QAAQ;AAAA,MACzB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QAAQ,KAAyE;AAC7F,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,UAAU,MAAM;AAAA,QAC1C,KAAK,IAAI;AAAA,QACT,QAAQ,IAAI;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,QACrC,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,YAAM,SAAS,KAAK,IAAI,OAAO,SAAS,MAAM,MAAM,SAAS,OAAO,CAAC;AACrE,YAAM,OAAiB;AAAA,QACrB;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,KAAK,IAAI;AAAA,QACT,SAAS,SAAS;AAAA,MACpB;AACA,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,IAC9C,SAAS,GAAG;AACV,YAAM,OAAO,QAAQ,CAAC;AACtB,UAAI,SAAS,aAAc,QAAO,EAAE,IAAI,OAAO,OAAO,eAAe,SAAS,KAAK;AACnF,YAAM,SAAU,EAA2B;AAC3C,UAAI,OAAO,WAAW,YAAY,WAAW,KAAK;AAChD,eAAO,EAAE,IAAI,OAAO,OAAO,gBAAgB,SAAS,KAAK;AAAA,MAC3D;AACA,YAAM,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAC1C,YAAM,SAAS,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,YAAY,MAAS;AAChE,YAAM,OAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,KAAK,IAAI;AAAA,QACT,SAAS,CAAC,CAAC,gBAAgB,2BAA2B,CAAC;AAAA,MACzD;AACA,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,QAAgB,KAAoC;AACrE,UAAM,QAAQ,KAAK,KAAK,IAAI,MAAM;AAClC,QAAI,CAAC,MAAO,QAAO,EAAE,IAAI,OAAO,OAAO,SAAS,SAAS,cAAc,MAAM,GAAG;AAChF,UAAM,OAAO,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,OAAO,GAAG,CAAC;AAC3D,UAAM,UAAU,KAAK,KAAK,MAAM,MAAS;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,KAAK,OAAa,KAAoC;AAClE,QAAI,MAAM,KAAK,WAAW,KAAK,CAAC,MAAM,MAAM;AAC1C,UAAI;AACF,cAAMC,QAAO,MAAM,MAAM,KAAK,KAAK;AACnC,YAAIA,MAAK,KAAM,OAAM,OAAO;AAAA,YACvB,OAAM,OAAOA,MAAK;AAAA,MACzB,SAAS,GAAG;AACV,cAAM,OAAO;AACb,cAAM,WAAY,GAAiC,SAAS;AAC5D,eAAO,EAAE,IAAI,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,QAAQ,CAAC,EAAE;AAAA,MACjF;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,KAAK,SAAS,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;AACrD,UAAM,OAAO,MAAM,KAAK,SAAS,MAAM,MAAM;AAC7C,WAAO,EAAE,IAAI,MAAM,MAAM,SAAS,MAAM;AAAA,EAC1C;AAAA,EAEA,MAAc,MAAM,QAAuC;AACzD,UAAM,QAAQ,KAAK,KAAK,IAAI,MAAM;AAClC,QAAI,CAAC,MAAO,QAAO,EAAE,IAAI,OAAO,OAAO,SAAS,SAAS,cAAc,MAAM,GAAG;AAChF,SAAK,KAAK,OAAO,MAAM;AACvB,UAAM,MAAM,MAAM;AAClB,UAAM,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AAC1C,WAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,EAClC;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EAC7E;AACF;;;ACnJA,IAAM,eAAe,sBAAsB,KAAK,GAAG;AAE5C,SAAS,UAAU,MAAoC;AAC5D,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,WAAW,KAAK,CAAC,MAAM,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,EAAG,QAAO;AAC3E,QAAM,QAAQ,MAAM,IAAI,MAAM;AAC9B,SAAO,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ;AAChD;AAEO,SAAS,WAAW,MAAoC;AAC7D,MAAI,CAAC,KAAK,SAAS,GAAG,EAAG,QAAO;AAChC,MAAI;AACJ,MAAI;AACF,gBAAY,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE,SAAS,MAAM,GAAG,EAAE;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,CAAC,MAAM,IAAI,IAAI,UAAU,MAAM,IAAI;AACzC,QAAM,OAAO,CAAC,MACZ,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;AACzD,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,OAAO,KAAK,IAAI;AACtB,SAAO,SAAS,SACZ,QACA,CAAC,GAAG,OAAO,GAAG,IAAI,MAAc,IAAI,MAAM,SAAS,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG,GAAG,IAAI;AACtF;AAEA,SAAS,OAAO,QAAkB,OAAuB;AACvD,SAAO,OAAO,OAAO,CAAC,KAAK,MAAO,OAAO,OAAO,KAAK,IAAK,OAAO,CAAC,GAAG,EAAE;AACzE;AAEA,SAAS,YAAY,MAAyD;AAC5E,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,GAAI,QAAO,EAAE,IAAI,OAAO,MAAM,OAAO,IAAI,CAAC,EAAE;AAChD,QAAM,KAAK,WAAW,IAAI;AAC1B,SAAO,KAAK,EAAE,IAAI,MAAM,MAAM,OAAO,IAAI,EAAE,EAAE,IAAI;AACnD;AAEA,SAAS,YAAY,MAAkC;AACrD,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,GAAG;AACnC,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAM,CAAC,UAAU,IAAI,IAAI,IAAI;AAC7B,QAAM,SAAS,YAAY,OAAO;AAClC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAM,OAAO,KAAK,MAAM;AAC9B,QAAMC,UAAS,SAAS,SAAY,MAAM,YAAY,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI;AAClF,MAAIA,UAAS,KAAKA,UAAS,IAAK,QAAO;AACvC,SAAO,EAAE,GAAG,QAAQ,QAAAA,QAAO;AAC7B;AAEA,SAASC,QAAO,QAAgB,MAA8C;AAC5E,MAAI,OAAO,OAAO,KAAK,GAAI,QAAO;AAClC,QAAM,QAAQ,QAAQ,OAAO,KAAK,MAAM,MAAM,OAAO,MAAM;AAC3D,SAAO,KAAK,QAAQ,UAAU,OAAO,QAAQ;AAC/C;AAEA,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,IAAI,CAAC,MAAM,YAAY,CAAC,CAAW;AAE9B,IAAM,SAAN,MAAa;AAAA,EACV,QAAkB,CAAC;AAAA,EACnB,OAAO;AAAA,EACN;AAAA,EAET,YAAYC,QAAO,OAAO;AACxB,SAAK,OAAOA;AAAA,EACd;AAAA,EAEA,IAAI,OAAyB;AAC3B,UAAM,UAAU,MAAM,YAAY,CAAC,GAAG,IAAI,WAAW;AACrD,UAAM,OAAO,MAAM,YAAY,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5D,QAAI,QAAQ,OAAW,OAAM,IAAI,MAAM,0BAA0B,GAAG,EAAE;AACtE,SAAK,QAAQ;AACb,SAAK,OAAO,MAAM,SAAS;AAAA,EAC7B;AAAA,EAEA,SAAS,MAA2B;AAClC,UAAMC,QAAO,KAAK,YAAY,EAAE,QAAQ,OAAO,EAAE;AACjD,QAAIA,UAAS,eAAeA,MAAK,SAAS,YAAY,KAAKA,UAAS,WAAW;AAC7E,aAAO;AAAA,IACT;AACA,QAAIA,UAAS,iBAAiBA,UAAS,aAAc,QAAO;AAC5D,UAAM,OAAO,YAAYA,KAAI;AAC7B,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,KAAK,MAAM,KAAK,SAAS,GAAI,QAAO;AACxC,QAAI,CAAC,KAAK,MAAM,KAAK,QAAQ,QAAQ,KAAM,QAAO;AAClD,QAAI,SAAS,KAAK,CAAC,MAAMF,QAAO,GAAG,IAAI,CAAC,EAAG,QAAO;AAClD,QAAI,KAAK,MAAM,CAAC,KAAK,KAAM,QAAO;AAClC,QAAI,KAAK,QAAQ,KAAK,MAAM,KAAK,CAAC,MAAMA,QAAO,GAAG,IAAI,CAAC,EAAG,QAAO;AACjE,WAAO;AAAA,EACT;AACF;;;AC5CO,SAAS,SAAS,QAAiD;AACxE,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,EAAE,WAAW,OAAO,IAAI;AAC/D,QAAM,YAAY,MAAM,QAAQ,QAAQ,SAAS,IAC7C,OAAO,UAAU,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IACjE,CAAC;AACL,SAAO;AAAA,IACL;AAAA,IACA,GAAI,OAAO,QAAQ,QAAQ,YAAY,OAAO,OAAO,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,EAClF;AACF;AAYA,IAAM,QAAQ,IAAI,OAAO,IAAI;;;ACjFtB,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAC3B,IAAM,oBAAoB;AAEjC,IAAMG,kBAAiB,oBAAI,IAAI,CAAC,aAAa,yBAAyB,iBAAiB,KAAK,CAAC;AAgB7F,SAAS,aAAaC,OAAc,KAAiC;AACnE,SAAOD,gBAAe,IAAIC,KAAI,KAAKA,MAAK,SAAS,YAAY,KAAK,IAAI,SAASA,KAAI;AACrF;AAEO,SAAS,WACdA,OACA,MAAyB,SAAS,gBAAgB,GAC9B;AACpB,MAAI,IAAI,SAASA,KAAI,EAAG,QAAO;AAC/B,MAAID,gBAAe,IAAIC,KAAI,KAAKA,MAAK,SAAS,YAAY,EAAG,QAAO;AACpE,MAAIA,UAAS,cAAe,QAAO,sBAAsB,KAAK,GAAG;AACjE,SAAO,UAAUA,KAAI,IAAIA,QAAO;AAClC;AAEO,IAAM,WAAN,MAAe;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,oBAAI,IAAoB;AAAA,EAChC,UAAU,oBAAI,IAAoB;AAAA,EAEnD,YAAY,SAA0B;AACpC,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ;AACtB,SAAK,MAAM,QAAQ,OAAO,KAAK;AAC/B,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,MAAM,QAAQ,QAAQ,CAACC,aAAY,QAAQ,KAAKA,QAAO;AAC5D,SAAK,MAAM,SAAS,QAAQ,YAAY,gBAAgB;AAAA,EAC1D;AAAA,EAEA,MAAM,QACJD,OACA,QACA,UACmB;AACnB,UAAM,MAAMA,MAAK,YAAY,EAAE,QAAQ,OAAO,EAAE;AAChD,UAAM,QAAQ,WAAW,KAAK,KAAK,GAAG;AACtC,QAAI,WAAW,GAAG,GAAG;AACnB,YAAM,KAAK,WAAW,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC9C,aAAO,WAAW,IAAI,KAAK,CAAC,GAAG,IAAI,GAAG;AAAA,IACxC;AACA,QAAI,OAAO;AACT,YAAM,MAAM,aAAa,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;AACrD,aAAO,WAAW,IAAI,MAAM,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,GAAG,GAAG;AAAA,IACrE;AACA,QAAI,CAAC,KAAK,UAAU,QAAQ,GAAI,QAAO,CAAC;AACxC,UAAM,QAAuB,KAAK,OAAO,OAAO,OAAO,SAAS;AAChE,QAAI,WAAW,KAAK,UAAU,EAAG,QAAO,CAAC;AACzC,UAAM,KAAK,GAAG,KAAK,IAAI,GAAG;AAC1B,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,QAAI,OAAO,IAAI,UAAU,KAAK,IAAI,EAAG,QAAO,IAAI;AAChD,UAAM,SAAS,WAAW;AAC1B,QAAI,QAAQ,QAAS,OAAM,IAAI,YAAY,OAAO;AAClD,QAAI,SAAS,KAAK,QAAQ,IAAI,EAAE;AAChC,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,IAAI,gBAAgB;AAClC,eAAS,EAAE,MAAM,KAAK,OAAO,KAAK,OAAO,IAAI,MAAM,MAAM,GAAG,OAAO,SAAS,EAAE;AAC9E,WAAK,QAAQ,IAAI,IAAI,MAAM;AAC3B,WAAK,OAAO,KAAK,KAAK,MAAM,KAAK,QAAQ,OAAO,EAAE,CAAC;AAAA,IACrD;AACA,WAAO,QAAQ,QAAQ,MAAM;AAAA,EAC/B;AAAA,EAEA,MAAc,OACZA,OACA,QACA,IACA,WACmB;AACnB,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,YAAY,IAAI,CAAC,YAAY,QAAQ,KAAK,SAAS,GAAG,SAAS,CAAC;AAChF,QAAI;AACJ,QAAI;AACF,eAAS;AAAA,QACP,MAAM,QAAQ,KAAK;AAAA,UACjB,OAAO,QAAQA,OAAM,QAAQ,OAAO;AAAA,UACpC,IAAI;AAAA,YAAe,CAAC,GAAG,WACrB,QAAQ,iBAAiB,SAAS,MAAM,OAAO,QAAQ,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,UAChF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AACA,UAAM,YAAY,OAAO,UAAU,OAAO,CAAC,MAAM,KAAK,OAAOA,OAAM,GAAG,MAAM,CAAC;AAC7E,QAAI,UAAU,SAAS,EAAG,MAAK,SAAS,IAAI,WAAW,OAAO,GAAG;AACjE,WAAO;AAAA,EACT;AAAA,EAEQ,OAAOA,OAAc,SAAiB,QAAgC;AAC5E,UAAM,KAAK,UAAU,OAAO,MAAM;AAClC,QAAI,CAAC,OAAO,WAAW,KAAK,CAAC,WAAW,OAAO,GAAI,QAAO;AAC1D,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,OAAO,KAAK,OAAO,SAAS,OAAO;AACzC,QAAI,SAAS,cAAc,SAAS,UAAU,SAAS,WAAY,QAAO;AAC1E,SAAK,IAAI,6CAA6C,OAAO,QAAQA,KAAI,WAAW,IAAI,EAAE;AAC1F,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,IAAY,WAAqB,KAA+B;AAC/E,UAAM,UAAU,KAAK,IAAI,OAAO,iBAAiB,eAAe;AAChE,QAAI,WAAW,EAAG;AAClB,SAAK,MAAM,OAAO,EAAE;AACpB,SAAK,MAAM,IAAI,IAAI,EAAE,WAAW,SAAS,KAAK,IAAI,IAAI,UAAU,IAAK,CAAC;AACtE,QAAI,KAAK,MAAM,OAAO,mBAAmB;AACvC,WAAK,MAAM,OAAO,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE,KAAe;AAAA,IAC5D;AAAA,EACF;AACF;AAQA,SAAS,QAAQ,QAAgB,QAAoD;AACnF,SAAO;AACP,SAAO,IAAI,QAAkB,CAAC,SAAS,WAAW;AAChD,UAAM,QAAQ,MAAM;AAClB,UAAI,EAAE,OAAO,YAAY,EAAG,QAAO,MAAM,MAAM,IAAI,YAAY,OAAO,CAAC;AACvE,aAAO,IAAI,YAAY,OAAO,CAAC;AAAA,IACjC;AACA,YAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACvD,SAAK,OAAO,KAAK,KAAK,CAAC,UAAU;AAC/B,UAAI,QAAQ,QAAS;AACrB,aAAO;AACP,cAAQ,oBAAoB,SAAS,KAAK;AAC1C,cAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AACH;;;ACtJA,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,SAAS;AACf,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,UAAU;AAET,SAAS,iBAA0B;AACxC,QAAM,MAAM,IAAI,MAAc,EAAE,EAAE,KAAK,CAAC;AACxC,SAAO,OAAO,KAAK,EAAE,CAAC,KAAK,GAAG,GAAM,CAAC,KAAK,GAAG,IAAM,CAAC,MAAM,GAAG,KAAM,CAAC,KAAK,GAAG,GAAK,CAAC;AAClF,SAAO,OAAO,KAAK,EAAE,CAAC,IAAI,GAAG,GAAM,GAAG,GAAG,GAAG,IAAM,GAAG,IAAM,CAAC,KAAK,GAAG,GAAK,CAAC;AAC1E,SAAO,OAAO,KAAK,EAAE,IAAI,IAAM,IAAI,IAAM,CAAC,OAAO,GAAG,IAAM,IAAI,GAAK,CAAC;AACpE,SAAO;AAAA,IACL,SAAS,QAAQ,OAAS,OAAU;AAAA,IACpC,SAAS,QAAQ;AAAA,IACjB,SAAS,KAAO,KAAO;AAAA,IACvB,SAAS,OAAO,SAAS,OAAO,QAAQ,KAAO,UAAU,OAAS;AAAA,IAClE,MAAM;AAAA,EACR;AACF;AAEA,IAAME,WAAU,IAAI,YAAY;AAEhC,SAAS,eAAe,MAAuB;AAC7C,UAAQ,OAAO,SAAU;AAC3B;AAEO,IAAM,YAAN,MAAgB;AAAA,EACb,UAAU,eAAe;AAAA,EACzB,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,WAAqC,CAAC;AAAA,EAEtC,OAAiB,CAAC;AAAA,EAClB,UAA6B,CAAC;AAAA,EAE9B,SAAS;AAAA,EAEjB;AAAA,EAEA;AAAA,EAEQ,UAAU;AAAA,EAED;AAAA,EAEA;AAAA,EAEjB,YACE,QAEA,QACA;AACA,SAAK,SAAS;AAEd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,OAAyB;AAC/B,eAAW,QAAQ,MAAO,MAAK,IAAI,IAAI;AACvC,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,OAAO,MAAc,MAAoB;AACvC,SAAK,QAAQ,MAAM,IAAI;AACvB,SAAK,OAAO,IAAI,KAAK;AAAA,EACvB;AAAA,EAEA,SAAe;AACb,SAAK,SAAS;AACd,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,eAAqB;AACnB,SAAK,OAAO,IAAI,GAAG;AAAA,EACrB;AAAA,EAEA,QAAQ,MAAc,MAAoB;AACxC,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAkB;AAChB,WAAO,EAAE,GAAG,KAAK,SAAS,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,EAAE;AAAA,EACzD;AAAA,EAEA,OAAO,SAAwB;AAC7B,UAAM,eAAe,KAAK;AAC1B,SAAK,UAAU,EAAE,GAAG,SAAS,MAAM,CAAC,GAAG,QAAQ,IAAI,EAAE;AAErD,QAAI,gBAAgB,CAAC,KAAK,aAAa,KAAK,KAAK,SAAS,GAAG;AAC3D,WAAK,SAAS,KAAK,WAAW,KAAK,KAAK,IAAI,CAAC;AAC7C,WAAK,OAAO,CAAC;AACb,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,UAA4B;AAC1B,WAAO,CAAC,KAAK,MAAM,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEA,OAAiB;AACf,WAAO,IAAI,SAAS;AAAA,MAClB,MAAM,CAAC,KAAK,WAAW,KAAK,KAAK,KAAK,MAAM;AAAA,MAC5C,OAAO,OAAO,UAAU;AACtB,YAAI,KAAK,OAAQ,OAAM,IAAI,YAAY,KAAK;AAC5C,aAAK,OAAO,KAAK;AACjB,eAAO,MAAM;AAAA,MACf;AAAA,MACA,MAAM,OAAkB;AAAA,QACtB,UAAU,KAAK,SAAS,SAAS,KAAK,KAAK;AAAA,QAC3C,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf;AAAA,MACA,SAAS,CAAC,WAAW,KAAK,QAAQ,MAAM;AAAA,MACxC,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,IAAY,YAAqB;AAC/B,YAAQ,KAAK,QAAQ,UAAU,YAAY;AAAA,EAC7C;AAAA,EAEQ,GAAG,MAAsB;AAC/B,WAAO,KAAK,QAAQ,KAAK,IAAI,KAAK;AAAA,EACpC;AAAA,EAEQ,IAAI,OAAqB;AAC/B,UAAM,EAAE,SAAS,QAAQ,IAAI,KAAK;AAClC,UAAM,OAAO,UAAU,MAAQ,UAAU,QAAQ,KAAO;AACxD,QAAI,UAAU,QAAQ,KAAK,UAAU,IAAI,EAAG;AAC5C,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,SAAS,KAAK,WAAW,GAAG,IAAI,CAAC;AACtC,UAAI,UAAU,KAAM,MAAK,KAAK,IAAI;AAClC;AAAA,IACF;AACA,SAAK,KAAK,IAAI;AAAA,EAChB;AAAA,EAEQ,UAAU,MAAuB;AACvC,UAAM,MACJ,SAAS,KAAK,GAAG,KAAK,IAClB,IAAI,MACJ,SAAS,KAAK,GAAG,KAAK,IACpB,IAAI,OACJ,SAAS,KAAK,GAAG,KAAK,IACpB,IAAI,OACJ;AACV,QAAI,CAAC,OAAO,SAAS,EAAG,QAAO;AAC/B,QAAI,KAAK,QAAQ,UAAU,KAAM,MAAK,KAAK,IAAI;AAC/C,QAAI,EAAE,KAAK,QAAQ,UAAU,SAAS;AACpC,WAAK,OAAO,CAAC;AACb,WAAK,WAAW,CAAC;AAAA,IACnB;AACA,SAAK,OAAO,GAAG;AACf,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,MAAoB;AAC/B,UAAM,QAAQ,KAAK,QAAQ,UAAU,UAAU;AAC/C,QAAI,SAAS,KAAK,GAAG,MAAM,KAAK,SAAS,GAAM;AAC7C,WAAK,OAAO,KAAK,eAAe,CAAC;AAAA,IACnC,WAAW,SAAS,KAAK,GAAG,KAAK,GAAG;AAClC,WAAK,OAAO,KAAK,KAAK,MAAM;AAAA,IAC9B,WAAW,SAAS,KAAK,GAAG,OAAO,GAAG;AACpC,WAAK,OAAO,KAAK,eAAe,CAAC;AAAA,IACnC,WAAW,SAAS,KAAK,GAAG,IAAI,GAAG;AACjC,WAAK,SAAS,KAAK,KAAK,KAAK,SAAS,IAAI,WAAW,KAAK,KAAK,IAAI,IAAI,IAAI;AAC3E,WAAK,OAAO,CAAC;AAAA,IACf,WAAW,SAAS,IAAM;AACxB,WAAK,KAAK,KAAK,IAAI;AACnB,UAAI,KAAM,MAAK,OAAOA,SAAQ,OAAO,IAAI,CAAC;AAC1C,WAAK,SAAS,KAAK,WAAW,KAAK,KAAK,IAAI,CAAC;AAC7C,WAAK,OAAO,CAAC;AAAA,IACf,OAAO;AACL,WAAK,KAAK,KAAK,IAAI;AACnB,UAAI,KAAM,MAAK,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,iBAAyB;AAC/B,QAAI,MAAM,KAAK,KAAK;AACpB,WAAO,MAAM,KAAK,KAAK,KAAK,MAAM,CAAC,MAAM,GAAM;AAC/C,WAAO,MAAM,KAAK,KAAK,KAAK,MAAM,CAAC,MAAM,GAAM;AAC/C,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEQ,iBAAyB;AAC/B,UAAM,EAAE,KAAK,IAAI;AACjB,QAAI,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM;AAC/B,QAAI,KAAK,QAAQ,UAAU,OAAO;AAChC,aAAO,IAAI,KAAK,UAAU,eAAe,KAAK,KAAK,SAAS,CAAC,KAAK,CAAC,EAAG;AAAA,IACxE;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,GAAiB;AAC9B,UAAMC,WAAU,KAAK,KAAK,OAAO,KAAK,KAAK,SAAS,GAAG,CAAC;AACxD,UAAMC,SAAQ,KAAK,QAAQ,UAAU,WAAW;AAChD,UAAM,QAAQA,QAAOD,SAAQ,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,SAASA,SAAQ;AAChF,QAAI,QAAQ,KAAK,KAAK,QAAQ,UAAU,MAAM;AAC5C,WAAK,OAAOD,SAAQ,OAAO,QAAQ,OAAO,KAAK,CAAC,GAAG,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA,EAEQ,KAAK,MAAoB;AAC/B,QAAI,OAAO,MAAQ,SAAS,MAAQ,SAAS,KAAQ,KAAK,QAAQ,UAAU,SAAS;AACnF,WAAK,OAAO,WAAW,GAAG,IAAM,OAAO,EAAI,GAAG,KAAK;AACnD;AAAA,IACF;AACA,SAAK,OAAO,WAAW,GAAG,IAAI,CAAC;AAAA,EACjC;AAAA,EAEQ,OAAO,OAAmBG,aAAY,MAAY;AACxD,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,QAAI,CAACA,cAAa,EAAE,UAAU,SAAS,UAAU,UAAU,CAAC,MAAM,SAAS,EAAI,GAAG;AAChF,WAAK,OAAO,MAAM,KAAK;AACvB;AAAA,IACF;AACA,UAAM,MAAgB,CAAC;AACvB,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,GAAM,KAAI,KAAK,EAAI;AAChC,UAAI,KAAK,IAAI;AAAA,IACf;AACA,SAAK,OAAO,MAAM,WAAW,KAAK,GAAG,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,MAAc,KAAK,KAAa,QAA2C;AACzE,SAAK,SAAS;AACd,SAAK;AACL,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,KAAK,MAAM;AAAA,IACpC,UAAE;AACA,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAc,KAAK,KAAa,QAA2C;AACzE,WAAO,KAAK,SAAS,WAAW,GAAG;AACjC,UAAI,KAAK,OAAQ,QAAO,IAAI,WAAW,CAAC;AACxC,YAAM,KAAK,QAAQ,MAAM;AAAA,IAC3B;AACA,UAAM,OAAO,KAAK,SAAS,CAAC;AAC5B,QAAI,SAAS,MAAM;AACjB,WAAK,SAAS,MAAM;AACpB,aAAO,IAAI,WAAW,CAAC;AAAA,IACzB;AACA,QAAI,SAAS,OAAW,QAAO,IAAI,WAAW,CAAC;AAE/C,UAAMC,UAAuB,CAAC;AAC9B,QAAI,IAAI;AACR,WAAO,KAAK,SAAS,SAAS,KAAK,IAAI,KAAK;AAC1C,YAAMC,QAAO,KAAK,SAAS,CAAC;AAC5B,UAAIA,UAAS,QAAQA,UAAS,OAAW;AACzC,YAAM,OAAOA,MAAK,SAAS,GAAG,MAAM,CAAC;AACrC,MAAAD,QAAO,KAAK,IAAI;AAChB,WAAK,KAAK;AACV,UAAI,KAAK,SAASC,MAAK,OAAQ,MAAK,SAAS,CAAC,IAAIA,MAAK,SAAS,KAAK,MAAM;AAAA,UACtE,MAAK,SAAS,MAAM;AACzB,UAAI,KAAK,UAAW;AAAA,IACtB;AACA,UAAM,MAAM,IAAI,WAAW,CAAC;AAC5B,QAAI,KAAK;AACT,eAAWC,UAASF,SAAQ;AAC1B,UAAI,IAAIE,QAAO,EAAE;AACjB,YAAMA,OAAM;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,QAAqC;AACnD,QAAI,QAAQ,QAAS,QAAO,QAAQ,OAAO,IAAI,YAAY,OAAO,CAAC;AACnE,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU,MAAY;AAC1B,aAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,MAAM,MAAM;AACtD,eAAO,IAAI,YAAY,OAAO,CAAC;AAAA,MACjC;AACA,YAAM,SAAS,MAAY;AACzB,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,gBAAQ;AAAA,MACV;AACA,WAAK,QAAQ,KAAK,MAAM;AACxB,cAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEQ,OAAa;AACnB,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,CAAC;AAChB,eAAW,WAAW,QAAS,SAAQ;AAAA,EACzC;AACF;;;AC7TO,IAAM,UAAN,MAAc;AAAA,EACV;AAAA,EAET,SAAS;AAAA,EAET,SAAS;AAAA,EACD,QAAsB,CAAC;AAAA,EACvB,UAA6B,CAAC;AAAA,EAC9B,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EAEX;AAAA,EAEQ;AAAA,EAEjB,YACE,OAEA,QAEA,QAEA,QACA;AACA,SAAK,QAAQ;AAEb,SAAK,SAAS;AACd,SAAK,QAAQ,IAAI;AAAA,MAAU,EAAE,OAAO,CAAC,UAAU,KAAK,UAAU,KAAK,EAAE;AAAA,MAAG,CAAC,QACvE,OAAO,KAAK,OAAO,GAAG;AAAA,IACxB;AACA,QAAI,OAAQ,MAAK,MAAM,SAAS,MAAM,OAAO,KAAK,KAAK;AACvD,SAAK,MAAM,OAAO,YAAY,KAAK;AAAA,EACrC;AAAA,EAEA,SAAmB;AACjB,WAAO,IAAI,SAAS;AAAA,MAClB,MAAM,CAAC,KAAK,WAAW,KAAK,WAAW,KAAK,MAAM;AAAA,MAClD,OAAO,OAAO,UAAU;AACtB,aAAK,MAAM,QAAQ,KAAK;AACxB,eAAO,MAAM;AAAA,MACf;AAAA,MACA,MAAM,OAAkB;AAAA,QACtB,UAAU,KAAK,MAAM,SAAS,KAAK,KAAK;AAAA,QACxC,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf;AAAA,MACA,SAAS,CAAC,WAAW,KAAK,QAAQ,MAAM;AAAA,MACxC,OAAO,MAAM,KAAK,YAAY;AAAA,MAC9B,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,YAAsB;AACpB,QAAI,CAAC,KAAK,cAAc,KAAK,OAAQ,OAAM,IAAI,YAAY,KAAK;AAChE,UAAM,OAAO,KAAK,MAAM,KAAK,EAAE;AAC/B,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,WAAO,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;AAAA,EACjE;AAAA,EAEA,IAAY,YAAqB;AAC/B,WAAO,KAAK,aAAa,KAAK,cAAc;AAAA,EAC9C;AAAA,EAEQ,UAAU,OAAyB;AACzC,QAAI,CAAC,KAAK,WAAY;AACtB,SAAK,MAAM,KAAK,MAAM,MAAM,CAAC;AAC7B,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,WAAW,KAAa,QAA2C;AAC/E,WAAO,KAAK,MAAM,WAAW,GAAG;AAC9B,UAAI,KAAK,UAAW,OAAM,IAAI,YAAY,KAAK;AAC/C,YAAM,KAAK,QAAQ,MAAM;AAAA,IAC3B;AAEA,UAAM,SAAS,KAAK,SAAS,IAAI;AACjC,UAAMC,UAAuB,CAAC;AAC9B,QAAI,IAAI;AACR,WAAO,KAAK,MAAM,SAAS,KAAK,IAAI,MAAM,QAAQ;AAChD,YAAMC,QAAO,KAAK,MAAM,CAAC;AACzB,YAAM,OAAOA,MAAK,SAAS,GAAG,MAAM,SAAS,CAAC;AAC9C,MAAAD,QAAO,KAAK,IAAI;AAChB,WAAK,KAAK;AACV,UAAI,KAAK,SAASC,MAAK,OAAQ,MAAK,MAAM,CAAC,IAAIA,MAAK,SAAS,KAAK,MAAM;AAAA,UACnE,MAAK,MAAM,MAAM;AAAA,IACxB;AACA,UAAM,MAAM,IAAI,WAAW,SAAS,CAAC;AACrC,QAAI,KAAK;AACT,eAAWC,UAASF,SAAQ;AAC1B,UAAI,IAAIE,QAAO,EAAE;AACjB,YAAMA,OAAM;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAoB;AAC1B,SAAK,aAAa;AAClB,SAAK,QAAQ,CAAC;AAEd,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,aAAa;AACxB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,aAAmB;AACzB,SAAK,aAAa;AAClB,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,cAAc,KAAK,cAAc,EAAG,MAAK,OAAO,IAAI;AAAA,EAChE;AAAA,EAEQ,QAAQ,QAAqC;AACnD,QAAI,QAAQ,QAAS,QAAO,QAAQ,OAAO,IAAI,YAAY,OAAO,CAAC;AACnE,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU,MAAY;AAC1B,aAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,MAAM,MAAM;AACtD,eAAO,IAAI,YAAY,OAAO,CAAC;AAAA,MACjC;AACA,YAAM,SAAS,MAAY;AACzB,gBAAQ,oBAAoB,SAAS,OAAO;AAC5C,gBAAQ;AAAA,MACV;AACA,WAAK,QAAQ,KAAK,MAAM;AACxB,cAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEQ,OAAa;AACnB,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU,CAAC;AAChB,eAAW,WAAW,QAAS,SAAQ;AAAA,EACzC;AACF;AAEO,IAAM,WAAN,MAAe;AAAA,EACH,QAAQ,oBAAI,IAAqB;AAAA,EAEjC;AAAA,EAEA;AAAA,EAEjB,YAAY,QAAmB,QAAmC;AAChE,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,OAA4C;AAC1C,QAAI,QAAQ;AACZ,WAAO,KAAK,MAAM,IAAI,KAAK,EAAG,UAAS;AACvC,UAAM,OAAO,IAAI,QAAQ,OAAO,KAAK,QAAQ,CAAC,MAAM,KAAK,MAAM,OAAO,EAAE,KAAK,GAAG,KAAK,MAAM;AAC3F,SAAK,MAAM,IAAI,OAAO,IAAI;AAC1B,WAAO,EAAE,MAAM,QAAQ,KAAK,OAAO,EAAE;AAAA,EACvC;AAAA,EAEA,IAAI,OAAwB;AAC1B,UAAM,OAAO,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAAC,KAAM,OAAM,IAAI,YAAY,QAAQ;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,UAAoB;AAClB,WAAO,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EACpD;AACF;AAiBO,IAAM,UAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASA,SAAS,SAAS,KAAiB,IAAqB;AACtD,QAAM,OAAO,IAAI,IAAI,IAAI,EAAE,EAAE,KAAK;AAClC,MAAI,CAAC,KAAM,OAAM,IAAI,YAAY,QAAQ;AACzC,SAAO;AACT;AAEA,SAAS,WAAW,KAAiB,IAAuB;AAC1D,QAAM,OAAO,IAAI,IAAI,IAAI,EAAE,EAAE;AAC7B,QAAM,MAAM,KAAK,OAAO,KAAK,KAAK;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,YAAY,QAAQ;AACxC,SAAO;AACT;AAEA,IAAMC,QAAO,CAAC,WAAkC,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM;AACtF,IAAMC,QAAqB,EAAE,IAAI,MAAM,MAAM,OAAO;AAE7C,SAAS,WAAW,KAAiB,KAA+B;AACzE,UAAQ,IAAI,IAAI;AAAA,IACd,KAAK,YAAY;AACf,UAAI,CAAC,IAAI,KAAM,OAAM,IAAI,YAAY,QAAQ;AAC7C,aAAOD,MAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC;AAAA,IACxD;AAAA,IACA,KAAK,kBAAkB;AACrB,UAAI,CAAC,IAAI,KAAM,OAAM,IAAI,YAAY,QAAQ;AAC7C,YAAM,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC;AAC/B,YAAM,KAAK,IAAI,IAAI,QAAQ,KAAK,UAAU,GAAG,CAAC;AAE9C,UAAI,CAAC,IAAI,OAAQ,KAAI,MAAM,gBAAgB,IAAI,KAAK,KAAK,KAAK;AAC9D,aAAOA,MAAK,EAAE;AAAA,IAChB;AAAA,IACA,KAAK;AACH,aAAOA,MAAK,SAAS,KAAK,IAAI,EAAE,EAAE,KAAK;AAAA,IACzC,KAAK;AACH,eAAS,KAAK,IAAI,EAAE,EAAE,SAAS,IAAI;AACnC,aAAOC;AAAA,IACT,KAAK,YAAY;AACf,YAAM,MAAM,WAAW,KAAK,IAAI,EAAE;AAElC,YAAM,SAAS,IAAI,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI;AACpD,UAAI,UAAU,IAAI,MAAM,oBAAoB,IAAI,GAAG,MAAM,IAAK,QAAOA;AACrE,UAAI,CAAC,IAAI,MAAM,gBAAgB,IAAI,KAAK,GAAG,EAAG,OAAM,IAAI,YAAY,OAAO;AAC3E,aAAOA;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAOD,MAAK,IAAI,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,IACvC,KAAK;AACH,eAAS,KAAK,IAAI,EAAE,EAAE,SAAS,IAAI;AACnC,aAAOC;AAAA,IACT,KAAK;AACH,iBAAW,KAAK,IAAI,EAAE,EAAE,OAAO,IAAI,MAAM,IAAI,IAAI;AACjD,aAAOA;AAAA,EACX;AACF;;;AC7PA,SAAS,MAAM,KAAc,MAAyB,OAAwC;AAC5F,QAAM,SAAS,oBAAI,IAAY;AAC/B,QAAM,OAAO,CAAC,MAAyB,QACrC,KAAK,OAAO,CAAC,OAAO;AAClB,UAAM,QAAQ,SAAS,IAAI,IAAI,EAAE,EAAE,IAAI;AACvC,QAAI,MAAM,OAAQ,QAAO,IAAI,EAAE;AAC/B,WAAO,MAAM,GAAG,KAAK,MAAM;AAAA,EAC7B,CAAC;AACH,QAAM,MAAoB,EAAE,MAAM,KAAK,MAAM,UAAU,GAAG,OAAO,KAAK,OAAO,UAAU,EAAE;AACzF,MAAI,OAAO,OAAO,EAAG,KAAI,SAAS,CAAC,GAAG,MAAM;AAC5C,SAAO;AACT;AAEA,SAAS,aAAa,QAAgE;AACpF,QAAM,EAAE,SAAS,OAAO,IAAI,QAAQ,cAAqB;AACzD,QAAMC,QAAO,MAAY,OAAO,IAAI,YAAY,OAAO,CAAC;AACxD,MAAI,OAAO,QAAS,CAAAA,MAAK;AAAA,MACpB,QAAO,iBAAiB,SAASA,OAAM,EAAE,MAAM,KAAK,CAAC;AAC1D,SAAO,EAAE,SAAS,MAAM,MAAM,OAAO,oBAAoB,SAASA,KAAI,EAAE;AAC1E;AAEA,eAAsB,UACpB,KACA,MACA,OACA,WACA,WACuB;AACvB,QAAM,WAAW,YAAY,IAAI,OAAO,oBAAoB,KAAK,IAAI,IAAI;AACzE,QAAMC,eAAc,aAAa,SAAS;AAC1C,EAAAA,aAAY,QAAQ,MAAM,MAAM;AAAA,EAAC,CAAC;AAClC,MAAI;AACF,WAAO,MAAM,UAAU,KAAK,MAAM,OAAO,UAAUA,aAAY,OAAO;AAAA,EACxE,UAAE;AACA,IAAAA,aAAY,KAAK;AAAA,EACnB;AACF;AAEA,eAAe,UACb,KACA,MACA,OACA,UACAA,cACuB;AACvB,aAAS;AACP,UAAM,MAAM,MAAM,KAAK,MAAM,KAAK;AAClC,QAAI,IAAI,KAAK,SAAS,KAAK,IAAI,MAAM,SAAS,KAAK,KAAK,IAAI,KAAK,SAAU,QAAO;AAElF,UAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAM,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO;AAChE,YAAM,OAAO,IAAI,IAAI,EAAE,EAAE;AACzB,aAAO,KAAK,YAAY,SAAY,CAAC,IAAI,CAAC,KAAK,QAAQ,MAAM,MAAM,EAAE,MAAM,MAAM,MAAS,CAAC;AAAA,IAC7F,CAAC;AACD,QAAI;AACJ,UAAM,SACJ,aAAa,OAAO,oBAChB,CAAC,IACD,CAAC,IAAI,QAAc,CAAC,YAAa,QAAQ,WAAW,SAAS,WAAW,KAAK,IAAI,CAAC,CAAE,CAAC;AAC3F,QAAI;AACF,YAAM,QAAQ,KAAK,CAAC,GAAG,SAAS,GAAG,QAAQA,YAAW,CAAC;AAAA,IACzD,UAAE;AACA,YAAM,MAAM;AACZ,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;;;ACbO,IAAM,aAA6C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOA,SAAS,SAAS,KAAc,IAA0B;AACxD,QAAM,OAAO,IAAI,IAAI,EAAE,EAAE;AACzB,MAAI,EAAE,gBAAgB,cAAe,OAAM,IAAI,YAAY,UAAU;AACrE,SAAO;AACT;AACA,IAAM,KAAK,CAACC,UACVA,UAAS,SAAY,EAAE,IAAI,MAAM,MAAM,OAAO,IAAI,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAAA,MAAK;AACnF,eAAsB,cACpB,KACA,MACuB;AACvB,QAAM,EAAE,KAAK,IAAI,IAAI;AACrB,UAAQ,IAAI,IAAI;AAAA,IACd,KAAK;AACH,aAAO,GAAG,IAAI,QAAQ,IAAI,SAAS,IAAI,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;AAAA,IAChE,KAAK,aAAa;AAChB,YAAM,CAAC,GAAG,CAAC,IAAI,aAAa,KAAK,KAAK,IAAI,MAAM;AAChD,YAAM,QAAQ,IAAI,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC;AAC5C,UAAI;AACF,eAAO,GAAG,CAAC,OAAO,IAAI,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,MACpD,SAAS,GAAG;AACV,cAAM,QAAQ,QAAQ,IAAI,MAAM,KAAK,CAAC;AACtC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,KAAK;AACH,eAAS,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,IAAI;AACnC,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,eAAS,KAAK,IAAI,EAAE,EAAE,OAAO,IAAI,OAAO;AACxC,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,aAAO,GAAG,MAAM,OAAO,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC;AAAA,IACpD,KAAK,gBAAgB;AACnB,YAAM,UAAU,SAAS,KAAK,IAAI,EAAE,EAAE,QAAQ,IAAI,IAAI;AACtD,UAAI,IAAI,UAAU;AAChB,iBAAS,MAAM,MAAM,MAAS;AAC9B,cAAM,IAAI,YAAY,aAAa;AAAA,MACrC;AACA,UAAI,YAAY,OAAW,OAAM,cAAc,SAAS,KAAK,SAAS,CAAC;AACvE,aAAO,GAAG;AAAA,IACZ;AAAA,IACA,KAAK;AACH,eAAS,KAAK,IAAI,EAAE,EAAE,SAAS,IAAI,GAAG;AACtC,aAAO,GAAG;AAAA,IACZ,KAAK,aAAa;AAChB,YAAM,SAAS,SAAS,KAAK,IAAI,EAAE;AACnC,YAAM,OAAO,IAAI,OAAO,OAAO,OAAO,OAAO;AAC7C,UAAI,IAAI,QAAQ,CAAC,KAAM,OAAM,IAAI,YAAY,UAAU;AACvD,aAAO,GAAG,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAAA,IAC1C;AAAA,IACA,KAAK;AACH,aAAO,GAAG,SAAS,KAAK,IAAI,EAAE,EAAE,UAAU,IAAI,OAAO,IAAI,IAAI,CAAC;AAAA,IAChE,KAAK;AACH,eAAS,KAAK,IAAI,EAAE,EAAE,UAAU,IAAI,OAAO,IAAI,MAAM,IAAI,KAAK;AAC9D,aAAO,GAAG;AAAA,IACZ,KAAK,gBAAgB;AACnB,YAAM,YAAY,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,QAAQ,MAAM,KAAK,SAAS,CAAC;AAChF,UAAI,UAAU,WAAW,EAAG,OAAM,IAAI,YAAY,QAAQ;AAC1D,aAAO,GAAG,SAAS;AAAA,IACrB;AAAA,EACF;AACF;AACA,SAAS,cAAc,SAAwB,QAAoC;AACjF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,OAAO,IAAI,YAAY,OAAO,CAAC;AACnD,WAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACtD,YAAQ,KAAK,SAAS,MAAM,EAAE,QAAQ,MAAM,OAAO,oBAAoB,SAAS,KAAK,CAAC;AAAA,EACxF,CAAC;AACH;AACA,SAAS,QAAQ,QAAgC;AAC/C,SAAO,WAAW,SACd,EAAE,QAAQ,QAAQ,MAAM,WAAW,MAAM,EAAE,IAC3C,EAAE,QAAQ,QAAQ,MAAM,GAAG;AACjC;AACA,eAAe,OACb,MACA,IACA,UAIC;AACD,QAAM,WAAW,SAAS,KAAK,KAAK,EAAE;AACtC,QAAM,QAAQ,CAAC,YAAY,CAAC,SAAS,QAAQ,EAAE;AAC/C,QAAM,SAAS,MAAM,SAAS,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAW,QAAQ;AAClF,SAAO,EAAE,IAAI,KAAK,IAAI,QAAQ,IAAI,SAAS,MAAM,GAAG,CAAC,GAAG,MAAM,OAAO,KAAK;AAC5E;;;ACxKO,IAAM,OAAO,KAAK;AAClB,IAAM,YAAY,OAAO;AACzB,IAAM,cAAc,IAAI,OAAO;AAC/B,IAAM,YAAY,IAAI,OAAO;AAC7B,IAAM,MAAM,OAAO;AAanB,IAAM,QAAN,MAAY;AAAA,EACjB;AAAA,EACQ;AAAA,EACA;AAAA,EACS,QAAQ,oBAAI,IAAwB;AAAA,EACpC,QAAQ,oBAAI,IAAY;AAAA,EACxB,OAAqB,CAAC;AAAA,EAC/B,SAAS;AAAA,EAEjB,YAAY,MAAc;AACxB,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,MAAM,OAAO,KAAK,KAAK,WAAW,UAAa,KAAK,WAAW,KAAK;AAAA,EAClF;AAAA,EAEA,QAAQ,IAAYC,SAAyC;AAC3D,SAAK,MAAM;AACX,UAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,KAAKA,SAAQ,KAAK,MAAM;AAC1D,UAAM,OAAgC,CAAC;AACvC,aAAS,OAAO,KAAK,MAAM,KAAK,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ;AAChE,UAAI,KAAK,MAAM,IAAI,IAAI,EAAG;AAC1B,YAAMC,QAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAIA,SAAQA,MAAK,CAAC,IAAIA,MAAK,CAAC,MAAM,OAAO,KAAM,CAAAA,MAAK,CAAC,KAAK;AAAA,UACrD,MAAK,KAAK,CAAC,OAAO,MAAM,IAAI,CAAC;AAAA,IACpC;AACA,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,QAAI,KAAM,MAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,WAAW,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC;AAChF,WAAO,KAAK,IAAI,CAAC,CAACC,QAAO,CAAC,MAAM,CAACA,QAAO,KAAK,IAAI,GAAG,KAAK,SAASA,MAAK,CAAC,CAAC;AAAA,EAC3E;AAAA,EAEA,QAAQ,IAAYF,SAAyC;AAC3D,QAAIA,YAAW,EAAG,QAAO,CAAC;AAC1B,SAAK,MAAM;AACX,UAAM,QAAQ,oBAAI,IAAI,CAAC,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,KAAKA,UAAS,KAAK,IAAI,CAAC,CAAC;AACnF,UAAM,OAAgC,CAAC;AACvC,eAAW,QAAQ,OAAO;AACxB,YAAME,SAAQ,OAAO;AACrB,YAAM,UAAU,MAAMA,UAAS,KAAKF,WAAUE,SAAQ;AACtD,UAAI,WAAW,KAAK,MAAM,IAAI,IAAI,KAAKA,UAAS,KAAK,OAAQ;AAC7D,WAAK,KAAK,CAACA,QAAO,KAAK,IAAI,MAAM,KAAK,SAASA,MAAK,CAAC,CAAC;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,KAAKA,QAAe,OAAyB;AAC3C,aAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM,MAAM;AAC9C,YAAM,QAAQA,SAAQ,MAAM;AAC5B,UAAI,KAAK,MAAM,IAAI,IAAI,EAAG;AAC1B,YAAM,OAAO,MAAM,SAAS,IAAI,KAAK,IAAI,KAAK,MAAM,MAAM,MAAM,CAAC;AACjE,YAAM,QAAQ,KAAK,KAAK,KAAK,MAAM;AACnC,YAAM,IAAI,IAAI;AACd,WAAK,MAAM,IAAI,MAAM,KAAK;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,KAAK,IAAYF,SAA4B;AAC3C,UAAM,MAAM,IAAI,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,KAAKA,OAAM,IAAI,EAAE,CAAC;AAC/E,SAAK,SAAS,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,IAAY,KAAyB;AAC5C,UAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,MAAM;AACjD,aAAS,MAAM,IAAI,MAAM,OAAO;AAC9B,YAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAClC,YAAM,OAAO,MAAM,OAAO;AAC1B,YAAM,IAAI,KAAK,IAAI,OAAO,MAAM,MAAM,GAAG;AACzC,YAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,UAAI,MAAO,KAAI,IAAI,MAAM,SAAS,MAAM,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,UACtD,KAAI,KAAK,GAAG,MAAM,IAAI,MAAM,KAAK,CAAC;AACvC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,IAAI,GAAG,MAAM,EAAE;AAAA,EAC7B;AAAA,EAEA,MAAM,IAAY,OAAyB;AACzC,aAASG,QAAO,GAAGA,QAAO,MAAM,UAAU;AACxC,YAAM,MAAM,KAAKA;AACjB,YAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAClC,YAAM,OAAO,MAAM,OAAO;AAC1B,YAAM,IAAI,KAAK,IAAI,OAAO,MAAM,MAAM,SAASA,KAAI;AACnD,UAAI,SAAS,KAAK,MAAM,IAAI,IAAI;AAChC,UAAI,CAAC,QAAQ;AACX,iBAAS,KAAK,KAAK,CAAC;AACpB,aAAK,MAAM,IAAI,MAAM,MAAM;AAAA,MAC7B;AACA,aAAO,IAAI,MAAM,SAASA,OAAMA,QAAO,CAAC,GAAG,IAAI;AAC/C,WAAK,MAAM,IAAI,IAAI;AACnB,MAAAA,SAAQ;AAAA,IACV;AACA,SAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,MAAM;AAAA,EACvD;AAAA,EAEA,SAAS,MAAoB;AAC3B,QAAI,OAAO,KAAK,QAAQ;AACtB,WAAK,SAAS;AACd,WAAK,SAAS,KAAK,IAAI,KAAK,UAAU,MAAM,IAAI;AAAA,IAClD;AACA,QAAI,OAAO,KAAK,QAAQ;AACtB,YAAM,OAAO,KAAK,MAAM,OAAO,IAAI;AACnC,iBAAW,QAAQ,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,GAAG;AACzC,YAAI,OAAO,QAAS,SAAS,QAAQ,SAAS,OAAO,KAAO,MAAK,KAAK,IAAI;AAAA,MAC5E;AACA,WAAK,MAAM,IAAI,IAAI,GAAG,KAAK,GAAG,OAAO,OAAO,IAAI;AAAA,IAClD;AACA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,OAAkB;AAChB,UAAM,OAAc,CAAC;AACrB,UAAM,SAAS,CAAC,GAAG,KAAK,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACnD,aAAS,IAAI,GAAG,IAAI,OAAO,UAAU;AACnC,UAAI,IAAI,IAAI;AACZ,YAAM,QAAQ,OAAO,CAAC;AACtB,aACE,IAAI,OAAO,UACX,OAAO,CAAC,MAAM,SAAS,IAAI,MACzB,OAAO,CAAC,IAAe,OAAQ,QAAQ,GACzC;AACA;AAAA,MACF;AACA,YAAMD,SAAQ,QAAQ;AACtB,YAAM,MAAM,KAAK,IAAI,KAAK,SAAS,SAAS,IAAI,MAAM,IAAI;AAC1D,YAAM,QAAQ,IAAI,WAAW,MAAMA,MAAK;AACxC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,CAAW;AAC/C,cAAM,IAAI,KAAK,SAAS,GAAG,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK,OAAOA,MAAK,CAAC,IAAI,IAAI,KAAK,IAAI;AAAA,MAC1F;AACA,WAAK,KAAK,EAAE,QAAQA,QAAO,MAAM,CAAC;AAClC,UAAI;AAAA,IACN;AACA,UAAME,WAAU,KAAK,IAAI,KAAK,QAAQ,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACnF,WAAO;AAAA,MACL,GAAI,KAAK,WAAW,SAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,MAC3D;AAAA,MACA,GAAI,KAAK,SAASA,WAAU,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM,MAAM;AACjB,SAAK,SAAS;AACd,SAAK,SAAS,KAAK;AACnB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,MAAY;AACV,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,MAAoB;AACxB,QAAI,KAAK,OAAQ;AACjB,eAAW,QAAQ,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC,EAAG,KAAI,CAAC,KAAK,MAAM,IAAI,IAAI,EAAG,MAAK,KAAK,IAAI;AACpF,QAAI,KAAK,QAAS;AAClB,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,QAAc;AACpB,QAAI,KAAK,OAAQ;AACjB,QAAI,SAAS,KAAK,MAAM,OAAO,KAAK,MAAM,QAAQ;AAClD,eAAW,QAAQ,KAAK,MAAM,KAAK,GAAG;AACpC,UAAI,SAAS,YAAa;AAC1B,UAAI,KAAK,MAAM,IAAI,IAAI,EAAG;AAC1B,WAAK,KAAK,IAAI;AACd,eAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,KAAK,MAA0B;AACrC,UAAM,OAAO,KAAK,KAAK,IAAI;AAC3B,QAAI,CAAC,KAAM,QAAO,IAAI,WAAW,IAAI;AACrC,SAAK,KAAK,GAAG,IAAI;AACjB,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,MAAoB;AAC/B,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,SAAK,MAAM,OAAO,IAAI;AACtB,SAAK,MAAM,OAAO,IAAI;AACtB,QAAI,KAAK,KAAK,SAAS,cAAc,KAAM,MAAK,KAAK,KAAK,KAAK;AAAA,EACjE;AACF;;;ACnHO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACA;AAAA,EACT,SAAS;AAAA,EACT;AAAA,EACR;AAAA,EAEA,YAAY,IAAmB,MAAc,MAAc,SAAkB;AAC3E,SAAK,KAAK;AACV,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,QAAQ,IAAI,MAAM,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,MAAc,MAAM,MAA8C;AAChE,eAAW,CAACC,QAAO,CAAC,KAAK,MAAM;AAC7B,WAAK,MAAM,KAAKA,QAAO,MAAM,KAAK,GAAG,MAAM,KAAK,MAAMA,QAAO,GAAG,KAAK,OAAO,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,IAAYC,SAAqC;AAC1D,UAAM,KAAK,MAAM,KAAK,MAAM,QAAQ,IAAIA,OAAM,CAAC;AAC/C,WAAO,KAAK,MAAM,KAAK,IAAIA,OAAM;AAAA,EACnC;AAAA,EAEA,MAAM,MAAM,IAAY,OAAkC;AACxD,UAAM,KAAK,MAAM,KAAK,MAAM,QAAQ,IAAI,MAAM,MAAM,CAAC;AACrD,SAAK,MAAM,MAAM,IAAI,KAAK;AAC1B,QAAI,CAAC,KAAK,UAAU,KAAK,MAAM,cAAc,UAAW,OAAM,KAAK,MAAM;AAAA,EAC3E;AAAA,EAEA,SAAS,MAAoB;AAC3B,SAAK,MAAM,SAAS,IAAI;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,UAAU,CAAC,KAAK,MAAM,QAAS;AACxC,UAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,QAAI,KAAK,WAAW,OAAW,OAAM,KAAK,GAAG,SAAS,KAAK,MAAM,KAAK,MAAM;AAC5E,eAAWC,QAAO,KAAK,KAAM,OAAM,KAAK,GAAG,OAAO,KAAK,MAAMA,KAAI,QAAQA,KAAI,OAAO,IAAI;AACxF,QAAI,KAAK,WAAW,OAAW,OAAM,KAAK,GAAG,SAAS,KAAK,MAAM,KAAK,MAAM;AAC5E,SAAK,UAAU;AACf,SAAK,MAAM,QAAQ;AAAA,EACrB;AAAA,EAEA,MAAM,MAAqB;AACzB,SAAK,SAAS;AACd,SAAK,MAAM,IAAI;AACf,UAAM,KAAK,MAAM,KAAK,MAAM,QAAQ,GAAG,KAAK,MAAM,MAAM,CAAC;AAAA,EAC3D;AACF;;;AC7HA,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,SAAS;AACf,IAAM,WAAW;AAEjB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,WAAW;AA2BV,IAAM,eAAe;AAE5B,IAAM,wBAAwB;AAE9B,SAAS,UAAU,KAAuB;AACxC,MAAK,KAAmC,SAAS,SAAU,QAAO;AAClE,SAAO,eAAe,SAAS,IAAI,QAAQ,WAAW,QAAQ;AAChE;AAEA,SAASC,QAAO,MAAc,MAAuB;AACnD,SAAO,SAAS,QAAQ,KAAK,WAAW,KAAK,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI,GAAG;AAChF;AAEO,IAAM,UAAN,MAAc;AAAA,EACX;AAAA,EACA;AAAA,EACS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAA0B,QAAQ,QAAQ;AAAA,EAE1C;AAAA,EAEA,gBAAgB;AAAA,EAExB,QAAQ;AAAA,EAER,UAAU;AAAA,EAEF,UAAU;AAAA,EAEV,UAAU;AAAA,EAED;AAAA,EAEjB;AAAA,EAEA;AAAA,EAEA,YACE,IAEA,MAEAC,WAEA,WAAoB,OAEpB,QAAQ,OAER,KACA;AACA,SAAK,KAAK;AACV,SAAK,MAAM;AAEX,SAAK,OAAO;AAEZ,SAAK,WAAW;AAChB,QAAIA,cAAa,OAAW,MAAK,OAAO,IAAI,WAAWA,SAAQ;AAAA,aACtD,SAAU,MAAK,OAAO,IAAI,WAAW,CAAC;AAC/C,SAAK,SAAS,KAAK,MAAM,UAAU;AACnC,QAAI,SAASA,cAAa,OAAW,MAAK,UAAU;AAAA,EACtD;AAAA,EAEA,OAAU,IAAkC;AAC1C,UAAMC,QAAO,KAAK,MAAM,KAAK,EAAE;AAC/B,SAAK,QAAQA,MAAK,MAAM,MAAM,MAAS;AACvC,WAAOA;AAAA,EACT;AAAA,EAEA,SAAe;AACb,SAAK,UAAU;AACf,iBAAa,KAAK,SAAS;AAC3B,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,UAAgD;AAC5D,QAAI,KAAK,QAAS,OAAM,IAAI,YAAY,KAAK;AAC7C,QAAI,KAAK,UAAU,KAAK,KAAM,QAAO,KAAK;AAC1C,UAAM,KAAK,UAAU,KAAK,EAAE;AAC5B,QAAI,MAAM,KAAK,OAAO,CAAC,KAAK,UAAU;AACpC,WAAK,SAAS,IAAI,gBAAgB,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,OAAO;AAChF,aAAO,KAAK;AAAA,IACd;AACA,UAAM,KACJ,MAAM,CAAC,KAAK,WAAW,MAAM,KAAK,GAAG,OAAO,KAAK,IAAI,EAAE,MAAM,MAAM,MAAS,IAAI;AAClF,QAAI,MAAM,IAAI,QAAQ;AACpB,WAAK,SAAS,IAAI,gBAAgB,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,GAAG,OAAO;AACzE,aAAO,KAAK;AAAA,IACd;AACA,UAAM,KAAK,KAAK;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAMC,UAAS,MAAM,KAAK,QAAQ;AAClC,UAAMA,SAAQ,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,OAA4B;AAChC,QAAI,KAAK,QAAS,OAAM,IAAI,YAAY,KAAK;AAC7C,QAAI,CAAC,KAAK,MAAM;AACd,UAAI;AACF,aAAK,OAAO,MAAM,KAAK,GAAG,eAAe,KAAK,IAAI;AAAA,MACpD,SAAS,KAAK;AACZ,YAAI,CAAC,UAAU,GAAG,EAAG,OAAM;AAC3B,aAAK,OAAO,IAAI,WAAW,CAAC;AAC5B,aAAK,UAAU;AAAA,MACjB;AACA,WAAK,SAAS,KAAK,KAAK;AAAA,IAC1B;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQF,WAA4B;AAClC,SAAK,SAAS;AACd,SAAK,OAAO,IAAI,WAAWA,SAAQ;AACnC,SAAK,SAAS,KAAK,KAAK;AACxB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,cAA6B;AACjC,QAAI,MAAM,KAAK,QAAQ,EAAG;AAC1B,QAAI,CAAC,KAAK,WAAW,KAAK,SAAU;AACpC,SAAK,UAAU;AACf,UAAM,KAAK,GAAG,UAAU,KAAK,MAAM,KAAK,MAAM,MAAM,GAAG,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,CAAC;AACxF,QAAI,CAAC,KAAK,MAAO,MAAK,OAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAwB;AAC5B,UAAME,UAAS,MAAM,KAAK,QAAQ;AAClC,WAAOA,UAASA,QAAO,KAAK,IAAI,KAAK;AAAA,EACvC;AAAA,EAEA,MAAM,MAAM,KAAa,IAAiC;AACxD,UAAMA,UAAS,MAAM,KAAK,QAAQ;AAClC,QAAIA,QAAQ,QAAOA,QAAO,KAAK,IAAI,GAAG;AACtC,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;AACrD,WAAO,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,EAC/B;AAAA,EAEQ;AAAA,EAER,QAAqC;AACnC,QAAI,KAAK,QAAQ,OAAW,QAAO,KAAK;AACxC,UAAM,OAAO,KAAK,GAAG,MAAM,KAAK,KAAK,EAAE;AACvC,QAAI,CAAC,QAAQ,KAAK,SAAU,QAAO,QAAQ,QAAQ,MAAS;AAC5D,UAAM,SAAS,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,YAAY,GAAG,CAAC,KAAK;AACjE,SAAK,QAAQ,KAAK,KAAK,IAAI,EACxB,MAAM,MAAM,KAAK,MAAM,CAAC,EACxB;AAAA,MACC,CAAC,OAAO,GAAG;AAAA,MACX,MAAM;AAAA,IACR;AACF,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,KAAK,KAA4B;AAC7C,UAAM,MAAM,MAAM,KAAK,MAAM;AAC7B,QAAI,QAAQ,UAAa,MAAM,IAAK,OAAM,IAAI,YAAY,OAAO;AAAA,EACnE;AAAA,EAEA,UAAU,MAAoB;AAC5B,SAAK,OAAO;AACZ,QAAI,KAAK,OAAQ,MAAK,OAAO,OAAO;AACpC,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,OAAmB,IAA6B;AAC3D,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,KAAK,KAAK,KAAK,MAAM,MAAM;AACjC,UAAMA,UAAS,MAAM,KAAK,QAAQ;AAClC,QAAIA,SAAQ;AACV,YAAMA,QAAO,MAAM,IAAI,KAAK;AAC5B,WAAK,UAAU;AACf,aAAO,MAAM;AAAA,IACf;AACA,UAAM,MAAM,KAAK,OAAO,KAAK,MAAM,MAAM;AACzC,QAAI,KAAK,KAAK,OAAQ,KAAI,KAAK,GAAG,KAAK,QAAQ,EAAE;AACjD,QAAI,IAAI,OAAO,EAAE;AACjB,SAAK,SAAS,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrD,SAAK,UAAU;AACf,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,SAAS,MAA6B;AAC1C,UAAM,KAAK,KAAK,IAAI;AACpB,UAAMA,UAAS,MAAM,KAAK,QAAQ;AAClC,QAAIA,SAAQ;AACV,MAAAA,QAAO,SAAS,IAAI;AACpB,WAAK,UAAU;AACf;AAAA,IACF;AACA,UAAM,MAAM,KAAK,OAAO,IAAI;AAC5B,QAAI,OAAO,KAAK,OAAQ,KAAI,KAAK,GAAG,KAAK,QAAQ,IAAI;AACrD,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,YAAkB;AACxB,SAAK,QAAQ;AACb,QAAI,KAAK,cAAc,UAAa,KAAK,SAAU;AACnD,UAAM,QAAQ,KAAK,IAAI,cAAc,KAAK,gBAAgB,qBAAqB;AAC/E,SAAK,YAAY,WAAW,MAAM;AAChC,WAAK,YAAY;AACjB,WAAK,OAAO,MAAM,KAAK,MAAM,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IACvD,GAAG,KAAK;AAAA,EACV;AAAA,EAEQ,OAAO,MAA0B;AACvC,UAAM,MAAM,KAAK,QAAQ,IAAI,WAAW,CAAC;AACzC,QAAI,IAAI,UAAU,KAAM,QAAO;AAC/B,UAAM,QAAQ,IAAI,WAAW,KAAK,IAAI,MAAM,IAAI,SAAS,GAAG,GAAG,CAAC;AAChE,UAAM,IAAI,IAAI,SAAS,GAAG,KAAK,MAAM,CAAC;AACtC,SAAK,OAAO;AACZ,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,WAAW,KAAK,MAAO,OAAM,IAAI,YAAY,KAAK;AAC3D,QAAI,CAAC,KAAK,SAAS,KAAK,YAAY,EAAE,KAAK,QAAQ,KAAK,QAAS;AACjE,SAAK,QAAQ;AACb,UAAM,UAAU,YAAY,IAAI;AAChC,QAAI;AACF,UAAI,KAAK,OAAQ,OAAM,KAAK,OAAO,MAAM;AAAA,UACpC,OAAM,KAAK,GAAG,UAAU,KAAK,MAAO,KAAK,KAAoB,MAAM,GAAG,KAAK,MAAM,CAAC;AAAA,IACzF,SAAS,KAAK;AACZ,WAAK,QAAQ;AACb,YAAM;AAAA,IACR;AACA,SAAK,gBAAgB,YAAY,IAAI,IAAI;AAAA,EAC3C;AACF;AAEO,IAAM,WAAN,MAAuC;AAAA,EAC3B,SAAS,oBAAI,IAAqB;AAAA,EAElC,OAAO,oBAAI,IAAuB;AAAA,EAEnD,cAAc;AAAA,EAEG;AAAA,EAEA,UAAU,oBAAI,IAA8B;AAAA,EAE5C;AAAA,EAEjB,YAAY,IAAe,UAAmC;AAC5D,SAAK,KAAK;AACV,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,QAAW,MAAc,IAAkC;AAC/D,UAAM,MAAM,MAAM,KAAK,SAAS,IAAI;AACpC,UAAMC,QAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ,QAAQ,GAAG,KAAK,EAAE;AAChE,UAAM,OAAOA,KAAI,MAAM,MAAM,MAAS;AACtC,SAAK,QAAQ,IAAI,KAAK,IAAI;AAC1B,SAAK,KAAK,KAAK,MAAM;AACnB,UAAI,KAAK,QAAQ,IAAI,GAAG,MAAM,KAAM,MAAK,QAAQ,OAAO,GAAG;AAAA,IAC7D,CAAC;AACD,WAAOA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,MAA+B;AAC5C,UAAM,SAASC,UAAS,IAAI;AAC5B,UAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,MAAM,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC;AACxE,WAAO,SAAS,KAAK,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC,CAAC;AAAA,EAC5D;AAAA,EAEA,UAAU,MAA+B;AACvC,WAAO,KAAK,KAAK,MAAM,MAAM,MAAM,WAAW,KAAK,IAAI,IAAI,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAc,KAAK,MAAcC,SAAiB,MAA8C;AAC9F,QAAI,KAAK,GAAG,UAAU;AACpB,UAAI;AACF,eAAO,MAAM,KAAK,GAAG,SAAS,MAAMA,OAAM;AAAA,MAC5C,SAAS,KAAK;AACZ,YAAI,QAAQ,GAAG,MAAM,QAAS,OAAM;AAAA,MACtC;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB,MAA6B;AAC3C,WAAO,KAAK,QAAQ,MAAM,YAAY;AACpC,YAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,YAAM,OAAO,OAAO,MAAM,KAAK,OAAO,YAAY,KAAK,MAAM,CAAC,IAAI;AAClE,UAAI,QAAS,MAAM,QAAQ,KAAK,IAAI,IAAI,EAAI,OAAM,QAAQ,UAAU,IAAI;AACxE,YAAM,KAAK,GAAG,UAAU,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,MAAc,KAAkB,WAAW,OAAgB;AAC9D,QAAI,OAAO,KAAK,OAAO,IAAI,IAAI;AAC/B,QAAI,CAAC,MAAM;AACT,aAAO,IAAI,QAAQ,KAAK,IAAI,MAAM,QAAW,OAAO,OAAO,GAAG;AAC9D,WAAK,OAAO,IAAI,MAAM,IAAI;AAAA,IAC5B;AACA,SAAK;AACL,QAAI,SAAU,MAAK;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAcL,WAAsB,OAAgB,WAAW,OAAgB;AACnF,QAAI,OAAO,KAAK,OAAO,IAAI,IAAI;AAC/B,QAAI,CAAC,MAAM;AACT,aAAO,IAAI,QAAQ,KAAK,IAAI,MAAMA,WAAU,OAAO,KAAK;AACxD,WAAK,OAAO,IAAI,MAAM,IAAI;AAAA,IAC5B,WAAW,OAAO;AAChB,WAAK,QAAQA,SAAQ;AAAA,IACvB;AACA,SAAK;AACL,QAAI,SAAU,MAAK;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAyB;AAC7B,eAAW,QAAQ,KAAK,OAAO,KAAK,EAAG,KAAID,QAAO,MAAM,MAAM,EAAG,QAAO;AACxE,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAyB;AAC9B,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK;AAC9B,UAAI,KAAK,UAAU,KAAKA,QAAO,MAAM,MAAM,EAAG,QAAO;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAe,WAAW,OAAa;AAC5C,SAAK;AACL,QAAI,SAAU,MAAK;AACnB,QAAI,KAAK,QAAQ,GAAG;AAClB,UAAI,YAAY,KAAK,YAAY,EAAG,MAAK,WAAW,KAAK,IAAI;AAC7D;AAAA,IACF;AACA,QAAI,KAAK,OAAO,IAAI,KAAK,IAAI,MAAM,KAAM,MAAK,OAAO,OAAO,KAAK,IAAI;AACrE,SAAK,KAAK,IAAI,IAAI,GAAG,QAAQ;AAC7B,SAAK,KAAK,OAAO,IAAI;AACrB,SAAK,WAAW,KAAK,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAyB;AACvB,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAgB;AACd,WAAO;AAAA,EACT;AAAA,EAEA,SAAkB;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,MAAc,MAAsB;AACvC,UAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,QAAI,CAAC,MAAM;AACT,WAAK,QAAQ;AACb;AAAA,IACF;AACA,SAAK,OAAO,OAAO,IAAI;AACvB,SAAK,UAAU,KAAK,MAAM;AAC1B,SAAK,OAAO,IAAI,KAAK,QAAQ,IAAI;AACjC,SAAK,KAAK,IAAI,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,OAAO,MAAc,MAAsB;AACzC,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM;AACxC,QAAI,CAAC,KAAM;AACX,SAAK,OAAO,OAAO,KAAK,MAAM;AAC9B,SAAK,UAAU,IAAI;AACnB,SAAK,OAAO,IAAI,MAAM,IAAI;AAC1B,SAAK,KAAK,OAAO,IAAI;AAAA,EACvB;AAAA,EAEA,MAAM,MAAM,MAA6B;AACvC,eAAW,CAAC,GAAG,IAAI,KAAK,KAAK,OAAQ,KAAIA,QAAO,GAAG,IAAI,EAAG,OAAM,KAAK,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAChG;AAAA,EAEA,MAAM,UAAU,MAA6B;AAC3C,eAAW,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,GAAG;AAC3C,UAAI,CAACA,QAAO,MAAM,IAAI,EAAG;AACzB,YAAM,KAAK,OAAO,YAAY;AAC5B,cAAM,QAAQ,IAAI,CAAC,KAAK,eAAe,KAAK,KAAK,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,QAAsB;AAC3B,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,QAAQ;AACtC,UAAI,CAACA,QAAO,MAAM,MAAM,EAAG;AAC3B,WAAK,OAAO;AACZ,WAAK,OAAO,OAAO,IAAI;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,SAAS,MAAoB;AAC3B,eAAW,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,GAAG;AAC3C,UAAI,CAACA,QAAO,MAAM,IAAI,EAAG;AACzB,WAAK,WAAW;AAChB,WAAK,OAAO,OAAO,IAAI;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,QAAQ,MAAc,IAAkB;AACtC,QAAI,SAAS,GAAI;AACjB,UAAMO,SAAmB,CAAC;AAC1B,eAAW,CAAC,GAAG,IAAI,KAAK,KAAK,QAAQ;AACnC,UAAIP,QAAO,GAAG,IAAI,EAAG,CAAAO,OAAM,KAAK,IAAI;AAAA,eAC3BP,QAAO,GAAG,EAAE,GAAG;AACtB,aAAK,WAAW;AAChB,aAAK,OAAO,OAAO,CAAC;AAAA,MACtB;AAAA,IACF;AACA,eAAW,QAAQO,QAAO;AACxB,WAAK,OAAO,OAAO,KAAK,IAAI;AAC5B,WAAK,UAAU,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,CAAC;AAChD,WAAK,OAAO,IAAI,KAAK,MAAM,IAAI;AAAA,IACjC;AAAA,EACF;AACF;AAEA,eAAsB,QAAQ,IAAe,MAAcD,UAAS,OAAyB;AAC3F,QAAM,QAAQA,UAAS,SAAY,GAAG,UAAU,GAAG;AACnD,MAAI;AACF,WAAO,OAAO,KAAK,KAAK,IAAI,IAAI,IAAI,GAAG,eAAe,IAAI;AAC1D,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAK,KAAmC,SAAS,SAAU,QAAO;AAClE,UAAM;AAAA,EACR;AACF;AAEA,IAAME,aAAY;AAElB,SAASH,UAAS,MAAsB;AACtC,SAAO,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AACjD;AAEA,eAAe,OAAO,IAAe,MAA2C;AAC9E,SAAO,GAAG,WAAW,IAAI,EAAE,MAAM,MAAM,MAAS;AAClD;AAMA,eAAe,QAAQ,IAAe,KAAa,SAAiB,EAAE,MAAM,EAAE,GAAoB;AAChG,QAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3C,MAAI,KAAK;AACT,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,OAAO,MAAM,MAAM;AACzB,QAAI,SAAS,IAAK;AAClB,QAAI,SAAS,MAAM;AACjB,WAAKA,UAAS,EAAE;AAChB;AAAA,IACF;AACA,UAAMH,QAAO,OAAO,MAAM,IAAI,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI;AACpD,UAAMO,QAAO,MAAM,OAAO,IAAIP,KAAI;AAClC,QAAIO,UAAS,QAAW;AACtB,WAAKP;AACL;AAAA,IACF;AACA,QAAI,OAAO,QAAQM,WAAW,OAAM,QAAQ,SAAS,GAAG;AACxD,WAAO;AACP,UAAM,QAAQ,GAAGC,MAAK,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAChD,QAAIA,MAAK,WAAW,GAAG,EAAG,MAAK;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,KAAuB;AACtC,SAAQ,KAAmC;AAC7C;AAEA,SAAS,SAAS,KAAaC,OAAsB;AACnD,SAAO,QAAQ,MAAM,IAAIA,KAAI,KAAK,GAAG,GAAG,IAAIA,KAAI;AAClD;AAEA,eAAe,WAAW,IAAe,MAA+B;AACtE,QAAM,SAAiB,EAAE,MAAM,EAAE;AACjC,MAAI,MAAM,MAAM,QAAQ,IAAIL,UAAS,IAAI,GAAG,MAAM;AAClD,MAAIK,QAAO,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AAC/C,aAAS;AACP,UAAMD,QAAO,MAAM,OAAO,IAAI,SAAS,KAAKC,KAAI,CAAC;AACjD,QAAID,UAAS,OAAW;AACxB,QAAI,OAAO,QAAQD,WAAW,OAAM,QAAQ,SAAS,IAAI;AACzD,WAAO;AACP,UAAM,SAASC,MAAK,WAAW,GAAG,IAAIA,QAAO,SAAS,KAAKA,KAAI;AAC/D,UAAM,MAAM,QAAQ,IAAIJ,UAAS,MAAM,GAAG,MAAM;AAChD,IAAAK,QAAO,OAAO,MAAM,OAAO,YAAY,GAAG,IAAI,CAAC;AAAA,EACjD;AACA,SAAO,SAAS,KAAKA,KAAI;AAC3B;AAEA,eAAe,UAAU,IAAe,MAA+B;AACrE,SAAOL,UAAS,MAAM,WAAW,IAAI,IAAI,EAAE,MAAM,MAAM,IAAI,CAAC;AAC9D;AAEA,eAAsB,eACpB,IACA,MACA,OACA,OAAiD,CAAC,GACnC;AACf,QAAM,UAAU,QAAQ,eAAe,KAAK,KAAK,aAAa;AAC9D,MAAK,CAAC,UAAU,CAAC,KAAK,UAAW,CAAC,GAAG,KAAM;AAC3C,QAAM,OAAO,CAAC,MACZ,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,QAAiB;AACnC,UAAM,OAAQ,KAAmC;AACjD,QAAI,UAAU,GAAG,KAAK,OAAO,SAAS,SAAU,QAAO;AACvD,UAAM;AAAA,EACR,CAAC;AACH,QAAM,MAAM,MAAM,KAAK,IAAI;AAC3B,MAAI,OAAO,CAAC,OAAQ;AACpB,QAAM,KAAK,OAAQ,MAAM,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC;AACvD,MAAI,IAAI,SAAU,OAAM,IAAI,YAAY,OAAO;AACjD;AAEO,SAAS,YAAY,IAAc,OAA2B;AACnE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,GAAG,MAAM,SAAS;AACtB,YAAM,KAAK,MAAM,MAAM,SAAS,GAAG,YAAY,KAAK,IAAI,CAAC;AACzD,YAAM,MAAM,UAAU,EAAE;AACxB,YAAM,GAAG,GAAG,MAAM,OAAO;AACzB,YAAM,SAAS,EAAE;AAAA,IACnB;AAAA,IACA,MAAM,OAAO,MAAM,IAAI;AACrB,YAAM,IAAI,MAAM,MAAM,SAAS,GAAG,YAAY,KAAK,IAAI,CAAC;AACxD,YAAM,IAAI,MAAM,MAAM,SAAS,GAAG,YAAY,KAAK,EAAE,CAAC;AACtD,aAAO,MAAM,QAAQ,GAAG,YAAY;AAClC,cAAM,MAAM,UAAU,CAAC;AACvB,cAAM,GAAG,OAAO,MAAM,EAAE;AACxB,cAAM,QAAQ,GAAG,CAAC;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,IACA,WAAW,CAAC,MAAM,YAChB,MAAM,QAAQ,GAAG,YAAY,KAAK,IAAI,GAAG,MAAM,GAAG,UAAU,MAAM,OAAO,CAAC;AAAA,IAC5E,iBAAiB,OAAO,SACtB,MAAM,gBAAgB,MAAM,MAAM,SAAS,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC;AAAA,IACvE,SAAS,CAAC,QAAQ,SAChB,MAAM,QAAQ,GAAG,YAAY,KAAK,IAAI,GAAG,MAAM,GAAG,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACzE,OAAO,CAAC,MAAM,YACZ,MAAM,QAAQ,GAAG,YAAY,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,MAAM,OAAO,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,QAAQ,IAAe,MAAsB,OAA4B;AACvF,QAAM,SAAS,KAAK,QAAQ;AAC5B,QAAM,WAAW,WAAW;AAC5B,QAAM,WAAW,WAAW,YAAY,WAAW;AAEnD,QAAM,OACJ,CAAC,SAAS,KAAK,SACX,IAAI,QAAQ,IAAI,KAAK,MAAM,KAAK,UAAU,KAAK,WAAW,MAAM,KAAK,UAAU,IAAI,IACnF,KAAK,aAAa,SAChB,MAAM,MAAM,KAAK,MAAM,KAAK,UAAU,KAAK,UAAU,MAAM,QAAQ,IACnE,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK,QAAQ;AAEhD,MAAI;AACJ,QAAM,SAAS,CAAC,OAAkC;AAChD,SAAK,KAAK,OAAO,EAAE,EAAE,MAAM,CAAC,QAAiB;AAC3C,oBAAc,EAAE,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AACA,MAAI,KAAK,OAAQ,QAAO,MAAM,KAAK,YAAY,CAAC;AAChD,MAAI,KAAK,SAAU,QAAO,MAAM,KAAK,SAAS,CAAC,CAAC;AAChD,QAAM,gBAAgB,MAAY;AAChC,QAAI,CAAC,UAAW;AAChB,UAAM,EAAE,IAAI,IAAI;AAChB,gBAAY;AACZ,UAAM;AAAA,EACR;AACA,MAAI,SAAS,KAAK;AAClB,QAAM,SAAS,CAAI,OACjB,KAAK,OAAO,MAAM;AAChB,kBAAc;AACd,WAAO,GAAG;AAAA,EACZ,CAAC;AAEH,SAAO,IAAI,SAAS;AAAA,IAClB,MAAM,WACF,CAAC,QACC,OAAO,YAAY;AACjB,YAAM,MAAM,MAAM,KAAK,MAAM,KAAK,MAAM;AACxC,gBAAU,IAAI;AACd,aAAO;AAAA,IACT,CAAC,IACH;AAAA,IACJ,OAAO,WACH,CAAC,UACC,OAAO,YAAY;AACjB,UAAI,KAAK,QAAQ,SAAU,UAAS,MAAM,KAAK,KAAK;AACpD,gBAAU,MAAM,KAAK,OAAO,OAAO,MAAM;AACzC,aAAO,MAAM;AAAA,IACf,CAAC,IACH;AAAA,IACJ,MAAM,CAAC,IAAI,WACT,OAAO,YAAY;AACjB,UAAI,OAAO;AACX,UAAI,WAAW,SAAU,QAAO;AAAA,eACvB,WAAW,SAAU,QAAO,MAAM,KAAK,KAAK;AAAA,eAC5C,WAAW,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC5D,UAAI,OAAO,KAAK,EAAG,OAAM,IAAI,YAAY,QAAQ;AACjD,eAAS,OAAO;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,IACH,OAAO,CAAC,KAAK,OACX,OAAO,MAAM;AACX,UAAI,CAAC,SAAU,OAAM,IAAI,YAAY,OAAO;AAC5C,aAAO,KAAK,MAAM,KAAK,EAAE;AAAA,IAC3B,CAAC;AAAA,IACH,QAAQ,CAAC,OAAO,OACd,OAAO,MAAM;AACX,UAAI,CAAC,SAAU,OAAM,IAAI,YAAY,OAAO;AAC5C,aAAO,KAAK,OAAO,OAAO,EAAE;AAAA,IAC9B,CAAC;AAAA,IACH,QAAQ,CAAC,SACP,OAAO,MAAM;AACX,UAAI,CAAC,SAAU,OAAM,IAAI,YAAY,OAAO;AAC5C,aAAO,KAAK,SAAS,IAAI;AAAA,IAC3B,CAAC;AAAA,IACH,MAAM,MACJ,OAAO,aAAa;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,GAAI,KAAK,WAAW,EAAE,QAAQ,KAAc,IAAI,CAAC;AAAA,IACnD,EAAE;AAAA,IACJ,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,IAEtC,OAAO,MACL,KAAK,OAAO,YAAY;AACtB,UAAI;AACF,sBAAc;AACd,cAAM,KAAK,MAAM;AAAA,MACnB,UAAE;AACA,eAAO,OAAO,MAAM,QAAQ;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;;;ACjpBA,SAAS,QAAQ,QAAqC;AACpD,SAAO,IAAI,QAAe,CAAC,GAAG,WAAW;AACvC,WAAO,iBAAiB,SAAS,MAAM,OAAO,IAAI,YAAY,OAAO,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EACzF,CAAC;AACH;AAsIA,IAAM,UAA+B,oBAAI,IAAI;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,aAAa,KAAqC;AACzD,SAAO,QAAQ,IAAI,IAAI,EAAE;AAC3B;AAEA,SAAS,cAAc,KAAsC;AAC3D,SAAO,IAAI,GAAG,WAAW,MAAM;AACjC;AAEA,SAAS,gBAAgB,KAAwC;AAC/D,SAAO,IAAI,GAAG,WAAW,OAAO;AAClC;AAEA,SAAS,cAAc,KAAyC;AAC9D,SAAQ,SAA+B,SAAS,IAAI,EAAE;AACxD;AAEA,SAAS,aAAa,KAAqC;AACzD,SAAO,IAAI,GAAG,WAAW,MAAM;AACjC;AAiBA,SAAS,aAAa,KAAmC;AACvD,SACE,IAAI,GAAG,WAAW,UAAU,KAC5B,IAAI,OAAO,cACX,IAAI,OAAO,eACX,IAAI,OAAO,eACX,IAAI,OAAO;AAEf;AAEA,SAAS,YAAY,KAAoC;AACvD,SAAO,IAAI,GAAG,WAAW,KAAK;AAChC;AAEA,SAAS,aAAa,KAAqC;AACzD,SAAO,IAAI,GAAG,WAAW,MAAM;AACjC;AAYA,IAAM,cAAmC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,CAAC;AAIM,SAAS,cAAc,KAAiC;AAC7D,QAAM,KAAM,IAAyB;AACrC,SAAO,OAAO,OAAO,YAAY,YAAY,IAAI,EAAE;AACrD;AAEA,IAAM,WAAW,OAAO;AAEjB,IAAM,gBAAgB;AAE7B,IAAM,QAAsB,EAAE,IAAI,OAAO,OAAO,SAAS,SAAS,8BAA8B;AAEhG,IAAM,aAAa,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,EAAE,CAAC;AAgEjD,IAAM,cAAN,MAAkB;AAAA,EACf,SAAS;AAAA,EACA;AAAA,EAET,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EAEZ,YAAY,IAAI,gBAAgB;AAAA,EAEhC,QAAQ;AAAA,EAEhB,QAAQ;AAAA,EAEA;AAAA,EAER;AAAA,EAEQ,UAAU;AAAA,EAEV,QAAQ;AAAA,EACR,UAAyB,QAAQ,QAAQ;AAAA,EACzC;AAAA,EACS,iBAAkC,CAAC;AAAA,EAE5C;AAAA,EAES;AAAA,EAER;AAAA,EAEA;AAAA,EAEQ;AAAA,EAEjB,YACE,KAEA,KAEA,SACA;AACA,SAAK,MAAM;AAEX,SAAK,MAAM;AAEX,SAAK,UAAU;AACf,SAAK,YAAY,QAAQ,WAAW;AACpC,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,WAAW,IAAI,WAAW,KAAK,QAAQ,SAAS,QAAQ,MAAM;AACnE,SAAK,QAAQ,QAAQ,SAAS,IAAI,SAAS,QAAQ,EAAE;AACrD,QAAI,CAAC,QAAQ,MAAO,SAAQ,WAAW,IAAI,KAAK,KAAK;AACrD,SAAK,SAAS,eAAe,MAAM,KAAK,OAAO,IAAI,IAAI;AACvD,SAAK,SAAS,SAAS,QAAQ;AAAA,EACjC;AAAA,EAEQ,QAAQ,KAAsB;AACpC,aAAS,KAAK,UAAW,KAAK,YAAY,CAAC,KAAK,UAAW,SAAS;AAAA,EACtE;AAAA,EAEA,YAAY,OAAO,OAAe;AAChC,aAAS,OAAO,IAAI,KAAK,WAAW,KAAK,aAAa,CAAC,KAAK;AAAA,EAC9D;AAAA,EAEA,OAAO,KAA4B;AACjC,QAAI,KAAK,cAAc,QAAW;AAChC,WAAK,QAAQ,QAAQ,KAAK,QAAQ,OAAO,KAAK,WAAW,GAAG,CAAC,EAAE,MAAM,MAAM,MAAS;AACpF,UAAI,QAAQ,IAAI,KAAM,QAAO;AAC7B,UAAI,CAAC,KAAK,QAAQ,aAAa,KAAK,SAAS,EAAG,QAAO;AACvD,WAAK,OAAO;AACZ,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,IAAI,KAAM,QAAO;AAE7B,QAAI,QAAQ,IAAI,KAAM,MAAK,KAAK;AAChC,QAAI,QAAQ,IAAI,KAAM,QAAO,KAAK,KAAK,GAAG;AAC1C,UAAM,MAAM,OAAO,GAAG;AACtB,QAAI,KAAK,QAAQ,GAAG,EAAG,QAAO;AAC9B,QAAI,EAAE,KAAK,SAAS,MAAM;AACxB,YAAM,SAAS,cAAc,GAAG;AAChC,aAAO,WAAW,SAAS,KAAK,KAAK,GAAG,IAAI;AAAA,IAC9C;AACA,UAAM,KAAK,QAAQ,cAAc,KAAK,KAAK,SAAS,KAAK,cAAc,GAAG,MAAM,aAAa;AAC3F,aAAO;AAAA,IACT;AACA,SAAK,QAAQ,YAAY,GAAG;AAC5B,UAAM,UAAU,KAAK;AACrB,SAAK,YAAY,IAAI,gBAAgB;AACrC,YAAQ,MAAM;AACd,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,UAA+B;AACrC,SAAK,eAAe,KAAK,QAAQ;AAAA,EACnC;AAAA,EAEQ,KAAK,KAAqB;AAChC,QAAI,KAAK,QAAS,QAAO;AACzB,SAAK,UAAU;AACf,SAAK;AACL,SAAK,UAAU,IAAI,QAAQ,CAAC,YAAa,KAAK,OAAO,OAAQ;AAC7D,UAAM,UAAU,KAAK;AACrB,SAAK,YAAY,IAAI,gBAAgB;AACrC,YAAQ,MAAM;AACd,eAAW,YAAY,KAAK,eAAgB,UAAS,WAAW,GAAG;AACnE,WAAO;AAAA,EACT;AAAA,EAEQ,OAAa;AACnB,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,eAAW,YAAY,KAAK,eAAgB,UAAS,aAAa,IAAI,IAAI;AAAA,EAC5E;AAAA,EAEA,MAAM,QAAQ,KAAkB,WAAgD;AAC9E,SAAK,QAAQ,YAAY,GAAG;AAC5B,eAAS;AACP,YAAM,KAAK;AACX,UAAI,KAAK,MAAO,QAAO;AACvB,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,MAAM,KAAK,SAAS,KAAK,SAAS;AACjD,UAAI,KAAK,MAAO,QAAO;AAEvB,YAAM,UAAU,CAAC,OAAO,MAAM,OAAO,UAAU,WAAW,KAAK,UAAU;AACzE,UAAI,WAAW,CAAC,KAAK,QAAQ,aAAa,EAAG;AAE7C,YAAM,KAAK;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,SAAS,MAAuB;AAC9B,UAAM,MAAM,KAAK;AACjB,QAAI,SAAS,OAAW,MAAK,QAAQ,OAAO;AAC5C,WAAO;AAAA,EACT;AAAA,EAEA,MAAY;AACV,QAAI,KAAK,MAAO;AAChB,SAAK,QAAQ;AACb,SAAK,UAAU,MAAM;AACrB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAc,SAAS,KAAkB,WAAgD;AACvF,QAAI;AACF,UAAI,YAAY,GAAG,EAAG,QAAO,MAAM,KAAK,UAAU,KAAK,SAAS;AAChE,UAAI,aAAa,GAAG,EAAG,QAAO,KAAK,WAAW,GAAG;AACjD,UAAI,aAAa,GAAG,EAAG,QAAO,KAAK,WAAW,GAAG;AACjD,UAAI,gBAAgB,GAAG,EAAG,QAAO,MAAM,KAAK,cAAc,GAAG;AAC7D,UAAI,cAAc,GAAG,EAAG,QAAO,MAAM,KAAK,YAAY,GAAG;AACzD,UAAI,cAAc,GAAG,GAAG;AACtB,eAAO,MAAM,YAAY,KAAK;AAAA,UAC5B,KAAK,KAAK;AAAA,UACV,OAAO,KAAK,QAAQ;AAAA,UACpB,KAAK,KAAK;AAAA,UACV,UAAU,MAAM,KAAK,eAAe;AAAA,UACpC,OAAO,CAAC,UAAU,cAAc,KAAK,KAAK,CAAC,cAAc,KAAK;AAAA,QAChE,CAAC;AAAA,MACH;AACA,UAAI,aAAa,GAAG,GAAG;AACrB,cAAM,EAAE,MAAM,KAAK,IAAI,KAAK;AAC5B,eAAO,WAAW,KAAK,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,MACrE;AACA,aAAO,MAAM,KAAK,YAAY,GAAG;AAAA,IACnC,SAAS,GAAG;AACV,UAAI,aAAa,eAAe,aAAa,YAAY;AACvD,eAAO,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,SAAS,EAAE,KAAK;AAAA,MACrD;AACA,YAAM,OAAQ,GAAiC;AAC/C,UAAI,OAAO,SAAS,YAAY,YAAY,KAAK,IAAI,GAAG;AACtD,eAAO,EAAE,IAAI,OAAO,OAAO,MAAM,SAAS,KAAK;AAAA,MACjD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,iBAA8B;AACpC,QAAI,KAAK,QAAQ,aAAa,EAAG,OAAM,IAAI,YAAY,OAAO;AAC9D,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,MAAc,KAAK,KAAmE;AACpF,UAAM,OAAO,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE;AAClC,UAAM,OAAO,IAAI,OAAO,KAAK,OAAO,KAAK;AACzC,QAAI,CAAC,KAAM,OAAM,IAAI,YAAY,IAAI,QAAQ,KAAK,OAAO,eAAe,OAAO;AAC/E,QAAI,KAAK,IAAK,MAAK,gBAAgB,KAAK,GAAG;AAE3C,QAAI,IAAI,OAAO,EAAG,QAAO,IAAI,WAAW,CAAC;AACzC,UAAMM,SAAQ,SAAS,IAAI,EAAE;AAC7B,QAAI,CAACA,UAAS,IAAI,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC1D,UAAM,SAASA,SAAQ,KAAK,UAAU,SAAS,KAAK,eAAe;AACnE,WAAO,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,QAAQ,CAAC,GAAG,MAAM;AAAA,EACzE;AAAA,EAEA,MAAc,MAAM,IAAY,MAAkB,WAAW,OAAwB;AACnF,UAAM,OAAO,KAAK,IAAI,IAAI,EAAE,EAAE;AAC9B,QAAI,CAAC,KAAK,MAAO,OAAM,IAAI,YAAY,OAAO;AAC9C,QAAI,CAAC,SAAS,IAAI,EAAE,UAAU;AAC5B,UAAI,SAAU,OAAM,IAAI,YAAY,QAAQ;AAC5C,aAAO,KAAK,MAAM,MAAM,KAAK,eAAe,CAAC;AAAA,IAC/C;AAEA,QAAI,SAAU,QAAO,KAAK,MAAM,MAAM,YAAY,MAAM,CAAC;AAEzD,WAAO,KAAK;AAAA,MACV;AAAA,MACA,KAAK,QAAQ,aAAa,IAAI,YAAY,MAAM,IAAI,KAAK,UAAU;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,KAAiE;AACrF,UAAM,eAAe,KAAK,QAAQ,IAAI,IAAI,MAAM,IAAI,OAAO,GAAG;AAC9D,UAAM,KAAK,KAAK,IAAI,QAAQ,SAAS,GAAG,CAAC;AACzC,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,YAAM,OAAO,IAAI,SACb,IAAI,OACJ,IAAI,YACF,MAAM,MAAM,SAAS,IAAI,IAAI,IAC7B,IAAI,SACF,MAAM,MAAM,UAAU,IAAI,IAAI,IAC9B,MAAM,KAAK,OAAO,MAAM,MAAM,UAAU,IAAI,IAAI,CAAC;AACzD,YAAM,OAAO,EAAE,GAAG,KAAK,KAAK;AAC5B,UAAI,IAAI,WAAW;AACjB,cAAM,MAAM,gBAAgB,IAAI;AAChC,aAAK,IAAI,UAAU,IAAI,KAAK,YAAY,IAAI,CAAC;AAAA,MAC/C,WAAW,IAAI,QAAQ;AACrB,cAAM,MAAM,QAAQ,MAAM,YAAY;AACpC,eAAK,IAAI,UAAU,IAAI,KAAK,YAAY,IAAI,CAAC;AAC7C,gBAAM,KAAK,IAAI,IAAI,EAAE,EAAE,KAAK,OAAO;AAAA,QACrC,CAAC;AAAA,MACH,OAAO;AACL,aAAK,IAAI,UAAU,IAAI,KAAK,YAAY,IAAI,CAAC;AAAA,MAC/C;AACA,UAAI,IAAI,YAAY,CAAE,MAAM,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAI;AACjE,cAAM,IAAI,YAAY,QAAQ;AAAA,MAChC;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,QAAQ,QAAQ,KAAK,IAAI,MAAM,EAAE,CAAC;AACxC,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAA0D;AAC5E,WAAO;AAAA,MACL,KAAK,QAAQ;AAAA,MACb;AAAA,QACE,MAAM,IAAI;AAAA,QACV,OAAO,IAAI;AAAA,QACX,UAAU,IAAI;AAAA,QACd,GAAI,IAAI,aAAa,SAAY,EAAE,UAAU,IAAI,SAAS,IAAI,CAAC;AAAA,QAC/D,GAAI,IAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACrC,GAAI,IAAI,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,QACzC,GAAI,IAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACrC,GAAI,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,MACpC;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,KAAgB,WAAgD;AACtF,QAAI,aAAa,GAAG,EAAG,QAAO,KAAK,WAAW,GAAG;AACjD,YAAQ,IAAI,IAAI;AAAA,MACd,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,SAAS,OAAO,MAAM,KAAK,KAAK,GAAG,EAAE;AAAA,MAChE,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,QAAQ,EAAE;AAAA,MAC1F,KAAK;AACH,aAAK,QAAQ,OAAO,OAAO,KAAK,KAAK,IAAI,EAAE;AAC3C,cAAM,QAAQ,QAAQ,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC;AAC5C,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK,WAAW;AACd,cAAM,OAAO,SAAS;AACtB,cAAM,OAAO,KAAK,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC1C,YAAI;AACJ,YAAI;AACF,kBAAQ,KAAK,IAAI,QAAQ,KAAK,OAAO,CAAC;AAAA,QACxC,SAAS,GAAG;AACV,gBAAM,QAAQ,QAAQ,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1C,gBAAM;AAAA,QACR;AACA,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,CAAC,MAAM,KAAK,EAAE;AAAA,MACvD;AAAA,MACA,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,SAAS,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;AAAA,MAC7E,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,KAAK,QAAQ,GAAG,EAAE;AAAA,MACjE,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO,IAAI,EAAE,EAAE;AAAA,MAC7D,KAAK;AACH,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,KAAK,IAAI,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,KAAK,OAAO,EAAE,EAAE,EAAE;AAAA,QACnE;AAAA,MACF,KAAK,WAAW;AACd,YAAI,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE,KAAK,KAAM,OAAM,IAAI,YAAY,OAAO;AAClE,cAAM,UAAU,KAAK,IAAI,aAAa,IAAI,EAAE;AAC5C,aAAK,IAAI,UAAU,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC;AAC7C,YAAI,QAAS,MAAK,IAAI,eAAe,IAAI,EAAE;AAC3C,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC;AAAA,MACA,KAAK;AACH,aAAK,IAAI,eAAe,IAAI,IAAI,IAAI,KAAK;AACzC,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,YAAI,IAAI,GAAI,MAAK,IAAI,eAAe,IAAI,EAAE;AAAA,YACrC,MAAK,IAAI,iBAAiB,IAAI,EAAE;AACrC,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,EAAE;AAAA,MAC5E,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,MACjF,KAAK;AACH,cAAM,KAAK,QAAQ,GAAG;AACtB,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,YAAI,IAAI,SAAS,IAAI,IAAI;AACvB,eAAK,IAAI,KAAK,IAAI,MAAM,IAAI,EAAE;AAC9B,cAAI,CAAC,IAAI,KAAM,OAAM,QAAQ,QAAQ,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAAA,QAC/D;AACA,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK,eAAe;AAClB,cAAM,MACJ,IAAI,SAAS,SACT,KAAK,oBAAoB,IACzB,KAAK,QAAQ,MAAM,cAAc,IAAI,IAAI;AAC/C,YAAI,CAAC,IAAK,OAAM,IAAI,YAAY,OAAO;AACvC,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,IAAI,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE;AAAA,MACzE;AAAA,MACA,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,QAAQ,MAAM,cAAc,KAAK,CAAC,EAAE;AAAA,MAClF,KAAK,aAAa;AAChB,cAAM,EAAE,MAAM,OAAO,UAAU,IAAI;AACnC,cAAM,WAAW,KAAK,eAAe;AACrC,cAAM,SAAS,YAAY,YAAY,IAAI,CAAC,UAAU,SAAS,CAAC,IAAI;AACpE,cAAM,WAAW,MAAM,UAAU,KAAK,KAAK,MAAM,OAAO,WAAW,MAAM;AACzE,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,SAAS;AAAA,MAClD;AAAA,MACA,KAAK,WAAW;AACd,cAAM,OAAO,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE;AAClC,YAAI,CAAC,KAAK,KAAM,OAAM,IAAI,YAAY,QAAQ;AAC9C,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,IAAI,QAAQ,IAAI,MAAM,EAAE;AAAA,MACjF;AAAA,MACA,KAAK,YAAY;AACf,cAAM,OAAO,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE;AAClC,YAAI,KAAK,MAAO,OAAM,KAAK,MAAM;AACjC,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,KAAwC;AAC/D,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,YAAM,QAAQ,KAAK;AACnB,UAAI,IAAI,OAAO,iBAAiB;AAC9B,cAAM,MAAM,MAAM,MAAM,MAAM,UAAU,IAAI,IAAI,EAAE,MAAM,MAAM,IAAI,IAAI,CAAC;AAAA,MACzE,WAAW,IAAI,OAAO;AACpB,cAAM,MAAM,UAAU,MAAM,MAAM,SAAS,IAAI,IAAI,CAAC;AAAA,eAC7C,IAAI,OAAO,mBAAoB,OAAM,SAAS,MAAM,MAAM,SAAS,IAAI,IAAI,CAAC;AAAA,eAC5E,IAAI,OAAO,mBAAmB;AACrC,cAAM,QAAQ,MAAM,MAAM,SAAS,IAAI,IAAI,GAAG,MAAM,MAAM,SAAS,IAAI,EAAE,CAAC;AAAA,MAC5E;AACA,aAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,IAClC;AACA,UAAM,OAAO,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE;AAClC,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU,CAAC,KAAK,KAAM,OAAM,IAAI,YAAY,QAAQ;AAC7F,YAAQ,IAAI,IAAI;AAAA,MACd,KAAK;AACH,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,OAAO,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK,QAAQ,GAAG,IAAI,MAAM;AAAA,QACjE;AAAA,MACF,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,KAAK,OAAO,IAAI,MAAM,IAAI,MAAM,EAAE;AAAA,MACjF,KAAK;AACH,cAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,EAAE;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA;AAAA,EAEA,MAAc,OAAO,MAA+B;AAClD,UAAM,OAAO,KAAK,WAAW,IAAI;AACjC,WAAO,SAAS,UAAa,CAAE,MAAM,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAK,OAAO;AAAA,EACtF;AAAA,EAEA,MAAc,QAAQ,KAAgE;AACpF,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE,KAAK,KAAM,OAAM,IAAI,YAAY,OAAO;AAClE,QAAI,IAAI,UAAU,QAAW;AAC3B,WAAK,IAAI,KAAK,IAAI,OAAO,IAAI,EAAE;AAC/B;AAAA,IACF;AACA,QAAI,IAAI,SAAS,OAAW,OAAM,IAAI,YAAY,QAAQ;AAC1D,UAAM,OAAO,IAAI,SAAS,IAAI,OAAO,MAAM,KAAK,OAAO,MAAM,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC;AAC3F,QAAI,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE,KAAK,KAAM,OAAM,IAAI,YAAY,OAAO;AAClE,UAAM,OAAO;AAAA,MACX,KAAK,QAAQ;AAAA,MACb;AAAA,QACE;AAAA,QACA,OAAO,IAAI,SAAS;AAAA,QACpB,UAAU,IAAI,YAAY;AAAA,QAC1B,GAAI,IAAI,aAAa,SAAY,EAAE,UAAU,IAAI,SAAS,IAAI,CAAC;AAAA,QAC/D,GAAI,IAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACrC,GAAI,IAAI,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,QACnC,GAAI,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,MACpC;AAAA,MACA,KAAK;AAAA,IACP;AACA,SAAK,IAAI,UAAU,IAAI,IAAI,IAAI;AAAA,EACjC;AAAA,EAEQ,QAAQ,IAAwB,MAAM,GAAG,MAAyB;AACxE,QAAI,OAAO,OAAW,QAAO,KAAK,IAAI,QAAQ,SAAS,IAAI,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;AAC9E,QAAI,KAAK,IAAI,IAAI,EAAE,EAAG,OAAM,IAAI,YAAY,OAAO;AACnD,SAAK,IAAI,UAAU,IAAI,SAAS,IAAI,CAAC;AACrC,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,IAAoB;AACjC,UAAM,OAAO,KAAK,IAAI,IAAI,EAAE,EAAE;AAC9B,UAAM,QAAQ,KAAK,IAAI,YAAY,EAAE;AACrC,WAAO;AAAA,MACL,KAAK,KAAK,QAAQ;AAAA,MAClB,MAAM,gBAAgB,eAAe,WAAW,aAAa,IAAI;AAAA,MACjE,GAAI,KAAK,WAAW,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,MAC/C,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,MACvC,GAAI,KAAK,IAAI,aAAa,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MACrD,GAAI,KAAK,KAAK,OAAO,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,EAAE,MAAM,YAAY,IAAI,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEQ,WAAW,KAA+B;AAChD,UAAM,MAAM,KAAK,IAAI,IAAI,EAAE;AAC3B,UAAM,OAAO,KAAK,QAAQ;AAC1B,YAAQ,IAAI,IAAI;AAAA,MACd,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,IAAI,OAAO,EAAE;AAAA,MACtD,KAAK;AACH,YAAI,OAAO,IAAI,OAAO;AACtB,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,IAAI,QAAQ,EAAE;AAAA,MACvD,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,OAAO,KAAK,UAAU,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI;AAAA,MAC3F,KAAK;AACH,YAAI,KAAM,MAAK,UAAU,KAAK,KAAK,KAAK,IAAI,IAAI;AAAA,iBACvC,IAAI,SAAS,KAAK,IAAK,OAAM,IAAI,YAAY,OAAO;AAC7D,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,gBAAgB,KAAsB;AAC5C,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,KAAK,oBAAoB,KAAK,GAAG;AACjD,QAAI,YAAY,UAAa,YAAY,IAAK;AAC9C,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,KAAK,UAAU,KAAK,KAAK,IAAI,CAAC,MAAM,KAAM;AAC9C,QAAI,KAAK,QAAQ,OAAO,IAAI,IAAI,CAAC,EAAG,OAAM,IAAI,YAAY,KAAK;AAC/D,SAAK,UAAU,MAAM,IAAI,IAAI;AAC7B,UAAM,IAAI,YAAY,OAAO;AAAA,EAC/B;AAAA,EAEQ,UAAU,KAAuD;AACvE,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,CAAC,QAAQ,MAAM,KAAK,QAAQ,GAAI,QAAO;AAC3C,UAAM,QAAQ,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAEzC,WAAO,CAAC,WAAW,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,EAC5D;AAAA,EAEQ,OAAe;AACrB,WAAO,KAAK,QAAQ,MAAM,QAAQ,KAAK,KAAK,CAAC,KAAK,KAAK;AAAA,EACzD;AAAA,EAEQ,MAAc;AACpB,WAAO,KAAK,QAAQ,MAAM,OAAO,KAAK,KAAK,CAAC,KAAK,KAAK;AAAA,EACxD;AAAA,EAEQ,sBAA6C;AACnD,UAAM,UAAU,KAAK,QAAQ,MAAM,oBAAoB,KAAK,GAAG;AAC/D,WAAO,YAAY,SAAY,KAAK,IAAI,cAAc,IAAK,WAAW;AAAA,EACxE;AAAA,EAEQ,WAAW,KAA+B;AAChD,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,OAAO,CAAC,QAAwB;AACpC,UAAI,QAAQ,KAAK,QAAQ,KAAK,IAAK,OAAM,IAAI,YAAY,OAAO;AAChE,aAAO,KAAK;AAAA,IACd;AACA,YAAQ,IAAI,IAAI;AAAA,MACd,KAAK;AACH,YAAI,KAAM,MAAK,QAAQ,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI;AAAA,iBACzC,KAAK,IAAI,GAAG,OAAO,IAAI,QAAQ,KAAK,KAAM,OAAM,IAAI,YAAY,OAAO;AAChF,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE;AAAA,MAC3F,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,OAAO,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE;AAAA,MAC1F,KAAK;AACH,YAAI,CAAC,KAAM,OAAM,IAAI,YAAY,OAAO;AACxC,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,GAAG,EAAE;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,YAAY,KAAyC;AAC3D,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,CAAC,KAAM,QAAO,QAAQ,QAAQ,EAAE,IAAI,OAAO,OAAO,eAAe,SAAS,aAAa,CAAC;AAC5F,WAAO,KAAK,QAAQ,GAAG;AAAA,EACzB;AAAA,EAEQ,cAAc,KAA2C;AAC/D,SAAK,QAAQ,KAAK,QAAQ,OAAO,IAAI,YAAY;AACjD,UAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,WAAO,cAAc,KAAK;AAAA,MACxB,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,MACV,UAAU,MAAM,KAAK,eAAe;AAAA,MACpC,SAAS,CAACC,OAAM,QAAQ,aAAa,SAAS,QAAQA,OAAM,QAAQ,QAAQ;AAAA,IAC9E,CAAC;AAAA,EACH;AAAA,EAEQ,IAAI,IAAuB;AACjC,UAAM,OAAO,KAAK,IAAI,IAAI,EAAE,EAAE;AAC9B,UAAM,MAAM,KAAK,OAAO,KAAK,KAAK;AAClC,QAAI,CAAC,IAAK,OAAM,IAAI,YAAY,QAAQ;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YACZ,KAIuB;AACvB,YAAQ,IAAI,IAAI;AAAA,MACd,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,EAAE;AAAA,MAC7E,KAAK,cAAc;AACjB,cAAM,EAAE,MAAM,MAAM,KAAK,KAAK,OAAO,SAAS,KAAK,IAAI;AACvD,cAAM,UAAU,EAAE,MAAM,MAAM,KAAK,KAAK,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG;AAClE,cAAM,MAAM,MAAM,KAAK,SAAS,MAAM,SAAS,OAAO,OAAO;AAC7D,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,IAAI;AAAA,MAC7C;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,SAAS,IAAI,SAAS,KAAK,UAAU,SAAS,KAAK,eAAe;AACxE,cAAM,QAAQ;AAAA,UACZ,UAAU,IAAI;AAAA,UACd,WAAW,IAAI;AAAA,UACf,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,QACjC;AACA,cAAM,SAAS,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,QAAQ,KAAK;AAC1E,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,OAAO;AAAA,MAChD;AAAA,MACA,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAO,MAAM,KAAK,QAAQ,WAAW,KAAM,KAAK;AAAA,MACnF,KAAK,aAAa;AAChB,aAAK,YAAY,IAAI;AACrB,aAAK,QAAQ,MAAM,KAAK,KAAK,KAAK,IAAI,GAAG;AAEzC,aAAK,SAAS;AAAA,UAAM,IAAI;AAAA,UAAK,CAAC,OAAO,QACnC,UAAU,YAAY,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK;AAAA,QACnD;AAEA,cAAM,KAAK,IAAI,SAAS;AACxB,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK;AACtD,gBAAM,UAAU,OAAO,CAAC,IAAI;AAC5B,cAAI,QAAS,MAAK,cAAc;AAChC,iBAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,OAAO;AAAA,QAChD,UAAE;AACA,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,IAAI,QAAQ,KAAK,CAAC,SAAS,IAAI,GAAG,EAAG,OAAM,IAAI,YAAY,QAAQ;AAEvE,YAAI,CAAE,MAAM,KAAK,QAAQ,OAAO,IAAI,QAAQ,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,GAAI;AACjF,gBAAM,IAAI,YAAY,OAAO;AAAA,QAC/B;AACA,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,KAAK,QAAQ,YAAY,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,EAAE;AAAA,QAC/D;AAAA,MACF,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,QAAQ,SAAS,KAAK,CAAC,EAAE;AAAA,MACvE,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,aAAa,GAAG;AAAA,MAC9B,KAAK;AACH,aAAK,SAAS,IAAI,KAAK,IAAI,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,GAAG,IAAI,KAAK;AAChF,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,SAAS,IAAI,IAAI,EAAE;AAAA,MACjE,KAAK;AACH,YAAI,IAAI,OAAQ,MAAK,MAAM,KAAK,IAAI,MAAM;AAC1C,eAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE;AAAA,MACpE,KAAK;AACH,aAAK,SAAS,IAAI;AAClB,aAAK,UAAU,IAAI;AACnB,aAAK,aAAa,EAAE,IAAI,YAAY;AACpC,eAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,MAClC,KAAK;AACH,eAAO,KAAK,MAAM;AAAA,MACpB,KAAK;AACH,eAAO,EAAE,IAAI,MAAM,MAAM,SAAS,OAAO,KAAK,SAAS,SAAS,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,MAAc,aACZ,KACuB;AACvB,UAAM,EAAE,OAAO,OAAO,IAAI,KAAK;AAC/B,QAAI,CAAC,SAAS,CAAC,OAAQ,OAAM,IAAI,YAAY,QAAQ;AACrD,QAAI;AACF,UAAI,IAAI,OAAO,SAAU,OAAM,OAAO,IAAI,QAAQ,IAAI,KAAK;AAAA,WACtD;AACH,cAAM,EAAE,QAAQ,QAAQ,MAAM,OAAO,KAAK,IAAI;AAC9C,cAAM,SAAS,KAAK,eAAe;AACnC,cAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,QAAQ,MAAM,OAAO,KAAK,GAAG,MAAM,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC5F;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,OAAQ,KAAmC;AACjD,UAAI,OAAO,SAAS,SAAU,OAAM;AACpC,aAAO,EAAE,IAAI,OAAO,OAAO,MAAM,SAAU,IAAc,QAAQ;AAAA,IACnE;AACA,WAAO,EAAE,IAAI,MAAM,MAAM,OAAO;AAAA,EAClC;AAAA,EAEQ,QAAwB;AAC9B,WAAO,QAAQ,KAAK,eAAe,CAAC;AAAA,EACtC;AAAA,EAEQ;AAAA,EACS,QAAsB,CAAC;AAAA,EACvB,WAAW,IAAI;AAAA,IAC9B,CAAC,KAAK,cAAc,KAAK,QAAQ,KAAoB,SAAS;AAAA,IAC9D,MAAM,KAAK,QAAQ,UAAU;AAAA,EAC/B;AAAA,EACQ;AAAA,EAEA,SAAS,KAAa,OAAe,OAAe,OAAsB;AAChF,QAAI,CAAC,SAAS,GAAG,EAAG,OAAM,IAAI,YAAY,QAAQ;AAClD,SAAK,WAAW;AAChB,QAAI,SAAS,EAAG;AAChB,UAAM,OACJ,UAAU,SAAY,MAAM,KAAK,QAAQ,QAAQ,GAAG,IAAI,MAAM,KAAK,aAAa,KAAK;AACvF,SAAK,QAAQ,WAAW,MAAM;AAC5B,WAAK,QAAQ;AACb,WAAK;AACL,UAAI,QAAQ,EAAG,MAAK,aAAa,YAAY,MAAM,KAAK;AAAA,IAC1D,GAAG,KAAK;AAAA,EACV;AAAA,EAEQ,aAAa,OAAqB;AACxC,SAAK,QAAQ,UAAU,KAAK;AAC5B,UAAM,UAAU,KAAK;AACrB,SAAK,YAAY,IAAI,gBAAgB;AACrC,YAAQ,MAAM;AAAA,EAChB;AAAA,EAEQ,aAAmB;AACzB,iBAAa,KAAK,KAAK;AACvB,kBAAc,KAAK,UAAU;AAC7B,SAAK,QAAQ;AACb,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,IAAI;AACT,SAAK,WAAW;AAChB,SAAK,UAAU,MAAM;AACrB,SAAK,QAAQ,OAAO,QAAQ,KAAK,GAAG;AACpC,SAAK,SAAS,MAAM;AACpB,eAAW,OAAO,KAAK,SAAS,KAAK,EAAG,MAAK,QAAQ,SAAS,GAAG;AACjE,UAAM,KAAK,IAAI,SAAS;AACxB,QAAI,CAAC,KAAK,QAAQ,MAAO,MAAK,QAAQ,WAAW,OAAO,KAAK,KAAK;AAClE,UAAM,KAAK,QAAQ,MAAM,SAAS;AAAA,EACpC;AACF;;;ACtjCO,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAC3B,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;;;ACgHhC,IAAM,UAAU;AACT,IAAM,gBAAgB;AAE7B,IAAM,UAAU,oBAAI,QAA0B;AAC9C,IAAI,aAAa;AAEjB,SAAS,OAAO,MAAwB;AACtC,QAAM,KAAK,QAAQ,IAAI,IAAI,KAAK;AAChC,UAAQ,IAAI,MAAM,EAAE;AACpB,SAAO;AACT;AAEO,SAAS,aAAa,KAA6B;AACxD,SAAO,IACJ,QAAQ,EACR,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,IAAI,EAC/C,IAAI,CAAC,OAAoB;AACxB,UAAM,OAAO,IAAI,IAAI,EAAE;AACvB,UAAM,QAAQ,IAAI,YAAY,EAAE;AAChC,UAAM,OAAO,KAAK,gBAAgB,eAAe,WAAW,aAAa,KAAK,IAAI;AAClF,UAAM,OAAO,KAAK,KAAK;AACvB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAI,SAAS,YAAY,QAAQ,YAAY,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,MACxE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,MACvC,GAAI,IAAI,aAAa,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MAChD,GAAI,SAAS,WAAW,EAAE,MAAM,OAAO,IAAI,EAAE,IAAI,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AACL;AASA,IAAM,QAAN,MAAY;AAAA,EACV;AAAA,EACQ;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EAER,MAAM,MAAc,KAAaC,SAAoBC,UAAsB,QAAoB;AAC7F,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS,EAAE,MAAM,IAAI;AAC1B,SAAK,SAAS;AACd,SAAK,IAAI;AACT,YAAQ,MAAMD,SAAQ,cAAc,IAAI;AACxC,IAAAC,SAAQ,IAAI;AAAA,EACd;AAAA,EAEA,MAAM,QAAW,MAAoC;AACnD,SAAK;AACL,iBAAa,KAAK,KAAK;AACvB,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,WAAK;AACL,WAAK,IAAI;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,MAAY;AAClB,iBAAa,KAAK,KAAK;AACvB,QAAI,KAAK,SAAS,KAAK,KAAK,OAAQ,MAAK,QAAQ,WAAW,KAAK,QAAQ,aAAa;AAAA,EACxF;AAAA,EAEA,QAAc;AACZ,iBAAa,KAAK,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,UAAiD;AACtD,QAAI,KAAK,OAAQ,QAAO,CAAC,KAAK,OAAO,MAAM,KAAK,OAAO,GAAG;AAC1D,WAAO,CAAC,OAAO,aAAa,WAAW,WAAW,SAAS,MAAS;AAAA,EACtE;AACF;AAEA,SAAS,UAAUD,SAAuE;AACxF,SAAO;AAAA,IACL,UAAU,KAAK;AACb,cAAQ,GAAGA,SAAQ,eAAe,OAAO,GAAG,CAAC;AAC7C,cAAQ,OAAOA,SAAQ,aAAa;AAAA,IACtC;AAAA,IACA,UAAU;AACR,cAAQ,IAAIA,SAAQ,aAAa,CAAC;AAClC,cAAQ,OAAOA,SAAQ,WAAW;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,aAAaC,UAAsBD,SAA0B;AACpE,EAAAC,SAAQ,QAAQ,CAAC,UAAU;AACzB,YAAQ,MAAMD,SAAQ,YAAY,UAAU,YAAY,IAAI,CAAC;AAC7D,YAAQ,OAAOA,SAAQ,UAAU;AAAA,EACnC,CAAC;AACH;AAEA,SAAS,WAAW,MAAwB,MAA0C;AACpF,QAAM,WAA2B,KAAK,OAAO,CAAC,KAAK,KAAK,OAAO,MAAqB,IAAI,CAAC;AACzF,SAAO,OAAO,CAAC,GAAG,UAAU,KAAK,IAAI,IAAI;AAC3C;AAEA,SAAS,SACP,OACAE,WACmC;AACnC,QAAM,MAAM,IAAI,kBAAkB,mBAAmB,wBAAwB;AAC7E,QAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAC5C,QAAM,YAAY,uBAAuB,OAAO,KAAK,OAAO,EAAE,UAAAA,UAAS,CAAC;AACxE,QAAM,MAAM;AACZ,SAAO;AAAA,IACL,MAAM,EAAE,KAAK,MAAM,MAAM;AAAA,IACzB,UAAU;AACR,gBAAU,QAAQ;AAClB,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,YACP,MACA,KACA,OACA,MACgB;AAChB,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN,KAAK,KAAK,YAAY,KAAK;AAAA,IAC3B,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,EACvD;AACA,MAAI,KAAK,QAAQ,QAAQ,MAAM;AAC7B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,KAAK;AAAA,MACd,KAAK,aAAa,KAAK,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,KAAK;AAAA,IACd,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,EAAE,KAAK,aAAa,KAAK,GAAG,EAAE;AAAA,EACtE;AACF;AAEA,SAAS,UAAU,MAA8D;AAC/E,SAAO;AAAA,IACL,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAChD,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,aAAa,MAAwB,OAA0B;AACtE,SAAO,gBAAgB;AAAA,IACrB,IAAI,KAAK;AAAA,IACT,KAAK,KAAK;AAAA,IACV,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC7C,MAAM,CAAC,MAAM,IAAI,MAAM,MAAM,WAAW,MAAM,KAAK,MAAM,IAAI,MAAM,MAAM,MAAM;AAAA,IAC/E,SAAS,CAAC,WAAW,MAAM,QAAQ,MAAM;AAAA,IACzC,UAAU,CAAC,SAAS,MAAM,OAAO,IAAI;AAAA,IACrC,MAAM,CAAC,MAAM,OACX,KAAK,cAAc,MAAM,QAAQ,IAAI,IAAI,KAAK,WAAW,IAAI,MAAM,MAAM,IAAI,GAAG,EAAE,IAAI,GAAG;AAAA,IAC3F,KAAK,CAAC,MAAM,OAAO,MAAM,IAAI,MAAM,EAAE;AAAA,IACrC,SAAS,CAAC,SAAS,MAAM,UAAU,IAAI;AAAA,IACvC,SAAS,CAAC,MAAM,OAAO,MAAM,QAAQ,MAAM,EAAE;AAAA,EAC/C,CAAC;AACH;AAEO,SAAS,iBAAiB,MAA2C;AAC1E,QAAM,MAAM,IAAI,kBAAkB,mBAAmB,wBAAwB;AAC7E,QAAMF,UAAS,IAAI,WAAW,KAAK,GAAG,cAAc;AACpD,QAAMC,WAAU,IAAI,YAAY,KAAK,KAAK,KAAK,KAAK;AAAA,IAClD,GAAG,UAAU,IAAI;AAAA,IACjB,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IACnD,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACtD,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,IACzD,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC1C,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC1C,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC7C,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,GAAG,UAAUD,OAAM;AAAA,IACnB,SAAS,CAAC,UAAU,KAAK,QAAQ,GAAGA,SAAQ,cAAc,KAAK,KAAK;AAAA,IACpE,YAAY,MACV,QAAQ,KAAKA,SAAQ,aAAa,MAAM,KAAK,QAAQ,KAAKA,SAAQ,YAAY,MAAM;AAAA,IACtF,OAAO,CAAC,QAAQ,OAAO,GAAG;AAAA,IAC1B,GAAI,KAAK,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ,OACpD,EAAE,aAAa,MAAM,QAAQ,KAAKA,SAAQ,aAAa,EAAE,IACzD,CAAC;AAAA,EACP,CAAC;AACD,eAAaC,UAASD,OAAM;AAC5B,QAAM,QAAQ,IAAI,UAAU;AAC5B,OAAK,MAAM,IAAI,KAAK;AACpB,QAAM,QAAQ,aAAa,MAAM,KAAK;AACtC,EAAAC,SAAQ,WAAW,CAAC,SAAS,MAAM,OAAO,IAAI,GAAG;AACjD,QAAM,SAAS,KAAK,aAAa;AACjC,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAMC,YAAW,CAAC,QAChB,MAAM,QAAQ,MAAO,cAAc,GAAG,IAAID,SAAQ,QAAQ,GAAG,IAAI,eAAe,GAAG,CAAE;AACvF,QAAM,YAAY,uBAAuB,QAAQ,KAAK,OAAO,EAAE,UAAAC,UAAS,CAAC;AACzE,QAAM,OAAO,KAAK,QAAQ,QAAQ,OAAO,SAAS,OAAOA,SAAQ,IAAI;AAErE,QAAM,EAAE,SAAS,QAAQ,SAAS,OAAO,IAAI,QAAQ,cAAsB;AAC3E,MAAIC,QAAO;AACX,MAAI;AAEJ,QAAM,SAAS,CAAC,MAAc,QAAuB;AACnD,QAAIA,MAAM;AACV,IAAAA,QAAO;AACP,UAAM,MAAM;AACZ,cAAU,OAAOF,SAAQ;AACzB,WAAO,oBAAoB,WAAW,SAAS;AAC/C,WAAO,oBAAoB,SAAS,OAAO;AAC3C,eAAW,OAAO,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAG,WAAU,GAAG;AACpD,cAAU,QAAQ;AAClB,UAAM,QAAQ;AACd,sBAAkB,KAAK;AACvB,SAAK,MAAM,OAAO,KAAK;AACvB,WAAO,UAAU;AACjB,SAAKA,SAAQ,KAAK,EAAE;AAAA,MAClB,MAAM,OAAO,IAAI;AAAA,MACjB,MAAM,OAAO,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,SAAuC;AACrD,QAAI,MAAM,SAAS,mBAAmB;AACpC,aAAO,GAAG,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IACnC,WAAW,MAAM,SAAS,oBAAoB;AAC5C,UAAI,CAAC,MAAM,OAAQ,MAAK,UAAU,OAAO,KAAK,OAAO,CAAC;AACtD,aAAO,GAAG,MAAM,OAAO,OAAO,CAAC;AAAA,IACjC,WAAW,MAAM,SAAS,qBAAqB,KAAK,QAAQ;AAC1D,kBAAY,KAAK,MAAM;AAAA,IACzB;AAAA,EACF;AACA,QAAM,YAAY,CAAC,UAA8B,OAAO,MAAM,IAA8B;AAC5F,QAAM,UAAU,CAAC,UAA8B;AAC7C,UAAM,eAAe;AACrB,SAAK,UAAU,OAAQ,MAAgC,WAAW,cAAc,CAAC;AACjF,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,iBAAiB,WAAW,SAAS;AAC5C,SAAO,iBAAiB,SAAS,OAAO;AAExC,QAAM,UAAU,oBAAI,IAAwB;AAC5C,QAAM,YAAY,CAAC,QAAsB;AACvC,UAAM,MAAM,QAAQ,IAAI,GAAG;AAC3B,YAAQ,OAAO,GAAG;AAClB,UAAM;AAAA,EACR;AACA,QAAM,cAAc,CAAC,WAA6B;AAChD,UAAM,EAAE,QAAQ,IAAI;AACpB,QAAIE,SAAQ,QAAQ,QAAQ,KAAM;AAClC,QAAI,QAAQ,QAAQ,mBAAmB,GAAG;AACxC,WAAK,UAAU,aAAa,gBAAgB,UAAU;AACtD,aAAO,OAAO;AACd;AAAA,IACF;AACA,UAAM,OAAO,IAAI,kBAAkB,mBAAmB,wBAAwB;AAC9E,UAAM,KAAK,KAAK,aAAa;AAC7B,UAAM,aAAa,uBAAuB,IAAI,MAAM,OAAO,EAAE,UAAAD,UAAS,CAAC;AACvE,UAAM,kBAAkB,CAAC,UAA8B;AACrD,YAAM,OAAO,MAAM;AACnB,UAAI,MAAM,SAAS,iBAAkB,WAAU,OAAO,GAAG;AAAA,UACpD,QAAO,IAAI;AAAA,IAClB;AACA,OAAG,iBAAiB,WAAW,eAAe;AAC9C,OAAG,iBAAiB,SAAS,OAAO;AACpC,YAAQ,IAAI,OAAO,KAAK,MAAM;AAC5B,SAAG,oBAAoB,WAAW,eAAe;AACjD,SAAG,oBAAoB,SAAS,OAAO;AACvC,iBAAW,QAAQ;AACnB,SAAG,UAAU;AAAA,IACf,CAAC;AACD,UAAM,QAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,KAAK,KAAK,YAAY,KAAK;AAAA,MAC3B;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,MACV,KAAK;AAAA,MACL,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AACA,OAAG,YAAY,KAAK;AAAA,EACtB;AAEA,SAAO;AAAA,IACL,YAAY,MAAM,KAAKD,SAAQ,OAAO,MAAM,IAAI;AAAA,IAChD,WAAW,MAAM,MAAM,IAAI;AAAA,EAC7B;AAEA,QAAM,SAAS,CAAC,QAAsB;AACpC,QAAIA,SAAQ,OAAO,GAAG,MAAM,YAAa;AACzC,UAAM,OAAO,QAAQ,IAAI,OAAO,MAAM,MAAM;AAC5C,QAAI,KAAK,QAAQ,QAAQ,UAAUE,MAAM,QAAO,MAAM,GAAG;AAAA,QACpD,OAAM,MAAM,MAAM,KAAKH,SAAQC,UAAS,MAAM,OAAO,MAAM,GAAG,CAAC;AAAA,EACtE;AACA,QAAM,OAAO,CAAC,OAAO,QACnB,OAAO,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,MAAM,MAAS;AAChE,SAAO;AAAA,IACL,KAAK,KAAK;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,IACf,SAAS,CAAC,aAAaA,SAAQ,QAAQ,QAAQ;AAAA,IAC/C,QAAQ,MAAM,QAAQ,KAAKD,SAAQ,YAAY,IAAI;AAAA,IACnD,gBAAgB,CAAC,SAASC,SAAQ,YAAY,IAAI;AAAA,IAClD,OAAO,MAAMA,SAAQ;AAAA,IACrB,YAAY,MAAM,KAAK,QAAQ,QAAQ,UAAU,CAACE;AAAA,EACpD;AACF;;;ACtbO,IAAM,WAAN,MAAe;AAAA,EACH,UAAU,oBAAI,IAAuB;AAAA,EACrC,aAAa,oBAAI,IAAuB;AAAA,EAExC,YAAY,oBAAI,IAAuB;AAAA,EAExD,IACE,KACA,WACA,QACA,UACW;AACX,UAAM,SAAS,cAAc,SAAY,SAAY,KAAK,QAAQ,IAAI,SAAS;AAC/E,QAAI,CAAC,UAAU,SAAU,MAAK,UAAU,IAAI,KAAK,QAAQ;AACzD,UAAM,SAAoB;AAAA,MACxB;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ,QAAQ;AAAA,MACtB,KAAK,QAAQ,OAAO;AAAA,MACpB;AAAA,IACF;AACA,SAAK,QAAQ,IAAI,KAAK,MAAM;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,OAAoB;AAClB,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC;AAAA,EAClC;AAAA,EAEA,OAAO,KAAmB;AACxB,SAAK,QAAQ,OAAO,GAAG;AAAA,EACzB;AAAA,EAEA,KAAK,KAAa,OAAe,QAAQ,OAAa;AACpD,UAAM,SAAS,KAAK,QAAQ,IAAI,KAAK;AACrC,QAAI,UAAU,MAAO,QAAO,UAAU,KAAK,MAAM,GAAG;AACpD,QAAI,OAAQ,QAAO,aAAa;AAChC,UAAM,SAAS,KAAK,QAAQ,IAAI,GAAG;AACnC,QAAI,OAAQ,QAAO,SAAS;AAAA,EAC9B;AAAA,EAEA,MAAM,KAAqB;AACzB,QAAI,SAAS,KAAK,QAAQ,IAAI,GAAG;AACjC,aAAS,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,EAAE,EAAG,UAAS;AAC/E,WAAO,QAAQ,OAAO;AAAA,EACxB;AAAA,EAEA,YAAY,KAAiC;AAC3C,UAAM,SAAS,KAAK,QAAQ,IAAI,KAAK,MAAM,GAAG,CAAC,GAAG;AAClD,WAAO,WAAW,SAAY,SAAY,KAAK,MAAM,MAAM;AAAA,EAC7D;AAAA,EAEA,UAAU,MAAkC;AAC1C,eAAW,UAAU,KAAK,QAAQ,OAAO,EAAG,KAAI,OAAO,SAAS,KAAM,QAAO,OAAO;AACpF,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,KAAa,MAAoB;AACpC,UAAM,MAAM,KAAK,UAAU,IAAI;AAC/B,QAAI,QAAQ,OAAW,OAAM,IAAI,YAAY,OAAO;AACpD,UAAM,SAAS,KAAK,OAAO,GAAG;AAC9B,WAAO,OAAO;AACd,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAO,KAAiC;AACtC,WAAO,KAAK,QAAQ,IAAI,GAAG,GAAG;AAAA,EAChC;AAAA,EAEQ,OAAO,KAAwB;AACrC,UAAM,SAAS,KAAK,QAAQ,IAAI,GAAG;AACnC,QAAI,CAAC,OAAQ,OAAM,IAAI,YAAY,OAAO;AAC1C,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,KAAqB;AAChC,WAAO,KAAK,QAAQ,IAAI,GAAG,GAAG,WAAW;AAAA,EAC3C;AAAA,EAEQ,KAAK,IAAuB;AAClC,eAAW,UAAU,KAAK,QAAQ,OAAO,EAAG,KAAI,OAAO,YAAY,GAAI,QAAO;AAC9E,WAAO,KAAK,OAAO,EAAE;AAAA,EACvB;AAAA,EAEA,QAAQ,QAAgB,KAAa,MAAoB;AACvD,UAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,UAAM,SAAS,KAAK,KAAK,OAAO,EAAE;AAClC,UAAM,KAAK,KAAK,KAAK,OAAO,GAAG;AAC/B,UAAM,QAAQ,QAAQ;AACtB,QAAI,QAAQ,EAAG,OAAM,IAAI,YAAY,QAAQ;AAC7C,UAAM,OAAO,KAAK,OAAO,MAAM;AAC/B,QAAI,OAAO,IAAI;AACb,UAAI,OAAO,SAAS,UAAa,KAAK,KAAK,OAAO,IAAI,MAAM,IAAI;AAC9D,cAAM,IAAI,YAAY,OAAO;AAAA,MAC/B;AACA,UAAI,OAAO,OAAQ,OAAM,IAAI,YAAY,QAAQ;AAAA,IACnD;AACA,QAAI,OAAO,QAAQ,KAAK,IAAK,OAAM,IAAI,YAAY,OAAO;AAC1D,QAAI,OAAO,OAAO,IAAK,OAAM,IAAI,YAAY,OAAO;AAEpD,UAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,QAAQ,OAAO,GAAG;AAC9F,QAAI,UAAU,MAAM,CAAC,OAAQ,OAAM,IAAI,YAAY,OAAO;AAC1D,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,QAAQ,QAAgB,KAAqB;AAC3C,WAAO,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,CAAC,EAAE;AAAA,EAC7C;AAAA,EAEA,OAAO,QAAgB,KAAqB;AAC1C,WAAO,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,CAAC,EAAE;AAAA,EAC7C;AAAA,EAEA,OAAO,KAAqB;AAC1B,UAAM,SAAS,KAAK,OAAO,GAAG;AAC9B,UAAM,KAAK,KAAK,KAAK,GAAG;AACxB,QAAI,OAAO,SAAS,GAAI,OAAM,IAAI,YAAY,OAAO;AACrD,WAAO,MAAM;AACb,WAAO,OAAO;AACd,SAAK,UAAU,OAAO,EAAE;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,cAAcC,OAAqC;AACjD,WAAO,KAAK,eAAe,EAAE,KAAK,CAAC,QAAQ,IAAI,SAASA,KAAI;AAAA,EAC9D;AAAA,EAEA,gBAA0B;AACxB,WAAO,KAAK,eAAe,EAAE,QAAQ,CAAC,QAAS,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAE;AAAA,EAC5E;AAAA,EAEQ,iBAA8B;AACpC,WAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,GAAG,GAAG,KAAK,WAAW,KAAK,CAAC,CAAC,CAAC;AAAA,EAC7E;AAAA,EAEA,oBAAoB,KAA2C;AAC7D,UAAM,SAAS,KAAK,QAAQ,IAAI,GAAG;AACnC,WAAO,WAAW,KAAK,UAAU,IAAI,OAAO,GAAG,KAAK;AAAA,EACtD;AAAA,EAEA,gBAAgB,KAAa,KAAyB;AACpD,UAAM,SAAS,KAAK,QAAQ,IAAI,GAAG;AACnC,UAAM,KAAK,KAAK,KAAK,GAAG;AACxB,QAAI,CAAC,UAAU,OAAO,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,EAAG,QAAO;AACnE,QAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,EAAE,SAAS,GAAG,EAAG,QAAO;AACvD,SAAK,UAAU,IAAI,IAAI,GAAG;AAC1B,SAAK,WAAW,IAAI,KAAK,OAAO,IAAI;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,MAAc,KAAsB;AAC5C,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AACxE,UAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9C,QAAI,QAAQ,GAAG;AACb,iBAAW,KAAK;AACd,YAAI,EAAE,eAAe,UAAa,CAAC,KAAK,IAAI,EAAE,UAAU,EAAG,GAAE,OAAO,GAAG;AAAA,IAC3E;AACA,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAAA,EAEA,UAAU,KAAgB,UAA0B;AAClD,WAAO,KAAK,WAAW,IAAI,GAAG,KAAK;AAAA,EACrC;AAAA,EAEA,UAAU,QAAgB,KAAgB,MAAoB;AAC5D,UAAM,OAAO,KAAK,OAAO,MAAM;AAC/B,UAAM,YAAY,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,QAAQ,KAAK,GAAG;AAC9F,QAAI,CAAC,UAAW,OAAM,IAAI,YAAY,OAAO;AAC7C,SAAK,WAAW,IAAI,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEA,sBAAsB,KAAgB,KAAmB;AACvD,UAAM,OAAO,KAAK,WAAW,IAAI,GAAG;AACpC,QAAI,SAAS,OAAW,MAAK,UAAU,MAAM,GAAG;AAAA,EAClD;AAAA,EAEA,iBAAiB,KAAgB,UAAkB,KAAmB;AACpE,SAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,GAAG,GAAG;AAAA,EACnD;AACF;;;ACtMA,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,YAAY;AAEzB,IAAM,cAAc,oBAAI,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;AAQ/B,IAAM,mBAAN,MAAuB;AAAA,EACX,WAAW,oBAAI,IAG9B;AAAA,EACM,OAAe,CAAC;AAAA,EAChB,SAAiB,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EAEjB,YAAY,QAA6C,WAAW,WAAW;AAC7E,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,QAAQ,KAAa,MAAoB;AACvC,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI;AACrC,SAAK,SAAS,IAAI,KAAK,SAAS,EAAE,MAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,EAAE,KAAK,CAAC;AAC9E,UAAM,QAAQ,KAAK,OAAO,IAAI;AAC9B,eAAW,KAAK,KAAK,OAAQ,KAAI,EAAE,SAAS,MAAO,MAAK,KAAK,KAAK,EAAE,GAAG,GAAG,MAAM,KAAK,CAAC;AACtF,SAAK,SAAS,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK;AAAA,EAC1D;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,SAAS,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AACvD,SAAK,OAAO,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,KAAK;AAAA,EAClE;AAAA,EAEA,QAAQ,KAAa,IAAkB;AACrC,UAAM,QAAQ,KAAK,SAAS,IAAI,GAAG;AACnC,QAAI,CAAC,MAAO;AACZ,QAAI,CAAC,UAAU,IAAI,EAAE,GAAG;AACtB,WAAK,QAAQ,GAAG;AAChB;AAAA,IACF;AACA,UAAM,UAAU,WAAW,MAAM,KAAK,QAAQ,GAAG,GAAG,KAAK,QAAQ;AAAA,EACnE;AAAA,EAEA,QAAQ,KAAmB;AACzB,UAAM,QAAQ,KAAK,SAAS,IAAI,GAAG;AACnC,QAAI,CAAC,MAAO;AACZ,iBAAa,MAAM,KAAK;AACxB,SAAK,SAAS,OAAO,GAAG;AACxB,QAAI,MAAM,WAAW,OAAW,MAAK,QAAQ,MAAM,MAAM;AACzD,UAAMC,SAAQ,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,IAAI,CAAC;AAC5D,SAAK,OAAO,KAAK,KAAK,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,IAAI,CAAC;AACzD,eAAW,KAAKA,OAAO,GAAE,KAAK;AAAA,EAChC;AAAA,EAEA,QAAQ,KAAa,MAAc,MAAkB,YAAiC;AACpF,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,WAAK;AAAA,IACP,WAAW,KAAK,SAAS,IAAI,GAAG;AAC9B,WAAK,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AAAA,IAC/B,WAAW,YAAY;AACrB,WAAK;AACL,YAAMC,SAAQ,MAAM;AAClB,YAAI,WAAW,MAAM,KAAM,MAAK;AAAA,MAClC;AACA,WAAK,OAAO,KAAK,EAAE,MAAM,MAAMA,OAAM,CAAC;AAAA,IACxC,OAAO;AACL,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,SAAS,MAAuB;AACtC,eAAW,EAAE,KAAK,KAAK,KAAK,SAAS,OAAO,EAAG,KAAI,KAAK,OAAO,IAAI,MAAM,KAAM,QAAO;AACtF,WAAO;AAAA,EACT;AACF;;;AChCO,SAASC,SAAQ,MAAcC,WAAU,MAAgC;AAC9E,SAAO,OAAO,OAAO,IAAI,MAAMA,QAAO,GAAG,EAAE,KAAK,CAAC;AACnD;AAEA,eAAe,SAAS,GAAuB,KAAsC;AACnF,UAAQ,IAAI,IAAI;AAAA,IACd,KAAK;AACH,aAAO,EAAE,QAAQ,IAAI,IAAI;AAAA,IAC3B,KAAK;AACH,aAAO,EAAE,QAAQ,IAAI,IAAI;AAAA,IAC3B,KAAK;AACH,aAAO,EAAE,KAAK,IAAI,MAAM;AAAA,QACtB,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,UAAU,IAAI;AAAA,QACd,WAAW,IAAI;AAAA,QACf,GAAI,IAAI,YAAY,SAAY,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;AAAA,MAC9D,CAAC;AAAA,IACH,KAAK;AACH,aAAO,EAAE,KAAK,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,MAAM,IAAI,IAAI,IAAI,QAAQ,IAAI,KAAK;AAAA,IAC9C,KAAK;AACH,aAAO,EAAE,QAAQ,IAAI,EAAE;AAAA,IACzB,KAAK;AACH,aAAO,EAAE,MAAM,IAAI,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,EAAE,MAAM,IAAI,IAAI;AAAA,IACzB,KAAK;AACH,aAAO,EAAE,OAAO,IAAI,IAAI;AAAA,IAC1B,KAAK;AACH,aAAO,EAAE,OAAO,IAAI,MAAM,IAAI,EAAE;AAAA,IAClC,KAAK;AACH,UAAI,CAAC,EAAE,QAAS,OAAMD,SAAQ,SAAS,kCAAkC;AACzE,aAAO,EAAE,QAAQ,IAAI,QAAQ,IAAI,IAAI;AAAA,IACvC,KAAK;AACH,UAAI,CAAC,EAAE,SAAU,OAAMA,SAAQ,UAAU,GAAG,IAAI,IAAI,mBAAmB;AACvE,aAAO,EAAE,SAAS,IAAI,IAAI;AAAA,IAC5B,KAAK;AACH,aAAO,EAAE,UAAU,IAAI,MAAM;AAAA,QAC3B,GAAI,IAAI,SAAS,SAAY,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,QACnD,GAAI,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,QACtD,GAAI,IAAI,SAAS,SAAY,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,MACrD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AACE,YAAMA,SAAQ,UAAU,qBAAsB,IAAuB,EAAE,EAAE;AAAA,EAC7E;AACF;AAEO,SAAS,gBACd,MACA,UACA,eAAmC,CAAC,GACpC,UAA+B,CAAC,GACd;AAClB,MAAI,OAAO;AACX,QAAM,QAAQ,CAACC,UAAiB,WAA2B,CAAC,MAC1D,KAAK,YAAYA,UAAS,QAAQ;AACpC,iBAAe,MAAMA,UAA2C;AAC9D,UAAM,UAAU,mBAAmBA,SAAQ,QAAQ;AACnD,QAAI,SAAS;AACX,YAAM,EAAE,OAAO,EAAE,UAAU,iBAAiB,OAAO,SAAS,OAAO,SAAS,EAAE,CAAC;AAC/E;AAAA,IACF;AACA,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,QAAQA,SAAQ,KAAK;AACpD,aAAO;AACP,YAAM;AAAA,QACJ,OAAO,EAAE,UAAU,iBAAiB,cAAc,EAAE,GAAG,cAAc,GAAG,QAAQ,EAAE;AAAA,MACpF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,OAAQ,KAA4B;AAC1C,YAAM;AAAA,QACJ,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACtD,OAAO,OAAO,SAAS,WAAW,OAAO;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,OAAK,iBAAiB,WAAW,CAAC,UAAU;AAC1C,UAAM,OAAO,MAAM;AACnB,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,KAAK,KAAK;AACrB;AAAA,IACF;AACA,QAAI,CAAC,KAAM;AACX,aAAS,UAAU,IAAI,EAAE;AAAA,MACvB,CAAC,WAAW;AACV,YAAI,kBAAkB,YAAY;AAChC,gBAAM,QAAQ,OAAO,eAAe,KAAK,OAAO,eAAe,OAAO,OAAO;AAC7E,gBAAM,QAAQ,QAAQ,SAAS,QAAQ,SAAS,OAAO,MAAM;AAC7D,gBAAM,EAAE,IAAI,KAAK,IAAI,QAAQ,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC;AAAA,QACtD,MAAO,OAAM,EAAE,IAAI,KAAK,IAAI,QAAQ,UAAU,KAAK,CAAC;AAAA,MACtD;AAAA,MACA,CAAC,QAAiB;AAChB,cAAM,OAAQ,KAA4B;AAC1C,cAAM;AAAA,UACJ,IAAI,KAAK;AAAA,UACT,OAAO,OAAO,SAAS,WAAW,OAAO;AAAA,UACzC,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC1D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACD,OAAK,QAAQ;AACb,SAAO,EAAE,YAAY,CAAC,UAAU,MAAM,EAAE,YAAY,MAAM,CAAC,EAAE;AAC/D;;;AC3JA,IAAM,aAAyB,EAAE,MAAM,aAAa,MAAM,GAAG,OAAO,GAAG,MAAM,MAAQ;AAE9E,IAAM,SAAS,MAAMC,SAAQ,aAAa,iBAAiB;AAE3D,SAAS,WACd,MACA,QACe;AACf,MAAI;AACJ,WAAS,KACP,MAC4B;AAC5B,WAAO,UAAU,SAAS;AACxB,YAAM,SAAS;AACf,UAAI,CAAC,OAAQ,OAAM,OAAO;AAC1B,UAAI;AACF,eAAO,MAAM,KAAK,OAAO,QAAQ,EAAE,GAAG,IAAI;AAAA,MAC5C,SAAS,KAAK;AACZ,YAAI,CAAE,MAAM,KAAK,KAAK,OAAO,GAAG,EAAI,OAAM;AAC1C,YAAI,YAAY,QAAQ;AACtB,oBAAU;AACV,iBAAO,OAAO,GAAG;AAAA,QACnB;AACA,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO;AACrC,QAAM,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO;AACrC,QAAM,SAAS,KAAK,CAAC,MAAM,YAAa,MAAM,EAAE,SAAS,KAAM,IAAI;AACnE,SAAO;AAAA,IACL,UAAU;AAAA,MACR,SAAS,CAAC,SAAU,WAAW,SAAS,MAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ,UAAU;AAAA,MACxF,SAAS,CAAC,SAAU,WAAW,SAAS,MAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAChF,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI;AAAA,MACxB,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI;AAAA,MACxB,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,MAC1B,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,MAC9B,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,MAC1B,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK;AAAA,MAC1B,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM;AAAA,MAC5B,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM;AAAA,MAC5B,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,MAC9B,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ;AAAA,MAChC,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,MAC9B,QAAQ,MAAO,UAAU,OAAO,IAAI,QAAQ,QAAQ,IAAI;AAAA,IAC1D;AAAA,IACA,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO,KAAK,UAAU;AACpB,gBAAU,EAAE,KAAK,SAAS;AAAA,IAC5B;AAAA,IACA,QAAQ;AACN,gBAAU;AAAA,IACZ;AAAA,EACF;AACF;;;AC9DO,IAAM,mBAAuC;AAAA,EAClD,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AACZ;AAkBA,IAAMC,UAAS,CAAC,QAAkB,KAAmC;AACrE,IAAM,SAAS,CAAC,QACdA,QAAO,GAAG,MAAM,YAAa,KAAmC,SAAS;AAE3E,SAAS,OAAO,IAAwB;AACtC,SAAO;AAAA,IACL,MAAM,GAAG,cAAc,cAAc,GAAG,iBAAiB,YAAY;AAAA,IACrE,MAAM,GAAG;AAAA,IACT,OAAO,GAAG,MAAM,QAAQ;AAAA,IACxB,MAAM,GAAG;AAAA,IACT,KAAK,GAAG;AAAA,EACV;AACF;AAEO,SAAS,iBAAiB,IAAyB;AACxD,QAAM,UAAU,oBAAI,IAAoB;AACxC,MAAI,SAAS;AACb,QAAM,SAAS,CAAC,OAAuB;AACrC,UAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,QAAI,CAAC,MAAO,OAAMC,SAAQ,SAAS,UAAU,EAAE,EAAE;AACjD,WAAO;AAAA,EACT;AACA,iBAAe,SAAS,MAA2C;AACjE,QAAI;AACF,aAAO,MAAM,GAAG,KAAK,IAAI;AAAA,IAC3B,SAAS,KAAK;AACZ,UAAID,QAAO,GAAG,MAAM,SAAU,QAAO;AACrC,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,OAAO,SAAS,OAAO,MAAM,GAAG,MAAM,IAAI,CAAC;AAAA,IACpD,SAAS,OAAO,UACb,MAAM,GAAG,YAAY,IAAI,GAAG,QAAQ,CAAC,CAACE,OAAM,EAAE,MAAqB;AAClE,UAAI,CAAC,GAAI,QAAO,CAAC;AACjB,YAAM,OAAO,OAAO,EAAE;AACtB,aAAO,CAAC,EAAE,MAAAA,OAAM,MAAM,KAAK,MAAM,KAAK,CAAC;AAAA,IACzC,CAAC;AAAA,IACH,MAAM,KAAK,MAAc,OAAkB;AACzC,YAAM,KAAK,MAAM,SAAS,IAAI;AAC9B,UAAI,MAAM,MAAM,UAAW,OAAMD,SAAQ,UAAU,IAAI;AACvD,UAAI,IAAI,eAAe,MAAM,MAAO,OAAMA,SAAQ,UAAU,IAAI;AAChE,UAAI,CAAC,MAAM,CAAC,MAAM,OAAQ,OAAMA,SAAQ,UAAU,IAAI;AACtD,UAAI,CAAC,MAAM,MAAM,SAAU,OAAM,GAAG,UAAU,MAAM,IAAI,WAAW,CAAC,CAAC;AACrE,cAAQ,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,IAAI,QAAQ,SAAS,GAAG,MAAM,OAAO,EAAE,EAAE,MAAM,QAAQ,IAAI;AAAA,IACxE,MAAM,MAAM,IAAI,QAAQ,OAAO;AAC7B,YAAM,IAAI,OAAO,EAAE;AACnB,QAAE,YAAY,GAAG,aAAa,EAAE,MAAM,KAAK;AAC3C,aAAO,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;AAAA,IAC7C;AAAA,IACA,MAAM,QAAQ,IAAI;AAChB,YAAM,IAAI,OAAO,EAAE;AACnB,cAAQ,OAAO,EAAE;AACjB,UAAI,EAAE,YAAY,OAAW,QAAO,MAAM,EAAE,SAAS,MAAM;AAAA,IAC7D;AAAA,IACA,OAAO,CAAC,SAAS,GAAG,MAAM,IAAI;AAAA,IAC9B,MAAM,MAAM,MAAM;AAChB,UAAI,EAAE,MAAM,GAAG,MAAM,IAAI,GAAG,YAAa,OAAMA,SAAQ,WAAW,IAAI;AACtE,WAAK,MAAM,GAAG,QAAQ,IAAI,GAAG,SAAS,EAAG,OAAMA,SAAQ,aAAa,IAAI;AACxE,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB;AAAA,IACA,MAAM,OAAO,MAAM;AACjB,WAAK,MAAM,GAAG,MAAM,IAAI,GAAG,YAAa,OAAMA,SAAQ,UAAU,IAAI;AACpE,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB;AAAA,IACA,QAAQ,CAAC,MAAM,OAAO,GAAG,OAAO,MAAM,EAAE;AAAA,IACxC,SAAS,CAAC,QAAQ,SAAS,GAAG,QAAQ,QAAQ,IAAI;AAAA,IAClD,UAAU,CAAC,SAAS,GAAG,SAAS,IAAI;AAAA,IACpC,MAAM,QAAQ,MAAM,QAAQ;AAC1B,UAAI,OAAO,SAAS,QAAW;AAC7B,cAAM,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE;AAAA,UACjC,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,YAAY;AAAA,QAC1C,GAAG;AACH,YAAI,SAAS,OAAW,QAAO,MAAM,MAAM,SAAS,OAAO,IAAI;AAAA,YAC1D,OAAM,GAAG,WAAW,MAAM,OAAO,IAAI;AAAA,MAC5C;AACA,UAAI,OAAO,SAAS,OAAW,OAAM,GAAG,MAAM,MAAM,OAAO,IAAI;AAC/D,UAAI,OAAO,UAAU,QAAW;AAC9B,cAAM,GAAG,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,GAAG,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACF;AASO,SAAS,QAAQ,QAA4C;AAClE,MAAI,CAAC,OAAO,gBAAiB,QAAO,QAAQ,QAAQ,IAAI;AACxD,SAAO,OAAO,gBAAgB,EAAE,MAAM,YAAY,CAAC,EAAE;AAAA,IACnD,CAAC,UAAU,UAAU;AAAA,IACrB,MAAM;AAAA,EACR;AACF;AAEO,SAAS,gBACd,QACA,OAA4C,CAAC,WAAW,IAAI,OAAO,MAAM,GACjE;AACR,QAAM,OAAO;AAAA,IACX,OAAO,KAAK,WAAW,OAAO,GAAG,KAAK,CAAE,MAAM,QAAQ,MAAM;AAAA,IAC5D;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,SAAS,KAAK;AAAA,IACd,QAAQ,CAAC,WAAW,KAAK,OAAO,QAAQ,iBAAiB,KAAK,MAAM,CAAC,CAAC;AAAA,IACtE,OAAO,KAAK;AAAA,EACd;AACF;;;AC5IO,IAAM,YAAY;AACzB,IAAM,aAAa;AACnB,IAAM,aAAa;AAEnB,IAAM,gBACJ,IAAI,IAAI,IAAI,KAAK,MAAM,OAAO,OAAO,QAAS,KAAK,KAAO,KAAK,KAAO,KAAK;AAEtE,IAAM,YAAY;AAClB,IAAM,aAAa;AAC1B,IAAM,kBAAkB;AAExB,IAAM,UAAU,oBAAI,IAAI;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAuBM,SAAS,kBAAkB,MAAsC;AACtE,QAAM,UAAkC,CAAC;AACzC,aAAW,OAAO,KAAK,MAAM,GAAG,GAAG;AACjC,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,QAAQ,QAAQ,IAAI,IAAI,EAAG;AAChC,QAAI,SAAS,MAAM;AACjB,aAAO,QAAQ;AACf;AAAA,IACF;AACA,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,QAAI,OAAO,EAAG,OAAM,WAAW,UAAU,oBAAoB,IAAI,EAAE;AACnE,QAAI,KAAK,EAAG,SAAQ,IAAI,IAAI;AAAA,QACvB,SAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,EACrD;AACA,MAAI,QAAQ,YAAY,OAAW,WAAU,QAAQ,OAAO;AAC5D,SAAO;AACT;AAEO,SAAS,cAAc,QAAsB;AAClD,QAAM,KAAK,cAAc,MAAM;AAC/B,QAAM,SAAS,OAAO,OAAO,CAAC,SAAS,MAAM,EAAE,KAAK,CAAC,MAAM,OAAO,KAAK,GAAG,WAAW,GAAG,CAAC,GAAG,CAAC;AAC7F,MAAI,OAAQ,OAAM,WAAW,SAAS,GAAG,EAAE,wBAAwB;AACrE;AAEA,SAAS,SAAS,QAAwB;AACxC,MAAI,CAAC,OAAQ,OAAM,WAAW,UAAU,gBAAgB;AACxD,MAAI,CAAC,OAAO,WAAW,GAAG,EAAG,OAAM,WAAW,UAAU,yBAAyB,MAAM,EAAE;AACzF,SAAO,cAAc,MAAM;AAC7B;AAEO,SAAS,UAAU,MAA4B;AACpD,MAAI,QAAQ,KAAK,UAAU;AAC3B,OAAK,QAAQ,gBAAgB,MAAM,WAAY,UAAS,CAAC;AACzD,MAAI,QAAQ,EAAE,YAAY,gBAAgB;AACxC,UAAM,WAAW,UAAU,2BAA2B,MAAM,SAAS,EAAE,CAAC,EAAE;AAAA,EAC5E;AACA,MAAI,CAAC,KAAK,KAAM,OAAM,WAAW,UAAU,qBAAqB;AAChE,QAAM,SAAS,SAAS,KAAK,MAAM;AACnC,gBAAc,MAAM;AACpB,QAAM,UAAU,kBAAkB,KAAK,IAAI;AAC3C,MAAI,QAAQ,UAAW,SAAQ,KAAK;AACpC,SAAO,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ,QAAQ;AAC3E;AAEO,SAAS,WAAW,QAAgB,OAAoD;AAC7F,QAAM,QAAQ,YAAY,aAAa;AACvC,MAAK,UAAU,IAAK,CAAC,MAAO,OAAM,WAAW,UAAU,4BAA4B,KAAK,EAAE;AAC1F,QAAM,KAAK,SAAS,MAAM;AAC1B,gBAAc,EAAE;AAChB,SAAO,EAAE,QAAQ,IAAI,SAAS,SAAS,YAAY,iBAAiB,EAAE;AACxE;;;ACnHO,IAAM,aAAa;AAEnB,IAAM,gBAAgB,CAAC,KAAM,KAAM,IAAK;AAE/C,IAAM,QAAQ,oBAAI,IAAI,CAAC,UAAU,SAAS,SAAS,QAAQ,CAAC;AAgB5D,SAAS,SAASE,QAAuB;AACvC,SAAOA,OAAM;AAAA,IAAQ;AAAA,IAAiB,CAAC,GAAG,UACxC,OAAO,aAAa,OAAO,SAAS,OAAO,CAAC,CAAC;AAAA,EAC/C;AACF;AAEO,SAAS,WAAW,MAA2B;AACpD,QAAM,QAAqB,CAAC;AAC5B,OAAK,MAAM,IAAI,EAAE,QAAQ,CAAC,KAAK,UAAU;AACvC,UAAM,UAAU,IAAI,QAAQ,QAAQ,EAAE,EAAE,KAAK;AAC7C,QAAI,CAAC,QAAS;AACd,UAAM,CAAC,QAAQ,QAAQ,MAAM,UAAU,UAAU,IAAI,QAAQ,MAAM,KAAK,EAAE,IAAI,QAAQ;AACtF,QAAI,WAAW,UAAa,WAAW,UAAa,SAAS,OAAW;AACxE,QAAI,QAAQ,MAAM,GAAG,EAAE,SAAS,QAAQ,EAAG;AAC3C,UAAM,OAAO,EAAE,QAAQ,QAAQ,MAAM,SAAS,CAAC,EAAE;AACjD,QAAI;AACF,YAAM,KAAK,EAAE,MAAM,QAAQ,GAAG,MAAM,EAAE,GAAG,MAAM,SAAS,kBAAkB,OAAO,EAAE,EAAE,CAAC;AAAA,IACxF,SAAS,KAAK;AACZ,YAAM,KAAK,EAAE,MAAM,QAAQ,GAAG,MAAM,SAAS,IAAa,CAAC;AAAA,IAC7D;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,SAASC,QAAO,KAAsB;AACpC,QAAM,OAAQ,KAAmC;AACjD,SAAO,OAAO,SAAS,WAAW,OAAO;AAC3C;AAEA,SAAS,KAAK,IAAY,QAAoC;AAC5D,MAAI,OAAO,QAAS,QAAO,QAAQ,QAAQ;AAC3C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAMC,QAAO,MAAM;AACjB,mBAAa,KAAK;AAClB,aAAO,oBAAoB,SAASA,KAAI;AACxC,cAAQ;AAAA,IACV;AACA,UAAM,QAAQ,WAAWA,OAAM,EAAE;AACjC,WAAO,iBAAiB,SAASA,OAAM,EAAE,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AAEA,eAAsB,WACpB,OACA,OACA,QACA,UAA6B,eAC7B,UAAuC,MAAM;AAAC,GAC9C,UAA0D,MAAM;AAAC,GACzC;AACxB,SAAO,QAAQ;AAAA,IACb,MAAM,IAAI,OAAO,SAAS;AACxB,YAAM,SAAS,MAAM,UAAU,MAAM,OAAO,QAAQ,SAAS,OAAO;AACpE,cAAQ,MAAM,MAAM;AACpB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,eAAe,UACb,EAAE,MAAM,MAAM,QAAQ,GACtB,OACA,QACA,SACA,SACsB;AACtB,MAAI,SAAkB;AACtB,WAAS,UAAU,GAAG,CAAC,WAAW,WAAW,QAAQ,UAAU,CAAC,OAAO,SAAS,WAAW;AACzF,QAAI;AACF,YAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,UAAI,CAAC,OAAO,QAAS,QAAO,EAAE,MAAM,QAAQ,KAAK,QAAQ,MAAM;AAC/D,cAAQ,KAAK;AACb,eAAS,OAAO,OAAO,IAAI,MAAM,oBAAoB,GAAG,EAAE,MAAM,YAAY,CAAC;AAC7E;AAAA,IACF,SAAS,KAAK;AACZ,eAAS;AACT,UAAI,MAAM,IAAID,QAAO,GAAG,CAAC,KAAK,YAAY,QAAQ,OAAQ;AAC1D,YAAM,KAAK,QAAQ,OAAO,GAAa,MAAM;AAAA,IAC/C;AAAA,EACF;AACA,QAAM,OAAOA,QAAO,MAAM;AAC1B,SAAO,EAAE,MAAM,QAAQ,KAAK,QAAQ,MAAM,OAAO,OAAQ,QAAkB,WAAW,IAAI,EAAE;AAC9F;;;AChFO,IAAM,YAAY,KAAK,OAAO;AAErC,IAAME,UAAS,CAAC,QAAkB,KAAmC;AAE9D,IAAM,cAAc,CAAC,QAAiBA,QAAO,GAAG,MAAM;AAE7D,SAAS,IAAI,MAAsB;AACjC,SAAO,KAAK,QAAQ,QAAQ,EAAE;AAChC;AAEO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACS;AAAA,EACA;AAAA,EAEjB,YAAY,OAAoB,SAAqCC,QAAkB;AACrF,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,QAAQA;AAAA,EACf;AAAA,EAEA,IAAI,eAAmC;AACrC,WAAO,KAAK,MAAM,gBAAgB,CAAC;AAAA,EACrC;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK,aAAa,SAAS;AAAA,EACpC;AAAA,EAEA,MAAc,KACZ,MACA,MACA,SAAS,OACT,UAAU,OACS;AACnB,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,IAAI,IAAI;AAAA,QACtD,GAAG;AAAA,QACH,aAAa;AAAA,QACb,SAAS;AAAA,UACP,GAAI,KAAK;AAAA,UACT,kBAAkB,KAAK,MAAM;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAMC,SAAQ,YAAY,kCAAmC,IAAc,OAAO,EAAE;AAAA,IACtF;AACA,QAAI,SAAS,GAAI,QAAO;AACxB,QAAI,SAAS,QAAQ,IAAI,eAAe,GAAG;AACzC,YAAM,SAAS,MAAM,OAAO;AAC5B,UAAI,WAAW,SAAS,WAAW,KAAK;AACtC,cAAMA,SAAQ,UAAU,uCAAuC,SAAS,MAAM,GAAG;AAAA,MACnF;AACA,WAAK,QAAQ,MAAM,KAAK,QAAQ;AAChC,UAAI;AACF,cAAMA,SAAQ,UAAU,0DAA0D;AACpF,aAAO,KAAK,KAAK,MAAM,MAAM,OAAO,IAAI;AAAA,IAC1C;AACA,UAAM,QAAQ,SAAS,QAAQ,IAAI,gBAAgB,KAAK;AACxD,UAAM,OAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACpD,UAAMA,SAAQ,OAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK;AAAA,EAC9E;AAAA,EAEA,MAAM,KAAQ,IAAY,OAAgC,CAAC,GAAG,SAAS,OAAmB;AACxF,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,IAAI,GAAG,KAAK,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,IACF;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAAA,EAEA,MAAM,KAAK,IAAY,QAAgB,MAAc,SAAuC;AAC1F,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,IAAI,QAAQ,IAAI,QAAQ,MAAM,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,EAAG,CAAC;AAAA,MACxF;AAAA,MACA;AAAA,IACF;AACA,WAAO,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,MAAM,IAAY,QAAgB,OAAkC;AACxE,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,oBAAoB,KAAK,UAAU,EAAE,IAAI,OAAO,CAAC;AAAA,QACnD;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM,OAAO;AAAA,EAC9B;AAAA,EAEA,MAAM,MACJ,QACA,SACA,SAAqB,MAAM,QACZ;AACf,UAAM,WAAW,MAAM,KAAK,KAAK,qBAAqB,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAChF,WAAO;AACP,UAAM,SAAU,SAAS,KAAoC,UAAU;AACvE,UAAMC,WAAU,IAAI,YAAY;AAChC,QAAI,WAAW;AACf,QAAI;AACF,iBAAS;AACP,cAAM,EAAE,MAAAC,OAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAIA,MAAM;AACV,oBAAYD,SAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAClD,YAAI,MAAM,SAAS,QAAQ,IAAI;AAC/B,eAAO,OAAO,GAAG;AACf,gBAAM,OAAO,SAAS,MAAM,GAAG,GAAG,EAAE,KAAK;AACzC,qBAAW,SAAS,MAAM,MAAM,CAAC;AACjC,cAAI,KAAM,SAAQ,KAAK,MAAM,IAAI,CAAgB;AACjD,gBAAM,SAAS,QAAQ,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,OAAO,QAAS;AACpB,YAAMD,SAAQ,YAAY,iCAAkC,IAAc,OAAO,EAAE;AAAA,IACrF,UAAE;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AACF;AAUO,SAAS,eAAe,SAA6C;AAC1E,QAAM,UAAU,oBAAI,IAAoB;AACxC,MAAI,SAAS;AACb,QAAM,QAAQ,CAAC,WAA2B;AACxC,QAAI,OAAO,OAAO,UAAU,OAAO,MAAO,QAAO;AACjD,UAAMA,SAAQ,UAAU,yDAAyD;AAAA,EACnF;AACA,QAAM,OAAO,CAAC,OAAuB;AACnC,UAAM,SAAS,QAAQ,IAAI,EAAE;AAC7B,QAAI,CAAC,OAAQ,OAAMA,SAAQ,SAAS,UAAU,EAAE,EAAE;AAClD,WAAO,MAAM,MAAM;AAAA,EACrB;AACA,QAAM,OAAO,CAAI,IAAY,OAAgC,CAAC,MAAM,QAAQ,EAAE,KAAQ,IAAI,IAAI;AAC9F,iBAAe,SAAS,QAAsB,MAAc,OAAkB;AAC5E,UAAM,EAAE,SAAS,GAAG,GAAG,MAAM,IAAI;AACjC,UAAM,UAAU,MACd,OAAO,KAAwC,QAAQ,EAAE,MAAM,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC;AACtF,QAAI;AACF,aAAO,EAAE,QAAQ,MAAM,QAAQ,GAAG,SAAS,OAAU;AAAA,IACvD,SAAS,KAAK;AACZ,UAAI,CAAC,MAAM,SAASF,QAAO,GAAG,MAAM,SAAU,OAAM;AACpD,YAAM,QAAQ,MAAM,OAAO,KAAiB,QAAQ,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,GAAG,QAAQ;AAClF,UAAI,OAAO,IAAO,OAAM;AACxB,YAAM,UAAU,EAAE,MAAM,IAAI,IAAI,GAAG,KAAK;AACxC,YAAM,OAAO,KAAK,WAAW,EAAE,MAAM,IAAI,IAAI,GAAG,MAAM,OAAO,IAAM,CAAC;AACpE,YAAMK,UAAS,MAAM,QAAQ,EAAE,MAAM,OAAO,UAAmB;AAC7D,cAAM,OAAO,KAAK,WAAW,OAAO;AACpC,cAAM;AAAA,MACR,CAAC;AACD,aAAO,EAAE,QAAAA,SAAQ,QAAQ;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,WAA2B;AAAA,IAC/B,SAAS,OAAO,SAAS,MAAM,KAAiB,QAAQ,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;AAAA,IAC3E,MAAM,QAAQ,MAAM;AAClB,YAAM,EAAE,QAAQ,IAAI,MAAM;AAAA,QACxB;AAAA,QACA,EAAE,MAAM,IAAI,IAAI,EAAE;AAAA,MACpB;AACA,aAAO,QAAQ,IAAI,CAAC,EAAE,MAAAC,OAAM,KAAK,OAAoB,EAAE,MAAAA,OAAM,MAAM,KAAK,MAAM,KAAK,EAAE;AAAA,IACvF;AAAA,IACA,MAAM,KAAK,MAAc,OAAkB;AACzC,YAAM,SAAS,QAAQ;AACvB,YAAM,QAAQ,OAAO;AACrB,YAAM,EAAE,QAAAD,SAAQ,QAAQ,IAAI,MAAM,SAAS,QAAQ,MAAM,KAAK;AAC9D,UAAI,MAAM,YAAY,UAAaA,QAAO,MAAM,SAAS,MAAM,SAAS;AACtE,cAAM,OAAO,KAAK,WAAW,EAAE,IAAIA,QAAO,GAAG,GAAG,IAAI;AACpD,cAAMH,SAAQ,UAAU,GAAG,IAAI,8CAA8C;AAAA,MAC/E;AACA,cAAQ,IAAI,EAAE,QAAQ;AAAA,QACpB;AAAA,QACA;AAAA,QACA,IAAIG,QAAO;AAAA,QACX,MAAM,MAAM,QAAQ,SAAYA,QAAO,MAAM;AAAA,QAC7C;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,IAAI,QAAQ,MAAM;AAC3B,YAAM,SAAS,KAAK,EAAE;AACtB,aAAO,OAAO,OAAO;AAAA,QACnB,OAAO;AAAA,QACP;AAAA,QACA,KAAK,IAAI,MAAM,OAAO,OAAO,KAAK;AAAA,QAClC,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,MAAM,IAAI,QAAQ,OAAO;AAC7B,YAAM,SAAS,KAAK,EAAE;AACtB,YAAM,OAAO,OAAO,OAAO;AAC3B,eAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM,MAAM;AAC9C,cAAM,OAAO,OAAO,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM,SAAS,IAAI,KAAK,IAAI,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,IAAI;AAChB,YAAM,SAAS,QAAQ,IAAI,EAAE;AAC7B,UAAI,CAAC,OAAQ,OAAMH,SAAQ,SAAS,UAAU,EAAE,EAAE;AAClD,cAAQ,OAAO,EAAE;AACjB,UAAI;AACF,cAAM,MAAM,MAAM,EAAE,OAAO,KAAK,WAAW,EAAE,IAAI,OAAO,GAAG,GAAG,IAAI;AAAA,MACpE,UAAE;AACA,YAAI,OAAO,QAAS,OAAM,QAAQ,EAAE,KAAK,WAAW,OAAO,OAAO;AAAA,MACpE;AAAA,IACF;AAAA,IACA,OAAO,OAAO,SAAS,KAAM,MAAM,KAAK,SAAS,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;AAAA,IACpE,OAAO,OAAO,SAAS,KAAM,MAAM,KAAK,SAAS,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;AAAA,IACpE,QAAQ,OAAO,SAAS,KAAM,MAAM,KAAK,UAAU,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;AAAA,IACtE,QAAQ,OAAO,MAAM,OAAO,KAAM,MAAM,KAAK,UAAU,EAAE,MAAM,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;AAAA,IACvF,SAAS,OAAO,QAAQ,SAAS,KAAM,MAAM,KAAK,WAAW,EAAE,QAAQ,MAAM,IAAI,IAAI,EAAE,CAAC;AAAA,IACxF,UAAU,OAAO,UACd,MAAM,KAAyB,YAAY,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,GAAG;AAAA,IACpE,MAAM,QAAQ,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG;AACvC,UAAI,SAAS,UAAa,CAAC,QAAQ,EAAE,aAAa,OAAQ,OAAM,OAAO,UAAU,MAAM,IAAI;AAAA,eAClF,SAAS,OAAW,UAAS,EAAE,GAAG,QAAQ,KAAK;AACxD,UAAI,OAAO,KAAK,MAAM,EAAE,SAAS,EAAG,OAAM,KAAK,WAAW,EAAE,MAAM,IAAI,IAAI,GAAG,GAAG,OAAO,CAAC;AAAA,IAC1F;AAAA,IACA,QAAQ,MAAM,KAAmB,QAAQ;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,IAAM,OAAkB,EAAE,OAAO,OAAO,QAAQ,OAAO,UAAU,OAAO,WAAW,MAAM;AAEzF,eAAe,OAAO,GAAuB,MAAc,MAA6B;AACtF,QAAM,OAAO,MAAM,EAAE,QAAQ,IAAI,GAAG;AACpC,MAAI,SAAS,IAAK;AAClB,QAAM,OAAqB,CAAC;AAC5B,MAAI,OAAO,OAAO,OAAO,GAAG;AAC1B,UAAMK,MAAK,MAAM,EAAE,KAAK,MAAM,IAAI;AAClC,QAAI;AACF,eAAS,KAAK,GAAG,KAAK,QAAQ;AAC5B,cAAM,QAAQ,MAAM,EAAE,KAAKA,KAAI,IAAI,OAAO,EAAE;AAC5C,YAAI,MAAM,WAAW,EAAG;AACxB,aAAK,KAAK,KAAK;AACf,cAAM,MAAM;AAAA,MACd;AAAA,IACF,UAAE;AACA,YAAM,EAAE,QAAQA,GAAE;AAAA,IACpB;AAAA,EACF;AACA,QAAM,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,GAAG,MAAM,OAAO,MAAM,UAAU,OAAO,IAAI,CAAC;AAC5E,MAAI;AACF,QAAI,OAAO,IAAK,OAAM,EAAE,MAAM,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC;AAC7D,QAAI,KAAK;AACT,eAAW,SAAS,MAAM;AACxB,YAAM,EAAE,MAAM,IAAI,IAAI,KAAK;AAC3B,YAAM,MAAM;AAAA,IACd;AAAA,EACF,UAAE;AACA,UAAM,EAAE,QAAQ,EAAE;AAAA,EACpB;AACF;AAYA,SAAS,MAAM,IAAY,QAAoC;AAC7D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAMH,QAAO,MAAM;AACjB,mBAAa,KAAK;AAClB,aAAO,oBAAoB,SAASA,KAAI;AACxC,cAAQ;AAAA,IACV;AACA,UAAM,QAAQ,WAAWA,OAAM,EAAE;AACjC,WAAO,iBAAiB,SAASA,KAAI;AAAA,EACvC,CAAC;AACH;AAOO,SAAS,aAAa,MAAiB,QAA+B;AAC3E,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,CAAC,OAAO,IAAI,IAAI,KAAK,aAAa,CAAC,KAAM,GAAM;AACrD,QAAMI,SAAQ,QAAQ,cAAoB;AAC1C,QAAM,SAAS,WAAWA,OAAM,SAAS,KAAK,aAAa,IAAM;AACjE,QAAM,QAAQ,MAAM,aAAa,MAAM;AACvC,OAAKA,OAAM,QAAQ,KAAK,KAAK;AAC7B,SAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACtD,MAAIC,QAAO;AACX,MAAI,KAAK;AACT,MAAI;AACJ,iBAAe,UAA4B;AACzC,UAAMC,WAAU,IAAI,gBAAgB;AACpC,cAAUA;AACV,UAAM,OAAO,MAAMA,SAAQ,MAAM;AACjC,WAAO,iBAAiB,SAAS,IAAI;AACrC,QAAI;AACJ,UAAM,QAAQ,MAAM;AAClB,mBAAa,KAAK;AAClB,cAAQ,WAAW,MAAM,SAAS;AAAA,IACpC;AACA,QAAIL,UAAS;AACb,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,YAAM;AACN,YAAM,OAAO;AAAA,QACXK,SAAQ;AAAA,QACR,CAAC,UAAU;AACT,gBAAM;AACN,cAAI,CAAC,MAAM,KAAM,MAAK,MAAM,KAAK;AAAA,QACnC;AAAA,QACA,MAAM;AACJ,gBAAM;AACN,UAAAL,UAAS;AACT,eAAK;AACL,eAAK,GAAG,MAAM;AACd,UAAAG,OAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AACA,aAAOH;AAAA,IACT,QAAQ;AACN,aAAOA;AAAA,IACT,UAAE;AACA,mBAAa,KAAK;AAClB,aAAO,oBAAoB,SAAS,IAAI;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,YAAY;AAChB,WAAO,CAAC,OAAO,SAAS;AACtB,YAAM,QAAQ,KAAK,IAAI;AACvB,YAAMA,UAAS,MAAM,QAAQ;AAC7B,UAAI,OAAO,QAAS;AACpB,UAAIA,WAAU,KAAK,IAAI,IAAI,SAAS,OAAO;AACzC,QAAAI,QAAO;AACP;AAAA,MACF;AACA,UAAI,CAACJ,WAAU,IAAI;AACjB,aAAK;AACL,aAAK,KAAK;AAAA,MACZ;AACA,MAAAG,OAAM,QAAQ;AACd,YAAM,MAAMC,OAAM,MAAM;AACxB,MAAAA,QAAO,KAAK,IAAIA,QAAO,GAAG,IAAI;AAAA,IAChC;AAAA,EACF,GAAG;AACH,SAAO,EAAE,OAAOD,OAAM,SAAS,MAAM,MAAM,SAAS,MAAM,EAAE;AAC9D;AAEO,SAAS,aAAa,OAAqC;AAChE,SAAO,MAAM,SAAS;AACxB;AAQA,eAAsB,WACpB,MACA,MACAP,QACA,SAAuB,CAAC,GACD;AACvB,QAAMU,YAAW,KAAK,SAAS,OAAO;AACtC,QAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAC5C,QAAM,OAAO;AAAA,IACX,OAAO,QAAQ,YAAY,GAAG;AAAA,IAC9B,MAAM,SAAS,KAAK;AAAA,EACtB;AACA,QAAM,OAAO,IAAI,gBAAgB;AACjC,QAAM,QAAQ,MAAM,KAAK,KAAK,QAAQ,EAAE,UAAAA,UAAS,CAAC;AAClD,MAAI;AACJ,QAAM,WAAW,eAAe,MAAM,MAAsB;AAC5D,QAAMC,UAAS,MAAO,QAAQ,aAAa,WAAW,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;AACjF,QAAM,SAAS;AAAA,IACb;AAAA,IACA,EAAE,GAAG,KAAK,UAAU,OAAOA,QAAO;AAAA,IAClC;AAAA,MACE,UAAU;AAAA,MACV,OAAO;AAAA,MACP,cAAc;AAAA,MACd,OAAO;AAAA,MACP,GAAID,YAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,IACvC;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IACf;AAAA,MACE,SAAS,YAAY,IAAI,aAAa,MAAM,MAAM,GAAG,OAAOV,MAAK;AAAA,MACjE,GAAG,QAAQ;AACT,iBAAS;AACT,aAAK,OAAO,QAAQ,QAAQ;AAC5B,eAAO,WAAW,IAAI;AAAA,MACxB;AAAA,MACA,OAAO,CAAC,UAAU,OAAO,WAAW,aAAa,KAAK,CAAC;AAAA,MACvD,OAAO;AACL,aAAK,MAAM;AACX,eAAO,WAAW,IAAI;AAAA,MACxB;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,KAAK;AAAA,EACP;AACA,QAAM,SAAS;AACf,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,KAAK;AAAA,IACd,UAAU;AACR,WAAK,MAAM;AACX,YAAM,MAAM;AACZ,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AACF;;;AC3cO,SAAS,cAA0B;AACxC,QAAM,UAAU,oBAAI,IAA0B;AAC9C,SAAO;AAAA,IACL,KAAK,OAAO,OAAO,QAAQ,IAAI,EAAE;AAAA,IACjC,KAAK,OAAO,IAAI,WAAW,KAAK,QAAQ,IAAI,IAAI,MAAM;AAAA,EACxD;AACF;;;ACfO,IAAMY,SAAQ,OAAO;AAErB,IAAM,eAAN,MAAmB;AAAA,EAChB,SAAwC,CAAC;AAAA,EACjD,OAAO;AAAA,EAEP,KAAK,QAAgBC,SAA4B;AAC/C,UAAM,MAAM,KAAK,IAAI,KAAK,MAAM,SAASA,OAAM;AAC/C,QAAI,OAAO,OAAQ,QAAO,IAAI,WAAW,CAAC;AAC1C,UAAM,MAAM,IAAI,WAAW,MAAM,MAAM;AACvC,aAAS,KAAK,QAAQ,KAAK,OAAO;AAChC,YAAM,QAAQ,KAAK,MAAM,KAAKD,MAAK;AACnC,YAAM,OAAO,KAAK,QAAQA;AAC1B,YAAM,IAAI,KAAK,IAAIA,SAAQ,MAAM,MAAM,EAAE;AACzC,YAAME,SAAQ,KAAK,OAAO,KAAK;AAC/B,UAAIA,OAAO,KAAI,IAAIA,OAAM,SAAS,MAAM,KAAK,IAAI,OAAO,GAAGA,OAAM,MAAM,CAAC,GAAG,KAAK,MAAM;AACtF,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAgB,OAAmB,QAAQ,OAAa;AAC5D,UAAM,QAAQ,SAAS,MAAM,eAAe,KAAK,MAAM,eAAe,MAAM,OAAO;AACnF,aAASC,QAAO,GAAGA,QAAO,MAAM,UAAU;AACxC,YAAM,KAAK,SAASA;AACpB,YAAM,QAAQ,KAAK,MAAM,KAAKH,MAAK;AACnC,YAAM,OAAO,KAAK,QAAQA;AAC1B,YAAM,IAAI,KAAK,IAAIA,SAAQ,MAAM,MAAM,SAASG,KAAI;AACpD,UAAI,SAAS,MAAMH,UAAS,MAAM,WAAWA,OAAO,MAAK,OAAO,KAAK,IAAI;AAAA,UACpE,MAAK,KAAK,OAAO,OAAO,CAAC,EAAE,IAAI,MAAM,SAASG,OAAMA,QAAO,CAAC,GAAG,IAAI;AACxE,MAAAA,SAAQ;AAAA,IACV;AACA,SAAK,OAAO,KAAK,IAAI,KAAK,MAAM,SAAS,MAAM,MAAM;AAAA,EACvD;AAAA,EAEA,SAAS,MAAoB;AAC3B,QAAI,OAAO,KAAK,MAAM;AACpB,YAAM,OAAO,KAAK,KAAK,OAAOH,MAAK;AACnC,WAAK,OAAO,SAAS,KAAK,IAAI,KAAK,OAAO,QAAQ,IAAI;AACtD,YAAM,OAAO,KAAK,OAAO,OAAO,CAAC;AACjC,YAAM,OAAO,QAAQ,OAAO,KAAKA;AACjC,UAAI,QAAQ,OAAO,KAAK,OAAQ,MAAK,KAAK,GAAG,IAAI;AAAA,IACnD;AACA,SAAK,OAAO;AAAA,EACd;AAAA,EAEQ,KAAK,OAAe,MAA0B;AACpD,UAAME,SAAQ,KAAK,OAAO,KAAK;AAC/B,QAAIA,UAASA,OAAM,UAAU,KAAM,QAAOA;AAC1C,UAAM,QAAQ,IAAI,WAAW,KAAK,IAAIF,QAAO,KAAK,IAAI,OAAOE,QAAO,UAAU,KAAK,CAAC,CAAC,CAAC;AACtF,QAAIA,OAAO,OAAM,IAAIA,MAAK;AAC1B,SAAK,OAAO,KAAK,IAAI;AACrB,WAAO;AAAA,EACT;AACF;;;ACnCO,SAAS,QAA4B;AAC1C,MAAI,SAAS;AACb,QAAM,OAAO,CAAC,MAAoB,UAAwB;AAAA,IACxD;AAAA,IACA,KAAK,EAAE;AAAA,IACP;AAAA,IACA,OAAO,KAAK,IAAI;AAAA,IAChB,MAAM,IAAI,aAAa;AAAA,IACvB,QAAQ;AAAA,IACR,UAAU,oBAAI,IAAI;AAAA,EACpB;AACA,QAAM,OAAO,KAAK,aAAa,KAAO;AACtC,QAAM,UAAU,oBAAI,IAAoB;AACxC,MAAI,SAAS;AAEb,QAAM,QAAQ,CAAC,SAAiB,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC9D,WAAS,KAAK,MAAoB;AAChC,QAAI,OAAO;AACX,eAAWE,SAAQ,MAAM,IAAI,GAAG;AAC9B,UAAI,KAAK,SAAS,YAAa,OAAMC,SAAQ,WAAW,IAAI;AAC5D,YAAMC,QAAO,KAAK,SAAS,IAAIF,KAAI;AACnC,UAAI,CAACE,MAAM,OAAMD,SAAQ,UAAU,IAAI;AACvC,aAAOC;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,WAAS,OAAO,MAA2C;AACzD,UAAM,QAAQ,MAAM,IAAI;AACxB,UAAMF,QAAO,MAAM,IAAI;AACvB,QAAIA,UAAS,OAAW,OAAMC,SAAQ,SAAS,qBAAqB;AACpE,UAAM,MAAM,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE;AACtC,QAAI,IAAI,SAAS,YAAa,OAAMA,SAAQ,WAAW,IAAI;AAC3D,WAAO,EAAE,KAAK,MAAAD,MAAK;AAAA,EACrB;AACA,QAAM,OAAO,CAAC,UAA4B;AAAA,IACxC,MAAM,KAAK;AAAA,IACX,MACE,KAAK,SAAS,SAAS,KAAK,KAAK,OAAO,KAAK,SAAS,YAAY,KAAK,OAAO,SAAS;AAAA,IACzF,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,EACZ;AACA,QAAM,SAAS,CAAC,OAAuB;AACrC,UAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,QAAI,CAAC,MAAO,OAAMC,SAAQ,SAAS,UAAU,EAAE,EAAE;AACjD,WAAO;AAAA,EACT;AACA,WAASE,QAAO,MAAc,OAAwB;AACpD,UAAM,EAAE,KAAK,MAAAH,MAAK,IAAI,OAAO,IAAI;AACjC,UAAM,WAAW,IAAI,SAAS,IAAIA,KAAI;AACtC,QAAI,YAAY,MAAM,UAAW,OAAMC,SAAQ,UAAU,IAAI;AAC7D,QAAI,UAAU,SAAS,eAAe,MAAM,MAAO,OAAMA,SAAQ,UAAU,IAAI;AAC/E,QAAI,SAAU,QAAO;AACrB,QAAI,CAAC,MAAM,OAAQ,OAAMA,SAAQ,UAAU,IAAI;AAC/C,UAAM,OAAO,KAAK,QAAQ,KAAQ;AAClC,QAAI,SAAS,IAAID,OAAM,IAAI;AAC3B,QAAI,QAAQ,KAAK,IAAI;AACrB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,QAAQ,MAAM;AAClB,aAAO,KAAK,KAAK,IAAI,CAAC;AAAA,IACxB;AAAA,IACA,MAAM,QAAQ,MAAM;AAClB,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,IAAI,SAAS,YAAa,OAAMC,SAAQ,WAAW,IAAI;AAC3D,aAAO,CAAC,GAAG,IAAI,QAAQ,EAAE;AAAA,QACvB,CAAC,CAACD,OAAM,IAAI,OAAoB,EAAE,MAAAA,OAAM,MAAM,KAAK,MAAM,MAAM,KAAK,IAAI,EAAE;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,MAAM,KAAK,MAAM,OAAO;AACtB,YAAM,OAAOG,QAAO,MAAM,KAAK;AAC/B,UAAI,MAAM,YAAY,KAAK,SAAS,QAAQ;AAC1C,aAAK,KAAK,SAAS,CAAC;AACpB,aAAK,QAAQ,KAAK,IAAI;AAAA,MACxB;AACA,cAAQ,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC;AAClD,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,IAAI,QAAQ,MAAM;AAC3B,aAAO,OAAO,EAAE,EAAE,KAAK,KAAK,KAAK,QAAQ,IAAI;AAAA,IAC/C;AAAA,IACA,MAAM,MAAM,IAAI,QAAQ,OAAO;AAC7B,YAAM,IAAI,OAAO,EAAE;AACnB,UAAI,CAAC,EAAE,MAAO,OAAMF,SAAQ,SAAS,UAAU,EAAE,eAAe;AAChE,QAAE,KAAK,KAAK,MAAM,QAAQ,OAAO,IAAI;AACrC,QAAE,KAAK,QAAQ,KAAK,IAAI;AAAA,IAC1B;AAAA,IACA,MAAM,QAAQ,IAAI;AAChB,aAAO,EAAE;AACT,cAAQ,OAAO,EAAE;AAAA,IACnB;AAAA,IACA,MAAM,MAAM,MAAM;AAChB,YAAM,EAAE,KAAK,MAAAD,MAAK,IAAI,OAAO,IAAI;AACjC,UAAI,IAAI,SAAS,IAAIA,KAAI,EAAG,OAAMC,SAAQ,UAAU,IAAI;AACxD,UAAI,SAAS,IAAID,OAAM,KAAK,aAAa,KAAO,CAAC;AACjD,UAAI,QAAQ,KAAK,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,MAAM,MAAM;AAChB,YAAM,EAAE,KAAK,MAAAA,MAAK,IAAI,OAAO,IAAI;AACjC,YAAM,OAAO,IAAI,SAAS,IAAIA,KAAI;AAClC,UAAI,CAAC,KAAM,OAAMC,SAAQ,UAAU,IAAI;AACvC,UAAI,KAAK,SAAS,YAAa,OAAMA,SAAQ,WAAW,IAAI;AAC5D,UAAI,KAAK,SAAS,OAAO,EAAG,OAAMA,SAAQ,aAAa,IAAI;AAC3D,UAAI,SAAS,OAAOD,KAAI;AACxB,UAAI,QAAQ,KAAK,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,MAAM;AACjB,YAAM,EAAE,KAAK,MAAAA,MAAK,IAAI,OAAO,IAAI;AACjC,YAAM,OAAO,IAAI,SAAS,IAAIA,KAAI;AAClC,UAAI,CAAC,KAAM,OAAMC,SAAQ,UAAU,IAAI;AACvC,UAAI,KAAK,SAAS,YAAa,OAAMA,SAAQ,UAAU,IAAI;AAC3D,UAAI,SAAS,OAAOD,KAAI;AACxB,UAAI,QAAQ,KAAK,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,MAAM,IAAI;AACrB,YAAM,IAAI,IAAI,MAAM,IAAI,EAAE,KAAK,GAAG,CAAC;AACnC,YAAM,IAAI,IAAI,MAAM,EAAE,EAAE,KAAK,GAAG,CAAC;AACjC,UAAI,MAAM,KAAK,EAAE,WAAW,GAAG,CAAC,GAAG,EAAG,OAAMC,SAAQ,UAAU,GAAG,EAAE,cAAc,IAAI,EAAE;AACvF,YAAM,SAAS,OAAO,IAAI;AAC1B,YAAM,OAAO,OAAO,IAAI,SAAS,IAAI,OAAO,IAAI;AAChD,UAAI,CAAC,KAAM,OAAMA,SAAQ,UAAU,IAAI;AACvC,YAAM,SAAS,OAAO,EAAE;AACxB,YAAM,WAAW,OAAO,IAAI,SAAS,IAAI,OAAO,IAAI;AACpD,UAAI,aAAa,KAAM;AACvB,UACE,UAAU,SAAS,gBAClB,KAAK,SAAS,eAAe,SAAS,SAAS,OAAO,IACvD;AACA,cAAMA,SAAQ,KAAK,SAAS,cAAc,cAAc,UAAU,EAAE;AAAA,MACtE;AACA,aAAO,IAAI,SAAS,OAAO,OAAO,IAAI;AACtC,aAAO,IAAI,SAAS,IAAI,OAAO,MAAM,IAAI;AACzC,aAAO,IAAI,QAAQ,KAAK,IAAI;AAC5B,aAAO,IAAI,QAAQ,OAAO,IAAI;AAAA,IAChC;AAAA,IACA,MAAM,QAAQ,QAAQ,MAAM;AAC1B,YAAM,EAAE,KAAK,MAAAD,MAAK,IAAI,OAAO,IAAI;AACjC,UAAI,IAAI,SAAS,IAAIA,KAAI,EAAG,OAAMC,SAAQ,UAAU,IAAI;AACxD,YAAM,OAAO,KAAK,WAAW,KAAQ;AACrC,WAAK,SAAS;AACd,UAAI,SAAS,IAAID,OAAM,IAAI;AAC3B,UAAI,QAAQ,KAAK,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,SAAS,MAAM;AACnB,YAAM,OAAO,KAAK,IAAI;AACtB,UAAI,KAAK,SAAS,UAAW,OAAMC,SAAQ,UAAU,IAAI;AACzD,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,QAAQ,MAAM,QAAQ;AAC1B,YAAM,OAAO,KAAK,IAAI;AACtB,UAAI,OAAO,SAAS,OAAW,MAAK,OAAQ,KAAK,OAAO,CAAC,OAAW,OAAO,OAAO;AAClF,UAAI,OAAO,SAAS,QAAW;AAC7B,YAAI,KAAK,SAAS;AAChB,gBAAMA,SAAQ,KAAK,SAAS,cAAc,WAAW,UAAU,IAAI;AACrE,aAAK,KAAK,SAAS,OAAO,IAAI;AAC9B,aAAK,QAAQ,KAAK,IAAI;AAAA,MACxB;AACA,UAAI,OAAO,UAAU,OAAW,MAAK,QAAQ,OAAO;AAAA,IACtD;AAAA,IACA,MAAM,SAAS;AACb,aAAO,EAAE,OAAO,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,IACtD;AAAA,EACF;AACF;;;AChLO,SAAS,eAAe,OAA+C;AAC5E,MAAI,KAAK;AACT,QAAM,MAAM,MAAc;AACxB,QAAI,SAAS;AACb,QAAI,QAAQ;AACZ,eAAS;AACP,YAAM,IAAI,MAAM,IAAI;AACpB,iBAAW,IAAI,QAAS;AACxB,UAAI,EAAE,IAAI,KAAO,QAAO,WAAW;AACnC,eAAS;AAAA,IACX;AAAA,EACF;AACA,QAAMG,QAAO,MAAc;AACzB,UAAM,MAAM,IAAI;AAChB,UAAM,IAAI,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,IAAI,KAAK,GAAG,CAAC;AAC/D,UAAM;AACN,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM;AACnB,UAAM,QAAQ,MAAM,IAAI;AACxB,UAAM,UAAU,IAAI;AACpB,UAAM,UAAU,QAAQ,IAAI,IAAI,IAAI;AACpC,WAAO,EAAE,SAAS,SAAS,SAAS,QAAQ,OAAO,EAAE;AAAA,EACvD;AACA,SAAO,KAAK,MAAM,QAAQ;AACxB,UAAM,KAAK,MAAM,IAAI;AACrB,UAAM,OAAO,IAAI;AACjB,UAAM,MAAM,KAAK;AACjB,QAAI,OAAO,GAAG;AACZ,WAAK;AACL;AAAA,IACF;AACA,UAAM,QAAQ,IAAI;AAClB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,SAASA,MAAK;AACpB,YAAMC,SAAQD,MAAK;AACnB,YAAM,OAAO,MAAM,IAAI;AACvB,UAAI,SAAS,EAAG,KAAI;AAAA,eACX,SAAS,GAAG;AACnB;AACA,eAAO;AAAA,MACT,WAAW,SAAS,GAAG;AACrB,cAAM,IAAI,OAAO;AACjB,eAAO,EAAE,QAAQ,MAAMC,QAAO,GAAG,EAAE;AAAA,MACrC,WAAW,SAAS,EAAG,OAAM;AAAA,eACpB,SAAS,GAAG;AACnB;AACA,YAAI;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,sBAA2C,oBAAI,IAAI;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMD,IAAM,UAAmD;AAAA,EACvD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,SAAS,SAAS,SAAkC;AAClD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAQ,QAAQ,WAAW,KAAK,QAAQ,QAAQ,CAAC,CAAC,KAAM;AAC1D;AAEA,IAAM,SAAN,MAAa;AAAA,EACX,KAAK;AAAA,EACI;AAAA,EAET,YAAY,OAAmB;AAC7B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,MAAM,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAc;AACZ,QAAI,SAAS;AACb,QAAI,QAAQ;AACZ,eAAS;AACP,YAAM,IAAI,KAAK,KAAK;AACpB,iBAAW,IAAI,QAAS;AACxB,UAAI,EAAE,IAAI,KAAO,QAAO,WAAW;AACnC,eAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAe;AACb,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,IAAI,IAAI,YAAY,EAAE,OAAO,KAAK,MAAM,SAAS,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC;AAC9E,SAAK,MAAM;AACX,WAAO;AAAA,EACT;AAAA,EAEA,UAAkB;AAChB,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,SAAS,MAAQ,SAAS,IAAM,MAAK,IAAI;AAC7C,WAAO;AAAA,EACT;AAAA,EAEA,SAAe;AACb,UAAM,QAAQ,KAAK,KAAK;AACxB,SAAK,IAAI;AACT,QAAI,QAAQ,EAAG,MAAK,IAAI;AAAA,EAC1B;AACF;AAEA,SAAS,UAAU,GAAwC;AACzD,QAAM,QAAyB,CAAC;AAChC,WAAS,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK;AAChC,QAAI,EAAE,KAAK,MAAM,GAAM,QAAO;AAC9B,aAAS,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAK,GAAE,QAAQ;AAC5C,UAAM,UAAoB,CAAC;AAC3B,aAAS,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAK,SAAQ,KAAK,EAAE,QAAQ,CAAC;AAC1D,UAAM,KAAK,SAAS,OAAO,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,WAAW,GAAW,MAAoB;AACjD,MAAI,SAAS,GAAG;AACd,MAAE,QAAQ;AACV,MAAE,OAAO;AAAA,EACX,WAAW,SAAS,EAAG,GAAE,OAAO;AAAA,WACvB,SAAS,GAAG;AACnB,MAAE,QAAQ;AACV,MAAE,KAAK;AAAA,EACT,OAAO;AACL,MAAE,KAAK;AACP,MAAE,IAAI;AAAA,EACR;AACF;AAEA,SAAS,YAAY,GAAW,OAAwC;AACtE,QAAM,UAA0B,CAAC;AACjC,WAAS,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK;AAChC,UAAM,SAAS,EAAE,KAAK;AACtB,UAAMA,SAAQ,EAAE,KAAK;AACrB,UAAM,OAAO,EAAE,KAAK;AACpB,QAAI,SAAS,EAAG,YAAW,GAAG,IAAI;AAAA,SAC7B;AACH,YAAM,OAAO,MAAM,EAAE,IAAI,CAAC,KAAK;AAC/B,UAAI,CAAC,oBAAoB,IAAI,MAAM,EAAG,EAAC,QAAQ,MAAM,MAAM,CAAC,GAAGA,MAAK,IAAI;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAA+C;AAC5E,QAAM,IAAI,IAAI,OAAO,KAAK;AAC1B,MAAI,QAAqC,CAAC;AAC1C,SAAO,EAAE,KAAK,MAAM,QAAQ;AAC1B,UAAM,KAAK,EAAE,KAAK;AAClB,UAAM,MAAM,EAAE,IAAI,IAAI,EAAE;AACxB,QAAI,OAAO,EAAG,SAAQ,UAAU,CAAC;AACjC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,OAAO,EAAG,QAAO,YAAY,GAAG,KAAK;AACzC,MAAE,KAAK;AAAA,EACT;AACA,SAAO,CAAC;AACV;;;ACxKO,IAAM,YAAY;AAmMzB,IAAMC,WAAU;AAChB,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,aAAa,CAAC,GAAM,IAAM,KAAM,GAAI;AAC1C,IAAM,cAAc;AACpB,IAAM,mBAAmB;AACzB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,cAAc,CAAC,QAAQ,OAAO;AACpC,IAAMC,WAAU,IAAI,YAAY;AAEhC,SAAS,SAAS,MAAsB;AACtC,SAAO,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AAC7C;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,UAAU,GAAG,IAAI;AACrE;AAEA,SAAS,OAAO,OAA4B;AAC1C,SAAO,WAAW,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;AAClD;AAEA,SAAS,QAAQ,MAAwC;AACvD,MAAI,KAAK,CAAC,MAAM,MAAQ,KAAK,CAAC,MAAM,GAAM,QAAO;AACjD,SAAO,IAAI,YAAY,EACpB,OAAO,KAAK,SAAS,GAAG,WAAW,CAAC,EACpC,MAAM,CAAC,EACP,MAAM,IAAI,EAAE,CAAC,EACb,KAAK,EACL,MAAM,QAAQ;AACnB;AAEA,SAAS,YAAY,MAA0B;AAC7C,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,SAAS,MAAM,CAAC,CAAC,MAAM,MAAO,OAAM,MAAM;AAC9C,MAAI,MAAM,CAAC,MAAM,KAAM,OAAM,MAAM;AACnC,SAAO,SAAS,MAAM,CAAC,KAAK,EAAE;AAChC;AAEO,SAAS,eACd,UACA,KACwB;AACxB,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,CAAC,CAAC,GAAG;AACzD,QAAIC,WAAU;AACd,UAAM,WAAW,MAAM,QAAQ,eAAe,CAAC,GAAGC,UAAiB;AACjE,YAAMC,OAAM,OAAO,OAAO,KAAKD,KAAI,IAAI,IAAIA,KAAI,IAAI;AACnD,UAAIC,SAAQ,OAAW,CAAAF,WAAU;AACjC,aAAOE,QAAO;AAAA,IAChB,CAAC;AACD,QAAI,CAACF,SAAS,KAAI,GAAG,IAAI;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,SAAS,SAA0B;AAC1C,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,GAAI,QAAQ,OAAO,EAAE,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC/C,GAAI,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,IAC1C,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,cAAc,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,cAAc,QAAgB,SAAsC;AAC3E,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK,EAAE,GAAG,OAAO,KAAK,GAAG,QAAQ,IAAI;AAAA,IACrC,OAAO;AAAA,MACL,IAAI,OAAO,SAAS,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,OAAO,QAAQ,OAAO,CAAC,GAAG,GAAG,CAAC;AAAA,MAC9E,GAAI,QAAQ,SAAS,CAAC;AAAA,IACxB;AAAA,EACF;AACF;AAEA,SAAS,YAAY,QAAwC;AAC3D,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,IAChB,SAAS,CAAC,aAAa,OAAO,QAAQ,QAAQ;AAAA,EAChD;AACF;AAEA,SAASG,QAAOC,SAAkC;AAChD,QAAM,MAAM,IAAI,WAAWA,QAAO,OAAO,CAAC,GAAGC,WAAU,IAAIA,OAAM,QAAQ,CAAC,CAAC;AAC3E,MAAI,SAAS;AACb,aAAWA,UAASD,SAAQ;AAC1B,QAAI,IAAIC,QAAO,MAAM;AACrB,cAAUA,OAAM;AAAA,EAClB;AACA,SAAO;AACT;AAEO,IAAM,WAAN,MAAe;AAAA,EACX;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACS,SAAS,oBAAI,IAAY;AAAA,EACzB,WAAW,oBAAI,IAA+B;AAAA,EAC9C,YAAY,oBAAI,IAA+B;AAAA,EAC/C,UAAU,oBAAI,IAAY;AAAA,EAC1B,UAAU,oBAAI,IAAY;AAAA,EAC1B,YAAY,oBAAI,IAA2D;AAAA,EAC3E,OAAO,IAAI,SAAS;AAAA,EACpB,QAAQ,IAAI,UAAU;AAAA,EACtB,WAAW,IAAI,iBAAiB,CAAC,QAAQ,KAAK,KAAK,OAAO,GAAG,CAAC;AAAA,EAC9D,OAAO,IAAI;AAAA,IAC1B,CAAC,KAAK,QAAQ,KAAK,UAAU,KAAK,GAAG,KAAK,MAAM,KAAK,KAAK,sBAAsB,KAAK,GAAG,CAAC;AAAA,IACzF,CAAC,QAAQ,KAAK,SAAS,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,EAC5D;AAAA,EACS,MAAM,IAAI,YAAY;AAAA,EACtB;AAAA,EACQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,IAAI,WAAW;AAAA,EAClB;AAAA,EACR;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,oBAAI,IAAuB;AAAA,EACvC;AAAA,EACA;AAAA,EACA,WAAW,oBAAI,IAA0B;AAAA,EACzC,YAAY,oBAAI,IAAc;AAAA,EAC9B,WAAW,oBAAI,IAA8C;AAAA,EACrE,aAAa,EAAE,OAAO,GAAG,UAAU,EAAE;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,OAAO,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,EAChD;AAAA,EACA,UAAU,IAAI,gBAAgB;AAAA,EAC/C,QAAgC,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC1C,UAAU;AAAA,EACT,OAAO,KAAK,IAAI;AAAA,EACjB,YAAY;AAAA,EAEpB,YAAY,SAA0B;AACpC,SAAK,SAAS,IAAI,WAAW;AAAA,MAC3B,MAAM,CAAC,MAAM,SAAS,KAAK,OAAO,MAAM,IAAI;AAAA,MAC5C,MAAM,CAAC,WACL,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK,CAAC,UAAU,MAAM,MAAM,MAAM,CAAC,KAAK,UAAU,KAAK,MAAM,MAAM;AAAA,MACzF,SAAS,KAAK,SAAS,QAAQ,KAAK,KAAK,QAAQ;AAAA,IACnD,CAAC;AACD,SAAK,OAAO,KAAK,SAAS,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE,CAAC;AAC3D,SAAK,eAAe,QAAQ;AAC5B,SAAK,qBAAqB,QAAQ;AAClC,SAAK,QAAQ,QAAQ,SAAS,YAAY;AAC1C,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,SAAS;AACd,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,WAAW,QAAQ,KAAK,aAAa;AAC1C,SAAK,aAAa,QAAQ,WAAW;AACrC,SAAK,MAAM,IAAI,SAAS,QAAQ,GAAG;AACnC,UAAM,WAAW,QAAQ,YAAY;AACrC,QAAI,CAAC,WAAW,QAAQ,EAAG,OAAM,IAAI,MAAM,oBAAoB,OAAO,QAAQ,CAAC,EAAE;AACjF,SAAK,WAAW;AAChB,SAAK,MAAM,EAAE,GAAG,WAAW,QAAQ,GAAG,eAAe,KAAK,IAAI,KAAK,GAAG,QAAQ,IAAI;AAClF,SAAK,KAAK,SAAS,QAAQ,WAAW,cAAc,CAAC;AACrD,SAAK,YAAY,QAAQ,aAAa,iBAAiB;AACvD,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,IAAI,OAAO,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAC7D,QAAI,QAAQ,QAAQ,OAAQ,MAAK,OAAO,IAAI,QAAQ,OAAO,MAAM;AACjE,SAAK,WAAW,IAAI,SAAS,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS,CAAC;AACtF,QAAI,QAAQ,OAAQ,MAAK,IAAI,UAAU,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,KAAK,OAAO,CAAC;AACtF,kBAAc,KAAK,KAAK;AAAA,MACtB,WAAW,KAAK;AAAA,MAChB,QAAQ,gBAAgB,iBAAiB,QAAQ,IAAI,KAAK,UAAU,CAAC;AAAA,MACrE,IAAI,KAAK;AAAA,IACX,CAAC;AACD,cAAU,KAAK,KAAK,KAAK,GAAG;AAC5B,UAAM,KAAK,gBAAgB,KAAK,MAAM,YAAY,IAAI,KAAK,MAAM,KAAK,SAAS,GAAG,KAAK,CAAC,CAAC;AACzF,SAAK,QAAQ,IAAI,SAAS,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC;AAC3D,SAAK,MAAM,cAAc;AACzB,SAAK,UAAU,IAAI,KAAK,KAAK;AAC7B,UAAM,UAAU,CAAC,KAAK,MAAM,CAAC,KAAK,KAAK,CAAC;AACxC,SAAK,WAAW,IAAI;AAAA,MAClB;AAAA,MACA,EAAE,CAAC,OAAO,QAAQ,GAAG,MAAM,QAAQ,QAAQ,CAACH,SAAQ,CAAC,GAAGA,IAAG,CAAC,EAAE,OAAO,EAAE;AAAA,MACvE,CAAC,SAAS,KAAK,UAAU,IAAI;AAAA,MAC7B;AAAA,QACE,OAAO,SAAS;AAAA,QAChB,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK,CAAC,UAAU,MAAM,MAAM,IAAI,CAAC;AAAA,QACrE,OAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AACA,SAAK,KAAK,KAAK,SAAS,KAAK,YAAY,IAAI,KAAK,KAAK,CAAC;AACxD,SAAK,KAAK,SAAS,MAAM,GAAG;AAC5B,SAAK,SAAS,MAAM,CAAC,KAAK,YAAY,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,GAAG,MAAM;AAC/E,WAAK,UAAU;AACf,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,OAAyB;AACjC,SAAK,OAAO,IAAI,KAAK;AAAA,EACvB;AAAA,EAEA,WAA0C;AACxC,SAAK,YAAY,KAAK,MAAM,EAAE,KAAK,CAAC,UAAU,aAAa,KAAK,MAAM,KAAK,CAAC;AAC5E,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,eAA6C;AACnD,SAAK,YAAY,KAAK,MAAM,EAAE;AAAA,MAAK,CAAC,UAClC,YAAY,KAAK,MAAM,OAAO,CAACI,aAAY;AACzC,YAAI,KAAK,OAAO,IAAIA,QAAO,EAAG;AAC9B,aAAK,OAAO,IAAIA,QAAO;AACvB,gBAAQ,KAAKA,QAAO;AAAA,MACtB,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,QAA2B;AACvC,WAAO,CAAC,KAAK,YAAY,GAAI,MAAM,gBAAgB,KAAK,MAAM,KAAK,QAAQ,CAAE;AAAA,EAC/E;AAAA,EAEA,MAAM,QAAQ,MAAc,OAAe,KAA0C;AACnF,UAAML,QAAOH,SAAQ,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,SAAY;AAC1E,QAAIG,UAAS,QAAW;AACtB,YAAM,WAAW,MAAM,KAAK,SAAS,GAAG,IAAIA,KAAI;AAChD,aAAO,WAAW,CAAC,QAAQ,SAAS,SAAS,OAAO,IAAI;AAAA,IAC1D;AACA,UAAM,OAAO,KAAK,GAAG,YAAY,KAAK,IAAI;AAC1C,UAAM,OAAO,MAAM,YAAY,KAAK,MAAM,IAAI;AAC9C,UAAM,SAASH,SAAQ,KAAK,IAAI,IAAI,CAAC;AACrC,QAAI,WAAW,QAAW;AACxB,YAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,MAAM,IAAI,OAAO,GAAG;AAC9D,YAAM,SAAS,CAACA,SAAQ,KAAK,IAAI,MAAM,MAAM,KAAK,SAAS,GAAG,IAAI,MAAM,GAAG,cAAc;AACzF,aAAO,UAAU,SAAS,EAAE,GAAG,QAAQ,OAAO,KAAK,IAAI;AAAA,IACzD;AACA,UAAM,OAAO,MAAM,KAAK,KAAK,IAAI;AACjC,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,OAAO,IAAI,GAAG;AAChB,aAAO;AAAA,QACL,KAAK;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,OAAO,SAAS,SAAS,IAAI,EAAE,QAAQ,WAAW,EAAE;AAAA,MACtD;AAAA,IACF;AACA,QAAI,YAAY,IAAI,MAAM,OAAQ,QAAO;AACzC,UAAM,OAAO,WAAW,IAAI;AAC5B,QAAI,CAAE,MAAM,KAAK,KAAK,OAAO,IAAI,EAAI,QAAO;AAC5C,WAAO,EAAE,KAAK,cAAc,MAAM,MAAM,OAAO,SAAS,SAAS,IAAI,EAAE;AAAA,EACzE;AAAA,EAEA,MAAc,KAAK,MAA+C;AAChE,QAAI;AACF,cAAQ,MAAM,KAAK,KAAK,eAAe,IAAI,GAAG,SAAS,GAAG,WAAW;AAAA,IACvE,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,MAA4C;AACtE,UAAMG,QAAOH,SAAQ,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,SAAY;AAC1E,QAAIG,UAAS,OAAW,QAAO;AAC/B,UAAM,WAAW,MAAM,KAAK,SAAS,GAAG,IAAIA,KAAI;AAChD,WAAO,SAAS,SAAS,UAAU;AAAA,EACrC;AAAA,EAEA,MAAc,YACZ,MACA,MACA,KACA,QAAQ,GACsB;AAC9B,UAAM,UAAU,MAAM,KAAK,cAAc,IAAI;AAC7C,UAAM,SAAS,SAAS,UAAU,KAAK,GAAG,YAAY,KAAK,IAAI;AAC/D,UAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,SAAS,OAAO,IAAI,IAAI,SAAY,SAAS,MAAM,KAAK,aAAa,GAAG,MAAM;AACpF,UAAM,QAAQ,QAAQ,IAAI,MAAM,SAAS,CAAC,MAAM,IAAI;AACpD,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,SAAS,MAAM,CAAC,CAAC,MAAM,MAAO,OAAM,MAAM;AAC9C,UAAM,CAAC,QAAQ,GAAGM,KAAI,IAAI;AAC1B,UAAM,MAAMA,MAAK,KAAK,GAAG;AACzB,UAAM,SAAS,CAAC,GAAI,MAAM,CAAC,GAAG,IAAI,CAAC,GAAI,UAAU,SAAS,MAAM,GAAG,KAAK,MAAM,CAAC,CAAC;AAChF,UAAM,QAAQ,SAAS,MAAM,KAAK,QAAQ,QAAQ,QAAQ,GAAG,IAAI;AACjE,QAAI,CAAC,OAAO;AACV,UAAI,CAAC,UAAU,SAAS,oBAAoB,CAAE,MAAM,KAAK,cAAc,MAAM,GAAI;AAC/E,eAAO;AAAA,MACT;AACA,YAAM,QAAQ,MAAM,KAAK,YAAY,QAAQ,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK,QAAQ,CAAC;AAChF,aAAO,SAAS,EAAE,GAAG,OAAO,QAAQ,cAAc,MAAM,QAAQ,OAAO,EAAE;AAAA,IAC3E;AACA,UAAM,SAAS,cAAc,OAAO,OAAO;AAC3C,WAAO,EAAE,QAAQ,MAAM,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,GAAG,MAAM,EAAE;AAAA,EAC/D;AAAA,EAEA,MAAc,KAAK,MAAc,MAAgB,KAA2C;AAC1F,UAAM,SAAS,MAAM,KAAK,QAAQ,MAAM,KAAK,CAAC,KAAK,MAAM,GAAG;AAC5D,QAAI,OAAQ,QAAO,EAAE,QAAQ,QAAQ,MAAM,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE;AACxF,WAAO,KAAK,YAAY,MAAM,MAAM,GAAG;AAAA,EACzC;AAAA,EAEA,MAAc,WAAW,MAAc,KAA4C;AACjF,UAAM,OAAO,KAAK,GAAG,YAAY,KAAK,IAAI;AAC1C,UAAM,OAAO,MAAM,KAAK,KAAK,eAAe,IAAI,EAAE,MAAM,MAAM,IAAI;AAClE,QAAI,CAAC,QAAS,KAAK,CAAC,MAAM,MAAQ,KAAK,CAAC,MAAM,GAAO,QAAO;AAC5D,WAAO,SAAS,MAAM,KAAK,aAAa,GAAG,IAAI,IAAI,WAAW;AAAA,EAChE;AAAA,EAEQ,OAAO,MAAiC;AAC9C,WAAO,KAAK,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,OAAO;AACvC,YAAM,MAAM,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,MAAM,QAAQ,CAAC;AACpD,UAAI,SAAS,KAAK,SAAS,IAAI,GAAG;AAClC,UAAI,CAAC,QAAQ;AACX,iBAAS,KAAK,KAAK,eAAe,IAAI,EAAE,KAAK,OAAO,UAAU;AAC5D,gBAAM,SAAS,eAAe,KAAK;AACnC,gBAAM,UAAU,eAAe,KAAK;AACpC,gBAAM,WAAW,MAAM,YAAY,QAAQ,KAAqB;AAChE,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,YAC3B;AAAA,UACF;AAAA,QACF,CAAC;AACD,aAAK,SAAS,IAAI,KAAK,MAAM;AAC7B,eAAO,MAAM,MAAM,KAAK,SAAS,OAAO,GAAG,CAAC;AAAA,MAC9C;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,MAAM,MAAc,QAAyD;AACzF,QAAI,YAAY,OAAO,eAAe,QAAQ,MAAM,EAAE,SAAS,EAAG,QAAO;AACzE,UAAM,SAAS,GAAG,IAAI;AACtB,QAAI,MAAM,KAAK,KAAK,OAAO,MAAM,EAAG,QAAO;AAC3C,UAAM,OAAO,aAAa,KAAK,IAAI,IAAI,CAAC;AACxC,QAAI,SAAS,OAAW,QAAO;AAC/B,UAAM,WAAW,GAAG,IAAI,SAAS,OAAO,MAAM,KAAK,MAAM,CAAC;AAC1D,WAAQ,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAK,WAAW;AAAA,EACzD;AAAA,EAEA,MAAc,QAAQ,QAAgB,KAA+C;AACnF,QAAI,OAAO,QAAQ,MAAM;AACvB,aAAO,EAAE,KAAK,MAAM,MAAM,MAAM,KAAK,KAAK,SAAS,OAAO,IAAI,GAAG,MAAM,OAAO,KAAK;AAAA,IACrF;AACA,QAAI,OAAO,QAAQ,QAAQ;AACzB,YAAM,CAAC,MAAM,EAAE,QAAAC,QAAO,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC3C,KAAK,KAAK,SAAS,OAAO,IAAI;AAAA,QAC9B,KAAK,OAAO,OAAO,IAAI;AAAA,MACzB,CAAC;AACD,aAAO,EAAE,MAAM,QAAAA,QAAO;AAAA,IACxB;AACA,UAAM,EAAE,QAAQ,QAAQ,QAAQ,IAAI,MAAM,KAAK,OAAO,OAAO,IAAI;AACjE,UAAM,QACJ,IAAI,yBAAyB,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,MAAM,IAAI;AAC7E,UAAM,UAAU,OAAO,UAAU,MAAM,KAAK,KAAK,SAAS,OAAO,OAAO,IAAI;AAC5E,WAAO;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B;AAAA,MACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3C,GAAI,OAAO,cAAc,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAc,OACZ,SACA,KAC4B;AAC5B,UAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,UAAM,MAAM,MAAM,kBAAkB,KAAK,MAAM,IAAI,GAAG;AACtD,UAAM,OAAO,EAAE,GAAG,IAAI,KAAK,UAAU,KAAK,UAAU,IAAI;AACxD,UAAM,MAAM,EAAE,GAAG,eAAe,OAAO,KAAK,IAAI,GAAG,GAAG,IAAI,IAAI;AAC9D,eAAW,OAAO,OAAO,SAAS,CAAC,EAAG,QAAO,IAAI,GAAG;AACpD,QAAI,WAAW,KAAK;AACpB,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,KAAK,QAAQ,QAAQ,GAAG;AAAA,IAC1C,SAAS,KAAK;AACZ,YAAM,IAAI,IAAI,SAAS;AACvB,YAAM;AAAA,IACR;AACA,WAAO,KAAK,MAAM,EAAE,GAAG,KAAK,KAAK,SAAS,OAAO,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,EAC5E;AAAA,EAEA,aAAa,MAAkC;AAC7C,WAAO,KAAK,KAAK,UAAU,IAAI;AAAA,EACjC;AAAA,EAEQ,MAAM,KAAsC;AAClD,QAAI,IAAI,SAAS,UAAa,KAAK,KAAK,UAAU,IAAI,IAAI,MAAM,QAAW;AACzE,YAAM,QAAQ,SAAS,oBAAoB,IAAI,IAAI,EAAE;AAAA,IACvD;AACA,UAAM,MAAM,KAAK;AACjB,UAAM,WAAW,IAAI,IAAI,cAAc;AACvC,UAAM,UAAU,IAAI,WAAW,QAAQ,QAAQ,IAAI;AACnD,UAAM,QAAQ,CAAC,aAAsB;AACnC,WAAK,WAAW;AAChB,UAAI,CAAC,SAAU,MAAK,WAAW;AAAA,IACjC;AACA,QAAI;AACJ,UAAM,SAAS,iBAAiB;AAAA,MAC9B;AAAA,MACA,UAAU,YAAY;AACpB,eAAO,UAAU,QAAQ,KAAK,KAAK;AACnC,eAAO,KAAK,WAAW,GAAG;AAAA,MAC5B;AAAA,MACA,WAAW,CAAC,SAAS;AACnB,aAAK,OAAO,GAAG;AACf,aAAK,SAAS,QAAQ,KAAK,KAAK,EAAE;AAAA,MACpC;AAAA,MACA,GAAI,IAAI,UAAU,EAAE,SAAS,IAAI,QAAQ,IAAI,CAAC;AAAA,MAC9C,GAAI,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,MACtD,SAAS,IAAI;AAAA,MACb,OAAO,IAAI;AAAA,MACX,MAAM,IAAI;AAAA,MACV,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,KAAK,IAAI;AAAA,MACT,IAAI,KAAK;AAAA,MACT,cAAc,KAAK;AAAA,MACnB,SAAS,IAAI;AAAA,MACb,SAAS,KAAK,QAAQ,KAAK,IAAI,MAAM;AAAA,MACrC,QAAQ,KAAK,OAAO,KAAK,GAAG;AAAA,MAC5B,MAAM,CAAC,QAAQ,QAAQ,KAAK,KAAK,QAAQ,GAAG;AAAA,MAC5C,YAAY,CAAC,WAAW,KAAK,UAAU,IAAI,MAAM,GAAG,WAAW,MAAM;AAAA,MACrE,WAAW,OAAO,EAAE,MAAM,KAAK,MAAM,WAAW,KAAK,KAAK,EAAE;AAAA,MAC5D,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,YAAY,KAAK,SAAS;AAAA,MAC1B,QAAQ,CAAC,SAAS,KAAK,OAAO,OAAO,IAAI;AAAA,MACzC,QAAQ,MAAM,KAAK,OAAO,KAAK;AAAA,MAC/B,OAAO,CAAC,MAAM,WAAW,KAAK,aAAa,KAAK,MAAM,MAAM;AAAA,MAC5D,QAAQ,CAAC,QAAQ,UAAU,KAAK,cAAc,KAAK,QAAQ,KAAK;AAAA,MAChE,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,MAAM,IAAI,YAAY,KAAK,SAAS;AAAA,MACpC,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,QAAQ,CAAC,UAAU,KAAK,OAAO,KAAK;AAAA,MACpC,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,MACrC,GAAG,KAAK,SAAS,GAAG;AAAA,IACtB,CAAC;AACD,SAAK,UAAU,IAAI,KAAK,MAAM;AAC9B,QAAI,IAAI,SAAS,OAAW,MAAK,SAAS,QAAQ,KAAK,IAAI,IAAI;AAC/D,SAAK,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,QAAQ,OAAO,OAAO,GAAG,GAAG,QAAQ;AAClE,QAAI,IAAI,QAAQ,IAAI,SAAS,OAAW,MAAK,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI;AAC1E,QAAI,IAAI,SAAS,OAAW,MAAK,KAAK,KAAK,KAAK,IAAI,IAAI;AACxD,SAAK,UAAU,IAAI,KAAK;AAAA,MACtB,MAAM,CAAC,IAAI,OAAO,GAAG,IAAI,IAAI;AAAA,MAC7B,KAAK,UAAU,QAAQ;AAAA,MACvB,SAAS,KAAK,IAAI;AAAA,IACpB,CAAC;AACD,SAAK,OAAO,OAAO,KAAK,MAAM;AAC5B,WAAK,UAAU,OAAO,GAAG;AACzB,WAAK,SAAS,QAAQ,GAAG;AACzB,UAAI,IAAI,SAAS,UAAa,KAAK,QAAQ,OAAO,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,UAClE,MAAK,QAAQ,IAAI,GAAG;AAAA,IAC3B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,KAAyD;AACxE,QAAI,IAAI,SAAS,OAAW,QAAO,CAAC;AACpC,QAAI,CAAC,IAAI,KAAM,QAAO,EAAE,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI,EAAE;AACxD,UAAM,OAAO,KAAK,KAAK,YAAY,IAAI,IAAI;AAC3C,WAAO,EAAE,UAAU,KAAK,KAAK,MAAM,IAAI,IAAI,GAAG,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC,EAAG;AAAA,EACxF;AAAA,EAEQ,OAAO,KAAmB;AAChC,SAAK,KAAK,OAAO,GAAG;AACpB,SAAK,UAAU,OAAO,GAAG;AAAA,EAC3B;AAAA,EAEQ,OAAO,KAAmB;AAChC,QAAI,KAAK,QAAQ,OAAO,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,QACxC,MAAK,QAAQ,IAAI,GAAG;AAAA,EAC3B;AAAA,EAEA,OAAsB;AACpB,UAAM,UAAU,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;AAC9E,UAAM,SAAS,CAAC,WAAiC;AAC/C,UAAI,OAAO;AACX,eAAS,KAAK,QAAQ,IAAI,KAAK,cAAc,EAAE,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,cAAc,EAAE,GAAG;AAC3F,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,CAAC,QAAoC;AACjD,YAAM,SAAS,QAAQ,SAAY,SAAY,QAAQ,IAAI,GAAG;AAC9D,YAAM,OAAO,UAAU,OAAO,MAAM,EAAE;AACtC,aAAO,SAAS,UAAa,KAAK,QAAQ,IAAI,IAAI,OAAO;AAAA,IAC3D;AACA,UAAM,SAAwB,CAAC;AAC/B,eAAW,UAAU,QAAQ,OAAO,GAAG;AACrC,YAAM,YAAY,KAAK,UAAU,IAAI,OAAO,GAAG;AAC/C,UAAI,OAAO,UAAU,CAAC,UAAW;AACjC,YAAM,OAAO,OAAO,MAAM;AAC1B,aAAO,KAAK;AAAA,QACV,KAAK,KAAK;AAAA,QACV,KAAK,OAAO;AAAA,QACZ,MAAM,MAAM,KAAK,IAAI;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,KAAK,OAAO;AAAA,QACZ,GAAG;AAAA,QACH,UAAU,KAAK,UAAU,IAAI,KAAK,GAAG,KAAK,WAAW;AAAA,QACrD,OAAO,KAAK,UAAU,IAAI,OAAO,GAAG,IAAI,MAAM;AAAA,QAC9C,QAAQ,KAAK,UAAU,IAAI,OAAO,GAAG,GAAG,OAAO,KAAK;AAAA,QACpD,OAAO,KAAK,QAAQ,OAAO,GAAG;AAAA,MAChC,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,MAAc,QAAiD;AAC7E,WAAO,OAAO,KAAK,QAAQ;AACzB,YAAM,UAAU,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,GAAG;AAC3D,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS;AACnB,cAAM,IAAI,WAAW,MAAM,KAAK,WAAW,IAAI,MAAM,IAAI,GAAG,CAAC;AAAA,MAC/D;AACA,YAAM,OAAO,IAAI,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAC1C,YAAM,WAAW,IAAI,OAAO,SAAY,KAAK,UAAU,IAAI;AAC3D,YAAM,SAAS,MAAM,KAAK,OAAO,SAAS;AAAA,QACxC,GAAI,WAAW,EAAE,SAAS,SAAS,QAAQ,IAAI,CAAC;AAAA,QAChD,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,KAAK,UAAU,IAAI;AAAA,QAC5B,OAAO,KAAK,QAAQ,IAAI;AAAA,QACxB,GAAG;AAAA,MACL,CAAC;AACD,gBAAU,OAAO;AACjB,aAAO,YAAY,MAAM;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,UAAU,MAAc;AAC9B,UAAM,UAAU,QAAQ,cAAuB;AAC/C,WAAO;AAAA,MACL,SAAS,QAAQ;AAAA,MACjB,QAAQ,MAAM;AACZ,cAAM,QAAQ,WAAW,MAAM,QAAQ,QAAQ,KAAK,GAAG,SAAS;AAChE,aAAK,QAAQ,QAAQ,KAAK,MAAM,aAAa,KAAK,CAAC;AACnD,cAAM,UAAU,KAAK,SAAS,IAAI,IAAI,KAAK,oBAAI,IAAI;AACnD,gBAAQ,IAAI,QAAQ,OAAO;AAC3B,aAAK,SAAS,IAAI,MAAM,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,KAA4C;AAC7D,UAAM,SAAS,KAAK,KAAK,YAAY,GAAG;AACxC,UAAM,QAAQ,WAAW,UAAa,KAAK,QAAQ,MAAM;AACzD,WAAO,EAAE,KAAK,KAAK,KAAK,MAAM,GAAG,GAAG,MAAM,QAAQ,SAAS,SAAS;AAAA,EACtE;AAAA,EAEQ,QAAQ,OAAwB;AACtC,WAAO,KAAK,KACT,KAAK,EACL,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,KAAK,KAAK,MAAM,OAAO,GAAG,MAAM,KAAK;AAAA,EAC5F;AAAA,EAEQ,OAAO,MAAoB;AACjC,UAAM,UAAU,KAAK,SAAS,IAAI,IAAI;AACtC,QAAI,CAAC,QAAS;AACd,SAAK,SAAS,OAAO,IAAI;AACzB,eAAW,MAAM;AACf,iBAAW,WAAW,QAAS,SAAQ,IAAI;AAAA,IAC7C,GAAG,CAAC;AAAA,EACN;AAAA,EAEQ,OAAO,MAAc,QAAmC;AAC9D,UAAM,EAAE,MAAM,OAAO,GAAG,MAAM,IAAI;AAClC,WAAO,OAAO,OAAO,QACnB;AAAA,MACE,KAAK,MAAM;AAAA,QACT,GAAG;AAAA,QACH,KAAK,MAAM,OAAO,OAAO;AAAA,QACzB;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,SAAS,KAAK,UAAU,MAAM,IAAI;AAAA,QAClC,OAAO,KAAK,QAAQ,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAEQ,UAAU,KAAgB,UAAkB,KAAa,MAAwB;AACvF,UAAM,OAAO,KAAK,KAAK,UAAU,KAAK,QAAQ;AAC9C,UAAM,aAAa,MAAM,KAAK,KAAK,UAAU,KAAK,QAAQ;AAC1D,SAAK,SAAS,QAAQ,KAAK,MAAM,MAAM,IAAI,UAAU,SAAY,UAAU;AAAA,EAC7E;AAAA,EAEQ,QAAQ,KAAqB;AACnC,WAAO,KAAK,UAAU,IAAI,GAAG,GAAG,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEQ,SAAS,MAAoB;AACnC,UAAM,KAAK,cAAc,IAAI;AAC7B,SAAK,SAAS,OAAO,EAAE;AACvB,UAAM,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE,CAAC,KAAK,UAAU,KAAK,MAAM,EAAE;AAC7F,QAAI,CAAC,KAAM,MAAK,KAAK,OAAO,OAAO,EAAE,EAAE,MAAM,MAAM,MAAS;AAAA,EAC9D;AAAA,EAEQ,UAAU,KAAa,OAAO,OAAe;AACnD,WAAO,KAAK,UAAU,IAAI,GAAG,GAAG,eAAe,IAAI,KAAK;AAAA,EAC1D;AAAA,EAEA,KAAK,KAAa,KAAsB;AACtC,QAAI,MAAM,EAAG,QAAO,KAAK,KAAK,UAAU,CAAC,KAAK,GAAG;AACjD,UAAM,SAAS,KAAK,UAAU,IAAI,GAAG;AACrC,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,QAAQ,EAAG,QAAO,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,OAAO,MAAc,MAAwC;AACzE,QAAI,SAAS,MAAO,QAAO,KAAK,UAAU,IAAI;AAC9C,QAAI,SAAS,UAAU;AACrB,YAAM,EAAE,QAAQ,aAAa,aAAa,IAAI,KAAK;AACnD,UAAI,CAAC;AACH,cAAM,QAAQ,UAAU,2DAA2D;AACrF,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,gBAAgB,CAAC,KAAK,SAAS,MAAM,KAAK,IAAI;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,YAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAC5C;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN,EAAE,UAAU,MAAM,OAAO,MAAM,WAAW,MAAM,QAAQ,MAAM,SAAS,EAAE;AAAA,QACzE,EAAE,OAAO,KAAK;AAAA,MAChB;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,MAAM;AACb,gBAAM,MAAM;AACZ,gBAAM,MAAM;AAAA,QACd;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,MAAM,gBAAgB,KAAK,MAAM,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,IAAI;AAC9E,QAAI,CAAC,OAAQ,OAAM,QAAQ,UAAU,4BAA4B,IAAI,EAAE;AACvE,QAAI,CAAC,KAAK;AACR,YAAM,QAAQ,UAAU,4BAA4B,IAAI,UAAU;AACpE,UAAM,OAAO,MAAM,KAAK,KAAK,SAAS,MAAM;AAC5C,UAAM,SAAS,KAAK,mBAAmB;AACvC,UAAM,SAAS,IAAI,eAAe;AAClC,UAAM,SAAS,IAAI,eAAe;AAClC,UAAM,SAAS,YAAY,OAAO,OAAO;AAAA,MACvC,UAAU,YAAY;AAAA,MACtB,OAAO;AAAA,IACT,CAAC;AACD,WAAO,YAAY,EAAE,MAAM,QAAQ,OAAO,OAAO,QAAQ,OAAO,MAAM,GAAG;AAAA,MACvE,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,SAAS,MAAM;AACb,eAAO,UAAU;AACjB,eAAO,OAAO;AACd,eAAO,MAAM,MAAM;AAAA,MACrB;AAAA,MACA,SAAS,CAAC,aACR,OAAO,iBAAiB,SAAS,CAAC,UAAU;AAC1C,QAAC,MAA0C,iBAAiB;AAC5D,iBAAS,IAAI,MAAM,OAAQ,MAAgC,OAAO,CAAC,CAAC;AAAA,MACtE,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,MAAwC;AAC9D,UAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,UAAM,MAAM,CAAC,WACX,KAAK,iBAAiB,EAAE,QAAQ,QAAQ,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC;AACzE,UAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAC5C,UAAM,SAAS,gBAAgB,CAAC,WAAW;AACzC,aAAO,WAAW,IAAI;AACtB,UAAI,MAAM;AAAA,IACZ,CAAC;AACD,UAAM,SAAS,gBAAgB,OAAO,OAAO,UAAU,gBAAgB;AACvE,UAAM,KAAK,OAAO,MAAM,OAAO,MAAM;AACrC,SAAK,UAAU,IAAI,QAAQ,EAAE,IAAI,QAAQ,OAAO,CAAC;AACjD,UAAM,SAAS,KAAK,SAAS,IAAI,EAAE,KAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAChE,QAAI,UAAW,MAAM,QAAQ,MAAM,EAAI,QAAO,OAAO,MAAM;AAAA,QACtD,KAAI,MAAM;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM,OAAO,QAAQ;AAAA,MAC9B,SAAS,MAAM;AACb,aAAK,UAAU,OAAO,MAAM;AAC5B,cAAM,MAAM;AACZ,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAsC;AAChD,UAAM,MAAM,KAAK,SAAS,SAAS,CAAC,KAAK,OAAO,WAAW,MAAM;AACjE,UAAM,QAAQ,MAAM,KAAK,OAAO;AAAA,MAC9B,MAAM,EAAE,GAAG,MAAM,QAAQ,OAAO,OAAO,WAAW,CAAC,GAAG,IAAI;AAAA,MAC1D,KAAK;AAAA,IACP;AACA,SAAK,KAAK,SAAS,MAAM,MAAM,MAAM;AACrC,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,MAAsB;AACtC,QAAI,OAAO;AACX,eAAW,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,GAAG;AAC3C,UAAI,OAAO,SAAS,KAAK,WAAW,SAAS,UAAU,KAAK,WAAW,GAAG,MAAM,GAAG,IAAI;AACrF,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,QAAgB,QAAsB,QAAgC;AACjF,UAAM,KAAK,cAAc,MAAM;AAC/B,UAAM,OAAO,KAAK,UAAU,IAAI,EAAE;AAClC,QAAI,CAAC,KAAM,OAAM,QAAQ,UAAU,GAAG,EAAE,2BAA2B;AACnE,QAAI,WAAW,UAAa,WAAW,OAAO,KAAK,EAAE,IAAI;AACvD,YAAM,QAAQ,UAAU,GAAG,EAAE,2BAA2B,MAAM,EAAE;AAAA,IAClE;AACA,QAAI,CAAE,MAAM,QAAQ,MAAM,EAAI,OAAM,QAAQ,UAAU,GAAG,EAAE,iCAAiC;AAC5F,SAAK,SAAS,IAAI,KAAK,IAAI,MAAM;AACjC,UAAM,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM;AACpC,SAAK,OAAO,OAAO,MAAM;AACzB,SAAK,OAAO,WAAW,IAAI;AAC3B,SAAK,KAAK,SAAS,MAAM,EAAE;AAAA,EAC7B;AAAA,EAEA,OAAO,QAAgB,SAAS,OAAa;AAC3C,UAAM,KAAK,cAAc,MAAM;AAC/B,SAAK,OAAO,OAAO,IAAI,MAAM;AAC7B,QAAI,CAAC,OAAQ;AACb,eAAW,SAAS,KAAK,UAAW,OAAM,OAAO,EAAE;AACnD,eAAW,SAAS,KAAK,KAAM,OAAM,OAAO,EAAE;AAAA,EAChD;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ,MAAM;AACnB,UAAM,UAAU,KAAK,OAAO,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AACtD,eAAW,UAAU,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAG,MAAK,OAAO,QAAQ,IAAI;AAAA,EAC5F;AAAA,EAEA,MAAc,OAAO,KAAyC;AAC5D,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,OAAO,WAAW,aAAa,MAAM,OAAO,GAAG,IAAI;AACnE,QAAI,CAAC,QAAS,OAAM,QAAQ,SAAS,WAAW,IAAI,GAAG,YAAY,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE;AAAA,EAC3F;AAAA,EAEA,MAAc,aAAa,KAAa,MAAiB,QAAoC;AAC3F,UAAM,OAAO,UAAU,IAAI;AAC3B,UAAM,KAAK,OAAO,EAAE,IAAI,SAAS,KAAK,GAAG,MAAM,SAAS,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC;AAC7E,UAAM,QAAQ,MAAM,KAAK,MAAM,IAAI;AACnC,QAAI,OAAO,QAAS,MAAK,OAAO,MAAM,QAAQ,IAAI;AAAA,EACpD;AAAA,EAEA,MAAc,cAAc,KAAa,QAAgB,OAA8B;AACrF,UAAM,OAAO,WAAW,QAAQ,KAAK;AACrC,eAAS;AACP,YAAM,UAAU,KAAK,OAAO,QAAQ,KAAK,MAAM;AAC/C,YAAM,KAAK,OAAO;AAAA,QAChB,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,GAAI,UAAU,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,MAClE,CAAC;AACD,UAAI,KAAK,OAAO,QAAQ,KAAK,MAAM,MAAM,QAAS;AAAA,IACpD;AACA,SAAK,OAAO,KAAK,QAAQ,KAAK,MAAM;AAAA,EACtC;AAAA,EAEA,MAAM,UAAyB;AAC7B,eAAW,OAAO,YAAa,OAAM,KAAK,KAAK,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAC7E,UAAM,YAAY,KAAK,MAAM,KAAK,EAAE,EAAE,MAAM,MAAM,MAAS;AAC3D,SAAK,QAAQ,KAAK,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAc,aAAqC;AACjD,UAAM,OAAO,MAAM,KAAK,KAAK,SAAS,UAAU,EAAE,MAAM,MAAM,EAAE;AAChE,UAAM,QAAQ,WAAW,IAAI;AAC7B,eAAW,EAAE,KAAK,KAAK,MAAO,MAAK,OAAO,KAAK,MAAM,SAAS;AAC9D,WAAO;AAAA,MACL;AAAA,MACA,CAAC,SACC,KAAK,MAAM,IAAI,EAAE,MAAM,CAAC,QAAiB;AACvC,aAAK,OAAO,KAAK,MAAM,WAAY,KAAe,WAAW,OAAO,GAAG,CAAC;AACxE,cAAM;AAAA,MACR,CAAC;AAAA,MACH,KAAK,QAAQ;AAAA,MACb,KAAK;AAAA,MACL,CAAC,UAAU,KAAK,OAAO,MAAM,QAAQ,IAAI;AAAA,MACzC,CAAC,EAAE,KAAK,GAAG,WAAW;AACpB,YAAI,CAAC,OAAO,QAAQ,OAAO,SAAS,eAAe,KAAK,QAAQ,OAAO,SAAS;AAC9E,eAAK,OAAO,OAAO,KAAK,MAAM;AAAA,QAChC,MAAO,MAAK,OAAO,KAAK,MAAM,UAAU,OAAO,KAAK;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,KAAa,OAA2C;AAC1E,WAAO;AAAA,MACL,MAAM,iBAAiB,KAAK,QAAQ;AAAA,MACpC,MAAM;AAAA,MACN,WAAW,KAAK;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,KAAK;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,MAAgB,KAAyB;AAC9D,SAAK,UAAU;AACf,SAAK,UAAU;AACf,UAAMC,SAAQ,OAAO;AACrB,UAAM,MAAM,MAAM,kBAAkB,KAAK,MAAMA,OAAM,WAAW,GAAG,IAAIA,SAAQ,IAAIA,MAAK,EAAE;AAC1F,UAAM,CAAC,OAAO,EAAE,IAAI;AACpB,UAAM,KAAK,KAAK,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAC9C,WAAO,EAAE,KAAK,MAAM,SAAS,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE;AAAA,EAChE;AAAA,EAEA,MAAM,aAAa,MAAgB,SAAoD;AACrF,UAAM,EAAE,KAAK,MAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,MAAM,QAAQ,GAAG;AACpE,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,GAAG,IAAI,qBAAqB;AAC1D,QAAI,SAAS;AACb,UAAM,MAAiB,IAAI;AAAA,MACzB,EAAE,OAAO,CAAC,UAAU,QAAQ,OAAO,MAAM,MAAM,CAAC,EAAE;AAAA,MAClD,CAAC,QAAQ,KAAK,UAAU,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK,iBAAiB,KAAK,QAAQ,GAAG,CAAC;AAAA,IAC9F;AACA,QAAI,SAAS,MAAM,KAAK,SAAS,QAAQ,KAAK,KAAK,UAAU,KAAK,MAAM,CAAC;AACzE,QAAI,OAAO,WAAW,EAAE,KAAK,SAAS;AACtC,QAAI,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,EAAE;AAClD,UAAM,MAAM,IAAI,QAAQ;AACxB,UAAM,QAAQ,IAAI,KAAK;AACvB,QAAI,UAAU,GAAG,KAAK;AACtB,QAAI,UAAU,GAAG,MAAM,OAAO,CAAC;AAC/B,QAAI,UAAU,GAAG,MAAM,OAAO,CAAC;AAC/B,UAAM,MAAM,KAAK,YAAY,KAAK;AAAA,MAChC,MAAM;AAAA,MACN,WAAW;AAAA,MACX,GAAG,QAAQ;AAAA,IACb,CAAC;AACD,UAAM,SAAS,CAACH,aAAoB,QAAQ,OAAOP,SAAQ,OAAO,GAAGO,QAAO;AAAA,CAAM,CAAC;AACnF,UAAM,SAAS,MAAM,KAAK,OAAO,SAAS,EAAE,KAAK,KAAK,KAAK,OAAO,CAAC;AACnE,aAAS,OAAO;AAChB,SAAK,OAAO,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC;AAC1C,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf,OAAO,CAAC,UAAU,IAAI,QAAQ,KAAK;AAAA,MACnC,QAAQ,CAAC,MAAM,SAAS,IAAI,OAAO,MAAM,IAAI;AAAA,MAC7C,QAAQ,CAAC,QAAQ,KAAK,KAAK,iBAAiB,KAAK,QAAQ,GAAG;AAAA,MAC5D,OAAO,MAAM;AACX,YAAI,aAAa;AACjB,YAAI,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MAAgB,UAAsB,CAAC,GAAuB;AACtE,UAAM,EAAE,KAAK,MAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,MAAM,QAAQ,GAAG;AACpE,UAAM,MAAM,KAAK,YAAY,KAAK,QAAQ,GAAG;AAC7C,UAAM,MAAoB,CAAC;AAC3B,UAAM,MAAoB,CAAC;AAC3B,UAAM,OAAO,QAAQ,YAAY;AACjC,UAAM,UACJ,CAACF,SAAsB,QAAsC,CAAC,UAAsB;AAClF,UAAI,KAAM,CAAAA,QAAO,KAAK,KAAK;AAC3B,YAAM,KAAK;AAAA,IACb;AACF,UAAM,SAAS,QAAQ,KAAK,QAAQ,QAAQ;AAC5C,UAAM,SAAS,QAAQ,KAAK,QAAQ,QAAQ;AAC5C,UAAM,SAAS,CAACE,aAAoB,OAAOP,SAAQ,OAAO,GAAGO,QAAO;AAAA,CAAI,CAAC;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,GAAG,IAAI,qBAAqB;AACnC,aAAO,EAAE,QAAQ,WAAW,QAAQH,QAAO,GAAG,GAAG,QAAQA,QAAO,GAAG,EAAE;AAAA,IACvE;AACA,UAAM,MAAM,IAAI,QAAQ;AACxB,QAAI,UAAU,GAAG,QAAQ,QAAQ,YAAY,QAAQ,KAAK,IAAI,WAAW,MAAM,CAAC;AAChF,QAAI,UAAU,GAAG,SAAS,MAAM,CAAC;AACjC,QAAI,UAAU,GAAG,SAAS,MAAM,CAAC;AACjC,UAAM,QAAQ,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AACrE,UAAM,SAAS,MAAM,KAAK,OAAO,SAAS,EAAE,KAAK,KAAK,KAAK,QAAQ,GAAG,MAAM,CAAC;AAC7E,YAAQ,YAAY,OAAO,GAAG;AAC9B,UAAM,SAAS,MAAM,OAAO;AAC5B,WAAO,EAAE,QAAQ,QAAQA,QAAO,GAAG,GAAG,QAAQA,QAAO,GAAG,EAAE;AAAA,EAC5D;AACF;;;ACrmCA,IAAM,OAAO,CAACO,UAAwB;AACpC,QAAM,IAAI,aAAaA,OAAMA,KAAI;AACnC;AAEA,SAAS,MAAMA,OAAoB;AACjC,MAAIA,UAAS,MAAMA,UAAS,OAAOA,UAAS,QAAQA,MAAK,SAAS,GAAG,GAAG;AACtE,UAAM,IAAI,UAAU,iBAAiBA,KAAI,EAAE;AAAA,EAC7C;AACF;AAEA,IAAMC,SAAQ,OAAO;AAErB,SAAS,QAAQ,MAAiD;AAChE,MAAI,OAAO,SAAS,SAAU,QAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAClE,MAAI,gBAAgB,KAAM,QAAO,KAAK,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,WAAW,MAAM,CAAC;AAC3F,MAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,WAAO,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAAA,EACrE;AACA,SAAO,IAAI,WAAW,IAAmB;AAC3C;AASA,IAAM,WAAW,CAAC,SAChB,CAAC,SAAS,QAAQ,UAAU,EAAE,SAAU,MAAoC,IAAc,KAC1F,EAAE,gBAAgB;AAEpB,IAAM,SAAN,MAAa;AAAA,EACX;AAAA,EACA;AAAA,EAEA,YAAY,QAAgB,CAAC,GAAG,OAAO,GAAG;AACxC,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EACd;AAAA,EAEQ,IAAI,OAAeC,SAAsB;AAC/C,UAAM,OAAO,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC;AAC7C,QAAI,KAAK,OAAOA;AACd,WAAK,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,WAAWA,UAAS,KAAK,IAAI,CAAC,CAAC;AAAA,EAC3E;AAAA,EAEQ,KAAK,KAAmB;AAC9B,QAAI,OAAO,KAAK,KAAM;AACtB,UAAM,OAAO,KAAK,OAAO,MAAM,KAAKD,MAAK;AACzC,aAAS,IAAI,GAAG,IAAI,MAAM,IAAK,MAAK,IAAI,GAAGA,MAAK;AAChD,SAAK,IAAI,MAAM,MAAM,OAAOA,MAAK;AACjC,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,MAAM,IAAY,OAAkC;AACxD,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,QAAQ,KAAK,MAAM,KAAKA,MAAK;AACnC,aAAS,IAAI,GAAG,IAAI,OAAO,IAAK,MAAK,IAAI,GAAGA,MAAK;AACjD,aAASE,QAAO,GAAGA,QAAO,MAAM,UAAU;AACxC,YAAM,QAAQ,KAAK,OAAO,KAAKA,SAAQF,MAAK;AAC5C,YAAM,OAAO,KAAKE,QAAO,QAAQF;AACjC,YAAM,IAAI,KAAK,IAAIA,SAAQ,MAAM,MAAM,SAASE,KAAI;AACpD,YAAM,OAAO,MAAM,SAASA,OAAMA,QAAO,CAAC;AAC1C,YAAM,OACJ,KAAK,kBAAkB,cAAc,OAAO,KAAK,MAAM;AAEzD,YAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,UAAI,SAAS,KAAK,MAAM,KAAK,QAAQ,GAAI,MAAK,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;AAAA,WACvE;AACH,cAAM,SAAS,IAAI,WAAW,KAAK,IAAI,KAAK,QAAQ,GAAG,OAAO,CAAC,CAAC;AAChE,YAAI,IAAK,QAAO,IAAI,IAAI,WAAW,MAAM,IAAI,YAAY,CAAC,CAAC;AAC3D,eAAO,IAAI,MAAM,IAAI;AACrB,aAAK,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;AAAA,MACvC;AACA,MAAAA,SAAQ;AAAA,IACV;AACA,SAAK,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,MAAM,MAAM;AAAA,EACnD;AAAA,EAEA,SAAS,MAAoB;AAC3B,QAAI,QAAQ,KAAK,MAAM;AACrB,WAAK,KAAK,IAAI;AACd;AAAA,IACF;AACA,UAAM,OAAO,KAAK,KAAK,OAAOF,MAAK;AACnC,SAAK,MAAM,SAAS;AACpB,QAAI,OAAO;AACT,WAAK,MAAM,OAAO,CAAC,IAAK,KAAK,MAAM,OAAO,CAAC,EAAW,MAAM,GAAG,QAAQ,OAAO,KAAKA,MAAK;AAC1F,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,aAAN,MAAiB;AAAA,EACN,OAAO;AAAA,EAChB;AAAA,EACA;AAAA,EACA,OAAO,IAAI,OAAO;AAAA,EAClB,eAAe,KAAK,IAAI;AAAA,EAExB,YAAYD,OAAc,QAAyB;AACjD,SAAK,OAAOA;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,UAAyB;AAC7B,WAAO,IAAI,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,EAAE,cAAc,KAAK,aAAa,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,eAAe,EAAE,mBAAmB,MAAM,IAAI,CAAC,GAAG;AACtD,UAAMI,QAAO,mBAAmB,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,IAAI,IAAI,IAAI,OAAO;AAC9F,QAAI,WAAW;AACf,UAAM,MAAM,OAAO,SAAkB;AACnC,YAAM,QAAQ,MAAM,QAAQ,IAAI;AAChC,YAAMA,MAAK,MAAM,UAAU,KAAK;AAChC,kBAAY,MAAM;AAAA,IACpB;AACA,WAAO;AAAA,MACL,OAAO,OAAO,SAAkB;AAC9B,YAAI,CAAC,SAAS,IAAI,EAAG,QAAO,IAAI,IAAI;AACpC,YAAI,KAAK,SAAS,WAAY,QAAOA,MAAK,SAAS,KAAK,QAAQ,CAAC;AACjE,mBAAW,KAAK,YAAY;AAC5B,YAAI,KAAK,SAAS,QAAS,OAAM,IAAI,KAAK,IAAI;AAAA,MAChD;AAAA,MACA,MAAM,OAAO,OAAe;AAC1B,mBAAW;AAAA,MACb;AAAA,MACA,UAAU,OAAO,SAAiBA,MAAK,SAAS,IAAI;AAAA,MACpD,OAAO,YAAY;AACjB,aAAK,OAAOA;AACZ,aAAK,eAAe,KAAK,IAAI;AAAA,MAC/B;AAAA,MACA,OAAO,YAAY;AAAA,MAAC;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAAyBJ,OAA6B;AAC/D,UAAMA,KAAI;AACV,QAAI,OAAO,SAAS,IAAIA,KAAI,GAAG,SAAS,YAAa,MAAK,0BAA0B;AACpF,SAAK,OAAO,SAAS,OAAO,KAAK,IAAI;AACrC,SAAK,OAAOA;AACZ,SAAK,SAAS;AACd,WAAO,SAAS,IAAIA,OAAM,IAAI;AAAA,EAChC;AACF;AAEA,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EACX,OAAO;AAAA,EAChB;AAAA,EACA;AAAA,EACS,WAAW,oBAAI,IAAoB;AAAA,EAC5C,UAAU;AAAA,EAEV,YAAYA,OAAc,QAAgC;AACxD,SAAK,OAAOA;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,QAAS,MAAK,eAAe;AAAA,EACxC;AAAA,EAEA,MAAM,mBAAmBA,OAAc,EAAE,SAAS,MAAM,IAAI,CAAC,GAA6B;AACxF,SAAK,QAAQ;AACb,UAAMA,KAAI;AACV,UAAM,QAAQ,KAAK,SAAS,IAAIA,KAAI;AACpC,QAAI,OAAO,SAAS,OAAQ,MAAK,mBAAmB;AACpD,QAAI,MAAO,QAAO;AAClB,QAAI,CAAC,OAAQ,MAAK,eAAe;AACjC,UAAM,MAAM,IAAI,iBAAgBA,OAAM,IAAI;AAC1C,SAAK,SAAS,IAAIA,OAAM,GAAG;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAcA,OAAc,EAAE,SAAS,MAAM,IAAI,CAAC,GAAwB;AAC9E,SAAK,QAAQ;AACb,UAAMA,KAAI;AACV,UAAM,QAAQ,KAAK,SAAS,IAAIA,KAAI;AACpC,QAAI,OAAO,SAAS,YAAa,MAAK,mBAAmB;AACzD,QAAI,MAAO,QAAO;AAClB,QAAI,CAAC,OAAQ,MAAK,eAAe;AACjC,UAAM,OAAO,IAAI,WAAWA,OAAM,IAAI;AACtC,SAAK,SAAS,IAAIA,OAAM,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAYA,OAAc,EAAE,YAAY,MAAM,IAAI,CAAC,GAAkB;AACzE,SAAK,QAAQ;AACb,UAAMA,KAAI;AACV,UAAM,QAAQ,KAAK,SAAS,IAAIA,KAAI;AACpC,QAAI,CAAC,MAAO,QAAO,KAAK,eAAe;AACvC,QAAI,MAAM,SAAS,eAAe,MAAM,SAAS,OAAO,KAAK,CAAC,WAAW;AACvE,WAAK,0BAA0B;AAAA,IACjC;AACA,SAAK,SAAS,OAAOA,KAAI;AACzB,QAAI,MAAM,SAAS,YAAa,OAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,QAA0C;AACtD,UAAM,QAAkB,CAAC;AACzB,aAAS,KAAoB,QAAQ,OAAO,MAAM,KAAK,GAAG,QAAQ;AAChE,UAAI,CAAC,MAAO,GAAG,SAAS,eAAe,GAAG,QAAU,QAAO;AAC3D,YAAM,QAAQ,GAAG,IAAI;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAe;AACb,SAAK,UAAU;AACf,eAAW,SAAS,KAAK,SAAS,OAAO,EAAG,KAAI,MAAM,SAAS,YAAa,OAAM,OAAO;AAAA,EAC3F;AAAA,EAEA,OAAO,OAA+B;AACpC,SAAK,QAAQ;AACb,eAAWA,SAAQ,CAAC,GAAG,KAAK,SAAS,KAAK,CAAC,EAAG,OAAMA;AAAA,EACtD;AAAA,EAEA,OAAO,SAAiC;AACtC,eAAW,UAAU,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAAG,OAAM;AAAA,EAC1D;AAAA,EAEA,OAAO,UAA4C;AACjD,eAAW,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAG,OAAM;AAAA,EAChD;AAAA,EAEA,MAAM,KAAK,QAAyBA,OAA6B;AAC/D,UAAMA,KAAI;AACV,QAAI,OAAO,SAAS,IAAIA,KAAI,EAAG,MAAK,0BAA0B;AAC9D,SAAK,QAAQ,SAAS,OAAO,KAAK,IAAI;AACtC,SAAK,OAAOA;AACZ,SAAK,SAAS;AACd,WAAO,SAAS,IAAIA,OAAM,IAAI;AAAA,EAChC;AACF;AAEO,SAAS,aAAwC;AACtD,SAAO,IAAI,gBAAgB,IAAI,IAAI;AACrC;AAEO,SAAS,aAAa,QAA4C;AACvE,SAAQ,kBAA8B;AACxC;;;ACzMO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EAET,YAAYK,UAAiB,QAAiB,MAAe;AAC3D,UAAMA,QAAO;AACb,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;AAOO,IAAM,kBAAN,MAAgD;AAAA,EAC5C;AAAA,EAEQ;AAAA,EAEA,UAAU,oBAAI,IAAoB;AAAA,EAE3C,SAAS;AAAA,EAEA,UAAU,oBAAI,IAA6D;AAAA,EAEpF;AAAA,EAER,YAAY,MAAqB,QAA8B;AAC7D,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAQ,OAA6B;AACnC,UAAM,SAAS,KAAK,QAAQ,IAAI,MAAM,GAAG;AACzC,QAAI,UAAU,KAAK,SAAS,OAAO,MAAM,EAAG;AAC5C,UAAM,SAAS,KAAK,QAAQ,IAAI,MAAM,GAAG;AACzC,QAAI,CAAC,OAAQ;AACb,SAAK,QAAQ,OAAO,MAAM,GAAG;AAC7B,QAAI,MAAM,QAAQ,SAAS;AACzB,aAAO,OAAO,IAAI,eAAe,MAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC3E,MAAO,QAAO,QAAQ,KAAK;AAAA,EAC7B;AAAA,EAEQ,SACN,OACA,QACS;AACT,QAAI,MAAM,QAAQ,aAAc,QAAO,MAAM,KAAK,MAAM,IAAI;AAAA,aACnD,MAAM,QAAQ,WAAY,QAAO,MAAM,MAAM,CAAC;AAAA,aAC9C,MAAM,QAAQ,aAAa;AAClC,WAAK,QAAQ,OAAO,MAAM,GAAG;AAC7B,aAAO,MAAM,IAAI,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,IAC7D,MAAO,QAAO;AACd,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAoB;AACvB,SAAK,UAAU;AACf,eAAW,UAAU,KAAK,QAAQ,OAAO,EAAG,QAAO,OAAO,KAAK;AAC/D,SAAK,QAAQ,MAAM;AACnB,eAAW,UAAU,KAAK,QAAQ,OAAO;AACvC,aAAO,MAAM,IAAI,EAAE,MAAM,MAAM,QAAQ,MAAM,QAAQ,CAAC;AACxD,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEQ,IAAI,MAA8C;AACxD,QAAI,KAAK,QAAS,QAAO,QAAQ,OAAO,KAAK,OAAO;AACpD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,SAAS,OAAO,CAAC;AAC9C,WAAK,KAAK,YAAY,IAAI;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEQ,OAAO,KAAmB;AAChC,UAAM,SAAS,KAAK,QAAQ,IAAI,GAAG;AACnC,SAAK,QAAQ,OAAO,GAAG;AACvB,YAAQ,OAAO,IAAI,eAAe,2BAA2B,CAAC;AAC9D,SAAK,KAAK,YAAY,EAAE,KAAK,UAAU,IAAI,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,MAAM,SAAiE;AAC3E,UAAM,MAAM,EAAE,KAAK;AACnB,UAAM,EAAE,OAAO,IAAI;AACnB,WAAO,eAAe;AACtB,QAAI,WAAW;AACf,UAAM,QAAQ,MAAM;AAClB,iBAAW;AACX,WAAK,OAAO,GAAG;AAAA,IACjB;AACA,WAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACtD,UAAM,SAAS,MAAM;AACnB,UAAI,SAAU;AACd,iBAAW;AACX,aAAO,oBAAoB,SAAS,KAAK;AAAA,IAC3C;AACA,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,KAAK,IAAI;AAAA,QACpB,KAAK;AAAA,QACL;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC/C,CAAC;AAAA,IACH,SAAS,GAAG;AACV,aAAO;AACP,YAAM;AAAA,IACR;AACA,UAAM,EAAE,QAAQ,YAAY,QAAQ,IAAI;AACxC,UAAM,OAAO,YAA6C;AACxD,UAAI,SAAU,QAAO;AACrB,YAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAe;AACvE,eAAO;AACP,cAAM;AAAA,MACR,CAAC;AACD,UAAI,MAAM,QAAQ,QAAS,QAAO,MAAM;AACxC,aAAO;AACP,aAAO;AAAA,IACT;AACA,UAAM,SAAS,YAAY;AACzB,UAAI,SAAU;AACd,aAAO;AACP,WAAK,OAAO,GAAG;AAAA,IACjB;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ,CAAC,OAAO,aAAa,GAAG,OAAO;AAAA,UAC7B,MAAM,YAAY;AAChB,kBAAM,QAAQ,MAAM,KAAK;AACzB,mBAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,MAAM,IAAI,EAAE,OAAO,QAAW,MAAM,KAAK;AAAA,UAChF;AAAA,UACA,QAAQ,YAAY;AAClB,kBAAM,OAAO;AACb,mBAAO,EAAE,OAAO,QAAW,MAAM,KAAK;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,SAAyD;AACvE,UAAM,MAAM,EAAE,KAAK;AACnB,UAAM,EAAE,OAAO,IAAI;AACnB,WAAO,eAAe;AACtB,UAAM,QAAQ,MAAM,KAAK,OAAO,GAAG;AACnC,WAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACtD,QAAIC;AACJ,QAAI;AACF,MAAAA,UAAS,MAAM,KAAK,IAAI;AAAA,QACtB,KAAK;AAAA,QACL;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,WAAW,QAAQ;AAAA,QACnB,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH,UAAE;AACA,aAAO,oBAAoB,SAAS,KAAK;AAAA,IAC3C;AACA,UAAM,QAAQ,CAAC,MAAe,WAC5B,KAAK,KAAK,YAAY,EAAE,KAAK,YAAY,KAAK,MAAM,OAAO,CAAC;AAC9D,UAAM,QAAQ,IAAI;AAAA,MAChB,MAAM,MAAM,KAAM,sBAAsB;AAAA,MACxC,OAAO;AAAA,MACP,CAAC,MAAM,KAAK,KAAK,YAAY,EAAE,KAAK,eAAe,KAAK,EAAE,CAAC;AAAA,IAC7D;AACA,QAAI,UAAU;AACd,SAAK,QAAQ,IAAI,KAAK,EAAE,OAAO,OAAO,CAAC,MAAM,MAAM,WAAW,GAAG,CAAC;AAClE,WAAO;AAAA,MACL,UAAWA,QAAyD;AAAA,MACpE,IAAI,WAAW;AACb,eAAO;AAAA,MACT;AAAA,MACA,MAAM,CAAC,SAAS;AACd,mBAAW,YAAY,IAAI;AAC3B,aAAK,KAAK,YAAY,EAAE,KAAK,WAAW,KAAK,KAAK,CAAC;AAAA,MACrD;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACF;;;AC1GO,SAAS,aAAaC,OAAsB;AACjD,QAAM,MAAMA,MAAK,MAAM,CAAC;AACxB,MAAI,CAACA,MAAK,WAAW,KAAK,KAAK,CAAC,OAAO,OAAO,KAAK,GAAG;AACpD,UAAM,IAAI,MAAM,kBAAkBA,KAAI,EAAE;AAC1C,SAAQ,IAA+B,GAAG;AAC5C;;;ACzGO,SAAS,cAAcC,UAA4C;AACxE,QAAM,OAAO,WAAW,KAAKA,QAAO,IAAI,CAAC;AACzC,SAAO,OAAO,OAAO,IAAI,MAAMA,QAAO,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;AAC/D;AAEO,SAAS,WAAW,MAAkB,SAAkC;AAC7E,MAAI,SAAS;AACb,MAAI;AACJ,QAAM,OAAuE,CAAC;AAC9E,QAAM,WAAW,IAAI,eAA2B;AAAA,IAC9C,MAAM,YAAY;AAChB,eAAS;AAAA,IACX;AAAA,IACA,OAAO;AACL,UAAI,CAAC,OAAQ,MAAK,YAAY,EAAE,MAAM,KAAK,CAAC;AAAA,IAC9C;AAAA,IACA,SAAS;AACP,eAAS;AACT,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACD,QAAM,SAAS,CAACC,UAAiB;AAC/B,UAAM,aAAa;AACnB,aAAS;AACT,eAAW,OAAO,KAAK,OAAO,CAAC,GAAG;AAChC,UAAIA,MAAM,KAAI,OAAOA,KAAI;AAAA,UACpB,KAAI,QAAQ;AAAA,IACnB;AACA,QAAI,CAAC,WAAY;AACjB,QAAIA,MAAM,YAAW,MAAMA,KAAI;AAAA,QAC1B,YAAW,MAAM;AAAA,EACxB;AACA,WAAS,OAAa;AACpB,QAAI,OAAQ;AACZ,aAAS;AACT,SAAK,MAAM;AACX,cAAU;AAAA,EACZ;AACA,WAAS,QAAc;AACrB,QAAI,CAAC,OAAQ,MAAK,YAAY,EAAE,OAAO,KAAK,CAAC;AAC7C,SAAK;AACL,WAAO;AAAA,EACT;AACA,OAAK,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAiC;AACxE,QAAI,gBAAgB,WAAY,SAAQ,QAAQ,IAAI;AAAA,aAC3C,SAAS,KAAM,MAAK,MAAM,GAAG,QAAQ;AAAA,aACrC,SAAS,KAAM,QAAO;AAAA,QAC1B,QAAO,cAAc,KAAK,KAAK,CAAC;AAAA,EACvC,CAAC;AACD,OAAK,QAAQ;AACb,QAAM,WAAW,IAAI,eAA2B;AAAA,IAC9C,MAAMC,QAAO;AACX,UAAI,OAAQ,OAAM,cAAc,iCAAiC;AACjE,YAAM,OAAOA,OAAM,MAAM;AACzB,YAAM,QAAQ,IAAI,QAAc,CAAC,SAAS,WAAW,KAAK,KAAK,EAAE,SAAS,OAAO,CAAC,CAAC;AACnF,WAAK,YAAY,MAAM,CAAC,KAAK,MAAM,CAAC;AACpC,aAAO;AAAA,IACT;AAAA,IACA,QAAQ;AACN,UAAI,CAAC,OAAQ,MAAK,YAAY,EAAE,KAAK,KAAK,CAAC;AAAA,IAC7C;AAAA,IACA,QAAQ;AACN,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACD,QAAMD,QAAO,CAAC,UAAiB;AAC7B,SAAK;AACL,WAAO,KAAK;AAAA,EACd;AACA,SAAO,EAAE,UAAU,UAAU,OAAO,MAAAA,MAAK;AAC3C;;;ACxFA,IAAM,cAAc,oBAAI,IAAI,CAAC,QAAQ,cAAc,kBAAkB,mBAAmB,CAAC;AACzF,IAAME,WAAU,IAAI,YAAY;AAChC,IAAMC,UAAS,IAAI,YAAY,QAAQ;AAEvC,IAAM,aAAN,MAAiB;AAAA,EACP,WAAW,IAAI,WAAW,CAAC;AAAA,EAClB;AAAA,EAEjB,YAAY,QAAiD;AAC3D,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,OAAyB;AACrC,UAAM,EAAE,MAAAC,OAAM,MAAM,IAAI,MAAM,KAAK,OAAO,KAAK;AAC/C,QAAIA,MAAM,QAAO;AACjB,UAAM,SAAS,IAAI,WAAW,KAAK,SAAS,SAAS,MAAM,MAAM;AACjE,WAAO,IAAI,KAAK,QAAQ;AACxB,WAAO,IAAI,OAAO,KAAK,SAAS,MAAM;AACtC,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,QAAiD;AAC3D,UAAM,SAASF,SAAQ,OAAO,MAAM;AACpC,eAAS;AACP,YAAM,KAAK,QAAQ,KAAK,UAAU,MAAM;AACxC,UAAI,MAAM,EAAG,QAAO,KAAK,KAAK,KAAK,OAAO,MAAM;AAChD,UAAI,CAAE,MAAM,KAAK,KAAK,EAAI,QAAO;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,KAA8C;AACvD,QAAI,KAAK,SAAS,WAAW,KAAK,CAAE,MAAM,KAAK,KAAK,EAAI,QAAO;AAC/D,WAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,MAAM,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,QAAQ,OAAgD;AAC5D,WAAO,KAAK,SAAS,SAAS,MAAO,KAAI,CAAE,MAAM,KAAK,KAAK,EAAI,QAAO;AACtE,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB;AAAA,EAEQ,KAAK,OAA2B;AACtC,UAAM,MAAM,KAAK,SAAS,MAAM,GAAG,KAAK;AACxC,SAAK,WAAW,KAAK,SAAS,MAAM,KAAK;AACzC,WAAO;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,UAAsB,QAA4B;AACjE,QAAO,UAAS,IAAI,GAAG,IAAI,OAAO,UAAU,SAAS,QAAQ,KAAK;AAChE,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,KAAI,SAAS,IAAI,CAAC,MAAM,OAAO,CAAC,EAAG,UAAS;AACpF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAQA,SAAS,UAAU,OAAiC;AAClD,QAAM,CAAC,aAAa,IAAI,GAAG,KAAK,IAAIC,QAAO,OAAO,KAAK,EAAE,MAAM,MAAM;AACrE,QAAM,QAAQ,oCAAoC,KAAK,UAAU;AACjE,MAAI,CAAC,MAAO,OAAM,cAAc,qCAAqC,WAAW,MAAM,GAAG,EAAE,CAAC,EAAE;AAC9F,QAAM,UAAmC,CAAC;AAC1C,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,QAAI,QAAQ,EAAG,SAAQ,KAAK,CAAC,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAAA,EACzF;AACA,SAAO,EAAE,QAAQ,OAAO,MAAM,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC,KAAK,IAAI,QAAQ;AACzE;AAEA,SAASE,QAAO,MAAoBC,OAAkC;AACpE,SAAO,KAAK,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,MAAMA,KAAI,IAAI,CAAC;AACrE;AAEA,gBAAgB,QAAQ,QAAgD;AACtE,aAAS;AACP,UAAM,OAAO,MAAM,OAAO,MAAM,MAAM;AACtC,QAAI,CAAC,KAAM,OAAM,cAAc,sCAAsC;AACrE,UAAM,OAAO,OAAO,SAASH,QAAO,OAAO,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;AAC/E,QAAI,CAAC,OAAO,SAAS,IAAI,EAAG,OAAM,cAAc,gCAAgC;AAChF,QAAI,SAAS,EAAG;AAChB,UAAM,OAAO,MAAM,OAAO,QAAQ,IAAI;AACtC,QAAI,CAAC,QAAQ,CAAE,MAAM,OAAO,QAAQ,CAAC,EAAI,OAAM,cAAc,6BAA6B;AAC1F,UAAM;AAAA,EACR;AACF;AAEA,gBAAgB,QAAQ,QAAoBI,SAA4C;AACtF,MAAI,OAAOA;AACX,SAAO,OAAO,GAAG;AACf,UAAM,OAAO,MAAM,OAAO,KAAK,IAAI;AACnC,QAAI,CAAC,KAAM,OAAM,cAAc,8BAA8B;AAC7D,YAAQ,KAAK;AACb,UAAM;AAAA,EACR;AACF;AAEA,gBAAgB,WAAW,QAAgD;AACzE,WAAS,OAAO,MAAM,OAAO,KAAK,KAAK,GAAG,MAAM,OAAO,MAAM,OAAO,KAAK,KAAK,EAAG,OAAM;AACzF;AAEA,SAAS,OAAO,QAAoB,MAAoB,QAAgB;AACtE,MAAI,WAAW,UAAU,KAAK,WAAW,OAAO,KAAK,WAAW,IAAK,QAAO;AAC5E,MAAIF,QAAO,MAAM,mBAAmB,GAAG,YAAY,EAAE,SAAS,SAAS,EAAG,QAAO,QAAQ,MAAM;AAC/F,QAAME,UAASF,QAAO,MAAM,gBAAgB;AAC5C,MAAIE,YAAW,OAAW,QAAO,WAAW,MAAM;AAClD,QAAM,OAAO,OAAOA,OAAM;AAC1B,MAAI,CAAC,QAAQ,KAAKA,QAAO,KAAK,CAAC,KAAK,CAAC,OAAO,cAAc,IAAI,GAAG;AAC/D,UAAM,cAAc,uCAAuCA,OAAM,EAAE;AAAA,EACrE;AACA,SAAO,QAAQ,QAAQ,IAAI;AAC7B;AAEA,SAAS,OAAOC,SAAoC,QAAuB,QAAsB;AAC/F,SAAO,IAAI,eAA2B;AAAA,IACpC,MAAM,YAAY;AAChB,cAAQ,iBAAiB,SAAS,MAAM,WAAW,MAAM,OAAO,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IACzF;AAAA,IACA,MAAM,KAAK,YAAY;AACrB,UAAI;AACF,cAAMC,QAAO,MAAMD,QAAO,KAAK;AAC/B,YAAIC,MAAK,MAAM;AACb,qBAAW,MAAM;AACjB,iBAAO,MAAM;AAAA,QACf,MAAO,YAAW,QAAQA,MAAK,KAAK;AAAA,MACtC,SAAS,KAAK;AACZ,mBAAW,MAAM,GAAG;AACpB,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,IACA,SAAS;AACP,aAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAEA,eAAe,aAAa,SAAuC;AACjE,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,OAAO,QAAQ,OAAO,IAAI,WAAW,MAAM,QAAQ,YAAY,CAAC,IAAI;AAC1E,QAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,IAAI,IAAI,QAAQ,GAAG,IAAI,MAAM,aAAa,SAAS,IAAI,IAAI,EAAE;AAC7F,UAAQ,QAAQ,QAAQ,CAAC,OAAOH,UAAS;AACvC,QAAI,CAAC,YAAY,IAAIA,KAAI,EAAG,OAAM,KAAK,GAAGA,KAAI,KAAK,KAAK,EAAE;AAAA,EAC5D,CAAC;AACD,MAAI,KAAM,OAAM,KAAK,mBAAmB,KAAK,MAAM,EAAE;AACrD,QAAM,KAAK,qBAAqB,IAAI,EAAE;AACtC,QAAM,OAAOJ,SAAQ,OAAO,MAAM,KAAK,MAAM,CAAC;AAC9C,QAAM,MAAM,IAAI,WAAW,KAAK,UAAU,MAAM,UAAU,EAAE;AAC5D,MAAI,IAAI,IAAI;AACZ,MAAI,KAAM,KAAI,IAAI,MAAM,KAAK,MAAM;AACnC,SAAO;AACT;AAEA,eAAsB,cACpB,MACA,OACA,SACmB;AACnB,UAAQ,QAAQ,eAAe;AAC/B,QAAM,UAAU,iBAAiB,UAAU,QAAQ,IAAI,QAAQ,KAAK;AACpE,QAAM,QAAQ,MAAM,aAAa,OAAO;AACxC,QAAM,SAAS,MAAM,KAAK;AAAA,IACxB,MAAM,QAAQ;AAAA,IACd,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,EAC/C,CAAC;AACD,UAAQ,QAAQ,iBAAiB,SAAS,MAAM,OAAO,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAC9E,MAAI;AACF,UAAM,SAAS,OAAO,SAAS,UAAU;AACzC,UAAM,OAAO,MAAM,KAAK;AACxB,WAAO,YAAY;AACnB,UAAM,SAAS,IAAI,WAAW,OAAO,SAAS,UAAU,CAAC;AACzD,QAAI;AACJ,OAAG;AACD,YAAM,MAAM,MAAM,OAAO,MAAM,UAAU;AACzC,UAAI,CAAC,IAAK,OAAM,cAAc,qDAAqD;AACnF,aAAO,UAAU,GAAG;AAAA,IACtB,SAAS,KAAK,UAAU,OAAO,KAAK,SAAS;AAC7C,UAAMM,UAAS,OAAO,QAAQ,MAAM,QAAQ,MAAM;AAClD,QAAI,CAACA,QAAQ,QAAO,MAAM;AAC1B,WAAO,IAAI,SAASA,UAAS,OAAOA,SAAQ,QAAQ,QAAQ,MAAM,IAAI,MAAM;AAAA,MAC1E,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,IAChB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM;AACb,UAAM;AAAA,EACR;AACF;;;ACvKO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAYE,WAAU,wDAAwD;AAC5E,UAAMA,QAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAChC;AAAA,EAET,YAAYA,UAAiB,MAAe;AAC1C,UAAMA,QAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AA6GA,IAAMC,WAAU,IAAI,YAAY;AAChC,IAAMC,WAAU,CAAC,SACf,OAAO,SAAS,WAAWD,SAAQ,OAAO,IAAI,IAAI;AAEpD,IAAM,cAAc;AAAA,EAClB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,aAAa;AACf;AAEA,eAAe,SACb,OAC6C;AAC7C,MAAI,CAAC,MAAO,QAAO,EAAE,UAAU;AAAA,EAAC,EAAE;AAClC,QAAME,QAAO,uBAAuB,OAAO,WAAW,CAAC;AACvD,QAAMC,WAAU,QAAQ,cAAoB;AAC5C,QAAM,OAAO,QAAQ,cAAoB;AACzC,OAAK,MAAM,QAAQD,OAAM,MAAM;AAC7B,IAAAC,SAAQ,QAAQ;AAChB,WAAO,KAAK;AAAA,EACd,CAAC;AACD,QAAMA,SAAQ;AACd,SAAO,EAAE,MAAAD,OAAM,SAAS,MAAM,KAAK,QAAQ,EAAE;AAC/C;AAEA,SAASE,QAAOC,SAAkC;AAChD,QAAM,MAAM,IAAI,WAAWA,QAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,CAAC;AACnE,MAAI,KAAK;AACT,aAAWC,UAASD,SAAQ;AAC1B,QAAI,IAAIC,QAAO,EAAE;AACjB,UAAMA,OAAM;AAAA,EACd;AACA,SAAO;AACT;AAEA,IAAM,UAAN,MAAc;AAAA,EACH,UAAU,QAAQ,cAA2B;AAAA,EAC7C,QAAQ,QAAQ,cAAqB;AAAA,EAC9C;AAAA,EACA;AAAA,EACiB,UAAU,oBAAI,IAAqB;AAAA,EAC3C,WAAW,oBAAI,IAA2C;AAAA,EAC1D,WAAW,oBAAI,IAAqB;AAAA,EAC5B,UAAU,oBAAI,IAAgB;AAAA,EAC/C,WAAsC;AAAA,EAC9B,SAAS;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,MAAuB,SAAqB;AACtD,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,QAAQ,QAAQ,MAAM,MAAM,MAAS;AAC1C,SAAK,iBAAiB,WAAW,CAAC,UAAU,KAAK,QAAQ,MAAM,IAAI,CAAC;AACpE,SAAK,iBAAiB,SAAS,MAAM,KAAK,IAAI,IAAI,gBAAgB,CAAC,CAAC;AACpE,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,KAAKP,UAAuB;AAC1B,QAAI,CAAC,KAAK,QAAS,MAAK,KAAK,YAAYA,QAAO;AAAA,EAClD;AAAA,EAEA,IAAI,OAAoB;AACtB,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,SAAK,QAAQ,OAAO,KAAK;AACzB,SAAK,QAAQ,KAAK,KAAK;AACvB,eAAW,SAAS,CAAC,GAAG,KAAK,OAAO,EAAG,OAAM;AAC7C,SAAK,QAAQ,MAAM;AACnB,eAAW,QAAQ,KAAK,QAAQ,OAAO,EAAG,MAAK,OAAO,KAAK;AAC3D,SAAK,QAAQ,MAAM;AACnB,SAAK,QAAQ;AACb,SAAK,KAAK,QAAQ;AAClB,SAAK,MAAM,QAAQ,KAAK;AAAA,EAC1B;AAAA,EAEA,QAAQ,MAAkB,WAAqB,CAAC,GAA2C;AACzF,UAAM,KAAK,EAAE,KAAK;AAClB,UAAM,EAAE,QAAQ,IAAI;AACpB,QAAI,QAAS,QAAO,EAAE,IAAI,MAAM,QAAQ,OAAO,OAAO,EAAE;AACxD,UAAMQ,QAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC5C,WAAK,QAAQ,IAAI,IAAI,EAAE,SAAS,QAAQ,GAAG,SAAS,CAAC;AACrD,WAAK,KAAK,YAAY,EAAE,GAAG,MAAM,GAAG,CAAC;AAAA,IACvC,CAAC;AACD,WAAO,EAAE,IAAI,MAAAA,MAAK;AAAA,EACpB;AAAA,EAEA,KAAK,MAAoC;AACvC,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA,EAEQ,QAAQ,MAQP;AACP,QAAI,KAAK,WAAW,KAAK,MAAM;AAC7B,WAAK,QAAQ,IAAe;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,UAAU,QAAW;AAC5B,WAAK,SAAS,IAAI,KAAK,KAAK,IAAI,KAAK,MAAqB;AAC1D;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,QAAW;AAC1B,WAAK,IAAI,IAAI,gBAAgB,KAAK,GAAG,CAAC;AACtC;AAAA,IACF;AACA,QAAI,KAAK,OAAO;AACd,WAAK,QAAQ,QAAQ,KAAK,KAAK;AAC/B;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,QAAW;AAC1B,WAAK,QAAQ,QAAQ,IAAsB;AAC3C;AAAA,IACF;AACA,UAAM,QAAQ;AACd,UAAM,OAAO,KAAK,QAAQ,IAAI,MAAM,EAAE;AACtC,QAAI,CAAC,KAAM;AACX,QAAI,MAAM,OAAO,QAAW;AAC1B,WAAK,SAAS,MAAM,IAAI,MAAM,KAAmB;AACjD;AAAA,IACF;AACA,QAAI,MAAM,YAAY,QAAW;AAC/B,WAAK,UAAU,MAAM,OAAO;AAC5B;AAAA,IACF;AACA,SAAK,QAAQ,OAAO,MAAM,EAAE;AAC5B,QAAI,MAAM,UAAU,OAAW,MAAK,OAAO,IAAI,gBAAgB,MAAM,OAAO,MAAM,IAAI,CAAC;AAAA,QAClF,MAAK,QAAQ,MAAM,MAAM;AAAA,EAChC;AAAA,EAEQ,QAAQ,EAAE,SAAS,EAAE,cAAc,GAAG,QAAQ,GAAG,KAAK,GAAkB;AAC9E,UAAM,OAAO,iBAAiB,SAAY,SAAY,KAAK,SAAS,IAAI,YAAY;AACpF,QAAI,CAAC,QAAQ,KAAK,SAAS;AACzB,WAAK,YAAY,EAAE,OAAO,mCAAmC,CAAC;AAC9D,WAAK,MAAM;AACX;AAAA,IACF;AACA,UAAM,QAAQ,aAAa,MAAM,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO,KAAK,CAAC;AAChF,SAAK,QAAQ,IAAI,KAAK;AAAA,EACxB;AACF;AAEA,eAAe,WACb,SACA,MACA,SAC4B;AAC5B,QAAM,MAAM,SAAS,GAAG,eAAe,YAAY;AAAA,EAAC,CAAC;AACrD,QAAM,MAAM;AAAA,IACV,IAAI;AAAA,IACJ,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,EACxD;AACA,QAAM,EAAE,IAAI,MAAAA,MAAK,IAAI,QAAQ,QAAQ,GAAG;AACxC,UAAQ,SAAS,IAAI,IAAI,IAAI;AAC7B,MAAI;AACF,UAAMA;AAAA,EACR,SAAS,OAAO;AACd,YAAQ,SAAS,OAAO,EAAE;AAC1B,UAAM;AAAA,EACR;AACA,SAAO;AAAA,IACL,OAAO,MAAM;AACX,UAAI,CAAC,QAAQ,SAAS,OAAO,EAAE,EAAG;AAClC,WAAK,QAAQ,KAAK,EAAE,IAAI,eAAe,cAAc,GAAG,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IAClF;AAAA,EACF;AACF;AAEA,eAAe,OAAO,SAAkB,EAAE,MAAM,KAAK,GAAwC;AAC3F,QAAM,MAAM,EAAE,IAAI,QAAiB,MAAM,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG;AACnE,SAAO,WAAY,MAAM,MAAM,SAAS,GAAG,QAAQ,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAiB;AAC7F;AAEA,eAAe,QACb,SACA,MACA,MACyB;AACzB,QAAM,EAAE,UAAU,UAAU,OAAO,OAAO,GAAG,GAAGC,MAAK,IAAI;AACzD,MAAI,KAAK,SAAS;AAChB,UAAM,MAAM,SAAS,GAAG,8BAA8B,YAAY;AAAA,IAAC,CAAC;AACtE,QAAM,UAAU,QAAQ,cAAsB;AAC9C,QAAM,UAAU,EAAE,GAAGA,OAAM,GAAI,UAAU,SAAY,EAAE,OAAOP,SAAQ,KAAK,EAAE,IAAI,CAAC,EAAG;AACrF,QAAM,EAAE,MAAAM,MAAK,IAAI,QAAQ;AAAA,IACvB,EAAE,IAAI,SAAS,MAAM,QAAQ;AAAA,IAC7B;AAAA,MACE,QAAQ,CAAC,IAAI,WAAW,OAAO,IAAI,WAAW,YAAY,KAAK;AAAA,MAC/D,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACA,EAAAA,MAAK,MAAM,QAAQ,MAAM;AACzB,QAAM,MAAM,MAAM,QAAQ;AAC1B,QAAM,OAAO,KAAK,QAAQ;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQA;AAAA,IACR,QAAQ,OAAOL,QAAO,cACpB,KAAM,MAAM,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,CAAC,MAAM,QAAQA,MAAK,CAAC;AAAA,EACrE;AACF;AAEA,eAAe,MACb,SACA,MACA,MAC0B;AAC1B,QAAM,EAAE,UAAU,UAAU,GAAGM,MAAK,IAAI;AACxC,QAAMH,UAAsC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAC3D,QAAM,OAAO,EAAE,GAAG,IAAI,YAAY,GAAG,GAAG,IAAI,YAAY,EAAE;AAC1D,QAAM,MAAM,CAAC,IAAW,OAAgC,CAAC,UAAsB;AAC7E,IAAAA,QAAO,EAAE,EAAE,KAAK,KAAK;AACrB,SAAK,KAAK,EAAE,EAAE,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EAC/C;AACA,QAAM,QAAQ,MAAM,QAAQ,SAAS,MAAM;AAAA,IACzC,GAAGG;AAAA,IACH,UAAU,IAAI,GAAG,QAAQ;AAAA,IACzB,UAAU,IAAI,GAAG,QAAQ;AAAA,EAC3B,CAAC;AACD,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,OAAO,CAAC,OAAc,IAAI,YAAY,EAAE,OAAOJ,QAAOC,QAAO,EAAE,CAAC,CAAC;AACvE,SAAO,EAAE,KAAK,MAAM,KAAK,QAAQ,QAAQ,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE;AACpE;AAEA,eAAe,WACb,SACA,MACA,MACyB;AACzB,QAAM,EAAE,QAAQ,GAAG,QAAQ,IAAI;AAC/B,MAAI,WAAW,UAAU;AACzB,QAAM,UAAwB,CAAC;AAC/B,QAAM,UAAU,QAAQ,cAAsB;AAC9C,QAAM,EAAE,IAAI,MAAAE,MAAK,IAAI,QAAQ;AAAA,IAC3B,EAAE,IAAI,iBAAiB,MAAM,QAAQ;AAAA,IACrC;AAAA,MACE,QAAQ,CAAC,KAAK,UAAW,WAAW,SAAS,KAAK,IAAI,QAAQ,KAAK,KAAK;AAAA,MACxE,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACA,EAAAA,MAAK,MAAM,QAAQ,MAAM;AACzB,QAAM,MAAM,MAAM,QAAQ;AAC1B,QAAM,OAAO,CAAC,WACZ,KAAK,QAAQ,KAAK,EAAE,IAAI,YAAY,UAAU,IAAI,GAAG,OAAO,CAAC,EAAE,MAAM,MAAM,MAAS;AACtF,SAAO;AAAA,IACL;AAAA,IACA,QAAQA;AAAA,IACR,IAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAOE,OAAM;AACf,iBAAWA;AACX,UAAIA,MAAM,YAAW,SAAS,QAAQ,OAAO,CAAC,EAAG,CAAAA,MAAK,KAAK;AAAA,IAC7D;AAAA,IACA,OAAO,CAAC,SAAS,KAAK,EAAE,QAAQ,SAAS,OAAOR,SAAQ,IAAI,EAAE,CAAC;AAAA,IAC/D,QAAQ,CAAC,MAAM,SAAS,KAAK,EAAE,QAAQ,UAAU,MAAM,KAAK,CAAC;AAAA,IAC7D,QAAQ,CAACC,UAAS,KAAK,EAAE,QAAQ,UAAU,QAAQA,MAAK,CAAC;AAAA,IACzD,OAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACvC;AACF;AAEA,SAAS,KAAK,SAA4B;AACxC,QAAM,KAAK,CAAC,WAAqB,SAAoB,QAAQ,KAAK,EAAE,IAAI,MAAM,QAAQ,KAAK,CAAC;AAC5F,QAAMK,QAAO,OAAO,WAAqB,SAAoB,KAAM,MAAM,GAAG,QAAQ,GAAG,IAAI;AAC3F,SAAO;AAAA,IACL,UAAU,CAAC,SAAS,GAAG,YAAY,IAAI;AAAA,IACvC,UAAU,OAAO,SAAS,IAAI,YAAY,EAAE,OAAQ,MAAM,GAAG,YAAY,IAAI,CAAgB;AAAA,IAC7F,WAAW,CAAC,MAAM,SAASA,MAAK,aAAa,MAAM,IAAI;AAAA,IACvD,MAAM,CAAC,SAAS,GAAG,QAAQ,IAAI;AAAA,IAC/B,OAAO,CAAC,SAAS,GAAG,SAAS,IAAI;AAAA,IACjC,SAAS,CAAC,SAAS,GAAG,WAAW,IAAI;AAAA,IACrC,OAAO,CAAC,SAASA,MAAK,SAAS,IAAI;AAAA,IACnC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAMA,MAAK,MAAM,MAAM,EAAE,UAAU,IAAI;AAAA,IACvD,QAAQ,CAAC,MAAM,OAAOA,MAAK,UAAU,MAAM,EAAE;AAAA,IAC7C,UAAU,CAAC,SAAS,GAAG,YAAY,IAAI;AAAA,IACvC,SAAS,CAAC,QAAQ,SAASA,MAAK,WAAW,QAAQ,IAAI;AAAA,IACvD,UAAU,CAAC,SAAS,GAAG,YAAY,IAAI;AAAA,IACvC,QAAQ,CAAC,SAAS,GAAG,UAAU,IAAI;AAAA,IACnC,MAAM,MAAM,OAAO,SAAS,UAAU;AACpC,UAAI,QAAQ,SAAS,CAAC,IAAI,GAAG;AAC3B,cAAM,IAAI;AAAA,UACR,+BAA+B,QAAQ,SAAS,KAAK,GAAG,CAAC;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AACA,YAAM,EAAE,IAAI,MAAAA,MAAK,IAAI,QAAQ,QAAQ;AAAA,QACnC,IAAI;AAAA,QACJ;AAAA,QACA,WAAW,QAAQ,cAAc;AAAA,MACnC,CAAC;AACD,cAAQ,SAAS,IAAI,IAAI,QAAQ;AACjC,UAAI;AACF,cAAMA;AAAA,MACR,SAAS,OAAO;AACd,gBAAQ,SAAS,OAAO,EAAE;AAC1B,cAAM;AAAA,MACR;AACA,aAAO;AAAA,QACL,OAAO,MAAM;AACX,cAAI,CAAC,QAAQ,SAAS,OAAO,EAAE,EAAG;AAClC,eAAK,QAAQ,KAAK,EAAE,IAAI,WAAW,OAAO,GAAG,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,QACvE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,MAAM,SAAkB,OAAe,MAAcG,MAA6B;AACzF,MAAI,QAAQ,SAAS,CAAC,IAAI,OAAO;AAC/B,WAAO,QAAQ;AAAA,MACb,IAAI;AAAA,QACF,+BAA+B,QAAQ,SAAS,KAAK,GAAG,CAAC,kBAAkB,IAAI;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAOA,KAAI;AACb;AAEA,eAAe,MACb,SACA,MACA,WACsB;AACtB,UAAQ,KAAK,EAAE,OAAO,EAAE,UAAU,UAAU,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,EAAE,CAAC;AACzE,QAAM,QAAQ;AAAA,IACZ,MACE,QAAQ;AAAA,MACN,IAAI,gBAAgB,gDAAgD,SAAS,KAAK;AAAA,IACpF;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,QAAQ,QAAQ;AAAA,EAChC,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACA,QAAM,UAAU,MAAM,SAAS,aAAa,MAAM,QAAQ;AAC1D,MAAI,SAAS;AACX,UAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,YAAQ,IAAI,KAAK;AACjB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,eAAsB,aACpB,MACA,UAAyB,CAAC,GACH;AACvB,QAAM,QAAQ,QAAQ,UAAU,OAAO,SAAa,QAAQ,SAAS,QAAQ;AAC7E,QAAM,MAAM,MAAM,SAAS,KAAK;AAChC,QAAM,UAAU,IAAI,QAAQ,MAAM,IAAI,OAAO;AAC7C,QAAM,QAAQ,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ,aAAa,GAAM;AACxE,UAAQ,WAAW,MAAM;AACzB,MAAI,MAAM,QAAQ,MAAO,MAAK,MAAM,QAAQ,MAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,gBAAgB,CAAC,CAAC;AAChG,QAAM,YAAY,IAAI;AAAA,IACpB,EAAE,aAAa,CAAC,SAAS,QAAQ,KAAK,IAAI,EAAE;AAAA,IAC5C,MAAM,UAAU;AAAA,EAClB;AACA,UAAQ,SAAS;AACjB,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,IAChB;AAAA,IACA,QAAQ,QAAQ,MAAM;AAAA,IACtB,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,QAAQ,SAAS,MAAM,IAAI;AAAA,IACvD,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,MAAM,SAAS,MAAM,IAAI;AAAA,IACnD,cAAc,CAAC,MAAM,OAAO,CAAC,MAAM,WAAW,SAAS,MAAM,IAAI;AAAA,IACjE,IAAI,MAAM,QAAQ,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,IACnC,OAAO,CAAC,SACN,MAAM,SAAS,GAAG,SAAS,MAAM,QAAQ,KAAK,EAAE,IAAI,SAAS,KAAK,CAAC,CAAC;AAAA,IACtE,QAAQ,OAAO,WACb,KAAM,MAAM,MAAM,SAAS,GAAG,UAAU,MAAM,QAAQ,KAAK,EAAE,IAAI,UAAU,OAAO,CAAC,CAAC;AAAA,IACtF,QAAQ,MACN,MAAM,SAAS,GAAG,UAAU,MAAM,QAAQ,KAAK,EAAE,IAAI,SAAS,CAAC,CAAC;AAAA,IAClE,MAAM,OAAO,KAAK,SAAS,cAAc,KAAM,MAAM,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,OAAO,CAAC;AAAA,IAC7F,OAAO,CAAC,QAAQ;AACd,YAAM,EAAE,QAAQ,GAAGF,MAAK,IAAI;AAC5B,aAAO,UAAU,MAAM,EAAE,GAAGA,OAAM,QAAQ,UAAU,IAAI,gBAAgB,EAAE,OAAO,CAAC;AAAA,IACpF;AAAA,IACA,MAAM,CAACG,aAAY,OAAO,SAASA,QAAO;AAAA,IAC1C,eAAe,CAAC,OAAOA,aAAY,cAAc,CAAC,MAAM,OAAO,SAAS,CAAC,GAAG,OAAOA,QAAO;AAAA,IAC1F,IAAI,KAAK,OAAO;AAAA,IAChB,UAAU,CAAC,MAAMA,WAAU,CAAC,MAAM,WAAW,SAAS,MAAMA,QAAO;AAAA,IACnE,MAAM,MAAM,IAAI,CAAC,GAAG;AAClB,UAAI,QAAQ,QAAS;AACrB,YAAM,QACH,KAAK,EAAE,IAAI,UAAU,GAAI,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,EAAG,CAAC,EACxD,MAAM,MAAM,MAAS;AACxB,cAAQ,IAAI,IAAI,gBAAgB,uBAAuB,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;;;A9EzdA,SAAS,cAAc,SAAyD;AAC9E,QAAM,EAAE,aAAa,aAAa,IAAI;AACtC,MAAI,iBAAiB,OAAW,QAAO,cAAc,EAAE,YAAY,IAAI,CAAC;AACxE,QAAM,OAAkB,gBAAgB,CAAC,KAAK,SAAS,MAAM,KAAK,IAAI;AACtE,SAAO;AAAA,IACL,aAAa,CAAC,KAAK,SAAS;AAC1B,YAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,cAAQ,IAAI,UAAU,YAAY;AAClC,aAAO,KAAK,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF;AACF;AAEO,SAAS,gBAAkC;AAChD,QAAM,YAAY,eAAe,EAAE,WAAW,MAAM,kBAAkB,KAAK,CAAC;AAC5E,SAAO,EAAE,GAAG,WAAW,QAAQ,EAAE,GAAG,UAAU,QAAQ,aAAa,MAAM,EAAE;AAC7E;AAEA,IAAM,aAAa;AAEnB,SAAS,WAAW,MAAoB,MAAuB,QAAiC;AAC9F,QAAM,SAAS,oBAAI,IAAmC;AACtD,QAAM,WAAW,oBAAI,IAA4D;AACjF,QAAMC,QAAO,CAACC,aAAoB;AAChC,eAAW,WAAW,CAAC,GAAG,MAAM,GAAG;AACjC,cAAQ,EAAE,SAAAA,UAAS,iBAAiB;AAAA,MAAC,EAAE,CAA4B;AAAA,IACrE;AAAA,EACF;AACA,QAAM,SAAS,SAAS,SAAY,IAAI,OAAO,IAAI;AACnD,MAAI,QAAQ;AACV,UAAM,OAAO,MAAM;AACjB,WAAK,OAAO,UAAU;AACtB,MAAAD,MAAK,UAAU;AAAA,IACjB;AACA,SAAK,IAAI,IAAI;AACb,WAAO,KAAK,QAAQ,MAAM,KAAK,OAAO,IAAI,CAAC;AAC3C,WAAO,GAAG,SAAS,CAAC,QAAQA,MAAK,OAAO,GAAG,CAAC,CAAC;AAAA,EAC/C,OAAO;AACL,eAAW,MAAMA,MAAK,UAAU,GAAG,CAAC;AAAA,EACtC;AACA,SAAO;AAAA,IACL,aAAa,CAACC,UAAS,aAAa,QAAQ,YAAYA,UAAS,QAAiB;AAAA,IAClF,iBAAiB,MAAM,SAAS;AAC9B,UAAI,SAAS,SAAS;AACpB,eAAO,IAAI,OAAO;AAClB;AAAA,MACF;AACA,YAAM,WAAW,CAAC,SAAkB,QAAQ,EAAE,KAAK,CAAiB;AACpE,eAAS,IAAI,SAAS,QAAQ;AAC9B,cAAQ,GAAG,WAAW,QAAQ;AAAA,IAChC;AAAA,IACA,oBAAoB,MAAM,SAAS;AACjC,aAAO,OAAO,OAAO;AACrB,YAAM,WAAW,SAAS,IAAI,OAAO;AACrC,UAAI,SAAU,SAAQ,IAAI,WAAW,QAAQ;AAAA,IAC/C;AAAA,IACA,WAAW,MAAM,KAAK,QAAQ,UAAU;AAAA,EAC1C;AACF;AAEA,SAAS,OAAO,IAA0C;AACxD,MAAI,CAAC,GAAI,QAAO;AAChB,QAAMC,WAAU,IAAI,YAAY;AAChC,SAAO,CAAC,UAAsB,GAAGA,SAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAC1E;AAEA,eAAsB,iBAAiB,UAA6B,CAAC,GAAwB;AAC3F,QAAM,OAAO,QAAQ,QAAQ,WAAW;AACxC,QAAM,KAAK,IAAI,OAAO,MAAM,QAAW,QAAW,EAAE,QAAQ,aAAa,IAAI,EAAE,CAAC;AAChF,QAAM,GAAG,UAAU;AACnB,QAAM,OAAO,oBAAI,IAAgB;AACjC,QAAM,UAAU,oBAAI,IAA0B;AAC9C,QAAM,UAAU,oBAAI,IAAkB;AACtC,MAAI,aAAa;AACjB,QAAM,OAAO,QAAQ,UAAU,IAAI,IAAI,4BAA4B,YAAY,GAAG;AAClF,QAAM,YAAY,QAAQ,SAAS;AACnC,QAAM,WAAW,IAAI,SAAS;AAAA,IAC5B;AAAA,IACA,aAAa,SAAS,OAAO;AAAA,IAC7B,cAAc,MAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrD,oBAAoB,MAClB;AAAA,MACE,QAAQ,gBAAgB,IAAI,IAAI,2BAA2B,YAAY,GAAG;AAAA,MAC1E;AAAA,MACA;AAAA,IACF;AAAA,IACF,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,IAC1C,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjC,GAAI,QAAQ,SAAS,SAAS,EAAE,QAAQ,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,IACpE,GAAI,QAAQ,kBAAkB,SAAY,EAAE,eAAe,QAAQ,cAAc,IAAI,CAAC;AAAA,IACtF,GAAI,QAAQ,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,IACrE,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,IACnD,GAAG,cAAc,OAAO;AAAA,IACxB,GAAI,QAAQ,MAAM,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;AAAA,IAC1C,GAAI,QAAQ,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,EACzE,CAAC;AACD,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,CAAI,SAChB,IAAI,QAAW,CAAC,SAAS,WAAW;AAClC,QAAI,WAAY,QAAO,OAAO,IAAI,MAAM,UAAU,CAAC;AACnD,YAAQ,IAAI,MAAM;AAClB,SAAK,EACF,KAAK,SAAS,MAAM,EACpB,QAAQ,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,EACzC,CAAC;AACH,QAAMA,WAAU,IAAI,YAAY;AAChC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,IAAI,MAAM,OAAO,CAAC,GAAG;AACzB,YAAM,EAAE,OAAO,UAAU,UAAU,GAAGC,MAAK,IAAI;AAC/C,YAAM,QAAQ,OAAO,QAAQ;AAC7B,YAAM,QAAQ,OAAO,QAAQ;AAC7B,YAAM,SAAS,MAAM;AAAA,QAAM,MACzB,SAAS,IAAI,MAAM;AAAA,UACjB,GAAGA;AAAA,UACH,GAAI,UAAU,SACV,EAAE,OAAO,OAAO,UAAU,WAAW,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI,MAAM,IAC7E,CAAC;AAAA,UACL,GAAI,QAAQ,EAAE,UAAU,MAAM,IAAI,CAAC;AAAA,UACnC,GAAI,QAAQ,EAAE,UAAU,MAAM,IAAI,CAAC;AAAA,QACrC,CAAC;AAAA,MACH;AACA,aAAO;AAAA,QACL,QAAQ,OAAO;AAAA,QACf,QAAQD,SAAQ,OAAO,OAAO,MAAM;AAAA,QACpC,QAAQA,SAAQ,OAAO,OAAO,MAAM;AAAA,MACtC;AAAA,IACF;AAAA,IACA,MAAM,aAAa,MAAM,OAAO,CAAC,GAAG;AAClC,YAAM,EAAE,QAAQ,GAAGC,MAAK,IAAI;AAC5B,UAAI,WAAW,UAAU;AACzB,YAAM,UAAwB,CAAC;AAC/B,YAAM,UAAU,MAAM;AAAA,QAAM,MAC1B,SAAS,aAAa,MAAM;AAAA,UAC1B,GAAGA;AAAA,UACH,QAAQ,CAAC,UAAW,WAAW,SAAS,KAAK,IAAI,QAAQ,KAAK,KAAK;AAAA,QACrE,CAAC;AAAA,MACH;AACA,aAAO;AAAA,QACL,KAAK,QAAQ;AAAA,QACb,QAAQ,MAAM,MAAM,QAAQ,MAAM;AAAA,QAClC,IAAI,SAAS;AACX,iBAAO;AAAA,QACT;AAAA,QACA,IAAI,OAAOC,OAAM;AACf,qBAAWA;AACX,cAAIA,MAAM,YAAW,SAAS,QAAQ,OAAO,CAAC,EAAG,CAAAA,MAAK,KAAK;AAAA,QAC7D;AAAA,QACA,OAAO,CAAC,SACN,QAAQ,MAAM,OAAO,SAAS,WAAW,IAAI,YAAY,EAAE,OAAO,IAAI,IAAI,IAAI;AAAA,QAChF,QAAQ,CAAC,MAAM,SAAS,QAAQ,OAAO,MAAM,IAAI;AAAA,QACjD,QAAQ,CAACC,UAAS,QAAQ,OAAO,aAAaA,KAAI,CAAC;AAAA,QACnD,OAAO,MAAM,QAAQ,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,MAAM,UAAU,MAAM,MAAM;AAC1B,YAAM,SAAS,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK;AACvD,YAAM,SAAS,GAAG,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACnD,YAAM,SAAS,GAAG,UAAU,MAAM,IAAI;AAAA,IACxC;AAAA,IACA,UAAU,OAAO,SAAS,SAAS,GAAG,eAAe,IAAI;AAAA,IACzD,OAAO,CAAC,SAAS,MAAM,MAAM,SAAS,MAAM,IAAI,CAAC;AAAA,IACjD,QAAQ,CAAC,WAAW,MAAM,YAAY,SAAS,OAAO,MAAM,CAAC;AAAA,IAC7D,QAAQ,YAAY,SAAS,OAAO,KAAK;AAAA,IACzC,WAAW,CAAC,WAAW,MAAM,YAAY,SAAS,UAAU,MAAM,CAAC;AAAA,IACnE,MAAM,UAAU;AACd,UAAI,WAAY,OAAM,IAAI,MAAM,UAAU;AAC1C,YAAM,EAAE,OAAO,MAAM,IAAI,IAAIC,gBAAe;AAC5C,YAAM,SAAS,YAAY,OAAqC;AAAA,QAC9D,UAAU,YAAY;AAAA,QACtB,QAAQ;AAAA,MACV,CAAC;AACD,cAAQ,IAAI,MAAM;AAClB,WAAK,OAAO,OAAO,KAAK,MAAM,QAAQ,OAAO,MAAM,CAAC;AACpD,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AACV,mBAAa;AACb,iBAAW,UAAU,CAAC,GAAG,OAAO,EAAG,QAAO,OAAO;AACjD,iBAAW,UAAU,CAAC,GAAG,OAAO,EAAG,QAAO,IAAI,MAAM,UAAU,CAAC;AAC/D,iBAAW,QAAQ,CAAC,GAAG,IAAI,EAAG,MAAK;AACnC,eAAS,IAAI,MAAM;AACnB,eAAS,WAAW;AAAA,IACtB;AAAA,EACF;AACF;",
|
|
6
|
+
"names": ["MessageChannel", "done", "opened", "chunk", "name", "link", "wait", "next", "name", "start", "CHUNK", "granted", "message", "chunk", "message", "next", "name", "name", "next", "headers", "fail", "start", "name", "rest", "next", "message", "MAX_LINKS", "name", "parentOf", "done", "start", "name", "parentOf", "follow", "MAX_LINKS", "link", "rest", "time", "length", "children", "moved", "ctimeMs", "within", "parentOf", "next", "name", "done", "message", "chunk", "next", "name", "length", "chunks", "message", "name", "length", "accept", "CLOSE_WAIT_MS", "done", "message", "accept", "rel", "name", "S_IFDIR", "S_IFREG", "MAX_LINKS", "missing", "children", "name", "under", "parentOf", "run", "ranged", "fail", "concat", "chunks", "chunk", "start", "done", "message", "MAX_LINKS", "within", "moved", "parentOf", "concat", "chunks", "chunk", "present", "rel", "opened", "done", "length", "follow", "message", "name", "json", "header", "header", "dispatch", "chunk", "json", "done", "run", "name", "SEND_BUFFER", "TOKEN", "NO_WEBSOCKET", "done", "canonicalHost", "name", "message", "chunked", "accept", "outbound", "concat", "contents", "start", "rest", "missing", "name", "message", "name", "stream", "rest", "next", "length", "within", "ipv6", "name", "LOOPBACK_NAMES", "name", "message", "encoder", "dropped", "utf8", "translate", "chunks", "next", "chunk", "chunks", "next", "chunk", "json", "done", "fail", "interrupted", "json", "length", "last", "start", "done", "written", "start", "length", "run", "within", "contents", "next", "ranged", "run", "parentOf", "follow", "moved", "MAX_LINKS", "link", "name", "ready", "name", "header", "process", "dispatch", "done", "name", "ready", "moved", "fsError", "message", "fsError", "codeOf", "fsError", "name", "field", "codeOf", "done", "codeOf", "fetch", "fsError", "decoder", "done", "opened", "name", "fh", "ready", "wait", "session", "readonly", "ranged", "CHUNK", "length", "chunk", "done", "name", "fsError", "next", "opened", "name", "field", "COMMAND", "encoder", "missing", "name", "set", "concat", "chunks", "chunk", "message", "rest", "module", "start", "name", "CHUNK", "length", "done", "next", "message", "opened", "name", "message", "fail", "chunk", "encoder", "latin1", "done", "header", "name", "length", "chunks", "next", "message", "encoder", "bytesOf", "name", "granted", "concat", "chunks", "chunk", "done", "rest", "next", "run", "options", "fail", "message", "decoder", "rest", "next", "name", "MessageChannel"]
|
|
7
7
|
}
|