@onjmin/koe 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +94 -11
- package/dist/index.js +93 -13
- package/dist/index.js.map +1 -1
- package/dist/koe-convert.js +71 -13
- package/dist/koe-worklet.js +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/converter/frq.ts","../src/converter/pitch.ts","../src/converter/pack.ts","../src/converter/parse-oto.ts","../src/converter/wav.ts","../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/converter/zip.ts","../src/koe.ts","../src/engine/voice-bank.ts","../src/engine/index.ts","../src/engine/worldline.ts"],"sourcesContent":["/**\n * UTAU `.frq` frequency-analysis files (FREQ0003). The same format OpenUtau\n * reads: an 8-byte header, hop size, then the average fundamental frequency of\n * the recording — exactly the reference pitch we need for correct resampling.\n *\n * Layout:\n * char[8] \"FREQ0003\"\n * int32 hopSize\n * float64 averageF0 ← the recorded pitch in Hz\n * byte[16] (blank)\n * int32 length\n * { float64 f0, float64 amp } × length\n */\nexport function parseFrqAverageF0(buffer: ArrayBuffer): number | null {\n\tif (buffer.byteLength < 20) return null;\n\tconst view = new DataView(buffer);\n\n\tlet header = \"\";\n\tfor (let i = 0; i < 8; i++) header += String.fromCharCode(view.getUint8(i));\n\tif (header !== \"FREQ0003\") return null;\n\n\tconst avg = view.getFloat64(12, true); // little-endian\n\treturn Number.isFinite(avg) && avg > 0 ? avg : null;\n}\n\n/** Map a WAV filename to its sibling frq filename: \"あ.wav\" → \"あ_wav.frq\". */\nexport function frqFileName(wavName: string): string {\n\tconst dot = wavName.lastIndexOf(\".\");\n\tconst base = dot >= 0 ? wavName.slice(0, dot) : wavName;\n\tconst ext = dot >= 0 ? wavName.slice(dot + 1) : \"wav\";\n\treturn `${base}_${ext}.frq`;\n}\n","const SAMPLE_RATE = 48000;\n\nconst NAME_SEMITONE: Record<string, number> = {\n\tc: 0,\n\td: 2,\n\te: 4,\n\tf: 5,\n\tg: 7,\n\ta: 9,\n\tb: 11,\n};\n\n/** Parse a note name like \"E4\", \"G#4\", \"Db5\" → frequency in Hz (null if invalid). */\nexport function noteNameToHz(name: string): number | null {\n\tconst m = /^([A-Ga-g])([#b]?)(-?\\d+)$/.exec(name);\n\tif (!m) return null;\n\tlet semi = NAME_SEMITONE[m[1].toLowerCase()];\n\tif (m[2] === \"#\") semi++;\n\telse if (m[2] === \"b\") semi--;\n\tconst midi = (parseInt(m[3], 10) + 1) * 12 + semi;\n\treturn 440 * 2 ** ((midi - 69) / 12);\n}\n\n/** Recorded pitch encoded in a multi-pitch alias suffix: \"a い_E4\" → 329.63 Hz. */\nexport function pitchFromAliasSuffix(alias: string): number | null {\n\tconst m = /_([A-Ga-g][#b]?-?\\d+)$/.exec(alias);\n\treturn m ? noteNameToHz(m[1]) : null;\n}\n\n/**\n * Estimate the fundamental frequency (Hz) of a voiced region by normalized\n * autocorrelation. Returns 0 when no clear pitch is found (unvoiced consonant,\n * silence, or a region too short to analyse).\n *\n * The signal is decimated to a lower analysis rate for speed; f0 below ~700 Hz\n * is well within the resulting Nyquist limit. A parabolic interpolation around\n * the best lag gives sub-sample (sub-semitone) accuracy.\n */\nexport function detectF0(pcm: Int16Array, start: number, end: number): number {\n\tconst DECIM = 4;\n\tconst sr = SAMPLE_RATE / DECIM; // 12 kHz analysis rate\n\tconst minLag = Math.floor(sr / 700); // highest f0 we look for\n\tconst maxLag = Math.floor(sr / 70); // lowest f0 we look for\n\n\tconst outLen = Math.floor((end - start) / DECIM);\n\tif (outLen < maxLag + 2) return 0;\n\tconst win = Math.min(outLen, 1500); // up to ~0.125 s of vowel\n\n\t// Decimate (box-average) + remove DC, and build a prefix sum of squares so\n\t// each lag's window energy is O(1).\n\tconst buf = new Float32Array(win);\n\tlet mean = 0;\n\tfor (let i = 0; i < win; i++) {\n\t\tlet s = 0;\n\t\tconst base = start + i * DECIM;\n\t\tfor (let j = 0; j < DECIM; j++) s += pcm[base + j];\n\t\tbuf[i] = s;\n\t\tmean += s;\n\t}\n\tmean /= win;\n\n\tconst sq = new Float64Array(win + 1);\n\tfor (let i = 0; i < win; i++) {\n\t\tbuf[i] -= mean;\n\t\tsq[i + 1] = sq[i] + buf[i] * buf[i];\n\t}\n\tif (sq[win] < 1) return 0; // effectively silent\n\n\t// Normalized autocorrelation: 2·r(lag) / (E[0..n] + E[lag..lag+n]) ∈ [-1, 1].\n\tconst norm = (lag: number): number => {\n\t\tconst n = win - lag;\n\t\tlet r = 0;\n\t\tfor (let i = 0; i < n; i++) r += buf[i] * buf[i + lag];\n\t\tconst e = sq[n] + (sq[lag + n] - sq[lag]);\n\t\treturn e > 0 ? (2 * r) / e : 0;\n\t};\n\n\tlet bestLag = -1;\n\tlet best = 0;\n\tfor (let lag = minLag; lag <= maxLag; lag++) {\n\t\tconst v = norm(lag);\n\t\tif (v > best) {\n\t\t\tbest = v;\n\t\t\tbestLag = lag;\n\t\t}\n\t}\n\tif (bestLag < 1 || best < 0.4) return 0; // unvoiced / no clear period\n\n\t// Parabolic interpolation around the peak\n\tconst y0 = norm(bestLag - 1);\n\tconst y1 = best;\n\tconst y2 = norm(bestLag + 1);\n\tconst denom = y0 - 2 * y1 + y2;\n\tconst shift = denom !== 0 ? (0.5 * (y0 - y2)) / denom : 0;\n\n\treturn sr / (bestLag + shift);\n}\n","import type { Manifest, PhonemeEntry } from \"../types.js\";\nimport type { OtoEntry } from \"./parse-oto.js\";\nimport { detectF0 } from \"./pitch.js\";\n\nconst TARGET_RATE = 48000;\n\nfunction msToSamples(ms: number): number {\n\treturn Math.round((ms / 1000) * TARGET_RATE);\n}\n\nconst clamp = (v: number, lo: number, hi: number) =>\n\tMath.max(lo, Math.min(hi, v));\n\nexport interface PackInput {\n\toto: OtoEntry;\n\t/** Full normalized PCM of the source WAV (48kHz / 16bit / mono) */\n\tpcm: Int16Array;\n\t/** Known recorded pitch in Hz (e.g. from the .frq file). 0/undefined → auto-detect. */\n\trecordedPitch?: number;\n}\n\nexport interface PackOutput {\n\tmanifest: Manifest;\n\t/** Raw PCM blob — Int16 / 48kHz / mono */\n\tbin: ArrayBuffer;\n}\n\nexport interface TrimmedPhoneme {\n\t/** PCM trimmed to the oto region [offset, cutoff] */\n\tpcm: Int16Array;\n\t/** Manifest params relative to the trimmed start (sample 0 = oto offset) */\n\tentry: Omit<PhonemeEntry, \"offset\">;\n}\n\n/**\n * Cut the full WAV PCM down to its usable oto region and recompute parameters\n * relative to the trimmed start.\n *\n * UTAU oto.ini values are all in ms and measured from `offset` (the left blank),\n * except `cutoff` (right blank):\n * - cutoff >= 0 : measured from the END of the file\n * - cutoff < 0 : region length from offset = |cutoff|\n *\n * After trimming, sample 0 == oto offset, so pre/overlap/consonant carry over\n * unchanged (just converted to samples), and the slice length is the region end.\n */\nexport function trimToOto(\n\tpcm: Int16Array,\n\toto: OtoEntry,\n\trecordedPitch = 0,\n): TrimmedPhoneme {\n\tconst full = pcm.length;\n\n\tconst start = clamp(msToSamples(oto.offset), 0, full);\n\tconst end =\n\t\toto.cutoff < 0\n\t\t\t? clamp(start + msToSamples(-oto.cutoff), start, full)\n\t\t\t: clamp(full - msToSamples(oto.cutoff), start, full);\n\n\tconst slice = pcm.subarray(start, end);\n\tconst length = slice.length;\n\n\tconst pre = clamp(msToSamples(oto.pre), 0, length);\n\tconst overlap = clamp(msToSamples(oto.overlap), 0, length);\n\tconst consonant = clamp(msToSamples(oto.consonant), 0, length);\n\n\t// Prefer the known recorded pitch (from the .frq file or alias suffix); only\n\t// fall back to autocorrelation on the sustained vowel when none is available.\n\tconst pitch =\n\t\trecordedPitch > 0\n\t\t\t? recordedPitch\n\t\t\t: detectF0(\n\t\t\t\t\tslice,\n\t\t\t\t\tMath.min(Math.max(pre, consonant), Math.max(0, length - 1)),\n\t\t\t\t\tlength,\n\t\t\t\t);\n\n\treturn {\n\t\tpcm: slice,\n\t\tentry: { length, pre, overlap, consonant, pitch },\n\t};\n}\n\n/**\n * Pack normalized PCM phonemes into voice.bin + manifest.json.\n * Each phoneme is trimmed to its oto region first.\n * Duplicate aliases are silently overwritten by the later entry.\n */\nexport function pack(inputs: PackInput[], referencePitch = 220): PackOutput {\n\tconst phonemes: Record<string, PhonemeEntry> = {};\n\tconst chunks: Int16Array[] = [];\n\tlet byteOffset = 0;\n\n\tfor (const { oto, pcm, recordedPitch } of inputs) {\n\t\tconst { pcm: slice, entry } = trimToOto(pcm, oto, recordedPitch);\n\t\tif (slice.length === 0) continue;\n\n\t\tphonemes[oto.alias] = { offset: byteOffset, ...entry };\n\t\tbyteOffset += slice.byteLength;\n\t\tchunks.push(slice);\n\t}\n\n\tconst bin = new ArrayBuffer(byteOffset);\n\tconst view = new Uint8Array(bin);\n\tlet pos = 0;\n\tfor (const chunk of chunks) {\n\t\tview.set(\n\t\t\tnew Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength),\n\t\t\tpos,\n\t\t);\n\t\tpos += chunk.byteLength;\n\t}\n\n\tconst manifest: Manifest = {\n\t\tsampleRate: 48000,\n\t\treferencePitch,\n\t\tphonemes,\n\t};\n\n\treturn { manifest, bin };\n}\n","export interface OtoEntry {\n\t/** Source WAV filename */\n\twav: string;\n\t/** Phoneme alias */\n\talias: string;\n\t/** Left blank — offset from WAV start (ms) */\n\toffset: number;\n\t/** Consonant portion end from offset (ms) */\n\tconsonant: number;\n\t/** Right blank — negative = from WAV end, positive = from offset (ms) */\n\tcutoff: number;\n\t/** Preutterance from offset (ms) */\n\tpre: number;\n\t/** Overlap / crossfade region (ms) */\n\toverlap: number;\n}\n\n/**\n * Parse oto.ini content (already decoded to UTF-8 string).\n * Silently skips malformed lines.\n */\nexport function parseOto(content: string): OtoEntry[] {\n\tconst entries: OtoEntry[] = [];\n\n\tfor (const raw of content.split(/\\r?\\n/)) {\n\t\tconst line = raw.trim();\n\t\tif (!line || line.startsWith(\"#\")) continue;\n\n\t\tconst eq = line.indexOf(\"=\");\n\t\tif (eq === -1) continue;\n\n\t\tconst wav = line.slice(0, eq).trim();\n\t\tconst parts = line.slice(eq + 1).split(\",\");\n\t\tif (parts.length < 6) continue;\n\n\t\tconst [alias, offsetStr, consonantStr, cutoffStr, preStr, overlapStr] =\n\t\t\tparts;\n\t\t// Empty alias → use filename without extension (UTAU spec default)\n\t\tconst aliasStr = alias.trim() || wav.replace(/\\.[^.]+$/, \"\");\n\t\tconst entry: OtoEntry = {\n\t\t\twav,\n\t\t\talias: aliasStr,\n\t\t\toffset: parseFloat(offsetStr) || 0,\n\t\t\tconsonant: parseFloat(consonantStr) || 0,\n\t\t\tcutoff: parseFloat(cutoffStr) || 0,\n\t\t\tpre: parseFloat(preStr) || 0,\n\t\t\toverlap: parseFloat(overlapStr) || 0,\n\t\t};\n\n\t\tif (!entry.alias) continue;\n\t\tentries.push(entry);\n\t}\n\n\treturn entries;\n}\n","export interface WavData {\n\tsampleRate: number;\n\tchannels: number;\n\t/** Normalized samples in [-1, 1], interleaved if multi-channel */\n\tsamples: Float32Array;\n}\n\n/** Parse a WAV file from an ArrayBuffer. Supports PCM 8/16/24-bit and IEEE float 32-bit. */\nexport function parseWav(buf: ArrayBuffer): WavData {\n\tconst view = new DataView(buf);\n\n\tconst riff = readFourCC(view, 0);\n\tif (riff !== \"RIFF\") throw new Error(`Not a RIFF file (got \"${riff}\")`);\n\n\tlet sampleRate = 0;\n\tlet channels = 0;\n\tlet bitsPerSample = 0;\n\tlet audioFormat = 1;\n\tlet dataOffset = 0;\n\tlet dataLength = 0;\n\n\tlet pos = 12;\n\twhile (pos < view.byteLength - 8) {\n\t\tconst id = readFourCC(view, pos);\n\t\tconst size = view.getUint32(pos + 4, true);\n\t\tpos += 8;\n\n\t\tif (id === \"fmt \") {\n\t\t\taudioFormat = view.getUint16(pos, true);\n\t\t\tchannels = view.getUint16(pos + 2, true);\n\t\t\tsampleRate = view.getUint32(pos + 4, true);\n\t\t\tbitsPerSample = view.getUint16(pos + 14, true);\n\t\t\t// WAVE_FORMAT_EXTENSIBLE: the real format code is the first 2 bytes of\n\t\t\t// the SubFormat GUID in the extension.\n\t\t\tif (audioFormat === 0xfffe && size >= 40) {\n\t\t\t\taudioFormat = view.getUint16(pos + 24, true);\n\t\t\t}\n\t\t} else if (id === \"data\") {\n\t\t\tdataOffset = pos;\n\t\t\t// Clamp to the actual file size — a corrupt chunk header could otherwise\n\t\t\t// send sample reads past the end of the buffer.\n\t\t\tdataLength = Math.min(size, view.byteLength - pos);\n\t\t\tbreak;\n\t\t}\n\n\t\tpos += size + (size & 1);\n\t}\n\n\tif (!dataOffset) throw new Error(\"WAV has no data chunk\");\n\tif (!channels || !sampleRate) throw new Error(\"WAV fmt chunk missing\");\n\n\t// Reject anything the sample loop below cannot decode — falling through\n\t// would silently produce all-zero (silent) audio.\n\tconst supported =\n\t\t(audioFormat === 3 && bitsPerSample === 32) ||\n\t\t(audioFormat === 1 &&\n\t\t\t(bitsPerSample === 8 || bitsPerSample === 16 || bitsPerSample === 24));\n\tif (!supported) {\n\t\tthrow new Error(\n\t\t\t`Unsupported WAV format ${audioFormat} / ${bitsPerSample}-bit (need PCM 8/16/24-bit or IEEE float 32-bit)`,\n\t\t);\n\t}\n\n\tconst bytesPerSample = bitsPerSample >> 3;\n\tconst totalSamples = Math.floor(dataLength / bytesPerSample);\n\tconst samples = new Float32Array(totalSamples);\n\n\tfor (let i = 0; i < totalSamples; i++) {\n\t\tconst p = dataOffset + i * bytesPerSample;\n\t\tif (audioFormat === 3) {\n\t\t\tsamples[i] = view.getFloat32(p, true);\n\t\t} else if (bitsPerSample === 8) {\n\t\t\tsamples[i] = (view.getUint8(p) - 128) / 128;\n\t\t} else if (bitsPerSample === 16) {\n\t\t\tsamples[i] = view.getInt16(p, true) / 32768;\n\t\t} else if (bitsPerSample === 24) {\n\t\t\tconst lo = view.getUint8(p) | (view.getUint8(p + 1) << 8);\n\t\t\tlet hi = view.getUint8(p + 2);\n\t\t\tif (hi & 0x80) hi = hi | 0xffffff00;\n\t\t\tsamples[i] = ((hi << 16) | lo) / 8388608;\n\t\t}\n\t}\n\n\treturn { sampleRate, channels, samples };\n}\n\n/** Mix down to mono by averaging all channels. */\nexport function toMono(wav: WavData): WavData {\n\tif (wav.channels === 1) return wav;\n\tconst len = wav.samples.length / wav.channels;\n\tconst out = new Float32Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tlet sum = 0;\n\t\tfor (let c = 0; c < wav.channels; c++)\n\t\t\tsum += wav.samples[i * wav.channels + c];\n\t\tout[i] = sum / wav.channels;\n\t}\n\treturn { sampleRate: wav.sampleRate, channels: 1, samples: out };\n}\n\n/** Linear interpolation resample to targetRate. Expects mono input. */\nexport function resample(wav: WavData, targetRate: number): WavData {\n\tif (wav.sampleRate === targetRate) return wav;\n\tconst ratio = wav.sampleRate / targetRate;\n\tconst outLen = Math.floor(wav.samples.length / ratio);\n\tconst out = new Float32Array(outLen);\n\tconst src = wav.samples;\n\tfor (let i = 0; i < outLen; i++) {\n\t\tconst x = i * ratio;\n\t\tconst xi = Math.floor(x);\n\t\tconst frac = x - xi;\n\t\tout[i] = (src[xi] ?? 0) + ((src[xi + 1] ?? 0) - (src[xi] ?? 0)) * frac;\n\t}\n\treturn { sampleRate: targetRate, channels: 1, samples: out };\n}\n\n/** Convert Float32 [-1,1] samples to Int16 PCM. */\nexport function toInt16(samples: Float32Array): Int16Array {\n\tconst out = new Int16Array(samples.length);\n\tfor (let i = 0; i < samples.length; i++) {\n\t\tout[i] = Math.round(Math.max(-1, Math.min(1, samples[i])) * 32767);\n\t}\n\treturn out;\n}\n\n/** Normalize then convert a WAV to 48kHz/16bit/mono Int16 PCM. */\nexport function normalizePcm(buf: ArrayBuffer): Int16Array {\n\tconst wav = parseWav(buf);\n\tconst mono = toMono(wav);\n\tconst resampled = resample(mono, 48000);\n\treturn toInt16(resampled.samples);\n}\n\nfunction readFourCC(view: DataView, pos: number): string {\n\treturn String.fromCharCode(\n\t\tview.getUint8(pos),\n\t\tview.getUint8(pos + 1),\n\t\tview.getUint8(pos + 2),\n\t\tview.getUint8(pos + 3),\n\t);\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import { unzipSync } from \"fflate\";\n\n/** Minimal file-like handle so zip entries can stand in for `File` objects. */\nexport interface ZipFile {\n\tarrayBuffer(): Promise<ArrayBuffer>;\n}\n\n/**\n * Extracts a zip archive into a flat path → file map, mirroring the shape of\n * `webkitdirectory` file lists so the converter can treat both sources the same.\n *\n * Many UTAU voicebank zips are packed on Windows without the UTF-8 flag, so\n * entry names are Shift_JIS bytes. fflate decodes those as latin1 (1 byte =\n * 1 code point) rather than mangling them, so we can losslessly recover the\n * original bytes and re-decode with the right encoding per entry.\n */\nexport function unzipToFileMap(\n\tdata: ArrayBuffer,\n): Promise<Record<string, ZipFile>> {\n\tconst bytes = new Uint8Array(data);\n\tconst unzipped = unzipSync(bytes);\n\tconst isUtf8ByIndex = readUtf8Flags(bytes);\n\tconst sjisDecoder = new TextDecoder(\"shift_jis\");\n\n\tconst fileMap: Record<string, ZipFile> = {};\n\tObject.keys(unzipped).forEach((rawName, i) => {\n\t\tconst fileBytes = unzipped[rawName];\n\t\tconst name = isUtf8ByIndex[i]\n\t\t\t? rawName\n\t\t\t: sjisDecoder.decode(Uint8Array.from(rawName, (c) => c.charCodeAt(0)));\n\t\tconst path = name.replace(/\\\\/g, \"/\");\n\t\tif (path.endsWith(\"/\")) return; // directory entry\n\t\tfileMap[path] = {\n\t\t\tarrayBuffer: () =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\tfileBytes.buffer.slice(\n\t\t\t\t\t\tfileBytes.byteOffset,\n\t\t\t\t\t\tfileBytes.byteOffset + fileBytes.byteLength,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t};\n\t});\n\treturn Promise.resolve(fileMap);\n}\n\n/** Walks the central directory to read the UTF-8 language flag (bit 11) of each entry, in order. */\nfunction readUtf8Flags(buf: Uint8Array): boolean[] {\n\tconst view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n\n\tlet eocd = -1;\n\tconst maxBack = Math.min(buf.length, 65557); // 22 + max comment length\n\tfor (let i = buf.length - 22; i >= buf.length - maxBack && i >= 0; i--) {\n\t\tif (view.getUint32(i, true) === 0x06054b50) {\n\t\t\teocd = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (eocd < 0) return [];\n\n\tconst entryCount = view.getUint16(eocd + 10, true);\n\tlet cdOffset = view.getUint32(eocd + 16, true);\n\n\tconst flags: boolean[] = [];\n\tfor (let i = 0; i < entryCount; i++) {\n\t\tif (view.getUint32(cdOffset, true) !== 0x02014b50) break;\n\t\tconst flag = view.getUint16(cdOffset + 8, true);\n\t\tconst nameLen = view.getUint16(cdOffset + 28, true);\n\t\tconst extraLen = view.getUint16(cdOffset + 30, true);\n\t\tconst commentLen = view.getUint16(cdOffset + 32, true);\n\t\tflags.push((flag & 0x800) !== 0);\n\t\tcdOffset += 46 + nameLen + extraLen + commentLen;\n\t}\n\treturn flags;\n}\n","import type { Manifest } from \"./types.js\";\n\n/** Magic number 'KOE\\0' (stored big-endian as 0x4B 0x4F 0x45 0x00). */\nconst MAGIC = 0x4b4f4500;\n\n/**\n * Koe Archive Format (.koe)\n * [4B] magic 'KOE\\0' (big-endian)\n * [4B] JSON length (little-endian)\n * [N ] manifest JSON (UTF-8)\n * [M ] raw PCM (Int16 / 48kHz / mono); phoneme offsets are relative to here\n */\nexport function packKoe(manifest: Manifest, pcmParts: BlobPart[]): Blob {\n\tconst json = new TextEncoder().encode(JSON.stringify(manifest));\n\tconst header = new ArrayBuffer(8);\n\tconst view = new DataView(header);\n\tview.setUint32(0, MAGIC, false); // magic, big-endian\n\tview.setUint32(4, json.byteLength, true); // json length, little-endian\n\treturn new Blob([header, json, ...pcmParts]);\n}\n\n/** Read the 8-byte header → JSON length. Throws on bad magic. */\nexport function parseKoeHeader(headerBytes: ArrayBuffer): {\n\tjsonLength: number;\n} {\n\tconst view = new DataView(headerBytes);\n\tif (view.byteLength < 8 || view.getUint32(0, false) !== MAGIC) {\n\t\tthrow new Error(\"Not a .koe file (bad magic)\");\n\t}\n\treturn { jsonLength: view.getUint32(4, true) };\n}\n\n/** Byte offset where PCM data begins, given the JSON length. */\nexport const pcmBase = (jsonLength: number): number => 8 + jsonLength;\n","import { parseKoeHeader, pcmBase } from \"../koe.js\";\nimport type { Manifest } from \"../types.js\";\n\n/**\n * Supplies raw bytes from the PCM section of a .koe archive on demand.\n * - BlobVoiceSource: slices an in-memory Blob / File (no full-buffer copy)\n * - RangeVoiceSource: HTTP Range requests against a URL (mobile-friendly)\n * `base` is the byte offset where PCM data starts (8 + jsonLength).\n */\ninterface VoiceSource {\n\treadBytes(offset: number, length: number): Promise<ArrayBuffer>;\n}\n\n/** Hard ceiling on a single phoneme's PCM size (~10.5 MB / ~55s at 48kHz). */\nconst MAX_PHONEME_SAMPLES = 5_242_880;\n/** Hard ceiling on the manifest JSON header itself. */\nconst MAX_JSON_LENGTH = 50 * 1024 * 1024;\n\nclass BlobVoiceSource implements VoiceSource {\n\tconstructor(\n\t\tprivate blob: Blob,\n\t\tprivate base: number,\n\t) {}\n\treadBytes(offset: number, length: number): Promise<ArrayBuffer> {\n\t\tconst start = this.base + offset;\n\t\treturn this.blob.slice(start, start + length).arrayBuffer();\n\t}\n}\n\nclass RangeVoiceSource implements VoiceSource {\n\tconstructor(\n\t\tprivate url: string,\n\t\tprivate base: number,\n\t) {}\n\tasync readBytes(offset: number, length: number): Promise<ArrayBuffer> {\n\t\tconst start = this.base + offset;\n\t\treturn rangeFetch(this.url, start, length);\n\t}\n}\n\nasync function rangeFetch(\n\turl: string,\n\tstart: number,\n\tlength: number,\n): Promise<ArrayBuffer> {\n\tconst res = await fetch(url, {\n\t\theaders: { Range: `bytes=${start}-${start + length - 1}` },\n\t\tcredentials: \"omit\", // never leak cookies / auth to a MML-supplied URL\n\t});\n\t// A server that ignores Range and returns 200 with the full file would\n\t// blow past the requested size and exhaust memory; only accept 206.\n\tif (res.status !== 206) {\n\t\tthrow new Error(\n\t\t\t`.koe fetch failed: expected 206 Partial Content, got ${res.status}`,\n\t\t);\n\t}\n\treturn readCapped(res, length);\n}\n\n/**\n * Read a response body without trusting its declared size: a server can answer\n * 206 yet still stream an oversized body. Abort as soon as the read exceeds\n * the requested byte count, before buffering the excess.\n */\nasync function readCapped(res: Response, length: number): Promise<ArrayBuffer> {\n\tconst reader = res.body?.getReader();\n\tif (!reader) {\n\t\tconst buf = await res.arrayBuffer();\n\t\tif (buf.byteLength > length) {\n\t\t\tthrow new Error(\n\t\t\t\t`.koe fetch failed: response exceeds requested ${length} bytes`,\n\t\t\t);\n\t\t}\n\t\treturn buf;\n\t}\n\tconst out = new Uint8Array(length);\n\tlet received = 0;\n\tfor (;;) {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) break;\n\t\tif (received + value.byteLength > length) {\n\t\t\tawait reader.cancel();\n\t\t\tthrow new Error(\n\t\t\t\t`.koe fetch failed: response exceeds requested ${length} bytes`,\n\t\t\t);\n\t\t}\n\t\tout.set(value, received);\n\t\treceived += value.byteLength;\n\t}\n\treturn received === length ? out.buffer : out.buffer.slice(0, received);\n}\n\nfunction validateJsonLength(jsonLength: number): void {\n\tif (\n\t\t!Number.isInteger(jsonLength) ||\n\t\tjsonLength < 0 ||\n\t\tjsonLength > MAX_JSON_LENGTH\n\t) {\n\t\tthrow new Error(`manifest JSON length out of bounds: ${jsonLength}`);\n\t}\n}\n\nfunction parseManifest(json: ArrayBuffer): Manifest {\n\tconst manifest = JSON.parse(new TextDecoder().decode(json)) as Manifest;\n\tif (\n\t\t!manifest ||\n\t\ttypeof manifest !== \"object\" ||\n\t\ttypeof manifest.phonemes !== \"object\" ||\n\t\tmanifest.phonemes === null\n\t) {\n\t\tthrow new Error(\"invalid manifest: missing phonemes table\");\n\t}\n\treturn manifest;\n}\n\n/**\n * Read-only access to a .koe voice bank: its manifest plus per-phoneme PCM,\n * fetched on demand (Blob slice or HTTP Range). The full bank is never held in\n * memory.\n *\n * Pure data — no AudioContext, no AudioWorklet, no DOM. Use this when you only\n * need the source samples (e.g. to feed the {@link Worldline} renderer or any\n * other vocoder). {@link KoeEngine} builds its concatenative playback on top of\n * this same class.\n *\n * const bank = await VoiceBank.load(koeBlobOrUrl);\n * const pcm = await bank.getPcm('a'); // Float64 [-1, 1]\n */\nexport class VoiceBank {\n\tprivate constructor(\n\t\t/** The voice bank manifest (sample rate, reference pitch, phoneme table). */\n\t\treadonly manifest: Manifest,\n\t\tprivate source: VoiceSource,\n\t) {}\n\n\t/**\n\t * Parse a .koe archive header + manifest and bind a lazy PCM source.\n\t * @param koe a Blob/File of the .koe archive, or a URL (served with Range support)\n\t */\n\tstatic async load(koe: Blob | string): Promise<VoiceBank> {\n\t\ttry {\n\t\t\tif (typeof koe === \"string\") {\n\t\t\t\t// Range requests on blob: URLs are not portable (Firefox/Safari answer\n\t\t\t\t// 200); the data already lives in memory, so read it back as a Blob.\n\t\t\t\tif (/^blob:/i.test(koe)) {\n\t\t\t\t\tconst res = await fetch(koe);\n\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\tthrow new Error(`blob: URL fetch failed: ${res.status}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn await VoiceBank.fromBlob(await res.blob());\n\t\t\t\t}\n\t\t\t\tif (!/^https?:/i.test(koe)) {\n\t\t\t\t\tthrow new Error(`unsupported URL protocol: ${koe}`);\n\t\t\t\t}\n\t\t\t\tconst header = await rangeFetch(koe, 0, 8);\n\t\t\t\tconst { jsonLength } = parseKoeHeader(header);\n\t\t\t\tvalidateJsonLength(jsonLength);\n\t\t\t\tconst json = await rangeFetch(koe, 8, jsonLength);\n\t\t\t\tconst manifest = parseManifest(json);\n\t\t\t\treturn new VoiceBank(\n\t\t\t\t\tmanifest,\n\t\t\t\t\tnew RangeVoiceSource(koe, pcmBase(jsonLength)),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn await VoiceBank.fromBlob(koe);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to load .koe voice bank: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate static async fromBlob(koe: Blob): Promise<VoiceBank> {\n\t\tconst header = await koe.slice(0, 8).arrayBuffer();\n\t\tconst { jsonLength } = parseKoeHeader(header);\n\t\tvalidateJsonLength(jsonLength);\n\t\tconst json = await koe.slice(8, 8 + jsonLength).arrayBuffer();\n\t\tconst manifest = parseManifest(json);\n\t\treturn new VoiceBank(\n\t\t\tmanifest,\n\t\t\tnew BlobVoiceSource(koe, pcmBase(jsonLength)),\n\t\t);\n\t}\n\n\t/** True if the bank contains a phoneme under this alias. */\n\thas(phoneme: string): boolean {\n\t\t// Own-property check: a plain [phoneme] access would also match inherited\n\t\t// Object.prototype keys like \"toString\" / \"constructor\".\n\t\treturn Object.hasOwn(this.manifest.phonemes, phoneme);\n\t}\n\n\t/**\n\t * Raw Int16 PCM bytes (48 kHz / mono) for a phoneme, or null if unknown.\n\t * The returned ArrayBuffer is freshly allocated and safe to transfer to a\n\t * worker / AudioWorklet.\n\t */\n\tasync readPcmBytes(phoneme: string): Promise<ArrayBuffer | null> {\n\t\tif (!Object.hasOwn(this.manifest.phonemes, phoneme)) return null;\n\t\tconst entry = this.manifest.phonemes[phoneme];\n\t\tif (\n\t\t\t!Number.isInteger(entry.offset) ||\n\t\t\t!Number.isInteger(entry.length) ||\n\t\t\tentry.offset < 0 ||\n\t\t\tentry.length < 0 ||\n\t\t\tentry.length > MAX_PHONEME_SAMPLES\n\t\t) {\n\t\t\tthrow new Error(`manifest entry out of bounds for phoneme: ${phoneme}`);\n\t\t}\n\t\treturn this.source.readBytes(entry.offset, entry.length * 2); // Int16 = 2 bytes/sample\n\t}\n\n\t/**\n\t * A phoneme's PCM as a Float64Array normalised to [-1, 1], or null if unknown.\n\t * Intended for external analysis / resynthesis such as the WORLD vocoder.\n\t */\n\tasync getPcm(phoneme: string): Promise<Float64Array | null> {\n\t\tconst buf = await this.readPcmBytes(phoneme);\n\t\tif (!buf) return null;\n\t\t// A truncated read (Blob clamped at EOF) can yield an odd byte count,\n\t\t// which the Int16Array(buffer) constructor rejects — floor to whole samples.\n\t\tconst int16 = new Int16Array(buf, 0, Math.floor(buf.byteLength / 2));\n\t\tconst f64 = new Float64Array(int16.length);\n\t\tfor (let i = 0; i < int16.length; i++) f64[i] = int16[i] / 32768;\n\t\treturn f64;\n\t}\n}\n","import type { Manifest, NoteEvent } from \"../types.js\";\nimport { VoiceBank } from \"./voice-bank.js\";\n\nexport type { NoteEvent };\n\nexport interface KoeEngineOptions {\n\t/** URL to koe-worklet.js. Defaults to './koe-worklet.js'. */\n\tworkletUrl?: string;\n}\n\n/**\n * Main-thread API for the koe concatenative synthesis engine.\n *\n * Loads a single .koe archive. The full voice bank is never held in memory:\n * phonemes are fetched on demand (via {@link VoiceBank}) and cached in the\n * audio thread.\n *\n * const engine = new KoeEngine();\n * await engine.load(koeBlobOrUrl);\n * await engine.play([{ phoneme: 'a', pitch: 440, duration: 48000 }]);\n *\n * For analysis / resynthesis (e.g. {@link Worldline}) you usually only need the\n * raw samples — use {@link VoiceBank} directly instead, which needs no\n * AudioContext or worklet.\n */\nexport class KoeEngine {\n\tprivate ctx: AudioContext;\n\tprivate workletUrl: string;\n\tprivate node: AudioWorkletNode | null = null;\n\tprivate bank: VoiceBank | null = null;\n\tprivate delivered = new Set<string>();\n\tprivate pending = new Map<string, Promise<void>>();\n\n\tconstructor(options: KoeEngineOptions = {}) {\n\t\tthis.ctx = new AudioContext({ sampleRate: 48000 });\n\t\tthis.workletUrl = options.workletUrl ?? \"./koe-worklet.js\";\n\t}\n\n\tget audioContext(): AudioContext {\n\t\treturn this.ctx;\n\t}\n\n\tget manifest(): Manifest | null {\n\t\treturn this.bank?.manifest ?? null;\n\t}\n\n\t/** The underlying voice bank (manifest + on-demand PCM), or null before load(). */\n\tget voiceBank(): VoiceBank | null {\n\t\treturn this.bank;\n\t}\n\n\t/**\n\t * Register the worklet and bind a .koe voice bank.\n\t * @param koe a Blob/File of the .koe archive, or a URL (served with Range support)\n\t */\n\tasync load(koe: Blob | string): Promise<void> {\n\t\tawait this.ctx.audioWorklet.addModule(this.workletUrl);\n\n\t\t// Re-loading: tear down the previous node, or both would keep playing.\n\t\tthis.node?.disconnect();\n\t\tthis.node = null;\n\n\t\tthis.bank = await VoiceBank.load(koe);\n\t\tthis.delivered.clear();\n\t\tthis.pending.clear();\n\n\t\tthis.node = new AudioWorkletNode(this.ctx, \"koe-processor\", {\n\t\t\tnumberOfInputs: 0,\n\t\t\tnumberOfOutputs: 1,\n\t\t\toutputChannelCount: [1],\n\t\t});\n\t\tthis.node.port.postMessage({ type: \"init\", manifest: this.bank.manifest });\n\t\tthis.node.connect(this.ctx.destination);\n\n\t\tconsole.log(\n\t\t\t\"[koe] ready —\",\n\t\t\tObject.keys(this.bank.manifest.phonemes).length,\n\t\t\t\"phonemes (on-demand)\",\n\t\t);\n\t}\n\n\t/** Fetch one phoneme's PCM and deliver it to the worklet (deduped, cached). */\n\tprivate ensurePhoneme(name: string): Promise<void> {\n\t\tif (this.delivered.has(name)) return Promise.resolve();\n\t\tconst existing = this.pending.get(name);\n\t\tif (existing) return existing;\n\t\tif (!this.bank || !this.node) return Promise.resolve();\n\n\t\tconst load = this.bank\n\t\t\t.readPcmBytes(name)\n\t\t\t.then((buf) => {\n\t\t\t\tif (!buf || !this.node) return;\n\t\t\t\tthis.node.port.postMessage({ type: \"phoneme\", name, buffer: buf }, [\n\t\t\t\t\tbuf,\n\t\t\t\t]);\n\t\t\t\tthis.delivered.add(name);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t// Always clear pending — a failed fetch must stay retryable, or the\n\t\t\t\t// rejected promise would poison every later play() of this phoneme.\n\t\t\t\tthis.pending.delete(name);\n\t\t\t});\n\n\t\tthis.pending.set(name, load);\n\t\treturn load;\n\t}\n\n\t/** Stop current playback, preload the phonemes for `notes`, then queue them. */\n\tasync play(notes: NoteEvent[]): Promise<void> {\n\t\tif (!this.node) throw new Error(\"KoeEngine: call load() before play()\");\n\t\tthis.node.port.postMessage({ type: \"stop\" });\n\t\tconst names = [...new Set(notes.map((n) => n.phoneme))].filter(Boolean);\n\t\tawait Promise.all(names.map((n) => this.ensurePhoneme(n)));\n\t\tthis.node.port.postMessage({ type: \"play\", notes });\n\t}\n\n\t/** Stop playback and clear the queue. */\n\tstop(): void {\n\t\tthis.node?.port.postMessage({ type: \"stop\" });\n\t}\n\n\t/** Resume the AudioContext if suspended (e.g. after autoplay block). */\n\tasync resume(): Promise<void> {\n\t\tif (this.ctx.state === \"suspended\") await this.ctx.resume();\n\t}\n\n\t/**\n\t * Tear down the worklet node and close the AudioContext, releasing the audio\n\t * hardware. The engine cannot be reused afterwards — create a new one.\n\t */\n\tasync dispose(): Promise<void> {\n\t\tthis.node?.disconnect();\n\t\tthis.node = null;\n\t\tthis.bank = null;\n\t\tthis.delivered.clear();\n\t\tthis.pending.clear();\n\t\tif (this.ctx.state !== \"closed\") await this.ctx.close();\n\t}\n\n\t/**\n\t * Read a phoneme's raw PCM and return it as a Float64Array normalised to\n\t * [-1, 1]. Convenience that forwards to the underlying {@link VoiceBank}.\n\t * Intended for external analysis such as the WORLD vocoder.\n\t */\n\tasync getPcm(phoneme: string): Promise<Float64Array | null> {\n\t\treturn this.bank?.getPcm(phoneme) ?? null;\n\t}\n}\n","import type { PhonemeEntry } from \"../types.js\";\n\n/** Output sample rate of the worldline synthesizer. */\nexport const WORLDLINE_SAMPLE_RATE = 48000;\n\n/**\n * WORLD needs roughly 85 ms of audio for stable F0 analysis. Phonemes with\n * fewer samples than this are rejected (renderNote returns null).\n */\nexport const MIN_WORLDLINE_SAMPLES = 4096;\n\n/** SynthRequest struct layout — 120 bytes, WASM32. */\nconst SYNTH_REQ_SIZE = 120;\n/** Frame period hardcoded in worldline's phrase_synth.cpp. */\nconst WL_FRAME_MS = 10;\n\n/**\n * The subset of the Emscripten module surface that we call. worldline.js is an\n * MODULARIZE=1 / EXPORT_NAME=WorldlineModule build of OpenUtau's worldline.\n */\ninterface WorldlineWasm {\n\t_PhraseSynthNew(): number;\n\t_PhraseSynthDelete(ps: number): void;\n\t_PhraseSynthAddRequest(\n\t\tps: number,\n\t\treq: number,\n\t\tposMs: number,\n\t\tskipMs: number,\n\t\tlengthMs: number,\n\t\tfadeInMs: number,\n\t\tfadeOutMs: number,\n\t\tflag: number,\n\t): void;\n\t_PhraseSynthSetCurves(\n\t\tps: number,\n\t\tf0: number,\n\t\tgender: number,\n\t\ttension: number,\n\t\tbreathiness: number,\n\t\tvoicing: number,\n\t\tlength: number,\n\t\tframeMs: number,\n\t): void;\n\t_PhraseSynthSynth(ps: number, yPtrPtr: number, flag: number): number;\n\t_malloc(size: number): number;\n\t_free(ptr: number): void;\n\tsetValue(ptr: number, value: number, type: string): void;\n\tgetValue(ptr: number, type: string): number;\n\tHEAPF32: Float32Array;\n\tHEAPF64: Float64Array;\n}\n\ntype WorldlineFactory = (opts?: {\n\tlocateFile?: (path: string) => string;\n}) => Promise<WorldlineWasm>;\n\ndeclare global {\n\t// Injected by worldline.js when loaded as a classic <script> or via importScripts.\n\t// eslint-disable-next-line no-var\n\tvar WorldlineModule: WorldlineFactory | undefined;\n\t// Present in classic Web Workers (used to load worldline.js off the main thread).\n\t// eslint-disable-next-line no-var\n\tvar importScripts: ((...urls: string[]) => void) | undefined;\n}\n\nexport interface WorldlineLoadOptions {\n\t/**\n\t * URL of `worldline.js` (the Emscripten loader). The matching\n\t * `worldline.wasm` must sit next to it — it is resolved relative to this URL.\n\t *\n\t * When consuming koe from npm + a CDN this is typically e.g.\n\t * `https://cdn.jsdelivr.net/npm/@onjmin/koe/dist/world/worldline.js`, or your\n\t * own hosted copy of `dist/world/`.\n\t */\n\tscriptUrl: string;\n}\n\n/**\n * A per-frame expression value: either a flat constant for the whole note, or\n * a function evaluated once per 10ms WORLD frame for a custom curve (vibrato,\n * portamento, scoop-in, humanize jitter, hand-drawn automation, …).\n *\n * `tMs` is elapsed time from the start of the rendered buffer (0 = includes\n * the `preMs` lead-in), `totalMs` is the full rendered length (`preMs +\n * durationMs`). Callers own all curve shaping — worldline itself has no\n * opinion on what \"vibrato\" or \"scoop\" means, it just samples whatever\n * function you give it once per frame.\n */\nexport type CurveInput = number | ((tMs: number, totalMs: number) => number);\n\nconst sampleCurve = (input: number, curve: CurveInput, totalMs: number): number =>\n\ttypeof curve === \"function\" ? curve(input, totalMs) : curve;\n\nexport interface RenderNoteParams {\n\t/**\n\t * Source phoneme PCM normalised to [-1, 1] (e.g. from\n\t * `VoiceBank.getPcm()` / `KoeEngine.getPcm()`).\n\t */\n\tpcm: Float64Array;\n\t/**\n\t * Target output pitch in Hz. Pass a function for vibrato, portamento,\n\t * scoop-in, pitch-drift humanize, etc. — it is sampled once per 10ms frame.\n\t */\n\tpitch: CurveInput;\n\t/** Sustain / vowel duration in ms (the lead-in below is rendered on top). */\n\tdurationMs: number;\n\t/** Preutterance / lead-in in ms — convert from {@link PhonemeEntry.pre}. */\n\tpreMs: number;\n\t/** Consonant length in ms — convert from {@link PhonemeEntry.consonant}. */\n\tconsonantMs: number;\n\t/** Reference tempo in BPM for worldline's internal timing. Default 120. */\n\ttempo?: number;\n\t/**\n\t * Formant/gender shift, 0-1. 0.5 (default) = unmodified. Below 0.5 skews\n\t * toward a lower/thicker formant (older, huskier); above 0.5 toward a\n\t * higher/thinner one (younger, brighter) — pitch itself is unaffected.\n\t */\n\tgender?: CurveInput;\n\t/**\n\t * Tension, 0-1. 0.5 (default) = neutral. Higher = tighter/more strained\n\t * (\"こぶし\"-style push); lower = more relaxed/breathy-adjacent.\n\t */\n\ttension?: CurveInput;\n\t/** Breathiness, 0-1. 0.5 (default) = neutral. Higher = airier/whispered. */\n\tbreathiness?: CurveInput;\n\t/**\n\t * Voicing ratio, 0-1. 1.0 (default) = fully voiced. Lower blends toward an\n\t * unvoiced/falsetto-adjacent texture.\n\t */\n\tvoicing?: CurveInput;\n}\n\n/** Convert a sample count at 48 kHz to milliseconds. */\nexport const samplesToMs = (samples: number): number =>\n\t(samples / WORLDLINE_SAMPLE_RATE) * 1000;\n\n/**\n * Derive {@link RenderNoteParams} lead-in / consonant fields from a manifest\n * entry, so callers don't repeat the sample→ms conversion.\n *\n * const params = { pcm, pitch, durationMs, ...leadInFromEntry(entry) };\n */\nexport function leadInFromEntry(entry: PhonemeEntry): {\n\tpreMs: number;\n\tconsonantMs: number;\n} {\n\treturn {\n\t\tpreMs: samplesToMs(entry.pre || 0),\n\t\tconsonantMs: samplesToMs(entry.consonant || 0),\n\t};\n}\n\n// Cache module factories by script URL so repeated loads share one WASM instance.\nconst moduleCache = new Map<string, Promise<WorldlineWasm>>();\n\nfunction injectScript(src: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst existing = document.querySelector<HTMLScriptElement>(\n\t\t\t`script[data-koe-worldline=\"${src}\"]`,\n\t\t);\n\t\tif (existing) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tconst s = document.createElement(\"script\");\n\t\ts.src = src;\n\t\ts.dataset.koeWorldline = src;\n\t\ts.onload = () => resolve();\n\t\ts.onerror = () => reject(new Error(`worldline: failed to load ${src}`));\n\t\tdocument.head.appendChild(s);\n\t});\n}\n\nfunction loadWasm(scriptUrl: string): Promise<WorldlineWasm> {\n\tconst cached = moduleCache.get(scriptUrl);\n\tif (cached) return cached;\n\n\tconst baseUrl = scriptUrl.slice(0, scriptUrl.lastIndexOf(\"/\") + 1);\n\tconst instantiate = (): Promise<WorldlineWasm> => {\n\t\tconst factory = globalThis.WorldlineModule;\n\t\tif (!factory)\n\t\t\tthrow new Error(\n\t\t\t\t\"worldline: WorldlineModule global was not defined by the script\",\n\t\t\t);\n\t\t// locateFile resolves worldline.wasm next to the script; fetch works in both\n\t\t// the DOM and Web Workers, so the WASM instantiates the same way off-thread.\n\t\treturn factory({ locateFile: (f: string) => baseUrl + f });\n\t};\n\n\tlet promise: Promise<WorldlineWasm>;\n\tif (typeof document !== \"undefined\") {\n\t\t// Main thread / DOM: load worldline.js via a <script> tag.\n\t\tpromise = injectScript(scriptUrl).then(instantiate);\n\t} else if (typeof globalThis.importScripts === \"function\") {\n\t\t// Classic Web Worker: importScripts runs worldline.js synchronously in the\n\t\t// worker's global scope, defining globalThis.WorldlineModule. This lets the\n\t\t// heavy WORLD synthesis run off the main thread.\n\t\tpromise = Promise.resolve().then(() => {\n\t\t\t(globalThis.importScripts as (...urls: string[]) => void)(scriptUrl);\n\t\t\treturn instantiate();\n\t\t});\n\t} else {\n\t\treturn Promise.reject(\n\t\t\tnew Error(\n\t\t\t\t\"Worldline.load requires a DOM or a classic Web Worker (importScripts) to load worldline.js\",\n\t\t\t),\n\t\t);\n\t}\n\tmoduleCache.set(scriptUrl, promise);\n\treturn promise;\n}\n\n/**\n * High-quality WORLD-vocoder note renderer (OpenUtau's worldline via WASM).\n *\n * Pure synthesis: PCM in → PCM out. No AudioContext, no scheduling — the caller\n * owns playback (schedule the returned buffer on its own timeline). Pair it with\n * {@link VoiceBank} for the source samples:\n *\n * const bank = await VoiceBank.load(koeUrl);\n * const wl = await Worldline.load({ scriptUrl: '.../world/worldline.js' });\n *\n * const entry = bank.manifest.phonemes[alias];\n * const pcm = await bank.getPcm(alias);\n * const audio = wl.renderNote({\n * pcm, pitch: 440, durationMs: 500, ...leadInFromEntry(entry),\n * });\n * // audio: Float32 @ 48 kHz, layout [lead-in/consonant ≈ preMs][vowel ≈ durationMs]\n */\nexport class Worldline {\n\treadonly sampleRate = WORLDLINE_SAMPLE_RATE;\n\n\tprivate constructor(private wasm: WorldlineWasm) {}\n\n\t/**\n\t * Load + instantiate the worldline WASM module (deduped per scriptUrl).\n\t *\n\t * Works on the main thread (loads via `<script>`) and inside a classic Web\n\t * Worker (loads via `importScripts`), so the heavy synthesis can run\n\t * off-thread. The matching `worldline.wasm` is fetched next to scriptUrl.\n\t */\n\tstatic async load(options: WorldlineLoadOptions): Promise<Worldline> {\n\t\treturn new Worldline(await loadWasm(options.scriptUrl));\n\t}\n\n\t/**\n\t * Render one note to Float32 PCM at 48 kHz.\n\t *\n\t * The output buffer is laid out as [lead-in/consonant ≈ preMs][vowel ≈\n\t * durationMs], rendered from sample offset 0 (no leading silence). The vowel\n\t * onset (the \"beat\") sits at ≈ preMs into the buffer, so a sequencer should\n\t * place the buffer at `beatTime − preMs` and may trim/crossfade the lead-in.\n\t *\n\t * No internal crossfade is applied — apply fades externally.\n\t *\n\t * @returns Float32 PCM, or null when `pcm` is shorter than\n\t * {@link MIN_WORLDLINE_SAMPLES} (too short for stable F0 analysis).\n\t */\n\trenderNote(params: RenderNoteParams): Float32Array | null {\n\t\tconst {\n\t\t\tpcm,\n\t\t\tpitch,\n\t\t\tdurationMs,\n\t\t\tpreMs,\n\t\t\tconsonantMs,\n\t\t\ttempo = 120,\n\t\t\tgender = 0.5,\n\t\t\ttension = 0.5,\n\t\t\tbreathiness = 0.5,\n\t\t\tvoicing = 1.0,\n\t\t} = params;\n\t\tif (!pcm || pcm.length < MIN_WORLDLINE_SAMPLES) return null;\n\n\t\tconst WL = this.wasm;\n\t\tconst FS = WORLDLINE_SAMPLE_RATE;\n\t\t// Representative pitch for the resampler's target note — the midpoint of\n\t\t// the vowel sustain when pitch is a curve, otherwise the flat value.\n\t\tconst basePitch = sampleCurve(preMs + durationMs / 2, pitch, preMs + durationMs);\n\t\tconst midiNote = Math.round(69 + 12 * Math.log2(basePitch / 440));\n\t\tconst posMs = 0; // no leading silence\n\t\tconst reqLen = preMs + durationMs; // render lead-in/consonant + vowel\n\n\t\t// cut_off must trim at least ~2 frames off the tail. PhraseSynth::AddRequest\n\t\t// computes the trim frame count as ceil(in_length_ms)/frame_ms, but\n\t\t// PyinEstimator yields floor(N/nhop)−1 frames — one fewer. With cut_off=0 the\n\t\t// requested frame count exceeds f0_.size() and Model::Trim's f0_.erase() runs\n\t\t// past end(), causing \"memory access out of bounds\". Trimming 2 frames keeps\n\t\t// it within bounds.\n\t\tconst cutMs = WL_FRAME_MS * 2;\n\n\t\tconst ps = WL._PhraseSynthNew();\n\t\tif (!ps) return null;\n\t\tconst reqPtr = WL._malloc(SYNTH_REQ_SIZE);\n\t\tif (!reqPtr) {\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tconst samplePtr = WL._malloc(pcm.length * 8);\n\t\tif (!samplePtr) {\n\t\t\tWL._free(reqPtr);\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tWL.HEAPF64.set(pcm, samplePtr >> 3);\n\n\t\tconst sv = (off: number, val: number, type: string) =>\n\t\t\tWL.setValue(reqPtr + off, val, type);\n\t\tsv(0, FS, \"i32\");\n\t\tsv(4, pcm.length, \"i32\");\n\t\tsv(8, samplePtr, \"*\");\n\t\tsv(12, 0, \"i32\");\n\t\tsv(16, 0, \"*\");\n\t\tsv(20, midiNote, \"i32\");\n\t\tsv(24, 100.0, \"double\");\n\t\tsv(32, 0.0, \"double\");\n\t\tsv(40, reqLen, \"double\");\n\t\tsv(48, consonantMs, \"double\");\n\t\tsv(56, cutMs, \"double\");\n\t\tsv(64, 100.0, \"double\");\n\t\tsv(72, 0.0, \"double\");\n\t\tsv(80, tempo, \"double\");\n\t\tsv(88, 0, \"i32\");\n\t\tsv(92, 0, \"*\");\n\t\tsv(96, 0, \"i32\");\n\t\tsv(100, 0, \"i32\");\n\t\tsv(104, 100, \"i32\");\n\t\tsv(108, 0, \"i32\");\n\t\tsv(112, 0, \"i32\");\n\t\tsv(116, 100, \"i32\");\n\n\t\t// skip/fadeIn/fadeOut all 0 — crossfade is handled externally.\n\t\tWL._PhraseSynthAddRequest(ps, reqPtr, posMs, 0.0, reqLen, 0.0, 0.0, 0);\n\t\tWL._free(samplePtr);\n\t\tWL._free(reqPtr);\n\n\t\tconst totalMs = posMs + reqLen + WL_FRAME_MS * 2;\n\t\tconst nFrames = Math.ceil(totalMs / WL_FRAME_MS) + 4;\n\t\t// Sample each curve once per 10ms frame. Plain numbers short-circuit to a\n\t\t// flat fill (same cost as before); functions get evaluated per-frame so\n\t\t// callers can draw vibrato, portamento, scoop-in, humanize jitter, etc.\n\t\tconst f0Arr = new Float64Array(nFrames);\n\t\tconst gArr = new Float64Array(nFrames);\n\t\tconst tArr = new Float64Array(nFrames);\n\t\tconst bArr = new Float64Array(nFrames);\n\t\tconst vArr = new Float64Array(nFrames);\n\t\tfor (let i = 0; i < nFrames; i++) {\n\t\t\tconst tMs = i * WL_FRAME_MS;\n\t\t\tf0Arr[i] = sampleCurve(tMs, pitch, totalMs);\n\t\t\tgArr[i] = sampleCurve(tMs, gender, totalMs);\n\t\t\ttArr[i] = sampleCurve(tMs, tension, totalMs);\n\t\t\tbArr[i] = sampleCurve(tMs, breathiness, totalMs);\n\t\t\tvArr[i] = sampleCurve(tMs, voicing, totalMs);\n\t\t}\n\n\t\tconst f0Ptr = WL._malloc(nFrames * 8);\n\t\tconst gPtr = WL._malloc(nFrames * 8);\n\t\tconst tPtr = WL._malloc(nFrames * 8);\n\t\tconst bPtr = WL._malloc(nFrames * 8);\n\t\tconst vPtr = WL._malloc(nFrames * 8);\n\t\tif (!f0Ptr || !gPtr || !tPtr || !bPtr || !vPtr) {\n\t\t\tif (f0Ptr) WL._free(f0Ptr);\n\t\t\tif (gPtr) WL._free(gPtr);\n\t\t\tif (tPtr) WL._free(tPtr);\n\t\t\tif (bPtr) WL._free(bPtr);\n\t\t\tif (vPtr) WL._free(vPtr);\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tWL.HEAPF64.set(f0Arr, f0Ptr >> 3);\n\t\tWL.HEAPF64.set(gArr, gPtr >> 3);\n\t\tWL.HEAPF64.set(tArr, tPtr >> 3);\n\t\tWL.HEAPF64.set(bArr, bPtr >> 3);\n\t\tWL.HEAPF64.set(vArr, vPtr >> 3);\n\t\tWL._PhraseSynthSetCurves(\n\t\t\tps,\n\t\t\tf0Ptr,\n\t\t\tgPtr,\n\t\t\ttPtr,\n\t\t\tbPtr,\n\t\t\tvPtr,\n\t\t\tnFrames,\n\t\t\tWL_FRAME_MS,\n\t\t);\n\t\tWL._free(f0Ptr);\n\t\tWL._free(gPtr);\n\t\tWL._free(tPtr);\n\t\tWL._free(bPtr);\n\t\tWL._free(vPtr);\n\n\t\tconst yPtrPtr = WL._malloc(4);\n\t\tif (!yPtrPtr) {\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tconst outLen = WL._PhraseSynthSynth(ps, yPtrPtr, 0);\n\t\tconst yPtr = WL.getValue(yPtrPtr, \"*\");\n\t\tconst audio =\n\t\t\toutLen > 0 && yPtr\n\t\t\t\t? new Float32Array(WL.HEAPF32.buffer, yPtr, outLen).slice()\n\t\t\t\t: null;\n\t\t// The wrapper allocates *y with `new float[]` for the caller to release;\n\t\t// Emscripten's operator new is malloc-backed, so _free reclaims it.\n\t\tif (yPtr) WL._free(yPtr);\n\t\tWL._free(yPtrPtr);\n\t\tWL._PhraseSynthDelete(ps);\n\t\treturn audio;\n\t}\n}\n"],"mappings":"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","names":["l","_a","_a","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/converter/frq.ts","../src/converter/pitch.ts","../src/converter/pack.ts","../src/converter/parse-oto.ts","../src/converter/wav.ts","../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/converter/zip.ts","../src/koe.ts","../src/engine/voice-bank.ts","../src/engine/index.ts","../src/engine/worldline.ts"],"sourcesContent":["/**\r\n * UTAU `.frq` frequency-analysis files (FREQ0003). The same format OpenUtau\r\n * reads: an 8-byte header, hop size, the average fundamental frequency of the\r\n * whole recording, then a per-frame f0 / amplitude curve.\r\n *\r\n * Layout:\r\n * char[8] \"FREQ0003\"\r\n * int32 hopSize ← in ORIGINAL WAV samples\r\n * float64 averageF0 ← whole-file average in Hz\r\n * byte[16] (blank)\r\n * int32 length\r\n * { float64 f0, float64 amp } × length\r\n */\r\n\r\nconst HEADER_SIZE = 40;\r\n\r\nexport interface FrqData {\r\n\t/** Analysis hop in samples of the ORIGINAL wav (not the 48 kHz conversion) */\r\n\thopSize: number;\r\n\t/** Whole-file average f0 in Hz, as stored in the header */\r\n\taverageF0: number;\r\n\t/** Per-frame f0 in Hz — 0 where the analyser found no clear pitch */\r\n\tf0: Float64Array;\r\n\t/** Per-frame amplitude, parallel to {@link f0} */\r\n\tamp: Float64Array;\r\n}\r\n\r\n/** Parse a `.frq` file, including the per-frame curve. Null if not FREQ0003. */\r\nexport function parseFrq(buffer: ArrayBuffer): FrqData | null {\r\n\tif (buffer.byteLength < HEADER_SIZE) return null;\r\n\tconst view = new DataView(buffer);\r\n\r\n\tlet header = \"\";\r\n\tfor (let i = 0; i < 8; i++) header += String.fromCharCode(view.getUint8(i));\r\n\tif (header !== \"FREQ0003\") return null;\r\n\r\n\tconst hopSize = view.getInt32(8, true);\r\n\tconst averageF0 = view.getFloat64(12, true); // little-endian\r\n\tconst declared = view.getInt32(36, true);\r\n\t// Trust the file's actual size over the declared count — truncated frq files\r\n\t// are common enough that reading past the buffer must not throw.\r\n\tconst available = Math.floor((buffer.byteLength - HEADER_SIZE) / 16);\r\n\tconst length = Math.max(0, Math.min(declared, available));\r\n\r\n\tconst f0 = new Float64Array(length);\r\n\tconst amp = new Float64Array(length);\r\n\tfor (let i = 0; i < length; i++) {\r\n\t\tconst p = HEADER_SIZE + i * 16;\r\n\t\tf0[i] = view.getFloat64(p, true);\r\n\t\tamp[i] = view.getFloat64(p + 8, true);\r\n\t}\r\n\r\n\treturn {\r\n\t\thopSize: hopSize > 0 ? hopSize : 256,\r\n\t\taverageF0: Number.isFinite(averageF0) && averageF0 > 0 ? averageF0 : 0,\r\n\t\tf0,\r\n\t\tamp,\r\n\t};\r\n}\r\n\r\n/**\r\n * Average f0 over the voiced frames covering a time span of the recording.\r\n *\r\n * The header's whole-file average includes leading silence and unvoiced\r\n * consonants, so it can sit well away from the pitch actually sounding in the\r\n * region a note is built from. Playback resamples the whole phoneme by one\r\n * scalar ratio, so an inaccurate value both detunes the note and makes two\r\n * crossfading notes drift apart in phase across the overlap — a 1% error at\r\n * 233 Hz drifts ~25° over a 30 ms overlap and ~84° over 100 ms.\r\n *\r\n * @param startMs / endMs span within the ORIGINAL recording, in milliseconds\r\n * @param sourceRate sample rate of the original WAV the frq describes\r\n * @returns Hz, or 0 when the span holds no voiced frames\r\n */\r\nexport function frqAverageF0InRange(\r\n\tfrq: FrqData,\r\n\tstartMs: number,\r\n\tendMs: number,\r\n\tsourceRate: number,\r\n): number {\r\n\tif (!(sourceRate > 0) || frq.f0.length === 0) return 0;\r\n\tconst perFrameMs = (frq.hopSize / sourceRate) * 1000;\r\n\tif (!(perFrameMs > 0)) return 0;\r\n\r\n\tconst first = Math.max(0, Math.floor(startMs / perFrameMs));\r\n\tconst last = Math.min(frq.f0.length - 1, Math.ceil(endMs / perFrameMs));\r\n\r\n\t// Amplitude-weighted so quiet fringe frames (a decaying tail, a breath)\r\n\t// don't pull the average away from the body of the vowel.\r\n\tlet num = 0;\r\n\tlet den = 0;\r\n\tfor (let i = first; i <= last; i++) {\r\n\t\tconst hz = frq.f0[i];\r\n\t\tif (!(hz > 0)) continue; // unvoiced / undetected\r\n\t\tconst w = frq.amp[i] > 0 ? frq.amp[i] : 1;\r\n\t\tnum += hz * w;\r\n\t\tden += w;\r\n\t}\r\n\treturn den > 0 ? num / den : 0;\r\n}\r\n\r\n/** Whole-file average f0 in Hz from a `.frq` file, or null. */\r\nexport function parseFrqAverageF0(buffer: ArrayBuffer): number | null {\r\n\tconst frq = parseFrq(buffer);\r\n\treturn frq && frq.averageF0 > 0 ? frq.averageF0 : null;\r\n}\r\n\r\n/** Map a WAV filename to its sibling frq filename: \"あ.wav\" → \"あ_wav.frq\". */\r\nexport function frqFileName(wavName: string): string {\r\n\tconst dot = wavName.lastIndexOf(\".\");\r\n\tconst base = dot >= 0 ? wavName.slice(0, dot) : wavName;\r\n\tconst ext = dot >= 0 ? wavName.slice(dot + 1) : \"wav\";\r\n\treturn `${base}_${ext}.frq`;\r\n}\r\n","const SAMPLE_RATE = 48000;\n\nconst NAME_SEMITONE: Record<string, number> = {\n\tc: 0,\n\td: 2,\n\te: 4,\n\tf: 5,\n\tg: 7,\n\ta: 9,\n\tb: 11,\n};\n\n/** Parse a note name like \"E4\", \"G#4\", \"Db5\" → frequency in Hz (null if invalid). */\nexport function noteNameToHz(name: string): number | null {\n\tconst m = /^([A-Ga-g])([#b]?)(-?\\d+)$/.exec(name);\n\tif (!m) return null;\n\tlet semi = NAME_SEMITONE[m[1].toLowerCase()];\n\tif (m[2] === \"#\") semi++;\n\telse if (m[2] === \"b\") semi--;\n\tconst midi = (parseInt(m[3], 10) + 1) * 12 + semi;\n\treturn 440 * 2 ** ((midi - 69) / 12);\n}\n\n/** Recorded pitch encoded in a multi-pitch alias suffix: \"a い_E4\" → 329.63 Hz. */\nexport function pitchFromAliasSuffix(alias: string): number | null {\n\tconst m = /_([A-Ga-g][#b]?-?\\d+)$/.exec(alias);\n\treturn m ? noteNameToHz(m[1]) : null;\n}\n\n/**\n * Estimate the fundamental frequency (Hz) of a voiced region by normalized\n * autocorrelation. Returns 0 when no clear pitch is found (unvoiced consonant,\n * silence, or a region too short to analyse).\n *\n * The signal is decimated to a lower analysis rate for speed; f0 below ~700 Hz\n * is well within the resulting Nyquist limit. A parabolic interpolation around\n * the best lag gives sub-sample (sub-semitone) accuracy.\n */\nexport function detectF0(pcm: Int16Array, start: number, end: number): number {\n\tconst DECIM = 4;\n\tconst sr = SAMPLE_RATE / DECIM; // 12 kHz analysis rate\n\tconst minLag = Math.floor(sr / 700); // highest f0 we look for\n\tconst maxLag = Math.floor(sr / 70); // lowest f0 we look for\n\n\tconst outLen = Math.floor((end - start) / DECIM);\n\tif (outLen < maxLag + 2) return 0;\n\tconst win = Math.min(outLen, 1500); // up to ~0.125 s of vowel\n\n\t// Decimate (box-average) + remove DC, and build a prefix sum of squares so\n\t// each lag's window energy is O(1).\n\tconst buf = new Float32Array(win);\n\tlet mean = 0;\n\tfor (let i = 0; i < win; i++) {\n\t\tlet s = 0;\n\t\tconst base = start + i * DECIM;\n\t\tfor (let j = 0; j < DECIM; j++) s += pcm[base + j];\n\t\tbuf[i] = s;\n\t\tmean += s;\n\t}\n\tmean /= win;\n\n\tconst sq = new Float64Array(win + 1);\n\tfor (let i = 0; i < win; i++) {\n\t\tbuf[i] -= mean;\n\t\tsq[i + 1] = sq[i] + buf[i] * buf[i];\n\t}\n\tif (sq[win] < 1) return 0; // effectively silent\n\n\t// Normalized autocorrelation: 2·r(lag) / (E[0..n] + E[lag..lag+n]) ∈ [-1, 1].\n\tconst norm = (lag: number): number => {\n\t\tconst n = win - lag;\n\t\tlet r = 0;\n\t\tfor (let i = 0; i < n; i++) r += buf[i] * buf[i + lag];\n\t\tconst e = sq[n] + (sq[lag + n] - sq[lag]);\n\t\treturn e > 0 ? (2 * r) / e : 0;\n\t};\n\n\tlet bestLag = -1;\n\tlet best = 0;\n\tfor (let lag = minLag; lag <= maxLag; lag++) {\n\t\tconst v = norm(lag);\n\t\tif (v > best) {\n\t\t\tbest = v;\n\t\t\tbestLag = lag;\n\t\t}\n\t}\n\tif (bestLag < 1 || best < 0.4) return 0; // unvoiced / no clear period\n\n\t// Parabolic interpolation around the peak\n\tconst y0 = norm(bestLag - 1);\n\tconst y1 = best;\n\tconst y2 = norm(bestLag + 1);\n\tconst denom = y0 - 2 * y1 + y2;\n\tconst shift = denom !== 0 ? (0.5 * (y0 - y2)) / denom : 0;\n\n\treturn sr / (bestLag + shift);\n}\n","import type { Manifest, PhonemeEntry } from \"../types.js\";\r\nimport type { OtoEntry } from \"./parse-oto.js\";\r\nimport { detectF0 } from \"./pitch.js\";\r\n\r\nconst TARGET_RATE = 48000;\r\n\r\nfunction msToSamples(ms: number): number {\r\n\treturn Math.round((ms / 1000) * TARGET_RATE);\r\n}\r\n\r\nconst clamp = (v: number, lo: number, hi: number) =>\r\n\tMath.max(lo, Math.min(hi, v));\r\n\r\nexport interface PackInput {\r\n\toto: OtoEntry;\r\n\t/** Full PCM of the source WAV (48kHz / 16bit / mono) */\r\n\tpcm: Int16Array;\r\n\t/** Known recorded pitch in Hz (e.g. from the .frq file). 0/undefined → auto-detect. */\r\n\trecordedPitch?: number;\r\n}\r\n\r\nexport interface PackOutput {\r\n\tmanifest: Manifest;\r\n\t/** Raw PCM blob — Int16 / 48kHz / mono */\r\n\tbin: ArrayBuffer;\r\n}\r\n\r\nexport interface TrimmedPhoneme {\r\n\t/** PCM trimmed to the oto region [offset, cutoff] */\r\n\tpcm: Int16Array;\r\n\t/** Manifest params relative to the trimmed start (sample 0 = oto offset) */\r\n\tentry: Omit<PhonemeEntry, \"offset\">;\r\n}\r\n\r\n/**\r\n * Resolve an oto entry's usable region within the full 48 kHz PCM.\r\n *\r\n * Shared with the converter CLI, which needs the same bounds to look up the\r\n * region's local f0 in a `.frq` curve.\r\n */\r\nexport function otoRegion(\r\n\tpcmLength: number,\r\n\toto: OtoEntry,\r\n): { start: number; end: number } {\r\n\tconst start = clamp(msToSamples(oto.offset), 0, pcmLength);\r\n\tconst end =\r\n\t\toto.cutoff < 0\r\n\t\t\t? clamp(start + msToSamples(-oto.cutoff), start, pcmLength)\r\n\t\t\t: clamp(pcmLength - msToSamples(oto.cutoff), start, pcmLength);\r\n\treturn { start, end };\r\n}\r\n\r\n/**\r\n * Remove the DC offset from a phoneme slice, returning an independent copy.\r\n *\r\n * A sample sitting off-centre cannot be crossfaded cleanly no matter how well\r\n * the phase is aligned: the two constant offsets simply add, so the seam gets a\r\n * step in its mean. Centring each phoneme at pack time is the only place this\r\n * can be fixed cheaply, and it is a precondition for the playback-side phase\r\n * alignment to actually deliver a flat crossfade.\r\n *\r\n * The copy is required as well as convenient — several oto entries routinely\r\n * point into the same source WAV, so the slices must not share storage.\r\n */\r\nfunction centerSlice(slice: Int16Array): Int16Array {\r\n\tconst out = new Int16Array(slice.length);\r\n\tif (slice.length === 0) return out;\r\n\r\n\tlet sum = 0;\r\n\tfor (let i = 0; i < slice.length; i++) sum += slice[i];\r\n\tconst dc = Math.round(sum / slice.length);\r\n\r\n\tfor (let i = 0; i < slice.length; i++) {\r\n\t\tout[i] = clamp(slice[i] - dc, -32768, 32767);\r\n\t}\r\n\treturn out;\r\n}\r\n\r\n/**\r\n * Cut the full WAV PCM down to its usable oto region and recompute parameters\r\n * relative to the trimmed start.\r\n *\r\n * UTAU oto.ini values are all in ms and measured from `offset` (the left blank),\r\n * except `cutoff` (right blank):\r\n * - cutoff >= 0 : measured from the END of the file\r\n * - cutoff < 0 : region length from offset = |cutoff|\r\n *\r\n * After trimming, sample 0 == oto offset, so pre/overlap/consonant carry over\r\n * unchanged (just converted to samples), and the slice length is the region end.\r\n */\r\nexport function trimToOto(\r\n\tpcm: Int16Array,\r\n\toto: OtoEntry,\r\n\trecordedPitch = 0,\r\n): TrimmedPhoneme {\r\n\tconst { start, end } = otoRegion(pcm.length, oto);\r\n\r\n\t// Centre the slice: the stored PCM is what playback crossfades, so the DC\r\n\t// offset has to go before it is written to voice.bin.\r\n\tconst slice = centerSlice(pcm.subarray(start, end));\r\n\tconst length = slice.length;\r\n\r\n\tconst pre = clamp(msToSamples(oto.pre), 0, length);\r\n\tconst overlap = clamp(msToSamples(oto.overlap), 0, length);\r\n\tconst consonant = clamp(msToSamples(oto.consonant), 0, length);\r\n\r\n\t// Prefer the known recorded pitch (from the .frq file or alias suffix); only\r\n\t// fall back to autocorrelation on the sustained vowel when none is available.\r\n\tconst pitch =\r\n\t\trecordedPitch > 0\r\n\t\t\t? recordedPitch\r\n\t\t\t: detectF0(\r\n\t\t\t\t\tslice,\r\n\t\t\t\t\tMath.min(Math.max(pre, consonant), Math.max(0, length - 1)),\r\n\t\t\t\t\tlength,\r\n\t\t\t\t);\r\n\r\n\treturn {\r\n\t\tpcm: slice,\r\n\t\tentry: { length, pre, overlap, consonant, pitch },\r\n\t};\r\n}\r\n\r\n/**\r\n * Pack phonemes into voice.bin + manifest.json.\r\n * Each phoneme is trimmed to its oto region and DC-centred first.\r\n * Duplicate aliases are silently overwritten by the later entry.\r\n */\r\nexport function pack(inputs: PackInput[], referencePitch = 220): PackOutput {\r\n\tconst phonemes: Record<string, PhonemeEntry> = {};\r\n\tconst chunks: Int16Array[] = [];\r\n\tlet byteOffset = 0;\r\n\r\n\tfor (const { oto, pcm, recordedPitch } of inputs) {\r\n\t\tconst { pcm: slice, entry } = trimToOto(pcm, oto, recordedPitch);\r\n\t\tif (slice.length === 0) continue;\r\n\r\n\t\tphonemes[oto.alias] = { offset: byteOffset, ...entry };\r\n\t\tbyteOffset += slice.byteLength;\r\n\t\tchunks.push(slice);\r\n\t}\r\n\r\n\tconst bin = new ArrayBuffer(byteOffset);\r\n\tconst view = new Uint8Array(bin);\r\n\tlet pos = 0;\r\n\tfor (const chunk of chunks) {\r\n\t\tview.set(\r\n\t\t\tnew Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength),\r\n\t\t\tpos,\r\n\t\t);\r\n\t\tpos += chunk.byteLength;\r\n\t}\r\n\r\n\tconst manifest: Manifest = {\r\n\t\tsampleRate: 48000,\r\n\t\treferencePitch,\r\n\t\tphonemes,\r\n\t};\r\n\r\n\treturn { manifest, bin };\r\n}\r\n","export interface OtoEntry {\n\t/** Source WAV filename */\n\twav: string;\n\t/** Phoneme alias */\n\talias: string;\n\t/** Left blank — offset from WAV start (ms) */\n\toffset: number;\n\t/** Consonant portion end from offset (ms) */\n\tconsonant: number;\n\t/** Right blank — negative = from WAV end, positive = from offset (ms) */\n\tcutoff: number;\n\t/** Preutterance from offset (ms) */\n\tpre: number;\n\t/** Overlap / crossfade region (ms) */\n\toverlap: number;\n}\n\n/**\n * Parse oto.ini content (already decoded to UTF-8 string).\n * Silently skips malformed lines.\n */\nexport function parseOto(content: string): OtoEntry[] {\n\tconst entries: OtoEntry[] = [];\n\n\tfor (const raw of content.split(/\\r?\\n/)) {\n\t\tconst line = raw.trim();\n\t\tif (!line || line.startsWith(\"#\")) continue;\n\n\t\tconst eq = line.indexOf(\"=\");\n\t\tif (eq === -1) continue;\n\n\t\tconst wav = line.slice(0, eq).trim();\n\t\tconst parts = line.slice(eq + 1).split(\",\");\n\t\tif (parts.length < 6) continue;\n\n\t\tconst [alias, offsetStr, consonantStr, cutoffStr, preStr, overlapStr] =\n\t\t\tparts;\n\t\t// Empty alias → use filename without extension (UTAU spec default)\n\t\tconst aliasStr = alias.trim() || wav.replace(/\\.[^.]+$/, \"\");\n\t\tconst entry: OtoEntry = {\n\t\t\twav,\n\t\t\talias: aliasStr,\n\t\t\toffset: parseFloat(offsetStr) || 0,\n\t\t\tconsonant: parseFloat(consonantStr) || 0,\n\t\t\tcutoff: parseFloat(cutoffStr) || 0,\n\t\t\tpre: parseFloat(preStr) || 0,\n\t\t\toverlap: parseFloat(overlapStr) || 0,\n\t\t};\n\n\t\tif (!entry.alias) continue;\n\t\tentries.push(entry);\n\t}\n\n\treturn entries;\n}\n","export interface WavData {\r\n\tsampleRate: number;\r\n\tchannels: number;\r\n\t/** Normalized samples in [-1, 1], interleaved if multi-channel */\r\n\tsamples: Float32Array;\r\n}\r\n\r\n/** Parse a WAV file from an ArrayBuffer. Supports PCM 8/16/24-bit and IEEE float 32-bit. */\r\nexport function parseWav(buf: ArrayBuffer): WavData {\r\n\tconst view = new DataView(buf);\r\n\r\n\tconst riff = readFourCC(view, 0);\r\n\tif (riff !== \"RIFF\") throw new Error(`Not a RIFF file (got \"${riff}\")`);\r\n\r\n\tlet sampleRate = 0;\r\n\tlet channels = 0;\r\n\tlet bitsPerSample = 0;\r\n\tlet audioFormat = 1;\r\n\tlet dataOffset = 0;\r\n\tlet dataLength = 0;\r\n\r\n\tlet pos = 12;\r\n\twhile (pos < view.byteLength - 8) {\r\n\t\tconst id = readFourCC(view, pos);\r\n\t\tconst size = view.getUint32(pos + 4, true);\r\n\t\tpos += 8;\r\n\r\n\t\tif (id === \"fmt \") {\r\n\t\t\taudioFormat = view.getUint16(pos, true);\r\n\t\t\tchannels = view.getUint16(pos + 2, true);\r\n\t\t\tsampleRate = view.getUint32(pos + 4, true);\r\n\t\t\tbitsPerSample = view.getUint16(pos + 14, true);\r\n\t\t\t// WAVE_FORMAT_EXTENSIBLE: the real format code is the first 2 bytes of\r\n\t\t\t// the SubFormat GUID in the extension.\r\n\t\t\tif (audioFormat === 0xfffe && size >= 40) {\r\n\t\t\t\taudioFormat = view.getUint16(pos + 24, true);\r\n\t\t\t}\r\n\t\t} else if (id === \"data\") {\r\n\t\t\tdataOffset = pos;\r\n\t\t\t// Clamp to the actual file size — a corrupt chunk header could otherwise\r\n\t\t\t// send sample reads past the end of the buffer.\r\n\t\t\tdataLength = Math.min(size, view.byteLength - pos);\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tpos += size + (size & 1);\r\n\t}\r\n\r\n\tif (!dataOffset) throw new Error(\"WAV has no data chunk\");\r\n\tif (!channels || !sampleRate) throw new Error(\"WAV fmt chunk missing\");\r\n\r\n\t// Reject anything the sample loop below cannot decode — falling through\r\n\t// would silently produce all-zero (silent) audio.\r\n\tconst supported =\r\n\t\t(audioFormat === 3 && bitsPerSample === 32) ||\r\n\t\t(audioFormat === 1 &&\r\n\t\t\t(bitsPerSample === 8 || bitsPerSample === 16 || bitsPerSample === 24));\r\n\tif (!supported) {\r\n\t\tthrow new Error(\r\n\t\t\t`Unsupported WAV format ${audioFormat} / ${bitsPerSample}-bit (need PCM 8/16/24-bit or IEEE float 32-bit)`,\r\n\t\t);\r\n\t}\r\n\r\n\tconst bytesPerSample = bitsPerSample >> 3;\r\n\tconst totalSamples = Math.floor(dataLength / bytesPerSample);\r\n\tconst samples = new Float32Array(totalSamples);\r\n\r\n\tfor (let i = 0; i < totalSamples; i++) {\r\n\t\tconst p = dataOffset + i * bytesPerSample;\r\n\t\tif (audioFormat === 3) {\r\n\t\t\tsamples[i] = view.getFloat32(p, true);\r\n\t\t} else if (bitsPerSample === 8) {\r\n\t\t\tsamples[i] = (view.getUint8(p) - 128) / 128;\r\n\t\t} else if (bitsPerSample === 16) {\r\n\t\t\tsamples[i] = view.getInt16(p, true) / 32768;\r\n\t\t} else if (bitsPerSample === 24) {\r\n\t\t\tconst lo = view.getUint8(p) | (view.getUint8(p + 1) << 8);\r\n\t\t\tlet hi = view.getUint8(p + 2);\r\n\t\t\tif (hi & 0x80) hi = hi | 0xffffff00;\r\n\t\t\tsamples[i] = ((hi << 16) | lo) / 8388608;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { sampleRate, channels, samples };\r\n}\r\n\r\n/** Mix down to mono by averaging all channels. */\r\nexport function toMono(wav: WavData): WavData {\r\n\tif (wav.channels === 1) return wav;\r\n\tconst len = wav.samples.length / wav.channels;\r\n\tconst out = new Float32Array(len);\r\n\tfor (let i = 0; i < len; i++) {\r\n\t\tlet sum = 0;\r\n\t\tfor (let c = 0; c < wav.channels; c++)\r\n\t\t\tsum += wav.samples[i * wav.channels + c];\r\n\t\tout[i] = sum / wav.channels;\r\n\t}\r\n\treturn { sampleRate: wav.sampleRate, channels: 1, samples: out };\r\n}\r\n\r\n/** Linear interpolation resample to targetRate. Expects mono input. */\r\nexport function resample(wav: WavData, targetRate: number): WavData {\r\n\tif (wav.sampleRate === targetRate) return wav;\r\n\tconst ratio = wav.sampleRate / targetRate;\r\n\tconst outLen = Math.floor(wav.samples.length / ratio);\r\n\tconst out = new Float32Array(outLen);\r\n\tconst src = wav.samples;\r\n\tfor (let i = 0; i < outLen; i++) {\r\n\t\tconst x = i * ratio;\r\n\t\tconst xi = Math.floor(x);\r\n\t\tconst frac = x - xi;\r\n\t\tout[i] = (src[xi] ?? 0) + ((src[xi + 1] ?? 0) - (src[xi] ?? 0)) * frac;\r\n\t}\r\n\treturn { sampleRate: targetRate, channels: 1, samples: out };\r\n}\r\n\r\n/** Convert Float32 [-1,1] samples to Int16 PCM. */\r\nexport function toInt16(samples: Float32Array): Int16Array {\r\n\tconst out = new Int16Array(samples.length);\r\n\tfor (let i = 0; i < samples.length; i++) {\r\n\t\tout[i] = Math.round(Math.max(-1, Math.min(1, samples[i])) * 32767);\r\n\t}\r\n\treturn out;\r\n}\r\n\r\n/**\r\n * Decode a WAV to 48kHz/16bit/mono Int16 PCM, reporting the source sample rate.\r\n *\r\n * The rate is needed to index a sibling `.frq` file, whose analysis hop is\r\n * counted in ORIGINAL samples — see {@link frqAverageF0InRange}.\r\n *\r\n * Note this does not touch amplitude: peak levels are carried through\r\n * unchanged, so a bank's own relative loudness between phonemes is preserved\r\n * (UTAU's engine instead normalises each region to −6 dBFS, which is why its\r\n * イ/エ段 and 語尾 samples come out louder than recorded).\r\n */\r\nexport function readWavPcm48k(buf: ArrayBuffer): {\r\n\tpcm: Int16Array;\r\n\tsourceRate: number;\r\n} {\r\n\tconst wav = parseWav(buf);\r\n\tconst mono = toMono(wav);\r\n\tconst resampled = resample(mono, 48000);\r\n\treturn { pcm: toInt16(resampled.samples), sourceRate: wav.sampleRate };\r\n}\r\n\r\n/**\r\n * Convert a WAV to 48kHz/16bit/mono Int16 PCM.\r\n *\r\n * @deprecated Misnomer — this never normalised amplitude. Use\r\n * {@link readWavPcm48k}, which also reports the source sample rate.\r\n */\r\nexport function normalizePcm(buf: ArrayBuffer): Int16Array {\r\n\treturn readWavPcm48k(buf).pcm;\r\n}\r\n\r\nfunction readFourCC(view: DataView, pos: number): string {\r\n\treturn String.fromCharCode(\r\n\t\tview.getUint8(pos),\r\n\t\tview.getUint8(pos + 1),\r\n\t\tview.getUint8(pos + 2),\r\n\t\tview.getUint8(pos + 3),\r\n\t);\r\n}\r\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","import { unzipSync } from \"fflate\";\n\n/** Minimal file-like handle so zip entries can stand in for `File` objects. */\nexport interface ZipFile {\n\tarrayBuffer(): Promise<ArrayBuffer>;\n}\n\n/**\n * Extracts a zip archive into a flat path → file map, mirroring the shape of\n * `webkitdirectory` file lists so the converter can treat both sources the same.\n *\n * Many UTAU voicebank zips are packed on Windows without the UTF-8 flag, so\n * entry names are Shift_JIS bytes. fflate decodes those as latin1 (1 byte =\n * 1 code point) rather than mangling them, so we can losslessly recover the\n * original bytes and re-decode with the right encoding per entry.\n */\nexport function unzipToFileMap(\n\tdata: ArrayBuffer,\n): Promise<Record<string, ZipFile>> {\n\tconst bytes = new Uint8Array(data);\n\tconst unzipped = unzipSync(bytes);\n\tconst isUtf8ByIndex = readUtf8Flags(bytes);\n\tconst sjisDecoder = new TextDecoder(\"shift_jis\");\n\n\tconst fileMap: Record<string, ZipFile> = {};\n\tObject.keys(unzipped).forEach((rawName, i) => {\n\t\tconst fileBytes = unzipped[rawName];\n\t\tconst name = isUtf8ByIndex[i]\n\t\t\t? rawName\n\t\t\t: sjisDecoder.decode(Uint8Array.from(rawName, (c) => c.charCodeAt(0)));\n\t\tconst path = name.replace(/\\\\/g, \"/\");\n\t\tif (path.endsWith(\"/\")) return; // directory entry\n\t\tfileMap[path] = {\n\t\t\tarrayBuffer: () =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\tfileBytes.buffer.slice(\n\t\t\t\t\t\tfileBytes.byteOffset,\n\t\t\t\t\t\tfileBytes.byteOffset + fileBytes.byteLength,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t};\n\t});\n\treturn Promise.resolve(fileMap);\n}\n\n/** Walks the central directory to read the UTF-8 language flag (bit 11) of each entry, in order. */\nfunction readUtf8Flags(buf: Uint8Array): boolean[] {\n\tconst view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n\n\tlet eocd = -1;\n\tconst maxBack = Math.min(buf.length, 65557); // 22 + max comment length\n\tfor (let i = buf.length - 22; i >= buf.length - maxBack && i >= 0; i--) {\n\t\tif (view.getUint32(i, true) === 0x06054b50) {\n\t\t\teocd = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (eocd < 0) return [];\n\n\tconst entryCount = view.getUint16(eocd + 10, true);\n\tlet cdOffset = view.getUint32(eocd + 16, true);\n\n\tconst flags: boolean[] = [];\n\tfor (let i = 0; i < entryCount; i++) {\n\t\tif (view.getUint32(cdOffset, true) !== 0x02014b50) break;\n\t\tconst flag = view.getUint16(cdOffset + 8, true);\n\t\tconst nameLen = view.getUint16(cdOffset + 28, true);\n\t\tconst extraLen = view.getUint16(cdOffset + 30, true);\n\t\tconst commentLen = view.getUint16(cdOffset + 32, true);\n\t\tflags.push((flag & 0x800) !== 0);\n\t\tcdOffset += 46 + nameLen + extraLen + commentLen;\n\t}\n\treturn flags;\n}\n","import type { Manifest } from \"./types.js\";\n\n/** Magic number 'KOE\\0' (stored big-endian as 0x4B 0x4F 0x45 0x00). */\nconst MAGIC = 0x4b4f4500;\n\n/**\n * Koe Archive Format (.koe)\n * [4B] magic 'KOE\\0' (big-endian)\n * [4B] JSON length (little-endian)\n * [N ] manifest JSON (UTF-8)\n * [M ] raw PCM (Int16 / 48kHz / mono); phoneme offsets are relative to here\n */\nexport function packKoe(manifest: Manifest, pcmParts: BlobPart[]): Blob {\n\tconst json = new TextEncoder().encode(JSON.stringify(manifest));\n\tconst header = new ArrayBuffer(8);\n\tconst view = new DataView(header);\n\tview.setUint32(0, MAGIC, false); // magic, big-endian\n\tview.setUint32(4, json.byteLength, true); // json length, little-endian\n\treturn new Blob([header, json, ...pcmParts]);\n}\n\n/** Read the 8-byte header → JSON length. Throws on bad magic. */\nexport function parseKoeHeader(headerBytes: ArrayBuffer): {\n\tjsonLength: number;\n} {\n\tconst view = new DataView(headerBytes);\n\tif (view.byteLength < 8 || view.getUint32(0, false) !== MAGIC) {\n\t\tthrow new Error(\"Not a .koe file (bad magic)\");\n\t}\n\treturn { jsonLength: view.getUint32(4, true) };\n}\n\n/** Byte offset where PCM data begins, given the JSON length. */\nexport const pcmBase = (jsonLength: number): number => 8 + jsonLength;\n","import { parseKoeHeader, pcmBase } from \"../koe.js\";\nimport type { Manifest } from \"../types.js\";\n\n/**\n * Supplies raw bytes from the PCM section of a .koe archive on demand.\n * - BlobVoiceSource: slices an in-memory Blob / File (no full-buffer copy)\n * - RangeVoiceSource: HTTP Range requests against a URL (mobile-friendly)\n * `base` is the byte offset where PCM data starts (8 + jsonLength).\n */\ninterface VoiceSource {\n\treadBytes(offset: number, length: number): Promise<ArrayBuffer>;\n}\n\n/** Hard ceiling on a single phoneme's PCM size (~10.5 MB / ~55s at 48kHz). */\nconst MAX_PHONEME_SAMPLES = 5_242_880;\n/** Hard ceiling on the manifest JSON header itself. */\nconst MAX_JSON_LENGTH = 50 * 1024 * 1024;\n\nclass BlobVoiceSource implements VoiceSource {\n\tconstructor(\n\t\tprivate blob: Blob,\n\t\tprivate base: number,\n\t) {}\n\treadBytes(offset: number, length: number): Promise<ArrayBuffer> {\n\t\tconst start = this.base + offset;\n\t\treturn this.blob.slice(start, start + length).arrayBuffer();\n\t}\n}\n\nclass RangeVoiceSource implements VoiceSource {\n\tconstructor(\n\t\tprivate url: string,\n\t\tprivate base: number,\n\t) {}\n\tasync readBytes(offset: number, length: number): Promise<ArrayBuffer> {\n\t\tconst start = this.base + offset;\n\t\treturn rangeFetch(this.url, start, length);\n\t}\n}\n\nasync function rangeFetch(\n\turl: string,\n\tstart: number,\n\tlength: number,\n): Promise<ArrayBuffer> {\n\tconst res = await fetch(url, {\n\t\theaders: { Range: `bytes=${start}-${start + length - 1}` },\n\t\tcredentials: \"omit\", // never leak cookies / auth to a MML-supplied URL\n\t});\n\t// A server that ignores Range and returns 200 with the full file would\n\t// blow past the requested size and exhaust memory; only accept 206.\n\tif (res.status !== 206) {\n\t\tthrow new Error(\n\t\t\t`.koe fetch failed: expected 206 Partial Content, got ${res.status}`,\n\t\t);\n\t}\n\treturn readCapped(res, length);\n}\n\n/**\n * Read a response body without trusting its declared size: a server can answer\n * 206 yet still stream an oversized body. Abort as soon as the read exceeds\n * the requested byte count, before buffering the excess.\n */\nasync function readCapped(res: Response, length: number): Promise<ArrayBuffer> {\n\tconst reader = res.body?.getReader();\n\tif (!reader) {\n\t\tconst buf = await res.arrayBuffer();\n\t\tif (buf.byteLength > length) {\n\t\t\tthrow new Error(\n\t\t\t\t`.koe fetch failed: response exceeds requested ${length} bytes`,\n\t\t\t);\n\t\t}\n\t\treturn buf;\n\t}\n\tconst out = new Uint8Array(length);\n\tlet received = 0;\n\tfor (;;) {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) break;\n\t\tif (received + value.byteLength > length) {\n\t\t\tawait reader.cancel();\n\t\t\tthrow new Error(\n\t\t\t\t`.koe fetch failed: response exceeds requested ${length} bytes`,\n\t\t\t);\n\t\t}\n\t\tout.set(value, received);\n\t\treceived += value.byteLength;\n\t}\n\treturn received === length ? out.buffer : out.buffer.slice(0, received);\n}\n\nfunction validateJsonLength(jsonLength: number): void {\n\tif (\n\t\t!Number.isInteger(jsonLength) ||\n\t\tjsonLength < 0 ||\n\t\tjsonLength > MAX_JSON_LENGTH\n\t) {\n\t\tthrow new Error(`manifest JSON length out of bounds: ${jsonLength}`);\n\t}\n}\n\nfunction parseManifest(json: ArrayBuffer): Manifest {\n\tconst manifest = JSON.parse(new TextDecoder().decode(json)) as Manifest;\n\tif (\n\t\t!manifest ||\n\t\ttypeof manifest !== \"object\" ||\n\t\ttypeof manifest.phonemes !== \"object\" ||\n\t\tmanifest.phonemes === null\n\t) {\n\t\tthrow new Error(\"invalid manifest: missing phonemes table\");\n\t}\n\treturn manifest;\n}\n\n/**\n * Read-only access to a .koe voice bank: its manifest plus per-phoneme PCM,\n * fetched on demand (Blob slice or HTTP Range). The full bank is never held in\n * memory.\n *\n * Pure data — no AudioContext, no AudioWorklet, no DOM. Use this when you only\n * need the source samples (e.g. to feed the {@link Worldline} renderer or any\n * other vocoder). {@link KoeEngine} builds its concatenative playback on top of\n * this same class.\n *\n * const bank = await VoiceBank.load(koeBlobOrUrl);\n * const pcm = await bank.getPcm('a'); // Float64 [-1, 1]\n */\nexport class VoiceBank {\n\tprivate constructor(\n\t\t/** The voice bank manifest (sample rate, reference pitch, phoneme table). */\n\t\treadonly manifest: Manifest,\n\t\tprivate source: VoiceSource,\n\t) {}\n\n\t/**\n\t * Parse a .koe archive header + manifest and bind a lazy PCM source.\n\t * @param koe a Blob/File of the .koe archive, or a URL (served with Range support)\n\t */\n\tstatic async load(koe: Blob | string): Promise<VoiceBank> {\n\t\ttry {\n\t\t\tif (typeof koe === \"string\") {\n\t\t\t\t// Range requests on blob: URLs are not portable (Firefox/Safari answer\n\t\t\t\t// 200); the data already lives in memory, so read it back as a Blob.\n\t\t\t\tif (/^blob:/i.test(koe)) {\n\t\t\t\t\tconst res = await fetch(koe);\n\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\tthrow new Error(`blob: URL fetch failed: ${res.status}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn await VoiceBank.fromBlob(await res.blob());\n\t\t\t\t}\n\t\t\t\tif (!/^https?:/i.test(koe)) {\n\t\t\t\t\tthrow new Error(`unsupported URL protocol: ${koe}`);\n\t\t\t\t}\n\t\t\t\tconst header = await rangeFetch(koe, 0, 8);\n\t\t\t\tconst { jsonLength } = parseKoeHeader(header);\n\t\t\t\tvalidateJsonLength(jsonLength);\n\t\t\t\tconst json = await rangeFetch(koe, 8, jsonLength);\n\t\t\t\tconst manifest = parseManifest(json);\n\t\t\t\treturn new VoiceBank(\n\t\t\t\t\tmanifest,\n\t\t\t\t\tnew RangeVoiceSource(koe, pcmBase(jsonLength)),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn await VoiceBank.fromBlob(koe);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to load .koe voice bank: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate static async fromBlob(koe: Blob): Promise<VoiceBank> {\n\t\tconst header = await koe.slice(0, 8).arrayBuffer();\n\t\tconst { jsonLength } = parseKoeHeader(header);\n\t\tvalidateJsonLength(jsonLength);\n\t\tconst json = await koe.slice(8, 8 + jsonLength).arrayBuffer();\n\t\tconst manifest = parseManifest(json);\n\t\treturn new VoiceBank(\n\t\t\tmanifest,\n\t\t\tnew BlobVoiceSource(koe, pcmBase(jsonLength)),\n\t\t);\n\t}\n\n\t/** True if the bank contains a phoneme under this alias. */\n\thas(phoneme: string): boolean {\n\t\t// Own-property check: a plain [phoneme] access would also match inherited\n\t\t// Object.prototype keys like \"toString\" / \"constructor\".\n\t\treturn Object.hasOwn(this.manifest.phonemes, phoneme);\n\t}\n\n\t/**\n\t * Raw Int16 PCM bytes (48 kHz / mono) for a phoneme, or null if unknown.\n\t * The returned ArrayBuffer is freshly allocated and safe to transfer to a\n\t * worker / AudioWorklet.\n\t */\n\tasync readPcmBytes(phoneme: string): Promise<ArrayBuffer | null> {\n\t\tif (!Object.hasOwn(this.manifest.phonemes, phoneme)) return null;\n\t\tconst entry = this.manifest.phonemes[phoneme];\n\t\tif (\n\t\t\t!Number.isInteger(entry.offset) ||\n\t\t\t!Number.isInteger(entry.length) ||\n\t\t\tentry.offset < 0 ||\n\t\t\tentry.length < 0 ||\n\t\t\tentry.length > MAX_PHONEME_SAMPLES\n\t\t) {\n\t\t\tthrow new Error(`manifest entry out of bounds for phoneme: ${phoneme}`);\n\t\t}\n\t\treturn this.source.readBytes(entry.offset, entry.length * 2); // Int16 = 2 bytes/sample\n\t}\n\n\t/**\n\t * A phoneme's PCM as a Float64Array normalised to [-1, 1], or null if unknown.\n\t * Intended for external analysis / resynthesis such as the WORLD vocoder.\n\t */\n\tasync getPcm(phoneme: string): Promise<Float64Array | null> {\n\t\tconst buf = await this.readPcmBytes(phoneme);\n\t\tif (!buf) return null;\n\t\t// A truncated read (Blob clamped at EOF) can yield an odd byte count,\n\t\t// which the Int16Array(buffer) constructor rejects — floor to whole samples.\n\t\tconst int16 = new Int16Array(buf, 0, Math.floor(buf.byteLength / 2));\n\t\tconst f64 = new Float64Array(int16.length);\n\t\tfor (let i = 0; i < int16.length; i++) f64[i] = int16[i] / 32768;\n\t\treturn f64;\n\t}\n}\n","import type { Manifest, NoteEvent } from \"../types.js\";\r\nimport { VoiceBank } from \"./voice-bank.js\";\r\n\r\nexport type { NoteEvent };\r\n\r\nexport interface KoeEngineOptions {\r\n\t/** URL to koe-worklet.js. Defaults to './koe-worklet.js'. */\r\n\tworkletUrl?: string;\r\n}\r\n\r\nexport interface PlayOptions {\r\n\t/**\r\n\t * Play the first note's lead-in (its consonant / preutterance region) instead\r\n\t * of skipping straight to the vowel.\r\n\t *\r\n\t * Every note but the first gets its lead-in from the crossfade with the note\r\n\t * before it. The first note has no predecessor, so the lead-in has to come\r\n\t * from somewhere: with `leadIn` the phrase starts one preutterance EARLIER\r\n\t * relative to its beats, and {@link KoeEngine.play} returns that offset in\r\n\t * samples so a sequencer can schedule around it. Left off (the default), the\r\n\t * first note keeps its beat exactly but opens on its vowel, dropping the\r\n\t * consonant.\r\n\t */\r\n\tleadIn?: boolean;\r\n}\r\n\r\n/**\r\n * Main-thread API for the koe concatenative synthesis engine.\r\n *\r\n * Loads a single .koe archive. The full voice bank is never held in memory:\r\n * phonemes are fetched on demand (via {@link VoiceBank}) and cached in the\r\n * audio thread.\r\n *\r\n * const engine = new KoeEngine();\r\n * await engine.load(koeBlobOrUrl);\r\n * await engine.play([{ phoneme: 'a', pitch: 440, duration: 48000 }]);\r\n *\r\n * For analysis / resynthesis (e.g. {@link Worldline}) you usually only need the\r\n * raw samples — use {@link VoiceBank} directly instead, which needs no\r\n * AudioContext or worklet.\r\n */\r\nexport class KoeEngine {\r\n\tprivate ctx: AudioContext;\r\n\tprivate workletUrl: string;\r\n\tprivate node: AudioWorkletNode | null = null;\r\n\tprivate bank: VoiceBank | null = null;\r\n\tprivate delivered = new Set<string>();\r\n\tprivate pending = new Map<string, Promise<void>>();\r\n\r\n\tconstructor(options: KoeEngineOptions = {}) {\r\n\t\tthis.ctx = new AudioContext({ sampleRate: 48000 });\r\n\t\tthis.workletUrl = options.workletUrl ?? \"./koe-worklet.js\";\r\n\t}\r\n\r\n\tget audioContext(): AudioContext {\r\n\t\treturn this.ctx;\r\n\t}\r\n\r\n\tget manifest(): Manifest | null {\r\n\t\treturn this.bank?.manifest ?? null;\r\n\t}\r\n\r\n\t/** The underlying voice bank (manifest + on-demand PCM), or null before load(). */\r\n\tget voiceBank(): VoiceBank | null {\r\n\t\treturn this.bank;\r\n\t}\r\n\r\n\t/**\r\n\t * Register the worklet and bind a .koe voice bank.\r\n\t * @param koe a Blob/File of the .koe archive, or a URL (served with Range support)\r\n\t */\r\n\tasync load(koe: Blob | string): Promise<void> {\r\n\t\tawait this.ctx.audioWorklet.addModule(this.workletUrl);\r\n\r\n\t\t// Re-loading: tear down the previous node, or both would keep playing.\r\n\t\tthis.node?.disconnect();\r\n\t\tthis.node = null;\r\n\r\n\t\tthis.bank = await VoiceBank.load(koe);\r\n\t\tthis.delivered.clear();\r\n\t\tthis.pending.clear();\r\n\r\n\t\tthis.node = new AudioWorkletNode(this.ctx, \"koe-processor\", {\r\n\t\t\tnumberOfInputs: 0,\r\n\t\t\tnumberOfOutputs: 1,\r\n\t\t\toutputChannelCount: [1],\r\n\t\t});\r\n\t\tthis.node.port.postMessage({ type: \"init\", manifest: this.bank.manifest });\r\n\t\tthis.node.connect(this.ctx.destination);\r\n\r\n\t\tconsole.log(\r\n\t\t\t\"[koe] ready —\",\r\n\t\t\tObject.keys(this.bank.manifest.phonemes).length,\r\n\t\t\t\"phonemes (on-demand)\",\r\n\t\t);\r\n\t}\r\n\r\n\t/** Fetch one phoneme's PCM and deliver it to the worklet (deduped, cached). */\r\n\tprivate ensurePhoneme(name: string): Promise<void> {\r\n\t\tif (this.delivered.has(name)) return Promise.resolve();\r\n\t\tconst existing = this.pending.get(name);\r\n\t\tif (existing) return existing;\r\n\t\tif (!this.bank || !this.node) return Promise.resolve();\r\n\r\n\t\tconst load = this.bank\r\n\t\t\t.readPcmBytes(name)\r\n\t\t\t.then((buf) => {\r\n\t\t\t\tif (!buf || !this.node) return;\r\n\t\t\t\tthis.node.port.postMessage({ type: \"phoneme\", name, buffer: buf }, [\r\n\t\t\t\t\tbuf,\r\n\t\t\t\t]);\r\n\t\t\t\tthis.delivered.add(name);\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// Always clear pending — a failed fetch must stay retryable, or the\r\n\t\t\t\t// rejected promise would poison every later play() of this phoneme.\r\n\t\t\t\tthis.pending.delete(name);\r\n\t\t\t});\r\n\r\n\t\tthis.pending.set(name, load);\r\n\t\treturn load;\r\n\t}\r\n\r\n\t/**\r\n\t * Stop current playback, preload the phonemes for `notes`, then queue them.\r\n\t *\r\n\t * @returns the lead-in offset in samples — how far the first note's audio\r\n\t * starts ahead of its beat. 0 unless {@link PlayOptions.leadIn}.\r\n\t */\r\n\tasync play(notes: NoteEvent[], options: PlayOptions = {}): Promise<number> {\r\n\t\tif (!this.node) throw new Error(\"KoeEngine: call load() before play()\");\r\n\t\tthis.node.port.postMessage({ type: \"stop\" });\r\n\t\tconst names = [...new Set(notes.map((n) => n.phoneme))].filter(Boolean);\r\n\t\tawait Promise.all(names.map((n) => this.ensurePhoneme(n)));\r\n\t\tconst leadIn = options.leadIn === true;\r\n\t\tthis.node.port.postMessage({ type: \"play\", notes, leadIn });\r\n\t\treturn leadIn ? this.leadInSamples(notes) : 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Output samples the first note's lead-in occupies ahead of its beat —\r\n\t * mirrors what the worklet does with `leadIn`, so callers can compensate.\r\n\t */\r\n\tprivate leadInSamples(notes: NoteEvent[]): number {\r\n\t\tconst first = notes[0];\r\n\t\tconst m = this.bank?.manifest;\r\n\t\tif (!first || !m || first.phoneme === \"\") return 0;\r\n\t\tconst entry = Object.hasOwn(m.phonemes, first.phoneme)\r\n\t\t\t? m.phonemes[first.phoneme]\r\n\t\t\t: undefined;\r\n\t\tif (!entry || entry.length <= 0) return 0;\r\n\t\tconst recorded = entry.pitch || m.referencePitch || first.pitch || 1;\r\n\t\tconst stepRate = first.pitch / recorded;\r\n\t\treturn stepRate > 0 ? entry.pre / stepRate : 0;\r\n\t}\r\n\r\n\t/** Stop playback and clear the queue. */\r\n\tstop(): void {\r\n\t\tthis.node?.port.postMessage({ type: \"stop\" });\r\n\t}\r\n\r\n\t/** Resume the AudioContext if suspended (e.g. after autoplay block). */\r\n\tasync resume(): Promise<void> {\r\n\t\tif (this.ctx.state === \"suspended\") await this.ctx.resume();\r\n\t}\r\n\r\n\t/**\r\n\t * Tear down the worklet node and close the AudioContext, releasing the audio\r\n\t * hardware. The engine cannot be reused afterwards — create a new one.\r\n\t */\r\n\tasync dispose(): Promise<void> {\r\n\t\tthis.node?.disconnect();\r\n\t\tthis.node = null;\r\n\t\tthis.bank = null;\r\n\t\tthis.delivered.clear();\r\n\t\tthis.pending.clear();\r\n\t\tif (this.ctx.state !== \"closed\") await this.ctx.close();\r\n\t}\r\n\r\n\t/**\r\n\t * Read a phoneme's raw PCM and return it as a Float64Array normalised to\r\n\t * [-1, 1]. Convenience that forwards to the underlying {@link VoiceBank}.\r\n\t * Intended for external analysis such as the WORLD vocoder.\r\n\t */\r\n\tasync getPcm(phoneme: string): Promise<Float64Array | null> {\r\n\t\treturn this.bank?.getPcm(phoneme) ?? null;\r\n\t}\r\n}\r\n","import type { PhonemeEntry } from \"../types.js\";\n\n/** Output sample rate of the worldline synthesizer. */\nexport const WORLDLINE_SAMPLE_RATE = 48000;\n\n/**\n * WORLD needs roughly 85 ms of audio for stable F0 analysis. Phonemes with\n * fewer samples than this are rejected (renderNote returns null).\n */\nexport const MIN_WORLDLINE_SAMPLES = 4096;\n\n/** SynthRequest struct layout — 120 bytes, WASM32. */\nconst SYNTH_REQ_SIZE = 120;\n/** Frame period hardcoded in worldline's phrase_synth.cpp. */\nconst WL_FRAME_MS = 10;\n\n/**\n * The subset of the Emscripten module surface that we call. worldline.js is an\n * MODULARIZE=1 / EXPORT_NAME=WorldlineModule build of OpenUtau's worldline.\n */\ninterface WorldlineWasm {\n\t_PhraseSynthNew(): number;\n\t_PhraseSynthDelete(ps: number): void;\n\t_PhraseSynthAddRequest(\n\t\tps: number,\n\t\treq: number,\n\t\tposMs: number,\n\t\tskipMs: number,\n\t\tlengthMs: number,\n\t\tfadeInMs: number,\n\t\tfadeOutMs: number,\n\t\tflag: number,\n\t): void;\n\t_PhraseSynthSetCurves(\n\t\tps: number,\n\t\tf0: number,\n\t\tgender: number,\n\t\ttension: number,\n\t\tbreathiness: number,\n\t\tvoicing: number,\n\t\tlength: number,\n\t\tframeMs: number,\n\t): void;\n\t_PhraseSynthSynth(ps: number, yPtrPtr: number, flag: number): number;\n\t_malloc(size: number): number;\n\t_free(ptr: number): void;\n\tsetValue(ptr: number, value: number, type: string): void;\n\tgetValue(ptr: number, type: string): number;\n\tHEAPF32: Float32Array;\n\tHEAPF64: Float64Array;\n}\n\ntype WorldlineFactory = (opts?: {\n\tlocateFile?: (path: string) => string;\n}) => Promise<WorldlineWasm>;\n\ndeclare global {\n\t// Injected by worldline.js when loaded as a classic <script> or via importScripts.\n\t// eslint-disable-next-line no-var\n\tvar WorldlineModule: WorldlineFactory | undefined;\n\t// Present in classic Web Workers (used to load worldline.js off the main thread).\n\t// eslint-disable-next-line no-var\n\tvar importScripts: ((...urls: string[]) => void) | undefined;\n}\n\nexport interface WorldlineLoadOptions {\n\t/**\n\t * URL of `worldline.js` (the Emscripten loader). The matching\n\t * `worldline.wasm` must sit next to it — it is resolved relative to this URL.\n\t *\n\t * When consuming koe from npm + a CDN this is typically e.g.\n\t * `https://cdn.jsdelivr.net/npm/@onjmin/koe/dist/world/worldline.js`, or your\n\t * own hosted copy of `dist/world/`.\n\t */\n\tscriptUrl: string;\n}\n\n/**\n * A per-frame expression value: either a flat constant for the whole note, or\n * a function evaluated once per 10ms WORLD frame for a custom curve (vibrato,\n * portamento, scoop-in, humanize jitter, hand-drawn automation, …).\n *\n * `tMs` is elapsed time from the start of the rendered buffer (0 = includes\n * the `preMs` lead-in), `totalMs` is the full rendered length (`preMs +\n * durationMs`). Callers own all curve shaping — worldline itself has no\n * opinion on what \"vibrato\" or \"scoop\" means, it just samples whatever\n * function you give it once per frame.\n */\nexport type CurveInput = number | ((tMs: number, totalMs: number) => number);\n\nconst sampleCurve = (input: number, curve: CurveInput, totalMs: number): number =>\n\ttypeof curve === \"function\" ? curve(input, totalMs) : curve;\n\nexport interface RenderNoteParams {\n\t/**\n\t * Source phoneme PCM normalised to [-1, 1] (e.g. from\n\t * `VoiceBank.getPcm()` / `KoeEngine.getPcm()`).\n\t */\n\tpcm: Float64Array;\n\t/**\n\t * Target output pitch in Hz. Pass a function for vibrato, portamento,\n\t * scoop-in, pitch-drift humanize, etc. — it is sampled once per 10ms frame.\n\t */\n\tpitch: CurveInput;\n\t/** Sustain / vowel duration in ms (the lead-in below is rendered on top). */\n\tdurationMs: number;\n\t/** Preutterance / lead-in in ms — convert from {@link PhonemeEntry.pre}. */\n\tpreMs: number;\n\t/** Consonant length in ms — convert from {@link PhonemeEntry.consonant}. */\n\tconsonantMs: number;\n\t/** Reference tempo in BPM for worldline's internal timing. Default 120. */\n\ttempo?: number;\n\t/**\n\t * Formant/gender shift, 0-1. 0.5 (default) = unmodified. Below 0.5 skews\n\t * toward a lower/thicker formant (older, huskier); above 0.5 toward a\n\t * higher/thinner one (younger, brighter) — pitch itself is unaffected.\n\t */\n\tgender?: CurveInput;\n\t/**\n\t * Tension, 0-1. 0.5 (default) = neutral. Higher = tighter/more strained\n\t * (\"こぶし\"-style push); lower = more relaxed/breathy-adjacent.\n\t */\n\ttension?: CurveInput;\n\t/** Breathiness, 0-1. 0.5 (default) = neutral. Higher = airier/whispered. */\n\tbreathiness?: CurveInput;\n\t/**\n\t * Voicing ratio, 0-1. 1.0 (default) = fully voiced. Lower blends toward an\n\t * unvoiced/falsetto-adjacent texture.\n\t */\n\tvoicing?: CurveInput;\n}\n\n/** Convert a sample count at 48 kHz to milliseconds. */\nexport const samplesToMs = (samples: number): number =>\n\t(samples / WORLDLINE_SAMPLE_RATE) * 1000;\n\n/**\n * Derive {@link RenderNoteParams} lead-in / consonant fields from a manifest\n * entry, so callers don't repeat the sample→ms conversion.\n *\n * const params = { pcm, pitch, durationMs, ...leadInFromEntry(entry) };\n */\nexport function leadInFromEntry(entry: PhonemeEntry): {\n\tpreMs: number;\n\tconsonantMs: number;\n} {\n\treturn {\n\t\tpreMs: samplesToMs(entry.pre || 0),\n\t\tconsonantMs: samplesToMs(entry.consonant || 0),\n\t};\n}\n\n// Cache module factories by script URL so repeated loads share one WASM instance.\nconst moduleCache = new Map<string, Promise<WorldlineWasm>>();\n\nfunction injectScript(src: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst existing = document.querySelector<HTMLScriptElement>(\n\t\t\t`script[data-koe-worldline=\"${src}\"]`,\n\t\t);\n\t\tif (existing) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tconst s = document.createElement(\"script\");\n\t\ts.src = src;\n\t\ts.dataset.koeWorldline = src;\n\t\ts.onload = () => resolve();\n\t\ts.onerror = () => reject(new Error(`worldline: failed to load ${src}`));\n\t\tdocument.head.appendChild(s);\n\t});\n}\n\nfunction loadWasm(scriptUrl: string): Promise<WorldlineWasm> {\n\tconst cached = moduleCache.get(scriptUrl);\n\tif (cached) return cached;\n\n\tconst baseUrl = scriptUrl.slice(0, scriptUrl.lastIndexOf(\"/\") + 1);\n\tconst instantiate = (): Promise<WorldlineWasm> => {\n\t\tconst factory = globalThis.WorldlineModule;\n\t\tif (!factory)\n\t\t\tthrow new Error(\n\t\t\t\t\"worldline: WorldlineModule global was not defined by the script\",\n\t\t\t);\n\t\t// locateFile resolves worldline.wasm next to the script; fetch works in both\n\t\t// the DOM and Web Workers, so the WASM instantiates the same way off-thread.\n\t\treturn factory({ locateFile: (f: string) => baseUrl + f });\n\t};\n\n\tlet promise: Promise<WorldlineWasm>;\n\tif (typeof document !== \"undefined\") {\n\t\t// Main thread / DOM: load worldline.js via a <script> tag.\n\t\tpromise = injectScript(scriptUrl).then(instantiate);\n\t} else if (typeof globalThis.importScripts === \"function\") {\n\t\t// Classic Web Worker: importScripts runs worldline.js synchronously in the\n\t\t// worker's global scope, defining globalThis.WorldlineModule. This lets the\n\t\t// heavy WORLD synthesis run off the main thread.\n\t\tpromise = Promise.resolve().then(() => {\n\t\t\t(globalThis.importScripts as (...urls: string[]) => void)(scriptUrl);\n\t\t\treturn instantiate();\n\t\t});\n\t} else {\n\t\treturn Promise.reject(\n\t\t\tnew Error(\n\t\t\t\t\"Worldline.load requires a DOM or a classic Web Worker (importScripts) to load worldline.js\",\n\t\t\t),\n\t\t);\n\t}\n\tmoduleCache.set(scriptUrl, promise);\n\treturn promise;\n}\n\n/**\n * High-quality WORLD-vocoder note renderer (OpenUtau's worldline via WASM).\n *\n * Pure synthesis: PCM in → PCM out. No AudioContext, no scheduling — the caller\n * owns playback (schedule the returned buffer on its own timeline). Pair it with\n * {@link VoiceBank} for the source samples:\n *\n * const bank = await VoiceBank.load(koeUrl);\n * const wl = await Worldline.load({ scriptUrl: '.../world/worldline.js' });\n *\n * const entry = bank.manifest.phonemes[alias];\n * const pcm = await bank.getPcm(alias);\n * const audio = wl.renderNote({\n * pcm, pitch: 440, durationMs: 500, ...leadInFromEntry(entry),\n * });\n * // audio: Float32 @ 48 kHz, layout [lead-in/consonant ≈ preMs][vowel ≈ durationMs]\n */\nexport class Worldline {\n\treadonly sampleRate = WORLDLINE_SAMPLE_RATE;\n\n\tprivate constructor(private wasm: WorldlineWasm) {}\n\n\t/**\n\t * Load + instantiate the worldline WASM module (deduped per scriptUrl).\n\t *\n\t * Works on the main thread (loads via `<script>`) and inside a classic Web\n\t * Worker (loads via `importScripts`), so the heavy synthesis can run\n\t * off-thread. The matching `worldline.wasm` is fetched next to scriptUrl.\n\t */\n\tstatic async load(options: WorldlineLoadOptions): Promise<Worldline> {\n\t\treturn new Worldline(await loadWasm(options.scriptUrl));\n\t}\n\n\t/**\n\t * Render one note to Float32 PCM at 48 kHz.\n\t *\n\t * The output buffer is laid out as [lead-in/consonant ≈ preMs][vowel ≈\n\t * durationMs], rendered from sample offset 0 (no leading silence). The vowel\n\t * onset (the \"beat\") sits at ≈ preMs into the buffer, so a sequencer should\n\t * place the buffer at `beatTime − preMs` and may trim/crossfade the lead-in.\n\t *\n\t * No internal crossfade is applied — apply fades externally.\n\t *\n\t * @returns Float32 PCM, or null when `pcm` is shorter than\n\t * {@link MIN_WORLDLINE_SAMPLES} (too short for stable F0 analysis).\n\t */\n\trenderNote(params: RenderNoteParams): Float32Array | null {\n\t\tconst {\n\t\t\tpcm,\n\t\t\tpitch,\n\t\t\tdurationMs,\n\t\t\tpreMs,\n\t\t\tconsonantMs,\n\t\t\ttempo = 120,\n\t\t\tgender = 0.5,\n\t\t\ttension = 0.5,\n\t\t\tbreathiness = 0.5,\n\t\t\tvoicing = 1.0,\n\t\t} = params;\n\t\tif (!pcm || pcm.length < MIN_WORLDLINE_SAMPLES) return null;\n\n\t\tconst WL = this.wasm;\n\t\tconst FS = WORLDLINE_SAMPLE_RATE;\n\t\t// Representative pitch for the resampler's target note — the midpoint of\n\t\t// the vowel sustain when pitch is a curve, otherwise the flat value.\n\t\tconst basePitch = sampleCurve(preMs + durationMs / 2, pitch, preMs + durationMs);\n\t\tconst midiNote = Math.round(69 + 12 * Math.log2(basePitch / 440));\n\t\tconst posMs = 0; // no leading silence\n\t\tconst reqLen = preMs + durationMs; // render lead-in/consonant + vowel\n\n\t\t// cut_off must trim at least ~2 frames off the tail. PhraseSynth::AddRequest\n\t\t// computes the trim frame count as ceil(in_length_ms)/frame_ms, but\n\t\t// PyinEstimator yields floor(N/nhop)−1 frames — one fewer. With cut_off=0 the\n\t\t// requested frame count exceeds f0_.size() and Model::Trim's f0_.erase() runs\n\t\t// past end(), causing \"memory access out of bounds\". Trimming 2 frames keeps\n\t\t// it within bounds.\n\t\tconst cutMs = WL_FRAME_MS * 2;\n\n\t\tconst ps = WL._PhraseSynthNew();\n\t\tif (!ps) return null;\n\t\tconst reqPtr = WL._malloc(SYNTH_REQ_SIZE);\n\t\tif (!reqPtr) {\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tconst samplePtr = WL._malloc(pcm.length * 8);\n\t\tif (!samplePtr) {\n\t\t\tWL._free(reqPtr);\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tWL.HEAPF64.set(pcm, samplePtr >> 3);\n\n\t\tconst sv = (off: number, val: number, type: string) =>\n\t\t\tWL.setValue(reqPtr + off, val, type);\n\t\tsv(0, FS, \"i32\");\n\t\tsv(4, pcm.length, \"i32\");\n\t\tsv(8, samplePtr, \"*\");\n\t\tsv(12, 0, \"i32\");\n\t\tsv(16, 0, \"*\");\n\t\tsv(20, midiNote, \"i32\");\n\t\tsv(24, 100.0, \"double\");\n\t\tsv(32, 0.0, \"double\");\n\t\tsv(40, reqLen, \"double\");\n\t\tsv(48, consonantMs, \"double\");\n\t\tsv(56, cutMs, \"double\");\n\t\tsv(64, 100.0, \"double\");\n\t\tsv(72, 0.0, \"double\");\n\t\tsv(80, tempo, \"double\");\n\t\tsv(88, 0, \"i32\");\n\t\tsv(92, 0, \"*\");\n\t\tsv(96, 0, \"i32\");\n\t\tsv(100, 0, \"i32\");\n\t\tsv(104, 100, \"i32\");\n\t\tsv(108, 0, \"i32\");\n\t\tsv(112, 0, \"i32\");\n\t\tsv(116, 100, \"i32\");\n\n\t\t// skip/fadeIn/fadeOut all 0 — crossfade is handled externally.\n\t\tWL._PhraseSynthAddRequest(ps, reqPtr, posMs, 0.0, reqLen, 0.0, 0.0, 0);\n\t\tWL._free(samplePtr);\n\t\tWL._free(reqPtr);\n\n\t\tconst totalMs = posMs + reqLen + WL_FRAME_MS * 2;\n\t\tconst nFrames = Math.ceil(totalMs / WL_FRAME_MS) + 4;\n\t\t// Sample each curve once per 10ms frame. Plain numbers short-circuit to a\n\t\t// flat fill (same cost as before); functions get evaluated per-frame so\n\t\t// callers can draw vibrato, portamento, scoop-in, humanize jitter, etc.\n\t\tconst f0Arr = new Float64Array(nFrames);\n\t\tconst gArr = new Float64Array(nFrames);\n\t\tconst tArr = new Float64Array(nFrames);\n\t\tconst bArr = new Float64Array(nFrames);\n\t\tconst vArr = new Float64Array(nFrames);\n\t\tfor (let i = 0; i < nFrames; i++) {\n\t\t\tconst tMs = i * WL_FRAME_MS;\n\t\t\tf0Arr[i] = sampleCurve(tMs, pitch, totalMs);\n\t\t\tgArr[i] = sampleCurve(tMs, gender, totalMs);\n\t\t\ttArr[i] = sampleCurve(tMs, tension, totalMs);\n\t\t\tbArr[i] = sampleCurve(tMs, breathiness, totalMs);\n\t\t\tvArr[i] = sampleCurve(tMs, voicing, totalMs);\n\t\t}\n\n\t\tconst f0Ptr = WL._malloc(nFrames * 8);\n\t\tconst gPtr = WL._malloc(nFrames * 8);\n\t\tconst tPtr = WL._malloc(nFrames * 8);\n\t\tconst bPtr = WL._malloc(nFrames * 8);\n\t\tconst vPtr = WL._malloc(nFrames * 8);\n\t\tif (!f0Ptr || !gPtr || !tPtr || !bPtr || !vPtr) {\n\t\t\tif (f0Ptr) WL._free(f0Ptr);\n\t\t\tif (gPtr) WL._free(gPtr);\n\t\t\tif (tPtr) WL._free(tPtr);\n\t\t\tif (bPtr) WL._free(bPtr);\n\t\t\tif (vPtr) WL._free(vPtr);\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tWL.HEAPF64.set(f0Arr, f0Ptr >> 3);\n\t\tWL.HEAPF64.set(gArr, gPtr >> 3);\n\t\tWL.HEAPF64.set(tArr, tPtr >> 3);\n\t\tWL.HEAPF64.set(bArr, bPtr >> 3);\n\t\tWL.HEAPF64.set(vArr, vPtr >> 3);\n\t\tWL._PhraseSynthSetCurves(\n\t\t\tps,\n\t\t\tf0Ptr,\n\t\t\tgPtr,\n\t\t\ttPtr,\n\t\t\tbPtr,\n\t\t\tvPtr,\n\t\t\tnFrames,\n\t\t\tWL_FRAME_MS,\n\t\t);\n\t\tWL._free(f0Ptr);\n\t\tWL._free(gPtr);\n\t\tWL._free(tPtr);\n\t\tWL._free(bPtr);\n\t\tWL._free(vPtr);\n\n\t\tconst yPtrPtr = WL._malloc(4);\n\t\tif (!yPtrPtr) {\n\t\t\tWL._PhraseSynthDelete(ps);\n\t\t\treturn null;\n\t\t}\n\t\tconst outLen = WL._PhraseSynthSynth(ps, yPtrPtr, 0);\n\t\tconst yPtr = WL.getValue(yPtrPtr, \"*\");\n\t\tconst audio =\n\t\t\toutLen > 0 && yPtr\n\t\t\t\t? new Float32Array(WL.HEAPF32.buffer, yPtr, outLen).slice()\n\t\t\t\t: null;\n\t\t// The wrapper allocates *y with `new float[]` for the caller to release;\n\t\t// Emscripten's operator new is malloc-backed, so _free reclaims it.\n\t\tif (yPtr) WL._free(yPtr);\n\t\tWL._free(yPtrPtr);\n\t\tWL._PhraseSynthDelete(ps);\n\t\treturn audio;\n\t}\n}\n"],"mappings":"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","names":["l","_a","_a","_a"]}
|