{"version":3,"file":"state-COslRWzE.mjs","names":["segments"],"sources":["../src/dsl/ids.ts","../../../node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_u64.js","../../../node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/utils.js","../../../node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/_md.js","../../../node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/sha2.js","../../medeo-dsl/src/ids.ts","../../medeo-dsl/src/fields.ts","../../medeo-dsl/src/text.ts","../src/dsl/text.ts","../src/dsl/interpret.ts","../src/dsl/state.ts"],"sourcesContent":["/**\n * Identities the sandbox shows for what the document does not store on its own\n * (RFC 04 §7.4, §7.1): a Clip's sequence marker, and the relations a Clip or\n * Track holds as fields or Tree placement. Each is derived from the owner, so a\n * script reading the same document twice sees the same ids.\n */\nexport const markerEntityId = (clipId: string): string => `sequence-marker:${clipId}`;\n\n/** contain(timeline, track) and contain(track, clip): keyed by the contained entity, held once. */\nexport const placementId = (childId: string): string => `contain:${childId}`;\n/** contain(clip, content): the Clip's source. */\nexport const contentId = (clipId: string): string => `content:${clipId}`;\nexport const markerRelationId = (clipId: string): string => `marker:${clipId}`;\nexport const anchorId = (clipId: string): string => `clip-anchor:${clipId}`;\n","const U32_MASK64 = /* @__PURE__ */ (() => BigInt(2 ** 32 - 1))();\nconst _32n = /* @__PURE__ */ BigInt(32);\n// Split bigint into two 32-bit halves. With `le=true`, returned fields become `{ h: low, l: high\n// }` to match little-endian word order rather than the property names.\nfunction fromBig(n, le = false) {\n    if (le)\n        return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n    return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n// Split bigint list into `[highWords, lowWords]` when `le=false`; with `le=true`, the first array\n// holds the low halves because `fromBig(...)` swaps the semantic meaning of `h` and `l`.\nfunction split(lst, le = false) {\n    const len = lst.length;\n    let Ah = new Uint32Array(len);\n    let Al = new Uint32Array(len);\n    for (let i = 0; i < len; i++) {\n        const { h, l } = fromBig(lst[i], le);\n        [Ah[i], Al[i]] = [h, l];\n    }\n    return [Ah, Al];\n}\n// Combine explicit `(high, low)` 32-bit halves into a bigint; `>>> 0` normalizes signed JS\n// bitwise results back to uint32 first, and little-endian callers must swap.\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// Split a JS number into u32 halves without a BigInt allocation. Exact only for integers\n// `0 <= n < 2**53`; callers use it on byte / bit counters, which JS length math caps far below\n// that (an ArrayBuffer cannot exceed 2**53 - 1 bytes).\nconst fromNumH = (n) => (n / 2 ** 32) | 0;\nconst fromNumL = (n) => n >>> 0;\n// Drop-in replacement for `view.setBigUint64(byteOffset, BigInt(n), isLE)` without the per-call\n// BigInt allocation. Same `n < 2**53` precondition as `fromNumH`/`fromNumL`.\nfunction setU64FromNum(view, byteOffset, n, isLE) {\n    const h = fromNumH(n);\n    const l = fromNumL(n);\n    view.setUint32(byteOffset, isLE ? l : h, isLE);\n    view.setUint32(byteOffset + 4, isLE ? h : l, isLE);\n}\n// High 32-bit half of a 64-bit logical right shift for `s` in `0..31`.\nconst shrSH = (h, _l, s) => h >>> s;\n// Low 32-bit half of a 64-bit logical right shift, valid for `s` in `1..31`.\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `1..31`.\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// High 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\n// Low 32-bit half of a 64-bit right rotate, valid for `s` in `33..63`; `32` uses `rotr32*`.\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// High 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped low half.\nconst rotr32H = (_h, l) => l;\n// Low 32-bit half of a 64-bit right rotate for `s === 32`; this is just the swapped high half.\nconst rotr32L = (h, _l) => h;\n// 64-bit left rotates (rotl*) are not defined here: sha3.ts, their only consumer, keeps\n// local copies so V8 inlines them into keccakP.\n// Add two split 64-bit words and return the split `{ h, l }` sum.\n// JS uses 32-bit signed integers for bitwise operations, so we cannot simply shift the carry out\n// of the low sum and instead use division.\nfunction add(Ah, Al, Bh, Bl) {\n    const l = (Al >>> 0) + (Bl >>> 0);\n    return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\n// Unmasked low-word accumulator for 3-way addition; pass the raw result into `add3H(...)`.\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\n// High-word finalize step for 3-way addition; `low` must be the untruncated output of `add3L(...)`.\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\n// Unmasked low-word accumulator for 4-way addition; pass the raw result into `add4H(...)`.\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\n// High-word finalize step for 4-way addition; `low` must be the untruncated output of `add4L(...)`.\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\n// Unmasked low-word accumulator for 5-way addition; pass the raw result into `add5H(...)`.\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\n// High-word finalize step for 5-way addition; `low` must be the untruncated output of `add5L(...)`.\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, fromNumH, fromNumL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, setU64FromNum, shrSH, shrSL, split, toBig };\n","/**\n * Checks if something is Uint8Array. Be careful: nodejs Buffer will return true.\n * @param a - value to test\n * @returns `true` when the value is a Uint8Array-compatible view.\n * @example\n * Check whether a value is a Uint8Array-compatible view.\n * ```ts\n * isBytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function isBytes(a) {\n    // Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases.\n    // The fallback still requires a real ArrayBuffer view, so plain\n    // JSON-deserialized `{ constructor: ... }` spoofing is rejected, and\n    // `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.\n    return (a instanceof Uint8Array ||\n        (ArrayBuffer.isView(a) &&\n            a.constructor.name === 'Uint8Array' &&\n            'BYTES_PER_ELEMENT' in a &&\n            a.BYTES_PER_ELEMENT === 1));\n}\n// Shared error-message prefix builder. Only called on throw paths, so assert\n// success paths never pay for the string concatenation.\nconst atitle = (title) => (title ? `\"${title}\" ` : '');\n/**\n * Asserts something is a non-negative integer.\n * @param n - number to validate\n * @param title - label included in thrown errors\n * @returns The validated number.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate a non-negative integer option.\n * ```ts\n * anumber(32, 'length');\n * ```\n */\nexport function anumber(n, title = '') {\n    if (typeof n !== 'number')\n        throw new TypeError(atitle(title) + 'expected number, got ' + typeof n);\n    if (!Number.isSafeInteger(n) || n < 0)\n        throw new RangeError(atitle(title) + 'expected integer >= 0, got ' + n);\n    return n;\n}\n/**\n * Asserts something is a boolean.\n * @param value - value to validate\n * @param title - label included in thrown errors\n * @returns The validated boolean.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Validate a boolean option.\n * ```ts\n * abool(true, 'enableXOF');\n * ```\n */\nexport function abool(value, title = '') {\n    if (typeof value !== 'boolean')\n        throw new TypeError(atitle(title) + 'expected boolean, got type=' + typeof value);\n    return value;\n}\n/**\n * Asserts something is Uint8Array.\n * @param value - value to validate\n * @param length - optional exact length constraint\n * @param title - label included in thrown errors\n * @returns The validated byte array.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate that a value is a byte array.\n * ```ts\n * abytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function abytes(value, length, title = '') {\n    // Success path first: this runs at the start of every update() / digestInto(), and the\n    // common `abytes(data)` form must not pay for length handling it does not use.\n    if (isBytes(value) && (length === undefined || value.length === length))\n        return value;\n    // Error path: recompute freely to build the exact message.\n    if (length !== undefined)\n        anumber(length, 'length');\n    const bytes = isBytes(value);\n    const ofLen = length !== undefined ? ` of length ${length}` : '';\n    const got = bytes ? `length=${value.length}` : `type=${typeof value}`;\n    const message = atitle(title) + 'expected Uint8Array' + ofLen + ', got ' + got;\n    if (!bytes)\n        throw new TypeError(message);\n    throw new RangeError(message);\n}\n/**\n * Copies bytes into a fresh Uint8Array.\n * Buffer-style slices can alias the same backing store, so callers that need ownership should copy.\n * @param bytes - source bytes to clone\n * @returns Freshly allocated copy of `bytes`.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Clone a byte array before mutating it.\n * ```ts\n * const copy = copyBytes(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function copyBytes(bytes) {\n    // `Uint8Array.from(...)` would also accept arrays / other typed arrays. Keep this helper strict\n    // because callers use it at byte-validation boundaries before mutating the detached copy.\n    return Uint8Array.from(abytes(bytes));\n}\n/**\n * Asserts something is a wrapped hash constructor.\n * @param h - hash constructor to validate\n * @throws On wrong argument types or invalid hash wrapper shape. {@link TypeError}\n * @throws On invalid hash metadata ranges or values. {@link RangeError}\n * @throws If the hash metadata allows empty outputs or block sizes. {@link Error}\n * @example\n * Validate a callable hash wrapper.\n * ```ts\n * import { ahash } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * ahash(sha256);\n * ```\n */\nexport function ahash(h) {\n    if (typeof h !== 'function' || typeof h.create !== 'function')\n        throw new TypeError('expected hash wrapped by utils.createHasher');\n    anumber(h.outputLen);\n    anumber(h.blockLen);\n    // HMAC and KDF callers treat these as real byte lengths; allowing zero lets fake wrappers pass\n    // validation and can produce empty outputs instead of failing fast.\n    if (h.outputLen < 1 || h.blockLen < 1)\n        throw new Error('hash blockLen / outputLen must be >= 1');\n}\nconst aobject = (value, label) => {\n    if (value === null || typeof value !== 'object' || Array.isArray(value))\n        throw new TypeError((label === 'object' ? '' : `\"${label}\" `) + 'expected object, got type=' + typeof value);\n};\nconst aopts = (value, label) => {\n    aobject(value, label);\n    const proto = Object.getPrototypeOf(value);\n    if (proto !== Object.prototype && proto !== null)\n        throw new TypeError(`\"${label}\" expected plain object`);\n    // Object.assign() treats an own \"__proto__\" source key as a write to the target's legacy\n    // prototype setter. Reject it before merging so inherited option values cannot be injected.\n    if (Object.hasOwn(value, '__proto__'))\n        throw new TypeError(`\"${label}.__proto__\" is not allowed`);\n};\n/**\n * Asserts a hash instance has not been destroyed or finished.\n * @param instance - hash instance to validate\n * @param checkFinished - whether to reject finalized instances\n * @throws If the hash instance has already been destroyed or finalized. {@link Error}\n * @example\n * Validate that a hash instance is still usable.\n * ```ts\n * import { aexists } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const hash = sha256.create();\n * aexists(hash);\n * ```\n */\nexport function aexists(instance, checkFinished = true) {\n    // Runs on every update()/digestInto(); the flags are library-owned booleans, so only their\n    // truthiness is checked - re-validating their type per call was pure hot-path overhead.\n    if (instance.destroyed)\n        throw new Error('hash was destroyed');\n    if (checkFinished && instance.finished)\n        throw new Error('digest() was already called');\n}\n/**\n * Asserts output is a sufficiently-sized byte array.\n * @param out - destination buffer\n * @param instance - hash instance providing output length\n * Oversized buffers are allowed; downstream code only promises to fill the first `outputLen` bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Validate a caller-provided digest buffer.\n * ```ts\n * import { aoutput } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const hash = sha256.create();\n * aoutput(new Uint8Array(hash.outputLen), hash);\n * ```\n */\nexport function aoutput(out, instance) {\n    abytes(out, undefined, 'output');\n    // `outputLen` is a library-owned readonly number; the negated comparison keeps failing fast\n    // when it is missing/NaN (comparisons with undefined/NaN are false) without an anumber() call.\n    const min = instance.outputLen;\n    if (!(out.length >= min)) {\n        throw new RangeError('\"output\" expected length >= ' + min);\n    }\n}\n/**\n * Casts a typed array view to Uint8Array.\n * @param arr - source typed array\n * @returns Uint8Array view over the same buffer.\n * @example\n * Reinterpret a typed array as bytes.\n * ```ts\n * u8(new Uint32Array([1, 2]));\n * ```\n */\nexport function u8(arr) {\n    return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/**\n * Casts a typed array view to Uint32Array.\n * `arr.byteOffset` must already be 4-byte aligned or the platform\n * Uint32Array constructor will throw.\n * @param arr - source typed array\n * @returns Uint32Array view over the same buffer.\n * @example\n * Reinterpret a byte array as 32-bit words.\n * ```ts\n * u32(new Uint8Array(8));\n * ```\n */\nexport function u32(arr) {\n    return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/**\n * Zeroizes typed arrays in place. Warning: JS provides no guarantees.\n * @param arrays - arrays to overwrite with zeros\n * @example\n * Zeroize sensitive buffers in place.\n * ```ts\n * clean(new Uint8Array([1, 2, 3]));\n * ```\n */\nexport function clean(...arrays) {\n    for (let i = 0; i < arrays.length; i++) {\n        arrays[i].fill(0);\n    }\n}\n/**\n * Creates a DataView for byte-level manipulation.\n * @param arr - source typed array\n * @returns DataView over the same buffer region.\n * @example\n * Create a DataView over an existing buffer.\n * ```ts\n * createView(new Uint8Array(4));\n * ```\n */\nexport function createView(arr) {\n    return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/**\n * Rotate-right operation for uint32 values.\n * @param word - source word\n * @param shift - shift amount in bits\n * @returns Rotated word.\n * @example\n * Rotate a 32-bit word to the right.\n * ```ts\n * rotr(0x12345678, 8);\n * ```\n */\nexport function rotr(word, shift) {\n    return (word << (32 - shift)) | (word >>> shift);\n}\n/**\n * Rotate-left operation for uint32 values.\n * @param word - source word\n * @param shift - shift amount in bits\n * @returns Rotated word.\n * @example\n * Rotate a 32-bit word to the left.\n * ```ts\n * rotl(0x12345678, 8);\n * ```\n */\nexport function rotl(word, shift) {\n    return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Whether the current platform is little-endian. */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/**\n * Byte-swap operation for uint32 values.\n * @param word - source word\n * @returns Word with reversed byte order.\n * @example\n * Reverse the byte order of a 32-bit word.\n * ```ts\n * byteSwap(0x11223344);\n * ```\n */\nexport function byteSwap(word) {\n    return (((word << 24) & 0xff000000) |\n        ((word << 8) & 0xff0000) |\n        ((word >>> 8) & 0xff00) |\n        ((word >>> 24) & 0xff));\n}\n/**\n * Conditionally byte-swaps one 32-bit word on big-endian platforms.\n * @param n - source word\n * @returns Original or byte-swapped word depending on platform endianness.\n * @example\n * Normalize a 32-bit word for host endianness.\n * ```ts\n * swap8IfBE(0x11223344);\n * ```\n */\nexport const swap8IfBE = isLE\n    ? (n) => n\n    : (n) => byteSwap(n) >>> 0;\n/**\n * Byte-swaps every word of a Uint32Array in place.\n * @param arr - array to mutate\n * @returns The same array after mutation; callers pass live state arrays here.\n * @example\n * Reverse the byte order of every word in place.\n * ```ts\n * byteSwap32(new Uint32Array([0x11223344]));\n * ```\n */\nexport function byteSwap32(arr) {\n    for (let i = 0; i < arr.length; i++) {\n        arr[i] = byteSwap(arr[i]);\n    }\n    return arr;\n}\n/**\n * Conditionally byte-swaps a Uint32Array on big-endian platforms.\n * @param u - array to normalize for host endianness\n * @returns Original or byte-swapped array depending on platform endianness.\n *   On big-endian runtimes this mutates `u` in place via `byteSwap32(...)`.\n * @example\n * Normalize a word array for host endianness.\n * ```ts\n * swap32IfBE(new Uint32Array([0x11223344]));\n * ```\n */\nexport const swap32IfBE = isLE\n    ? (u) => u\n    : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string.\n * Uses the built-in function when available and assumes it matches the tested\n * fallback semantics.\n * @param bytes - bytes to encode\n * @returns Lowercase hexadecimal string.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Convert bytes to lowercase hexadecimal.\n * ```ts\n * bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])); // 'cafe0123'\n * ```\n */\nexport function bytesToHex(bytes) {\n    abytes(bytes);\n    // @ts-ignore\n    if (hasHexBuiltin)\n        return bytes.toHex();\n    // pre-caching improves the speed 6x\n    let hex = '';\n    for (let i = 0; i < bytes.length; i++) {\n        hex += hexes[bytes[i]];\n    }\n    return hex;\n}\n// Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.\n// ASCII codes: '0'..'9' = 48..57, 'A'..'F' = 65..70, 'a'..'f' = 97..102.\n// prettier-ignore\nfunction asciiToBase16(ch) {\n    return ch >= 48 && ch <= 57 ? ch - 48 // '2' => 50-48\n        : ch >= 65 && ch <= 70 ? ch - (65 - 10) // 'B' => 66-(65-10)\n            : ch >= 97 && ch <= 102 ? ch - (97 - 10) // 'b' => 98-(97-10)\n                : undefined;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @param hex - hexadecimal string to decode\n * @returns Decoded bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Decode lowercase hexadecimal into bytes.\n * ```ts\n * hexToBytes('cafe0123'); // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n * ```\n */\nexport function hexToBytes(hex) {\n    if (typeof hex !== 'string')\n        throw new TypeError('hex string expected, got ' + typeof hex);\n    if (hasHexBuiltin) {\n        try {\n            return Uint8Array.fromHex(hex);\n        }\n        catch (error) {\n            if (error instanceof SyntaxError)\n                throw new RangeError(error.message);\n            throw error;\n        }\n    }\n    const hl = hex.length;\n    const al = hl / 2;\n    if (hl % 2)\n        throw new RangeError('hex string expected, got unpadded hex of length ' + hl);\n    const array = new Uint8Array(al);\n    for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n        const n1 = asciiToBase16(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n        const n2 = asciiToBase16(hex.charCodeAt(hi + 1)); // parse second char\n        if (n1 === undefined || n2 === undefined) {\n            const char = hex[hi] + hex[hi + 1];\n            throw new RangeError('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n        }\n        array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n    }\n    return array;\n}\n/**\n * Yields to the host task scheduler so timers, I/O, and rendering can make progress.\n * Uses the Web Scheduling API when available or `setTimeout` as a cross-platform fallback.\n * Host-task yields are much slower than microtasks (roughly 1ms with the timer fallback), so\n * async loops should use `asyncTick >= 10` to amortize scheduling overhead to about 10% while\n * still allowing other event-loop work to proceed.\n * @param onReject - optional cleanup invoked only if the host yield fails\n * @example\n * Yield to the next scheduler tick.\n * ```ts\n * await nextTick();\n * ```\n */\nexport function nextTick(onReject) {\n    const host = globalThis;\n    if (typeof host.scheduler?.yield === 'function') {\n        const promise = host.scheduler.yield();\n        // Keep the original scheduler rejection; this handler exists only for cleanup.\n        if (onReject)\n            promise.catch(onReject);\n        return promise;\n    }\n    return new Promise((resolve) => host.setTimeout(resolve, 0));\n}\n/**\n * Returns control to the host event loop every `tick` milliseconds to avoid blocking long loops.\n * @param iters - number of loop iterations to run\n * @param tick - maximum time slice in milliseconds\n * @param cb - callback executed on each iteration\n * @param onReject - optional cleanup invoked only if a host yield fails\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @example\n * Run a loop that periodically yields back to the event loop.\n * ```ts\n * await asyncLoop(2, 0, () => {});\n * ```\n */\nexport async function asyncLoop(iters, tick, cb, onReject) {\n    anumber(iters, 'iters');\n    anumber(tick, 'tick');\n    if (typeof cb !== 'function')\n        throw new TypeError('callback must be a function');\n    // Callback is synchronous by contract; asyncLoop only yields between sync work windows.\n    let ts = Date.now();\n    for (let i = 0; i < iters; i++) {\n        cb(i);\n        // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n        const diff = Date.now() - ts;\n        if (diff >= 0 && diff < tick)\n            continue;\n        await nextTick(onReject);\n        // Track only synchronous work time; scheduler delay after yielding is outside our budget.\n        ts = Date.now();\n    }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * Built-in doesn't validate input to be string: we do the check.\n * Non-ASCII details are delegated to the platform `TextEncoder`.\n * @param str - string to encode\n * @returns UTF-8 encoded bytes.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Encode a string as UTF-8 bytes.\n * ```ts\n * utf8ToBytes('abc'); // Uint8Array.from([97, 98, 99])\n * ```\n */\nexport function utf8ToBytes(str) {\n    if (typeof str !== 'string')\n        throw new TypeError('string expected');\n    const encoded = new TextEncoder().encode(str);\n    try {\n        // Copy into the current realm for Firefox extension contexts. Callers that own the returned\n        // buffer can then wipe it independently of TextEncoder's temporary result.\n        return new Uint8Array(encoded); // https://bugzil.la/1681809\n    }\n    finally {\n        clean(encoded);\n    }\n}\n/**\n * Helper for KDFs: consumes Uint8Array or string.\n * String inputs are UTF-8 encoded; byte-array inputs stay aliased to the caller buffer.\n * @param data - user-provided KDF input\n * @param errorTitle - label included in thrown errors\n * @returns Byte representation of the input.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Normalize KDF input to bytes.\n * ```ts\n * kdfInputToBytes('password');\n * ```\n */\nexport function kdfInputToBytes(data, errorTitle = '') {\n    if (typeof data === 'string')\n        return utf8ToBytes(data);\n    return abytes(data, undefined, errorTitle);\n}\n/**\n * Copies several Uint8Arrays into one.\n * @param arrays - arrays to concatenate\n * @returns Concatenated byte array.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Concatenate multiple byte arrays.\n * ```ts\n * concatBytes(new Uint8Array([1]), new Uint8Array([2]));\n * ```\n */\nexport function concatBytes(...arrays) {\n    let sum = 0;\n    for (let i = 0; i < arrays.length; i++) {\n        const a = arrays[i];\n        abytes(a);\n        sum += a.length;\n    }\n    const res = new Uint8Array(sum);\n    for (let i = 0, pad = 0; i < arrays.length; i++) {\n        const a = arrays[i];\n        res.set(a, pad);\n        pad += a.length;\n    }\n    return res;\n}\n/**\n * Validates declared required and optional field types on a plain object.\n * This walks field schemas and formats detailed errors, so avoid it on hot paths; use direct\n * one-line guards such as `abytes()`, `abool()`, or `anumber()` instead.\n * @param object - object to validate\n * @param fields - map of required field names to expected types\n * @param optFields - map of optional field names to expected types\n * @param title - label included in thrown errors\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Validate required and optional option fields.\n * ```ts\n * validateObject({ N: 1024, dkLen: 32 }, { N: 'number' }, { dkLen: 'number' });\n * ```\n */\nexport const validateObject = (object, fields = {}, optFields = {}, title = 'object') => {\n    aobject(object, title);\n    aobject(fields, 'fields');\n    aobject(optFields, 'optFields');\n    function checkField(fieldName, expectedType, isOpt) {\n        const label = title === 'object' ? `param \"${String(fieldName)}\"` : `\"${title}.${String(fieldName)}\"`;\n        // Config fields must be explicit own properties. Optional inherited values are rejected too\n        // because callers keep reading the same options object after validation.\n        const val = object[fieldName];\n        // Runtime objects such as Field instances intentionally satisfy required method slots\n        // via their shared prototype.\n        if (!Object.hasOwn(object, fieldName) &&\n            (isOpt ? val !== undefined : expectedType !== 'function')) {\n            throw new TypeError(`${label} is invalid: expected own property`);\n        }\n        if (isOpt && val === undefined)\n            return;\n        const current = typeof val;\n        if (current !== expectedType || val === null)\n            throw new TypeError(`${label} is invalid: expected ${expectedType}, got ${current}`);\n    }\n    const iter = (f, isOpt) => Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));\n    iter(fields, false);\n    iter(optFields, true);\n};\n/**\n * Merges default options and passed options.\n * @param defaults - base option object\n * @param opts - user overrides\n * @param title - label included in thrown override errors\n * @returns Fresh merged option object with a null prototype.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Merge user overrides onto default options.\n * ```ts\n * checkOpts({ dkLen: 32 }, { asyncTick: 10 });\n * ```\n */\nexport function checkOpts(defaults, opts, title = 'opts') {\n    aopts(defaults, 'defaults');\n    if (opts !== undefined)\n        aopts(opts, title);\n    // Callers read optional fields directly, so omitted values must not fall through to ambient\n    // Object.prototype pollution (for example a forged `dkLen` changing SHAKE's default output).\n    const merged = Object.assign(Object.create(null), defaults, opts);\n    return merged;\n}\n/**\n * Creates a callable hash function from a stateful class constructor.\n * @param hashCons - hash constructor or factory\n * @param info - optional metadata such as DER OID\n * @returns Frozen callable hash wrapper with `.create()`.\n *   Wrapper construction eagerly calls `hashCons(undefined)` once to read\n *   `outputLen` / `blockLen`, so constructor side effects happen at module\n *   init time.\n * @throws On wrong argument types. {@link TypeError}\n * @example\n * Wrap a stateful hash constructor into a callable helper.\n * ```ts\n * import { createHasher } from '@noble/hashes/utils.js';\n * import { sha256 } from '@noble/hashes/sha2.js';\n * const wrapped = createHasher(sha256.create, { oid: sha256.oid });\n * wrapped(new Uint8Array([1]));\n * ```\n */\nexport function createHasher(hashCons, info = {}) {\n    if (typeof hashCons !== 'function')\n        throw new TypeError('\"hashCons\" expected function, got type=' + typeof hashCons);\n    info = checkOpts({}, info, 'info');\n    const hashC = (msg, opts) => hashCons(opts)\n        .update(msg)\n        .digest();\n    const tmp = hashCons(undefined);\n    hashC.outputLen = tmp.outputLen;\n    hashC.blockLen = tmp.blockLen;\n    hashC.canXOF = tmp.canXOF;\n    hashC.create = (opts) => hashCons(opts);\n    Object.assign(hashC, info);\n    return Object.freeze(hashC);\n}\n/**\n * Cryptographically secure PRNG backed by `crypto.getRandomValues`.\n * @param bytesLength - number of random bytes to generate\n * @returns Random bytes.\n * The platform `getRandomValues()` implementation still defines any\n * single-call length cap, and this helper rejects oversize requests\n * with a stable library `RangeError` instead of host-specific errors.\n * @throws On wrong argument types. {@link TypeError}\n * @throws On wrong argument ranges or values. {@link RangeError}\n * @throws If the current runtime does not provide `crypto.getRandomValues`. {@link Error}\n * @example\n * Generate a fresh random key or nonce.\n * ```ts\n * const key = randomBytes(16);\n * ```\n */\nexport function randomBytes(bytesLength = 32) {\n    // Match the repo's other length-taking helpers instead of relying on Uint8Array coercion.\n    anumber(bytesLength, 'bytesLength');\n    const cr = typeof globalThis === 'object' ? globalThis.crypto : null;\n    if (typeof cr?.getRandomValues !== 'function')\n        throw new Error('crypto.getRandomValues must be defined');\n    // Web Cryptography API Level 2 §10.1.1:\n    // if `byteLength > 65536`, throw `QuotaExceededError`.\n    // Keep the guard explicit so callers can see the quota in code\n    // instead of discovering it by reading the spec or host errors.\n    // This wrapper surfaces the same quota as a stable library RangeError.\n    if (bytesLength > 65536)\n        throw new RangeError(`\"bytesLength\" expected <= 65536, got ${bytesLength}`);\n    return cr.getRandomValues(new Uint8Array(bytesLength));\n}\n/**\n * Creates OID metadata for NIST hashes with prefix `06 09 60 86 48 01 65 03 04 02`.\n * @param suffix - final OID byte for the selected hash.\n *   The helper accepts any byte even though only the documented NIST hash\n *   suffixes are meaningful downstream.\n * @returns Object containing the DER-encoded OID.\n * @example\n * Build OID metadata for a NIST hash.\n * ```ts\n * oidNist(0x01);\n * ```\n */\nexport const oidNist = (suffix) => ({\n    // Current NIST hashAlgs suffixes used here fit in one DER subidentifier octet.\n    // Larger suffix values would need base-128 OID encoding and a different length byte.\n    oid: Uint8Array.from([0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, suffix]),\n});\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { setU64FromNum } from \"./_u64.js\";\nimport { abytes, aexists, aoutput, createView } from \"./utils.js\";\n/**\n * Shared 32-bit conditional boolean primitive reused by SHA-256, SHA-1, and MD5 `F`.\n * Returns bits from `b` when `a` is set, otherwise from `c`.\n * The XOR form is equivalent to MD5's `F(X,Y,Z) = XY v not(X)Z` because the masked terms never\n * set the same bit.\n * @param a - selector word\n * @param b - word chosen when selector bit is set\n * @param c - word chosen when selector bit is clear\n * @returns Mixed 32-bit word.\n * @example\n * Combine three words with the shared 32-bit choice primitive.\n * ```ts\n * Chi(0xffffffff, 0x12345678, 0x87654321);\n * ```\n */\nexport function Chi(a, b, c) {\n    return (a & b) ^ (~a & c);\n}\n/**\n * Shared 32-bit majority primitive reused by SHA-256 and SHA-1.\n * Returns bits shared by at least two inputs.\n * @param a - first input word\n * @param b - second input word\n * @param c - third input word\n * @returns Mixed 32-bit word.\n * @example\n * Combine three words with the shared 32-bit majority primitive.\n * ```ts\n * Maj(0xffffffff, 0x12345678, 0x87654321);\n * ```\n */\nexport function Maj(a, b, c) {\n    return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n * Accepts only byte-aligned `Uint8Array` input, even when the underlying spec describes bit\n * strings with partial-byte tails.\n * @param blockLen - internal block size in bytes\n * @param outputLen - digest size in bytes\n * @param padOffset - trailing length field size in bytes\n * @param isLE - whether length and state words are encoded in little-endian\n * @example\n * Use a concrete subclass to get the shared Merkle-Damgard update/digest flow.\n * ```ts\n * import { _SHA1 } from '@noble/hashes/legacy.js';\n * const hash = new _SHA1();\n * hash.update(new Uint8Array([97, 98, 99]));\n * hash.digest();\n * ```\n */\nexport class HashMD {\n    blockLen;\n    outputLen;\n    canXOF = false;\n    padOffset;\n    isLE;\n    // For partial updates less than block size\n    buffer;\n    view;\n    finished = false;\n    length = 0;\n    pos = 0;\n    destroyed = false;\n    constructor(blockLen, outputLen, padOffset, isLE) {\n        this.blockLen = blockLen;\n        this.outputLen = outputLen;\n        this.padOffset = padOffset;\n        this.isLE = isLE;\n        this.buffer = new Uint8Array(blockLen);\n        this.view = createView(this.buffer);\n    }\n    update(data) {\n        aexists(this);\n        abytes(data);\n        const { view, buffer, blockLen } = this;\n        const len = data.length;\n        let processed = false;\n        for (let pos = 0; pos < len;) {\n            const take = Math.min(blockLen - this.pos, len - pos);\n            // Fast path only when there is no buffered partial block: `take === blockLen` implies\n            // `this.pos === 0`, so we can process full blocks directly from the input view.\n            if (take === blockLen) {\n                const dataView = createView(data);\n                for (; blockLen <= len - pos; pos += blockLen)\n                    this.process(dataView, pos);\n                processed = true;\n                continue;\n            }\n            // When the whole input is buffered in one go (common for short messages), passing `data`\n            // directly avoids allocating a subarray view.\n            buffer.set(pos === 0 && take === len ? data : data.subarray(pos, pos + take), this.pos);\n            this.pos += take;\n            pos += take;\n            if (this.pos === blockLen) {\n                this.process(view, 0);\n                this.pos = 0;\n                processed = true;\n            }\n        }\n        this.length += data.length;\n        // Shared schedule buffers only pick up input-derived words inside process(); if everything\n        // was buffered without processing, there is nothing to zero.\n        if (processed)\n            this.roundClean();\n        return this;\n    }\n    digestInto(out) {\n        aexists(this);\n        aoutput(out, this);\n        this.finished = true;\n        // Padding\n        // We can avoid allocation of buffer for padding completely if it\n        // was previously not allocated here. But it won't change performance.\n        const { buffer, view, blockLen, isLE } = this;\n        let { pos } = this;\n        // append the bit '1' to the message, then zero-pad the rest of the block\n        buffer[pos++] = 0b10000000;\n        buffer.fill(0, pos);\n        // we have less than padOffset left in buffer, so we cannot put length in\n        // current block, need process it and pad again\n        if (this.padOffset > blockLen - pos) {\n            this.process(view, 0);\n            buffer.fill(0);\n        }\n        // `padOffset` reserves the whole length field. For SHA-384/512 the high 64 bits stay zero from\n        // the padding fill above, and JS will overflow before user input can make that half non-zero.\n        // So we only need to write the low 64 bits here (`length * 8` only scales the exponent of an\n        // integer below 2**53, so the split inside the helper stays exact).\n        setU64FromNum(view, blockLen - 8, this.length * 8, isLE);\n        this.process(view, 0);\n        // The final block above is processed outside update(), so the shared message-schedule\n        // buffers (e.g. SHA256_W) would otherwise retain input-derived words after digest().\n        this.roundClean();\n        // digest() passes our own `buffer` as `out`; reuse its cached view instead of allocating one.\n        const oview = out === buffer ? view : createView(out);\n        const len = this.outputLen;\n        // NOTE: we do division by 4 later, which must be fused in single op with modulo by JIT\n        const outLen = len / 4;\n        const state = this.get();\n        // Subclass-misconfiguration invariant: outputLen must be 32-bit aligned and fit the state.\n        if (len % 4 || outLen > state.length)\n            throw new Error('invalid outputLen');\n        for (let i = 0; i < outLen; i++)\n            oview.setUint32(4 * i, state[i], isLE);\n    }\n    digest() {\n        const { buffer, outputLen } = this;\n        this.digestInto(buffer);\n        // Copy before destroy(): subclasses wipe `buffer` during cleanup, but `digest()` must return\n        // fresh bytes to the caller.\n        const res = buffer.slice(0, outputLen);\n        this.destroy();\n        return res;\n    }\n    _cloneIntoMeta(to) {\n        const { buffer, length, finished, destroyed, pos } = this;\n        to.destroyed = destroyed;\n        to.finished = finished;\n        to.length = length;\n        to.pos = pos;\n        // Only partial-block bytes need copying: when `length % blockLen === 0`, `pos === 0` and\n        // later `update()` / `digestInto()` overwrite `to.buffer` from the start before reading it.\n        if (pos)\n            to.buffer.set(buffer); // Avoid a hot modulo guard.\n        return to;\n    }\n    clone() {\n        return this._cloneInto();\n    }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state from RFC 6234 §6.1: the first 32 bits of the fractional parts of the\n * square roots of the first eight prime numbers. Exported as a shared table; callers must treat\n * it as read-only because constructors copy words from it by index. */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state `H(0)` from RFC 6234 §6.1. Exported as a shared table; callers must\n * treat it as read-only because constructors copy words from it by index. */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n    0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state from RFC 6234 §6.3: eight RFC 64-bit `H(0)` words stored as sixteen\n * big-endian 32-bit halves. Derived from the fractional parts of the square roots of the ninth\n * through sixteenth prime numbers. Exported as a shared table; callers must treat it as read-only\n * because constructors copy halves from it by index. */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n    0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n    0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state from RFC 6234 §6.3: eight RFC 64-bit `H(0)` words stored as sixteen\n * big-endian 32-bit halves. Derived from the fractional parts of the square roots of the first\n * eight prime numbers. Exported as a shared table; callers must treat it as read-only because\n * constructors copy halves from it by index. */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n    0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n    0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out {@link https://www.rfc-editor.org/rfc/rfc4634 | RFC 4634} and\n * {@link https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf | FIPS 180-4}.\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, oidNist, rotr } from \"./utils.js\";\n/**\n * SHA-224 / SHA-256 round constants from RFC 6234 §5.1: the first 32 bits\n * of the cube roots of the first 64 primes (2..311).\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable SHA-224 / SHA-256 message schedule buffer `W_t` from RFC 6234 §6.2 step 1. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\n/** Internal SHA-224 / SHA-256 compression engine from RFC 6234 §6.2. */\nclass SHA2_32B extends HashMD {\n    // We cannot use array here since array allows indexing by variable\n    // which means optimizer/compiler cannot use registers.\n    // Numeric initializers matter: starting the fields as `undefined` changes\n    // V8's field representation and makes sha256 3x slower (measured).\n    A = 0;\n    B = 0;\n    C = 0;\n    D = 0;\n    E = 0;\n    F = 0;\n    G = 0;\n    H = 0;\n    constructor(outputLen, IV) {\n        super(64, outputLen, 8, false);\n        this.A = IV[0] | 0;\n        this.B = IV[1] | 0;\n        this.C = IV[2] | 0;\n        this.D = IV[3] | 0;\n        this.E = IV[4] | 0;\n        this.F = IV[5] | 0;\n        this.G = IV[6] | 0;\n        this.H = IV[7] | 0;\n    }\n    get() {\n        const { A, B, C, D, E, F, G, H } = this;\n        return [A, B, C, D, E, F, G, H];\n    }\n    // prettier-ignore\n    set(A, B, C, D, E, F, G, H) {\n        this.A = A | 0;\n        this.B = B | 0;\n        this.C = C | 0;\n        this.D = D | 0;\n        this.E = E | 0;\n        this.F = F | 0;\n        this.G = G | 0;\n        this.H = H | 0;\n    }\n    _cloneInto(to) {\n        (to ||= new this.constructor()).set(...this.get());\n        return this._cloneIntoMeta(to);\n    }\n    process(view, offset) {\n        // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n        for (let i = 0; i < 16; i++, offset += 4)\n            SHA256_W[i] = view.getUint32(offset, false);\n        for (let i = 16; i < 64; i++) {\n            const W15 = SHA256_W[i - 15];\n            const W2 = SHA256_W[i - 2];\n            const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n            const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n            SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n        }\n        // Compression function main loop, 64 rounds\n        let { A, B, C, D, E, F, G, H } = this;\n        for (let i = 0; i < 64; i++) {\n            const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n            const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n            const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n            const T2 = (sigma0 + Maj(A, B, C)) | 0;\n            H = G;\n            G = F;\n            F = E;\n            E = (D + T1) | 0;\n            D = C;\n            C = B;\n            B = A;\n            A = (T1 + T2) | 0;\n        }\n        // Add the compressed chunk to the current hash value\n        A = (A + this.A) | 0;\n        B = (B + this.B) | 0;\n        C = (C + this.C) | 0;\n        D = (D + this.D) | 0;\n        E = (E + this.E) | 0;\n        F = (F + this.F) | 0;\n        G = (G + this.G) | 0;\n        H = (H + this.H) | 0;\n        this.set(A, B, C, D, E, F, G, H);\n    }\n    roundClean() {\n        clean(SHA256_W);\n    }\n    destroy() {\n        // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n        // update()/digest() callable on reused instances.\n        this.destroyed = true;\n        this.set(0, 0, 0, 0, 0, 0, 0, 0);\n        clean(this.buffer);\n    }\n}\n/** Internal SHA-256 hash class grounded in RFC 6234 §6.2. */\nexport class _SHA256 extends SHA2_32B {\n    constructor() {\n        super(32, SHA256_IV);\n    }\n}\n/** Internal SHA-224 hash class grounded in RFC 6234 §6.2 and §8.5. */\nexport class _SHA224 extends SHA2_32B {\n    constructor() {\n        super(28, SHA224_IV);\n    }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// SHA-384 / SHA-512 round constants from RFC 6234 §5.2:\n// 80 full 64-bit words split into high/low halves.\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n    '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n    '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n    '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n    '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n    '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n    '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n    '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n    '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n    '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n    '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n    '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n    '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n    '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n    '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n    '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n    '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n    '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n    '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n    '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n    '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable high-half schedule buffer for the RFC 6234 §6.4 64-bit `W_t` words.\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\n// Reusable low-half schedule buffer for the RFC 6234 §6.4 64-bit `W_t` words.\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n/** Internal SHA-384 / SHA-512 compression engine from RFC 6234 §6.4. */\nclass SHA2_64B extends HashMD {\n    // We cannot use array here since array allows indexing by variable\n    // which means optimizer/compiler cannot use registers.\n    // h -- high 32 bits, l -- low 32 bits\n    // Numeric initializers matter: starting the fields as `undefined` changes\n    // V8's field representation and slows hashing down (measured on sha256).\n    Ah = 0;\n    Al = 0;\n    Bh = 0;\n    Bl = 0;\n    Ch = 0;\n    Cl = 0;\n    Dh = 0;\n    Dl = 0;\n    Eh = 0;\n    El = 0;\n    Fh = 0;\n    Fl = 0;\n    Gh = 0;\n    Gl = 0;\n    Hh = 0;\n    Hl = 0;\n    constructor(outputLen, IV) {\n        super(128, outputLen, 16, false);\n        this.Ah = IV[0] | 0;\n        this.Al = IV[1] | 0;\n        this.Bh = IV[2] | 0;\n        this.Bl = IV[3] | 0;\n        this.Ch = IV[4] | 0;\n        this.Cl = IV[5] | 0;\n        this.Dh = IV[6] | 0;\n        this.Dl = IV[7] | 0;\n        this.Eh = IV[8] | 0;\n        this.El = IV[9] | 0;\n        this.Fh = IV[10] | 0;\n        this.Fl = IV[11] | 0;\n        this.Gh = IV[12] | 0;\n        this.Gl = IV[13] | 0;\n        this.Hh = IV[14] | 0;\n        this.Hl = IV[15] | 0;\n    }\n    // prettier-ignore\n    get() {\n        const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n        return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n    }\n    // prettier-ignore\n    set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n        this.Ah = Ah | 0;\n        this.Al = Al | 0;\n        this.Bh = Bh | 0;\n        this.Bl = Bl | 0;\n        this.Ch = Ch | 0;\n        this.Cl = Cl | 0;\n        this.Dh = Dh | 0;\n        this.Dl = Dl | 0;\n        this.Eh = Eh | 0;\n        this.El = El | 0;\n        this.Fh = Fh | 0;\n        this.Fl = Fl | 0;\n        this.Gh = Gh | 0;\n        this.Gl = Gl | 0;\n        this.Hh = Hh | 0;\n        this.Hl = Hl | 0;\n    }\n    _cloneInto(to) {\n        (to ||= new this.constructor()).set(...this.get());\n        return this._cloneIntoMeta(to);\n    }\n    process(view, offset) {\n        // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n        for (let i = 0; i < 16; i++, offset += 4) {\n            SHA512_W_H[i] = view.getUint32(offset);\n            SHA512_W_L[i] = view.getUint32((offset += 4));\n        }\n        for (let i = 16; i < 80; i++) {\n            // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n            const W15h = SHA512_W_H[i - 15] | 0;\n            const W15l = SHA512_W_L[i - 15] | 0;\n            const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n            const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n            // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n            const W2h = SHA512_W_H[i - 2] | 0;\n            const W2l = SHA512_W_L[i - 2] | 0;\n            const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n            const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n            // SHA512_W[i] = s0 + s1 + SHA512_W[i - 7] + SHA512_W[i - 16];\n            const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n            const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n            SHA512_W_H[i] = SUMh | 0;\n            SHA512_W_L[i] = SUMl | 0;\n        }\n        let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n        // Compression function main loop, 80 rounds\n        for (let i = 0; i < 80; i++) {\n            // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n            const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n            const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n            //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n            const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n            const CHIl = (El & Fl) ^ (~El & Gl);\n            // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n            // prettier-ignore\n            const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n            const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n            const T1l = T1ll | 0;\n            // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n            const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n            const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n            const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n            const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n            Hh = Gh | 0;\n            Hl = Gl | 0;\n            Gh = Fh | 0;\n            Gl = Fl | 0;\n            Fh = Eh | 0;\n            Fl = El | 0;\n            ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n            Dh = Ch | 0;\n            Dl = Cl | 0;\n            Ch = Bh | 0;\n            Cl = Bl | 0;\n            Bh = Ah | 0;\n            Bl = Al | 0;\n            const All = u64.add3L(T1l, sigma0l, MAJl);\n            Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n            Al = All | 0;\n        }\n        // Add the compressed chunk to the current hash value\n        ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n        ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n        ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n        ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n        ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n        ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n        ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n        ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n        this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n    }\n    roundClean() {\n        clean(SHA512_W_H, SHA512_W_L);\n    }\n    destroy() {\n        // HashMD callers route post-destroy usability through `destroyed`; zeroizing alone still leaves\n        // update()/digest() callable on reused instances.\n        this.destroyed = true;\n        clean(this.buffer);\n        this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n    }\n}\n/** Internal SHA-512 hash class grounded in RFC 6234 §6.3 and §6.4. */\nexport class _SHA512 extends SHA2_64B {\n    constructor() {\n        super(64, SHA512_IV);\n    }\n}\n/** Internal SHA-384 hash class grounded in RFC 6234 §6.3 and §6.4. */\nexport class _SHA384 extends SHA2_64B {\n    constructor() {\n        super(48, SHA384_IV);\n    }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See the repo-side derivation recipe in `test/misc/sha2-gen-iv.js`.\n * These IV literals are checked against that script rather than a dedicated\n * local RFC section.\n */\n/** SHA-512/224 IV derived by the SHA-512/t recipe in `test/misc/sha2-gen-iv.js` and\n * stored as sixteen big-endian 32-bit halves. */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n    0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n    0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA-512/256 IV derived by the SHA-512/t recipe in `test/misc/sha2-gen-iv.js` and\n * stored as sixteen big-endian 32-bit halves. */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n    0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n    0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n/** Internal SHA-512/224 hash class using the derived `T224_IV` and the shared\n * RFC 6234 §6.4 compression engine. */\nexport class _SHA512_224 extends SHA2_64B {\n    constructor() {\n        super(28, T224_IV);\n    }\n}\n/** Internal SHA-512/256 hash class using the derived `T256_IV` and the shared\n * RFC 6234 §6.4 compression engine. */\nexport class _SHA512_256 extends SHA2_64B {\n    constructor() {\n        super(32, T256_IV);\n    }\n}\n/**\n * SHA2-256 hash function from RFC 4634. In JS it's the fastest: even faster than Blake3. Some info:\n *\n * - Trying 2^128 hashes would get 50% chance of collision, using birthday attack.\n * - BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n * - Each sha256 hash is executing 2^18 bit operations.\n * - Good 2024 ASICs can do 200Th/sec with 3500 watts of power, corresponding to 2^36 hashes/joule.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-256.\n * ```ts\n * sha256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new _SHA256(), \n/* @__PURE__ */ oidNist(0x01));\n/**\n * SHA2-224 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-224.\n * ```ts\n * sha224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new _SHA224(), \n/* @__PURE__ */ oidNist(0x04));\n/**\n * SHA2-512 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512.\n * ```ts\n * sha512(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new _SHA512(), \n/* @__PURE__ */ oidNist(0x03));\n/**\n * SHA2-384 hash function from RFC 4634.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-384.\n * ```ts\n * sha384(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new _SHA384(), \n/* @__PURE__ */ oidNist(0x02));\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on {@link https://eprint.iacr.org/2010/548.pdf | truncated SHA512}.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512/256.\n * ```ts\n * sha512_256(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new _SHA512_256(), \n/* @__PURE__ */ oidNist(0x06));\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on {@link https://eprint.iacr.org/2010/548.pdf | truncated SHA512}.\n * @param msg - message bytes to hash\n * @param opts - Reserved hash options.\n * @returns Digest bytes.\n * @example\n * Hash a message with SHA2-512/224.\n * ```ts\n * sha512_224(new Uint8Array([97, 98, 99]));\n * ```\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new _SHA512_224(), \n/* @__PURE__ */ oidNist(0x05));\n","import { sha256 } from '@noble/hashes/sha2.js';\n\nimport type { EntityTable, RelationTable, RelationValues } from './types.ts';\n\nexport function bytesToBase64url(bytes: Uint8Array): string {\n  let binary = '';\n  for (const byte of bytes) binary += String.fromCharCode(byte);\n  return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');\n}\nexport function base64urlToBytes(value: string): Uint8Array {\n  if (!/^[A-Za-z0-9_-]+$/.test(value) || value.length % 4 === 1) throw new Error('Invalid base64url');\n  const bytes = Uint8Array.from(atob(value.replaceAll('-', '+').replaceAll('_', '/')), (c) => c.charCodeAt(0));\n  if (bytesToBase64url(bytes) !== value) throw new Error('Non-canonical base64url');\n  return bytes;\n}\nexport function tupleHash(tuple: readonly string[]): string {\n  return bytesToBase64url(sha256(new TextEncoder().encode(JSON.stringify(tuple))));\n}\nexport function resourceId(kind: 'media' | 'voice', system: string, key: string): string {\n  return `${kind}:${tupleHash([system, key])}`;\n}\nexport function relationId<K extends RelationTable>(table: K, value: RelationValues[K]): string {\n  const v = value as unknown as Record<string, string>;\n  switch (table) {\n    case 'voice-timbre-relations':\n      return `voice-timbre:${tupleHash([v.recordingId, v.voiceId])}`;\n    case 'derived-from-relations':\n      return `derived-from:${tupleHash([v.entityId, v.sourceId])}`;\n  }\n  throw new Error(`Unknown relation table: ${table}`);\n}\n/** Kinds of id a document mints: its entities', and a script segment's. */\nexport type EntityIdKind = 'timeline' | 'track' | 'clip' | 'audio-script' | 'segment' | 'phonetic-script' | 'caption';\nexport type DslIdFactory = (kind: EntityIdKind) => string;\nexport const defaultIdFactory: DslIdFactory = (kind) => `${kind}_${globalThis.crypto.randomUUID()}`;\n\nconst resourceKinds: Partial<Record<EntityTable, 'media' | 'voice'>> = {\n  'media-entities': 'media',\n  'voice-entities': 'voice',\n};\n/** A resource row's ID is derived from its locator, so one external resource is one entity. */\nexport function assertResourceIdentity(table: EntityTable, id: string, value: Record<string, unknown>): void {\n  const kind = resourceKinds[table];\n  if (kind && id !== resourceId(kind, value.system as string, value.key as string))\n    throw new Error('Resource identity does not match locator');\n}\n/** A relation row's ID is derived from its two ends. */\nexport function assertRelationIdentity(table: RelationTable, id: string, value: unknown): void {\n  if (id !== relationId(table, value as RelationValues[RelationTable]))\n    throw new Error('Relation ID does not match endpoints');\n}\n","import { Cursor } from 'loro-crdt';\n\nimport type { EntityTable, RelationTable } from './types.ts';\n\ntype Check = (value: unknown) => boolean;\ninterface Field {\n  check: Check;\n  optional?: boolean;\n}\nconst string: Check = (v) => typeof v === 'string';\nconst nonempty: Check = (v) => string(v) && (v as string).length > 0;\nconst finite: Check = (v) => typeof v === 'number' && Number.isFinite(v);\nconst fraction: Check = (v) => finite(v) && (v as number) >= 0 && (v as number) <= 1;\nconst integer: Check = (v) => typeof v === 'number' && Number.isSafeInteger(v);\nconst nonnegative: Check = (v) => integer(v) && (v as number) >= 0;\nconst positive: Check = (v) => integer(v) && (v as number) > 0;\nconst oneOf =\n  (...values: unknown[]): Check =>\n  (v) =>\n    values.includes(v);\nconst required = (check: Check): Field => ({ check });\nconst optional = (check: Check): Field => ({ check, optional: true });\nconst reservedIds = ['$cid', '__proto__', 'constructor', 'prototype'];\nconst id: Check = (v) => nonempty(v) && !reservedIds.includes(v as string);\nconst cursor: Check = (v) => v instanceof Cursor;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n  return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Cursor);\n}\nexport function assertId(value: unknown): asserts value is string {\n  if (!id(value)) throw new Error('Expected a nonempty, non-reserved ID');\n}\nexport function validLanguage(value: unknown): boolean {\n  if (typeof value !== 'string') return false;\n  if (/^x(?:-[a-z0-9]{1,8})+$/i.test(value)) return true;\n  try {\n    return value.length > 0 && Intl.getCanonicalLocales(value).length === 1;\n  } catch {\n    return false;\n  }\n}\nfunction object(fields: Record<string, Field>): Check {\n  return (v) => {\n    try {\n      checkFields(v, fields);\n      return true;\n    } catch {\n      return false;\n    }\n  };\n}\nfunction checkFields(\n  value: unknown,\n  fields: Record<string, Field>,\n  partial = false,\n): asserts value is Record<string, unknown> {\n  if (!isRecord(value)) throw new Error('Expected an object');\n  for (const key of Object.keys(value)) {\n    if (!Object.hasOwn(fields, key)) throw new Error(`Unknown field: ${key}`);\n  }\n  for (const [key, field] of Object.entries(fields)) {\n    if (partial && !Object.hasOwn(value, key)) continue;\n    const v = value[key];\n    if (v === undefined && field.optional) continue;\n    if (!field.check(v)) throw new Error(`Invalid or missing field: ${key}`);\n  }\n}\nconst styleFields: Record<string, Field> = {\n  font: optional(object({ system: required(oneOf('font-library')), key: required(nonempty) })),\n  fontSize: optional(finite),\n  fontColor: optional(string),\n  fontWeight: optional(finite),\n  entranceAnimation: optional(string),\n  entranceAnimationDurationMs: optional(nonnegative),\n  strokeColor: optional(string),\n  strokeWidth: optional(finite),\n  positionX: optional(fraction),\n  positionY: optional(fraction),\n};\nconst seqMarkerFields: Record<string, Field> = {\n  inMs: required(nonnegative),\n  outMs: required(nonnegative),\n  rate: optional((v) => finite(v) && (v as number) > 0),\n  fillTimeline: optional(oneOf(true)),\n};\n/** A sequence marker's own fields; the window being nonempty is checked where it is written. */\nexport function assertSeqMarker(value: unknown): void {\n  checkFields(value, seqMarkerFields);\n}\nconst timeAnchorFields: Record<string, Field> = {\n  to: required(id),\n  offsetMs: required(integer),\n  fallback_abs_ms: required(nonnegative),\n};\n/** A time anchor's own fields; what it points at is checked by `assertReferenceAdmitted`. */\nexport function assertTimeAnchor(value: unknown): void {\n  checkFields(value, timeAnchorFields);\n}\nconst selectionFields: Record<string, Field> = {\n  audioScriptId: required(id),\n  segmentId: required(id),\n  start: optional(cursor),\n  end: optional(cursor),\n};\n/** A whole segment, or a run inside it: both ends or neither. */\nconst segmentSelection =\n  (fields: Record<string, Field>): Check =>\n  (v) =>\n    object(fields)(v) &&\n    ((v as Record<string, unknown>).start === undefined) === ((v as Record<string, unknown>).end === undefined);\nexport function assertCaptionContent(value: unknown): void {\n  if (!segmentSelection(selectionFields)(value)) throw new Error('Invalid segment selection');\n}\nconst phonemeFields: Record<string, Field> = { ...selectionFields, phonemeScript: optional(string) };\nexport function assertPhoneme(value: unknown): void {\n  if (!segmentSelection(phonemeFields)(value)) throw new Error('Invalid phoneme');\n}\nconst segmentFields: Record<string, Field> = {\n  id: required(id),\n  text: required(string),\n  startMs: optional(nonnegative),\n  endMs: optional(nonnegative),\n};\n/** A segment's time in the medium it was read off: both ends or neither, the end not before the start. */\nconst segment: Check = (v) => {\n  if (!object(segmentFields)(v)) return false;\n  const { startMs, endMs } = v as { startMs?: number; endMs?: number };\n  return startMs === undefined ? endMs === undefined : endMs !== undefined && endMs >= startMs;\n};\n/** One segment as a script stores it; a segment added on its own is checked here, not with its row. */\nexport function assertScriptSegment(value: unknown): void {\n  if (!segment(value))\n    throw new Error('A segment is { id, text } with startMs and endMs both or neither, endMs not before startMs');\n}\n/** A script's segments: each with its own id, unique within the script. */\nconst segments: Check = (v) =>\n  Array.isArray(v) && v.every(segment) && new Set(v.map((s: { id: string }) => s.id)).size === v.length;\nconst locator = { system: required(oneOf('memota', 'memota-speech')), key: required(nonempty) };\nconst entityFields: Record<EntityTable, Record<string, Field>> = {\n  'timeline-entities': {},\n  'track-entities': {\n    role: required(oneOf('video_clip', 'speech', 'caption', 'bgm')),\n    hidden: optional((v) => typeof v === 'boolean'),\n  },\n  'clip-entities': {\n    seqMarker: required(object(seqMarkerFields)),\n    volume: optional(finite),\n    source: required(id),\n    anchor: optional(object(timeAnchorFields)),\n  },\n  'media-entities': {\n    ...locator,\n    kind: required(oneOf('video', 'audio', 'voiceover-recording', 'image')),\n    storageKey: optional(nonempty),\n    durationMs: optional(positive),\n    digest: optional(nonempty),\n  },\n  'audio-script-entities': {\n    segments: required(segments),\n    defaultLanguage: optional(validLanguage),\n    system: optional(oneOf('memota')),\n    key: optional(nonempty),\n    storageKey: optional(nonempty),\n    digest: optional(nonempty),\n  },\n  'phonetic-script-entities': {\n    // Every PhoneticScript states one once its write completes (assertPhoneticScript); a write may\n    // state it after the row, in order with the text edits its range follows.\n    phoneme: optional(segmentSelection(phonemeFields)),\n    system: optional(oneOf('memota')),\n    key: optional(nonempty),\n    storageKey: optional(nonempty),\n    digest: optional(nonempty),\n  },\n  'caption-entities': {\n    selection: optional(segmentSelection(selectionFields)),\n    text: optional(string),\n    style: optional(object(styleFields)),\n  },\n  'voice-entities': { system: required(oneOf('voice-library')), key: required(nonempty), name: optional(string) },\n};\nexport const entityTables = Object.keys(entityFields) as EntityTable[];\n/**\n * Fields stored as one encoded string: written whole, never merged field by field. A patch to one\n * is merged into the current value first, then the whole value is written.\n */\nexport const atomicFields: { readonly [K in EntityTable]?: readonly string[] } = {\n  'clip-entities': ['seqMarker', 'anchor'],\n  'phonetic-script-entities': ['phoneme'],\n  'caption-entities': ['selection'],\n};\nconst relationFields: Record<RelationTable, Record<string, Field>> = {\n  'voice-timbre-relations': { recordingId: required(id), voiceId: required(id) },\n  'derived-from-relations': { entityId: required(id), sourceId: required(id), sourceDigest: optional(nonempty) },\n};\nexport const relationTables = Object.keys(relationFields) as RelationTable[];\n\nconst fileFields = ['system', 'key', 'storageKey', 'digest'];\nconst phonemeScriptOf = (row: Record<string, unknown>) =>\n  isRecord(row.phoneme) ? (row.phoneme.phonemeScript as string | undefined) : undefined;\n/**\n * A PhoneticScript as a write leaves it: written for a segment (D181), and its phonemeScript is raw\n * content stored as its file (D178) — with text the row names that file and its digest, without\n * text it has no file, and rewritten text is a new file.\n */\nexport function assertPhoneticScript(\n  before: Record<string, unknown> | undefined,\n  after: Record<string, unknown>,\n): void {\n  if (!isRecord(after.phoneme)) throw new Error('A PhoneticScript is written for a segment of its base script');\n  if (phonemeScriptOf(after) === undefined) {\n    if (fileFields.some((field) => after[field] !== undefined))\n      throw new Error('A PhoneticScript without text has no file');\n  } else if (after.system === undefined || after.key === undefined || after.digest === undefined)\n    throw new Error('A PhoneticScript stores its phonemeScript as a file: name it by system and key with its digest');\n  // New text is a new file; keeping the old digest would claim the old file holds it.\n  if (\n    before !== undefined &&\n    phonemeScriptOf(after) !== phonemeScriptOf(before) &&\n    after.digest !== undefined &&\n    after.digest === before.digest\n  )\n    throw new Error('A rewritten phonemeScript is stored again: write its new file');\n}\n/** A transcript names the file it was read from by system and key together; its facts come with that name. */\nfunction assertTranscriptFile(row: Record<string, unknown>): void {\n  if ((row.system === undefined) !== (row.key === undefined))\n    throw new Error('A transcript names its transcription file by system and key');\n  if (row.key === undefined && (row.storageKey !== undefined || row.digest !== undefined))\n    throw new Error('A script without a transcription file has no file facts');\n}\nexport function assertEntity(table: EntityTable, value: unknown): void {\n  checkFields(value, entityFields[table]);\n  if (table === 'audio-script-entities') assertTranscriptFile(value);\n  if (table === 'media-entities') {\n    if (value.kind === 'image' && value.durationMs !== undefined) throw new Error('Image has no intrinsic duration');\n    if (value.kind !== 'image' && !positive(value.durationMs)) throw new Error('Finite media requires durationMs');\n    if (['audio', 'voiceover-recording'].includes(value.kind as string) && !nonempty(value.storageKey))\n      throw new Error('Audio requires storageKey');\n  }\n}\n/** Validate only touched fields, so an unrelated edit can proceed in a merged, invalid document. */\nexport function assertEntityPatch(table: EntityTable, patch: unknown, current: Record<string, unknown>): void {\n  if (!isRecord(patch)) throw new Error('Expected an entity patch');\n  if (table === 'audio-script-entities' && Object.hasOwn(patch, 'segments'))\n    throw new Error('Change segments with segment mutations and edit their text through the Text adapter');\n  if (\n    table === 'caption-entities' &&\n    current.style !== undefined &&\n    Object.hasOwn(patch, 'style') &&\n    patch.style === undefined\n  )\n    throw new Error('Reset individual style fields; retain the style Map');\n  if (table === 'caption-entities' && current.text !== undefined && patch.text !== undefined)\n    throw new Error('Edit Caption text through the Text adapter');\n  const next = patchRow(table, current, patch);\n  for (const key of Object.keys(patch)) {\n    const field = entityFields[table][key];\n    if (!field || (!field.optional && next[key] === undefined) || (next[key] !== undefined && !field.check(next[key])))\n      throw new Error(`Invalid patch field: ${key}`);\n  }\n  if (table === 'audio-script-entities' && fileFields.some((field) => Object.hasOwn(patch, field))) {\n    // The file a transcript was read from is where its words and times came from; it never changes.\n    if (current.key !== undefined && (next.system !== current.system || next.key !== current.key))\n      throw new Error(\"A transcript's transcription file is fixed once named\");\n    assertTranscriptFile(next);\n  }\n  if (table === 'media-entities' || table === 'voice-entities') {\n    for (const key of ['system', 'key', 'kind']) {\n      if (Object.hasOwn(patch, key) && patch[key] !== current[key])\n        throw new Error(`Resource identity field is immutable: ${key}`);\n    }\n  }\n  if (table === 'media-entities') {\n    if (Object.hasOwn(patch, 'durationMs')) {\n      if (next.kind === 'image' ? next.durationMs !== undefined : !positive(next.durationMs))\n        throw new Error('durationMs must match the media kind');\n    }\n    if (\n      Object.hasOwn(patch, 'storageKey') &&\n      ['audio', 'voiceover-recording'].includes(next.kind as string) &&\n      !nonempty(next.storageKey)\n    )\n      throw new Error('Audio requires storageKey');\n  }\n}\nexport function assertRelation(table: RelationTable, value: unknown): void {\n  checkFields(value, relationFields[table]);\n}\n\n/**\n * The row after a patch. An atomic field merges into its current value, so a partial patch keeps\n * the rest of it; an unreadable stored value is replaced instead, so writing a whole value repairs it.\n */\nexport function patchRow(\n  table: EntityTable,\n  current: Record<string, unknown>,\n  patch: Record<string, unknown>,\n): Record<string, unknown> {\n  const next = mergeFields(current, patch);\n  for (const key of atomicFields[table] ?? []) {\n    const old = current[key];\n    const value = patch[key];\n    if (value !== undefined && isRecord(old) && old.invalid === true)\n      next[key] = isRecord(value) ? mergeFields({}, value) : value;\n  }\n  return next;\n}\n\n/** Undefined deletes; nested patches retain sibling fields and an existing empty style Map. */\nexport function mergeFields(target: Record<string, unknown>, patch: Record<string, unknown>): Record<string, unknown> {\n  const result = { ...target };\n  for (const [key, value] of Object.entries(patch)) {\n    if (reservedIds.includes(key)) throw new Error(`Reserved field: ${key}`);\n    if (value === undefined) delete result[key];\n    else result[key] = isRecord(value) ? mergeFields(isRecord(result[key]) ? result[key] : {}, value) : value;\n  }\n  return result;\n}\n","import { validLanguage } from './fields.ts';\nimport type { TextDelta, TextEdit } from './types.ts';\n\nexport function assertTextOffset(text: string, at: number): void {\n  if (!Number.isSafeInteger(at) || at < 0 || at > text.length) throw new Error('Invalid UTF-16 text offset');\n  const left = text.charCodeAt(at - 1),\n    right = text.charCodeAt(at);\n  if (left >= 0xd800 && left <= 0xdbff && right >= 0xdc00 && right <= 0xdfff)\n    throw new Error('Offset splits a surrogate pair');\n}\nfunction range(text: string, start: number, end: number): void {\n  assertTextOffset(text, start);\n  assertTextOffset(text, end);\n  if (start >= end) throw new Error('Expected a nonempty text range');\n}\n/** A script marks only what language a run is written in; how to say it belongs to its phonetic script. */\nfunction assertMark(key: string, value: unknown): void {\n  if (key !== 'language') throw new Error(`Unsupported mark: ${key}`);\n  if (value !== null && !validLanguage(value)) throw new Error('Invalid language');\n}\nfunction attributes(\n  attrs: Record<string, string | number | null> | undefined,\n): Record<string, string | number | null> | undefined {\n  if (!attrs) return;\n  for (const [key, value] of Object.entries(attrs)) assertMark(key, value);\n  return { ...attrs };\n}\nfunction previewDelta(text: string, delta: TextDelta[]): { text: string; delta: TextDelta[] } {\n  let offset = 0;\n  const normalized: TextDelta[] = [];\n  for (const op of delta) {\n    const keys = Object.keys(op);\n    if (\n      keys.filter((key) => ['insert', 'retain', 'delete'].includes(key)).length !== 1 ||\n      keys.some((key) => !['insert', 'retain', 'delete', 'attributes'].includes(key))\n    )\n      throw new Error('Invalid text Delta operation');\n    if ('insert' in op) {\n      if (typeof op.insert !== 'string') throw new Error('Only text insertions are supported');\n      const attrs = attributes(op.attributes);\n      text = text.slice(0, offset) + op.insert + text.slice(offset);\n      normalized.push({ insert: op.insert, ...(attrs ? { attributes: attrs } : {}) });\n      offset += op.insert.length;\n    } else {\n      const length = 'retain' in op ? op.retain : op.delete;\n      if (!Number.isSafeInteger(length) || length < 0) throw new Error('Invalid Delta length');\n      assertTextOffset(text, offset + length);\n      if ('retain' in op) {\n        const attrs = attributes(op.attributes);\n        normalized.push({ retain: length, ...(attrs ? { attributes: attrs } : {}) });\n        offset += length;\n      } else {\n        if ('attributes' in op) throw new Error('Delete cannot have attributes');\n        text = text.slice(0, offset) + text.slice(offset + length);\n        normalized.push({ delete: length });\n      }\n    }\n  }\n  return { text, delta: normalized };\n}\nexport function prepareTextEdits(text: string, edits: readonly TextEdit[]): { edits: TextEdit[]; text: string } {\n  const prepared = edits.map<TextEdit>((edit) => {\n    switch (edit.type) {\n      case 'insert':\n        assertTextOffset(text, edit.at);\n        if (typeof edit.text !== 'string') throw new Error('Expected text');\n        text = text.slice(0, edit.at) + edit.text + text.slice(edit.at);\n        break;\n      case 'delete':\n        assertTextOffset(text, edit.at);\n        if (!Number.isSafeInteger(edit.length) || edit.length < 0) throw new Error('Invalid delete length');\n        assertTextOffset(text, edit.at + edit.length);\n        text = text.slice(0, edit.at) + text.slice(edit.at + edit.length);\n        break;\n      case 'mark':\n        range(text, edit.start, edit.end);\n        assertMark(edit.key, edit.value);\n        break;\n      case 'unmark':\n        range(text, edit.start, edit.end);\n        assertMark(edit.key, null);\n        break;\n      case 'delta': {\n        const result = previewDelta(text, edit.delta);\n        text = result.text;\n        return { type: 'delta', delta: result.delta };\n      }\n      default:\n        throw new Error('Unknown text edit');\n    }\n    return edit;\n  });\n  return { edits: prepared, text };\n}\n\n/** A segment's text with the language mark on each UTF-16 unit, or undefined where it has none. */\nexport interface MarkedText {\n  text: string;\n  langs: (string | undefined)[];\n}\n\n/** The language a whole segment carries: one shared mark on every unit, else none. */\nexport function markedLanguage(text: MarkedText): string | undefined {\n  if (!text.text.length) return undefined;\n  const first = text.langs[0];\n  for (let i = 1; i < text.text.length; i++) if (text.langs[i] !== first) return undefined;\n  return first;\n}\n\n/** Read language marks off a rich-text delta. */\nexport function langsFromDelta(delta: readonly { insert: string; attributes?: Record<string, unknown> }[]): MarkedText {\n  let text = '';\n  const langs: (string | undefined)[] = [];\n  for (const run of delta) {\n    text += run.insert;\n    const language = typeof run.attributes?.language === 'string' ? run.attributes.language : undefined;\n    for (let i = 0; i < run.insert.length; i++) langs.push(language);\n  }\n  return { text, langs };\n}\n","import type { MarkedText, TextEdit } from '@mengine/medeo-dsl';\n\nexport { langsFromDelta, markedLanguage, type MarkedText } from '@mengine/medeo-dsl';\n\n/** UTF-16 offset of the code point at `index`; `index` may be the code-point length. */\nexport function codePointOffset(text: string, index: number): number {\n  if (!Number.isSafeInteger(index) || index < 0) throw new Error('Expected a nonnegative code-point index');\n  let offset = 0;\n  for (let i = 0; i < index; i++) {\n    if (offset >= text.length) throw new Error('Code-point index is past the end of the text');\n    offset += (text.codePointAt(offset) ?? 0) > 0xffff ? 2 : 1;\n  }\n  return offset;\n}\n\n/** Code-point index of a UTF-16 offset that does not split a surrogate pair. */\nexport function codePointIndex(text: string, offset: number): number {\n  return text.slice(0, offset).length;\n}\n\n/**\n * Apply one edit to the preview, as the document will: inserted text takes the\n * mark of the unit before it, since a language mark extends after its end.\n */\nexport function applyEdit(text: MarkedText, edit: TextEdit): void {\n  switch (edit.type) {\n    case 'insert': {\n      const inherited = edit.at > 0 ? text.langs[edit.at - 1] : undefined;\n      text.text = text.text.slice(0, edit.at) + edit.text + text.text.slice(edit.at);\n      text.langs.splice(edit.at, 0, ...Array.from({ length: edit.text.length }, () => inherited));\n      break;\n    }\n    case 'delete':\n      text.text = text.text.slice(0, edit.at) + text.text.slice(edit.at + edit.length);\n      text.langs.splice(edit.at, edit.length);\n      break;\n    case 'mark':\n      for (let i = edit.start; i < edit.end; i++) text.langs[i] = edit.value;\n      break;\n    case 'unmark':\n      for (let i = edit.start; i < edit.end; i++) text.langs[i] = undefined;\n      break;\n    default:\n      throw new Error('Unsupported text edit');\n  }\n}\n\n/** The smallest replacement turning `from` into `to`: keep their common prefix and suffix. */\nexport function replacement(from: string, to: string, at = 0): TextEdit[] {\n  let prefix = 0;\n  while (prefix < from.length && prefix < to.length && from[prefix] === to[prefix]) prefix++;\n  // Never split a surrogate pair at either edge.\n  if (prefix > 0 && isHighSurrogate(from.charCodeAt(prefix - 1))) prefix--;\n  let suffix = 0;\n  while (\n    suffix < from.length - prefix &&\n    suffix < to.length - prefix &&\n    from[from.length - 1 - suffix] === to[to.length - 1 - suffix]\n  )\n    suffix++;\n  if (suffix > 0 && isLowSurrogate(from.charCodeAt(from.length - suffix))) suffix--;\n  const removed = from.length - prefix - suffix,\n    inserted = to.slice(prefix, to.length - suffix);\n  const edits: TextEdit[] = [];\n  if (removed > 0) edits.push({ type: 'delete', at: at + prefix, length: removed });\n  if (inserted.length > 0) edits.push({ type: 'insert', at: at + prefix, text: inserted });\n  return edits;\n}\n\nfunction isHighSurrogate(code: number): boolean {\n  return code >= 0xd800 && code <= 0xdbff;\n}\nfunction isLowSurrogate(code: number): boolean {\n  return code >= 0xdc00 && code <= 0xdfff;\n}\n\n/**\n * Where a selection endpoint lands after an edit, following the document's\n * Cursors: each sticks to the unit after it, so text inserted at an endpoint\n * lands before that unit. An insertion at a selection's start therefore stays\n * outside it, and one at its end joins it.\n */\nexport function shiftOffset(offset: number, edit: TextEdit): number {\n  if (edit.type === 'insert') return edit.at <= offset ? offset + edit.text.length : offset;\n  if (edit.type === 'delete') {\n    if (edit.at >= offset) return offset;\n    return Math.max(edit.at, offset - edit.length);\n  }\n  return offset;\n}\n","import type { SandboxContract } from '@mengine/medeo-dsl';\n\nimport { anchorId, contentId, markerRelationId, placementId } from './ids.ts';\nimport type { CaptionState, SelectionState, WorkingState } from './state.ts';\nimport { codePointIndex, markedLanguage } from './text.ts';\n\ntype Entity = SandboxContract.Entity;\ntype Relation = SandboxContract.Relation;\ntype Segment = SandboxContract.ScriptSegment;\n\n/**\n * Interpretation (RFC 04 §8): the working state as the entities and relations a\n * script reads. Variants read assembled — a base's fields come with them.\n */\nexport function interpret(state: WorkingState): { entities: Entity[]; relations: Relation[] } {\n  const entities: Entity[] = [];\n  const add = (entityId: string, entityKind: SandboxContract.EntityKind, payload: object) =>\n    entities.push({ entityId, entityKind, payload } as Entity);\n  add(state.timelineId, 'timeline', {});\n  for (const [id, track] of state.tracks) add(id, 'track', { ...track });\n  for (const [id, clip] of state.clips) add(id, 'clip', { ...clip });\n  for (const [id, marker] of state.markers) add(id, 'sequence-marker', { ...marker });\n  for (const [id, media] of state.media) {\n    const { kind, ...file } = media;\n    add(id, kind, { ...file, durationMs: 'durationMs' in media ? media.durationMs : null });\n  }\n  for (const [id, voice] of state.voices) add(id, 'voice', { voice: { ...voice } });\n  for (const [id, script] of state.scripts)\n    add(id, 'audio-script', { ...script.file, segments: segments(state, id) ?? [] });\n  for (const [id, phonetic] of state.phonetics) {\n    const base = segments(state, phonetic.audioScriptId);\n    const selection = phonetic.selection && selectionOf(state, phonetic.selection);\n    add(id, 'phonetic-script', {\n      bases: [phonetic.audioScriptId],\n      ...(selection ? { selection } : {}),\n      ...(phonetic.phonemeScript === undefined ? {} : { phonemeScript: phonetic.phonemeScript }),\n      ...(base ? { segments: base } : {}),\n    });\n  }\n  for (const [id, caption] of state.captions) add(id, 'caption', captionPayload(state, caption));\n  return { entities, relations: relations(state) };\n}\n\nexport function segments(state: WorkingState, scriptId: string): Segment[] | undefined {\n  const script = state.scripts.get(scriptId);\n  if (!script) return;\n  return script.segments.map((segment) => {\n    const language = markedLanguage(segment);\n    return {\n      text: segment.text,\n      ...(language === undefined ? {} : { language }),\n      ...(segment.startMs === undefined ? {} : { startMs: segment.startMs, endMs: segment.endMs }),\n    };\n  });\n}\n\n/** A selection as the contract states it: a segment by index, and a code-point range when it selects a run. */\nexport function selectionOf(\n  state: WorkingState,\n  selection: SelectionState,\n): { segment: number; textRange?: { start: number; end: number } } | undefined {\n  const all = state.scripts.get(selection.audioScriptId)?.segments ?? [];\n  const segment = all.findIndex((s) => s.id === selection.segmentId);\n  if (segment < 0) return;\n  if (selection.start === undefined || selection.end === undefined) return { segment };\n  const text = all[segment].text;\n  return {\n    segment,\n    textRange: { start: codePointIndex(text, selection.start), end: codePointIndex(text, selection.end) },\n  };\n}\n\nfunction captionPayload(state: WorkingState, caption: CaptionState): object {\n  const base = caption.selection?.audioScriptId ?? caption.unresolved?.audioScriptId;\n  const selection = caption.selection && selectionOf(state, caption.selection);\n  const baseSegments = base === undefined ? undefined : segments(state, base);\n  return {\n    // A Caption has no length of its own; its Clip's marker decides (D173).\n    durationMs: null,\n    bases: base === undefined ? [] : [base],\n    ...(selection ? { selection } : {}),\n    ...(caption.text === undefined ? {} : { text: caption.text }),\n    ...(caption.style === undefined ? {} : { style: structuredClone(caption.style) }),\n    ...(baseSegments ? { segments: baseSegments } : {}),\n  };\n}\n\nfunction relations(state: WorkingState): Relation[] {\n  const result: Relation[] = [];\n  const add = (relationId: string, relationKind: SandboxContract.RelationKind, from: string, to: string) =>\n    result.push({ relationId, relationKind, endpoint0EntityId: from, endpoint1EntityId: to });\n  for (const trackId of state.trackOrder) add(placementId(trackId), 'contain', state.timelineId, trackId);\n  for (const trackId of state.trackOrder)\n    for (const clipId of state.trackClips.get(trackId) ?? []) add(placementId(clipId), 'contain', trackId, clipId);\n  for (const [clipId, content] of state.clipContent) add(contentId(clipId), 'contain', clipId, content);\n  for (const [clipId, markerId] of state.clipMarker) add(markerRelationId(clipId), 'marker', clipId, markerId);\n  for (const [clipId, host] of state.clipHost) add(anchorId(clipId), 'clip-anchor', clipId, host);\n  for (const [id, row] of state.timbres) add(id, 'voice-timbre', row.recordingId, row.voiceId);\n  for (const [id, row] of state.derived) add(id, 'derived-from', row.entityId, row.sourceId);\n  return result;\n}\n","import type {\n  CaptionStyle,\n  CaptionText,\n  Media,\n  MedeoDslSnapshot,\n  RelationValues,\n  SegmentSelection,\n  StoredFile,\n  Track,\n  Voice,\n} from '@mengine/medeo-dsl';\n\nimport { markerEntityId } from './ids.ts';\nimport { langsFromDelta, type MarkedText } from './text.ts';\n\n/** A Clip's sequence marker as the sandbox holds it: the stored marker plus where the Clip starts. */\nexport interface MarkerFields {\n  inMs: number;\n  outMs: number;\n  startMs?: number;\n  rate?: number;\n  fillTimeline?: true;\n}\n\n/** A segment of a script, or a UTF-16 run of that segment's text when both ends are stated. */\nexport interface SelectionState {\n  audioScriptId: string;\n  segmentId: string;\n  start?: number;\n  end?: number;\n}\n\nexport interface CaptionState {\n  selection?: SelectionState;\n  text?: string;\n  style?: CaptionStyle;\n  /** Its stored selection no longer resolves: shown without one until a script states another. */\n  unresolved?: { audioScriptId: string };\n}\n\n/** A PhoneticScript: the segment it is written for, and what to synthesize for it. */\nexport interface PhoneticState {\n  /** Absent once the segment it was written for is gone; a script states another. */\n  selection?: SelectionState;\n  audioScriptId: string;\n  phonemeScript?: string;\n}\n\n/** A segment's text, and for a transcript's segment where it was spoken in the medium (D186). */\nexport type SegmentState = MarkedText & { id: string; startMs?: number; endMs?: number };\n/** The transcription file a transcript was read from: named by the script, its facts read from the store. */\nexport type TranscriptFile = { system: 'memota'; key: string; storageKey?: string; digest?: string };\nexport interface ScriptState {\n  segments: SegmentState[];\n  defaultLanguage?: string;\n  file?: TranscriptFile;\n}\n\n/**\n * The document in the sandbox's terms while a script runs: business entities\n * and relations over plain values, never Loro containers. Loaded from the\n * client's snapshot; the plan is the difference to the state it was loaded as.\n */\nexport interface WorkingState {\n  timelineId: string;\n  tracks: Map<string, Track>;\n  /** Tracks the Timeline contains, in order. */\n  trackOrder: string[];\n  clips: Map<string, { volume?: number }>;\n  /** The Clips each Track contains, in order. */\n  trackClips: Map<string, string[]>;\n  clipContent: Map<string, string>;\n  markers: Map<string, MarkerFields>;\n  clipMarker: Map<string, string>;\n  /**\n   * The Clip whose marker each one is, kept after the marker Relation is unlinked: in storage a\n   * marker is a field of its Clip's row, so it goes when that Clip is deleted (D188).\n   */\n  markerOwner: Map<string, string>;\n  clipHost: Map<string, string>;\n  media: Map<string, Media>;\n  voices: Map<string, Voice>;\n  scripts: Map<string, ScriptState>;\n  phonetics: Map<string, PhoneticState>;\n  /**\n   * The Memota file holding each PhoneticScript's phonemeScript. A script reads it and never\n   * writes it; text the script rewrote has none until the plan stores it.\n   */\n  phoneticFiles: Map<string, Partial<StoredFile>>;\n  captions: Map<string, CaptionState>;\n  timbres: Map<string, { recordingId: string; voiceId: string }>;\n  derived: Map<string, RelationValues['derived-from-relations']>;\n  /** Fallbacks as stored; an anchor the plan leaves alone keeps its own. */\n  fallbacks: Map<string, number>;\n}\n\nexport function loadState(snapshot: MedeoDslSnapshot): WorkingState {\n  const timelines = Object.keys(snapshot['timeline-entities']);\n  if (timelines.length !== 1) throw new Error('Expected a document with exactly one Timeline');\n  const timelineId = timelines[0];\n  const state: WorkingState = {\n    timelineId,\n    tracks: new Map(Object.entries(snapshot['track-entities']).map(([id, track]) => [id, { ...track }])),\n    trackOrder: snapshot['contain-relations'].map((node) => node.entityId),\n    clips: new Map(),\n    trackClips: new Map(\n      snapshot['contain-relations'].map((node) => [node.entityId, node.children.map((child) => child.entityId)]),\n    ),\n    clipContent: new Map(),\n    markers: new Map(),\n    clipMarker: new Map(),\n    markerOwner: new Map(),\n    clipHost: new Map(),\n    media: new Map(Object.entries(snapshot['media-entities']).map(([id, media]) => [id, { ...media }])),\n    voices: new Map(Object.entries(snapshot['voice-entities']).map(([id, voice]) => [id, { ...voice }])),\n    scripts: new Map(),\n    phonetics: new Map(\n      Object.entries(snapshot['phonetic-script-entities']).map(([id, { phoneme }]) => {\n        const selection = selectionState(phoneme, snapshot.phoneticText[id]);\n        const value: PhoneticState = { audioScriptId: phoneme.audioScriptId };\n        if (selection) value.selection = selection;\n        if (phoneme.phonemeScript !== undefined) value.phonemeScript = phoneme.phonemeScript;\n        return [id, value];\n      }),\n    ),\n    phoneticFiles: new Map(\n      Object.entries(snapshot['phonetic-script-entities']).flatMap(([id, { phoneme: _, ...file }]) =>\n        file.key === undefined ? [] : [[id, file]],\n      ),\n    ),\n    captions: new Map(),\n    timbres: new Map(Object.entries(snapshot['voice-timbre-relations']).map(([id, row]) => [id, { ...row }])),\n    derived: new Map(Object.entries(snapshot['derived-from-relations']).map(([id, row]) => [id, { ...row }])),\n    fallbacks: new Map(),\n  };\n  for (const [id, clip] of Object.entries(snapshot['clip-entities'])) {\n    state.clips.set(id, clip.volume === undefined ? {} : { volume: clip.volume });\n    state.clipContent.set(id, clip.source);\n    const marker: MarkerFields = { inMs: clip.seqMarker.inMs, outMs: clip.seqMarker.outMs };\n    if (clip.seqMarker.rate !== undefined) marker.rate = clip.seqMarker.rate;\n    if (clip.seqMarker.fillTimeline) marker.fillTimeline = true;\n    if (clip.anchor) {\n      marker.startMs = clip.anchor.offsetMs;\n      state.fallbacks.set(id, clip.anchor.fallback_abs_ms);\n      if (clip.anchor.to !== timelineId) state.clipHost.set(id, clip.anchor.to);\n    }\n    state.markers.set(markerEntityId(id), marker);\n    state.clipMarker.set(id, markerEntityId(id));\n    state.markerOwner.set(markerEntityId(id), id);\n  }\n  for (const [id, script] of Object.entries(snapshot['audio-script-entities'])) {\n    const { system, key, storageKey, digest } = script;\n    state.scripts.set(id, {\n      segments: script.segments.map((segment) => {\n        const rich = snapshot.richText[segment.id];\n        const text = rich\n          ? langsFromDelta(rich.delta)\n          : { text: segment.text, langs: Array.from({ length: segment.text.length }, () => undefined) };\n        return {\n          id: segment.id,\n          ...text,\n          ...(segment.startMs === undefined ? {} : { startMs: segment.startMs, endMs: segment.endMs }),\n        };\n      }),\n      ...(script.defaultLanguage === undefined ? {} : { defaultLanguage: script.defaultLanguage }),\n      ...(system === undefined || key === undefined\n        ? {}\n        : {\n            file: {\n              system,\n              key,\n              ...(storageKey === undefined ? {} : { storageKey }),\n              ...(digest === undefined ? {} : { digest }),\n            },\n          }),\n    });\n  }\n  for (const [id, caption] of Object.entries(snapshot['caption-entities'])) {\n    const value: CaptionState =\n      caption.style === undefined ? {} : { style: structuredClone(caption.style) as CaptionStyle };\n    // A Caption's own text wins over its selection when a merge left both (D171).\n    if (caption.text !== undefined) value.text = caption.text;\n    else if (caption.selection) {\n      const selection = selectionState(caption.selection, snapshot.captionText[id]);\n      if (selection) value.selection = selection;\n      else value.unresolved = { audioScriptId: caption.selection.audioScriptId };\n    }\n    state.captions.set(id, value);\n  }\n  return state;\n}\n\n/** A stored selection as offsets of its segment's current text; undefined when it no longer resolves. */\nfunction selectionState(selection: SegmentSelection, resolved: CaptionText | undefined): SelectionState | undefined {\n  if (!resolved) return;\n  const { audioScriptId, segmentId } = selection;\n  return selection.start === undefined\n    ? { audioScriptId, segmentId }\n    : { audioScriptId, segmentId, start: resolved.start, end: resolved.end };\n}\n\nexport function cloneState(state: WorkingState): WorkingState {\n  return structuredClone(state);\n}\n"],"x_google_ignoreList":[1,2,3,4],"mappings":"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"}