@opendaw/studio-core 0.0.63 → 0.0.65

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../lib/std/dist/lang.js", "../../../lib/std/dist/arrays.js", "../../../lib/std/dist/option.js", "../../../lib/std/dist/math.js", "../../../lib/std/dist/numeric.js", "../../../lib/std/dist/iterables.js", "../../../lib/std/dist/data.js", "../../../lib/std/dist/terminable.js", "../../../lib/std/dist/notifier.js", "../../../lib/std/dist/runtime-notifier.js", "../../../lib/std/dist/time-span.js", "../../../lib/runtime/dist/communicator.js", "../../../lib/runtime/dist/messenger.js", "../../../lib/runtime/dist/wait.js", "../../../lib/runtime/dist/promises.js", "../../../lib/runtime/dist/stopwatch.js", "../../../lib/fusion/dist/peaks/Peaks.js", "../../../lib/fusion/dist/peaks/SamplePeakWorker.js", "../../../lib/fusion/dist/opfs/OpfsWorker.js", "../../../lib/dsp/dist/biquad-coeff.js", "../../../lib/dsp/dist/biquad-processor.js", "../../../lib/dsp/dist/transient-detection.js", "../../core-workers/src/workers-main.ts"],
4
- "sourcesContent": ["// noinspection JSUnusedGlobalSymbols\nexport const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const isNull = (value) => value === null;\nexport const isNotNull = (value) => value !== null;\nexport const isUndefined = (value) => value === undefined;\nexport const isNotUndefined = (value) => value !== undefined;\nexport const isAbsent = (value) => value === undefined || value === null;\nexport const ifDefined = (value, procedure) => value !== undefined && value !== null ? procedure(value) : undefined;\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(getOrProvide(fail)) : value;\nexport const isInstanceOf = (obj, clazz) => obj instanceof clazz;\nexport const asInstanceOf = (obj, clazz) => obj instanceof clazz ? obj : panic(`${obj} is not instance of ${clazz}`);\nexport const assertInstanceOf = (obj, clazz) => {\n if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n }\n};\nexport const isSameClass = (a, b) => a.constructor === b.constructor;\nexport const tryProvide = (provider) => {\n try {\n return provider();\n }\n catch (reason) {\n return panic(String(reason));\n }\n};\nexport const getOrProvide = (value) => value instanceof Function ? value() : value;\nexport const safeWrite = (object, property, value) => property in object ? object[property] = value : undefined;\nexport const safeExecute = (func, ...args) => func?.apply(null, args);\nexport const isRecord = (value) => isDefined(value) && typeof value === \"object\";\nexport const hasField = (record, key, type) => {\n if (!(key in record))\n return false;\n const value = record[key];\n return type === \"null\" ? value === null : typeof value === type;\n};\nexport const safeRead = (object, ...keys) => {\n let current = object;\n for (const key of keys) {\n if (!isRecord(current) || !(key in current)) {\n return undefined;\n }\n current = current[key];\n }\n return current;\n};\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => {\n throw typeof issue === \"string\" ? new Error(issue) : issue;\n};\nexport const assert = (condition, fail) => condition ? undefined : panic(getOrProvide(fail));\nexport const checkIndex = (index, array) => index >= 0 && index < array.length ? index : panic(`Index ${index} is out of bounds`);\nexport const InaccessibleProperty = (failMessage) => new Proxy({}, { get() { return panic(failMessage); } });\nexport const canWrite = (obj, key) => {\n while (isDefined(obj)) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (isDefined(descriptor)) {\n return typeof descriptor.set === \"function\";\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n};\nexport const requireProperty = (object, key) => {\n const { status, value } = tryCatch(() => object instanceof Function ? object.name : object.constructor.name);\n const feature = status === \"failure\" ? `${object}.${String(key)}` : `${value}.${String(key)}`;\n console.debug(`%c${feature}%c available`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n if (!(key in object)) {\n throw feature;\n }\n};\nexport class SuccessResult {\n value;\n status = \"success\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when succeeded\");\n}\nexport class FailureResult {\n error;\n status = \"failure\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when failed\");\n}\nexport const tryCatch = (statement) => {\n try {\n return new SuccessResult(statement());\n }\n catch (error) {\n return new FailureResult(error);\n }\n};\nexport const isValidIdentifier = (identifier) => /^[A-Za-z_$][A-Za-z0-9_]*$/.test(identifier);\nexport const asValidIdentifier = (identifier) => isValidIdentifier(identifier) ? identifier : panic(`'${identifier}' is not a valid identifier`);\nexport const asEnumValue = (value, enm) => {\n const keys = Object.keys(enm);\n if (keys.length === 0)\n return panic(\"Empty enum object (are you using `const enum`?)\");\n const values = Object.keys(enm)\n .filter(k => isNaN(Number(k)))\n .map(k => enm[k]);\n return values.includes(value) ? value : panic(`Invalid enum value: ${String(value)}`);\n};\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\n", "import { asDefined, panic } from \"./lang\";\nexport var Sorting;\n(function (Sorting) {\n Sorting[Sorting[\"Ascending\"] = 1] = \"Ascending\";\n Sorting[Sorting[\"Descending\"] = -1] = \"Descending\";\n})(Sorting || (Sorting = {}));\nexport class Arrays {\n static #empty = Object.freeze(new Array(0));\n static empty = () => (() => this.#empty)();\n static clear = (array) => { array.length = 0; };\n static replace = (array, newValues) => {\n array.length = 0;\n array.push(...newValues);\n };\n static consume = (array, procedure) => {\n for (let index = 0; index < array.length;) {\n if (procedure(array[index])) {\n array.splice(index, 1);\n }\n else {\n index++;\n }\n }\n };\n static peekFirst = (array) => array.at(0) ?? null;\n static peekLast = (array) => array.at(-1) ?? null;\n static getFirst = (array, fail) => asDefined(array.at(0), fail);\n static getLast = (array, fail) => asDefined(array.at(-1), fail);\n static getPrev = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index - 1) % array.length), \"Internal Error\");\n };\n static getNext = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index + 1) % array.length), \"Internal Error\");\n };\n static removeLast = (array, fail) => asDefined(array.pop(), fail);\n static create = (factory, n) => {\n const array = new Array(n);\n for (let i = 0; i < n; i++) {\n array[i] = factory(i);\n }\n return array;\n };\n static equals = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n /**\n * The satisfy method checks if all elements in a given array satisfy a provided predicate function\n * when compared with the first element of the array. That essentially means that all tested properties\n * in the predicate function are equal throughout the array.\n * [1, 1, 1, 1, 1] > (a, b) => a === b returns true\n * [1, 1, 1, 1, 2] > (a, b) => a === b returns false\n * [1, 1, 3, 2, 1] > (a, b) => a === b returns false\n */\n static satisfy = (array, predicate) => {\n if (array.length < 2) {\n return true;\n }\n const first = array[0];\n for (let i = 1; i < array.length; i++) {\n if (!predicate(first, array[i])) {\n return false;\n }\n }\n return true;\n };\n static remove = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n array.splice(index, 1);\n };\n static removeIf = (array, predicate) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n array.splice(i, 1);\n }\n }\n };\n static removeOpt = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return false;\n }\n array.splice(index, 1);\n return true;\n };\n static hasDuplicates = (array) => new Set(array).size < array.length;\n static removeDuplicates = (array) => {\n let index = 0 | 0;\n const result = new Set();\n for (const element of array) {\n if (!result.has(element)) {\n result.add(element);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static removeDuplicateKeys = (array, key) => {\n let index = 0 | 0;\n const seen = new Set();\n for (const element of array) {\n const value = element[key];\n if (!seen.has(value)) {\n seen.add(value);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static subtract(array, excludeArray, compareFn) {\n return array.filter(item => !excludeArray.some(excludeItem => compareFn(item, excludeItem)));\n }\n static intersect(array, other, compareFn) {\n return array.filter(item => other.some(includeItem => compareFn(item, includeItem)));\n }\n static merge(baseArray, mergeIntoArray, compareFn) {\n return [...(baseArray\n .filter(baseItem => !mergeIntoArray\n .some(mergeItem => compareFn(baseItem, mergeItem)))), ...mergeIntoArray];\n }\n static *iterate(array) {\n for (let i = 0; i < array.length; i++) {\n yield array[i];\n }\n }\n static *iterateReverse(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n yield array[i];\n }\n }\n static *iterateStateFull(array) {\n const maxIndex = array.length - 1;\n for (let i = 0; i <= maxIndex; i++) {\n yield { value: array[i], isFirst: i === 0, isLast: i === maxIndex };\n }\n }\n static *iterateAdjacent(array) {\n if (array.length <= 1) {\n return;\n }\n for (let i = 1, left = array[0]; i < array.length; i++) {\n const right = array[i];\n yield [left, right];\n left = right;\n }\n }\n static isSorted(array, sorting = Sorting.Ascending) {\n if (array.length < 2) {\n return true;\n }\n let prev = array[0];\n for (let i = 1; i < array.length; i++) {\n const next = array[i];\n if (Math.sign(prev - next) === sorting) {\n return false;\n }\n prev = next;\n }\n return true;\n }\n static toRecord(array, toKey) {\n return array.reduce((record, value) => {\n record[toKey(value)] = value;\n return record;\n }, {});\n }\n static concatArrayBuffers(a, b) {\n const result = new ArrayBuffer(a.byteLength + b.byteLength);\n const view = new Uint8Array(result);\n view.set(new Uint8Array(a), 0);\n view.set(new Uint8Array(b), a.byteLength);\n return result;\n }\n}\n", "import { asDefined, getOrProvide, isDefined, panic } from \"./lang\";\nexport var Option;\n(function (Option) {\n Option.wrap = (value) => isDefined(value) ? new Some(value) : Option.None;\n Option.from = (provider) => Option.wrap(provider());\n Option.tryFrom = (provider) => {\n try {\n return Option.wrap(provider());\n }\n catch (_error) {\n return Option.None;\n }\n };\n Option.execute = (func, ...args) => Option.wrap(func?.apply(null, args));\n Option.async = (promise) => promise.then(value => Option.wrap(value), () => Option.None);\n class Some {\n #value;\n constructor(value) { this.#value = asDefined(value); }\n unwrap() { return this.#value; }\n unwrapOrElse(_) { return this.#value; }\n unwrapOrNull() { return this.#value; }\n unwrapOrUndefined() { return this.#value; }\n contains(value) { return value === this.#value; }\n match(matchable) { return matchable.some(this.#value); }\n ifSome(run) { return run(this.#value); }\n ifAbsent(_func) { return undefined; }\n isEmpty() { return false; }\n nonEmpty() { return true; }\n map(callback) { return Option.wrap(callback(this.#value)); }\n mapOr(func, _or) { return func(this.#value); }\n flatMap(callback) { return callback(this.#value); }\n equals(other) { return this.unwrapOrNull() === other.unwrapOrNull(); }\n assert(_fail) { return this; }\n toString() { return `{Option.Some(${this.#value})}`; }\n get [Symbol.toStringTag]() { return this.toString(); }\n }\n Option.Some = Some;\n Option.None = new class {\n unwrap = (fail) => panic(isDefined(fail) ? getOrProvide(fail) : \"unwrap failed\");\n unwrapOrElse = (value) => getOrProvide(value);\n unwrapOrNull = () => null;\n unwrapOrUndefined = () => undefined;\n contains = (_) => false;\n match = (matchable) => matchable.none();\n ifSome = (_) => { };\n ifAbsent = (exec) => exec(undefined);\n isEmpty = () => true;\n nonEmpty = () => false;\n map = (_) => Option.None;\n mapOr = (_, or) => getOrProvide(or);\n flatMap = (_) => Option.None;\n equals = (other) => other.isEmpty();\n assert = (fail) => panic(getOrProvide(fail) ?? \"assert failed\");\n toString = () => \"{Option.None}\";\n get [Symbol.toStringTag]() { return this.toString(); }\n };\n})(Option || (Option = {}));\n", "// noinspection JSUnusedGlobalSymbols\nexport const TAU = Math.PI * 2.0;\nexport const PI_HALF = Math.PI / 2.0;\nexport const PI_QUART = Math.PI / 4.0;\nexport const INVERSE_SQRT_2 = 1.0 / Math.sqrt(2.0);\nexport const clamp = (value, min, max) => Math.max(min, Math.min(value, max));\nexport const clampUnit = (value) => Math.max(0.0, Math.min(value, 1.0));\nexport const squashUnit = (value, margin) => margin + (1.0 - 2.0 * margin) * Math.max(0.0, Math.min(value, 1.0));\nexport const quantizeFloor = (value, interval) => Math.floor(value / interval) * interval;\nexport const quantizeCeil = (value, interval) => Math.ceil(value / interval) * interval;\nexport const quantizeRound = (value, interval) => Math.round(value / interval) * interval;\nexport const linear = (y1, y2, mu) => y1 + (y2 - y1) * mu;\nexport const exponential = (y1, y2, mu) => y1 * Math.pow(y2 / y1, mu);\nexport const cosine = (y1, y2, mu) => {\n const mu2 = (1.0 - Math.cos(mu * Math.PI)) * 0.5;\n return y1 * (1.0 - mu2) + y2 * mu2;\n};\nexport const mod = (value, range) => fract(value / range) * range;\nexport const fract = (value) => value - Math.floor(value);\nexport const nextPowOf2 = (n) => Math.pow(2, Math.ceil(Math.log(n) / Math.log(2)));\nexport const radToDeg = (rad) => rad * 180.0 / Math.PI;\nexport const degToRad = (deg) => deg / 180.0 * Math.PI;\n// M\u00F6bius-Ease Curve\n// Only produces valid values between 0 and 1 (unitValues)\n// https://www.desmos.com/calculator/ht8cytaxsz\n// The inverse is h`=1-h\nexport const moebiusEase = (x, h) => (x * h) / ((2.0 * h - 1.0) * (x - 1.0) + h);\n", "const dataView = new DataView(new ArrayBuffer(8));\nexport var Integer;\n(function (Integer) {\n Integer.MIN_VALUE = -0x80000000;\n Integer.MAX_VALUE = 0x7fffffff;\n Integer.toByte = (value) => {\n dataView.setInt8(0, value);\n return dataView.getInt8(0);\n };\n Integer.toShort = (value) => {\n dataView.setInt16(0, value);\n return dataView.getInt16(0);\n };\n Integer.toInt = (value) => {\n dataView.setInt32(0, value);\n return dataView.getInt32(0);\n };\n})(Integer || (Integer = {}));\nexport var Float;\n(function (Float) {\n const EXP_BIT_MASK = 2139095040;\n const SIGNIFICANT_BIT_MASK = 8388607;\n const ARRAY_BUFFER = new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT);\n const FLOAT_VIEW = new Float32Array(ARRAY_BUFFER);\n const INT_VIEW = new Int32Array(ARRAY_BUFFER);\n /**\n * Returns a representation of the specified floating-point value\n * according to the IEEE 754 floating-point \"single format\" bit layout.\n * @param value a floating-point number.\n * @returns the bits that represent the floating-point number.\n */\n Float.floatToIntBits = (value) => {\n const result = Float.floatToRawIntBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0) {\n return 0x7fc00000;\n }\n return result;\n };\n Float.intBitsToFloat = (value) => {\n INT_VIEW[0] = value;\n return FLOAT_VIEW[0];\n };\n Float.floatToRawIntBits = (value) => {\n FLOAT_VIEW[0] = value;\n return INT_VIEW[0];\n };\n Float.toFloat32 = (value) => {\n dataView.setFloat32(0, value);\n return dataView.getFloat32(0);\n };\n})(Float || (Float = {}));\nexport var Float16;\n(function (Float16) {\n Float16.floatToIntBits = (value) => {\n const bits = Float.floatToIntBits(value);\n const sign = bits >>> 16 & 0x8000;\n let val = (bits & 0x7fffffff) + 0x1000;\n if (val >= 0x47800000) {\n if ((bits & 0x7fffffff) >= 0x47800000) {\n if (val < 0x7f800000) {\n return sign | 0x7c00;\n }\n return sign | 0x7c00 | (bits & 0x007fffff) >>> 13;\n }\n return sign | 0x7bff;\n }\n if (val >= 0x38800000) {\n return sign | val - 0x38000000 >>> 13;\n }\n if (val < 0x33000000) {\n return sign;\n }\n val = (bits & 0x7fffffff) >>> 23;\n return sign | ((bits & 0x7fffff | 0x800000) + (0x800000 >>> val - 102) >>> 126 - val);\n };\n Float16.intBitsToFloat = (bits) => {\n let mantissa = bits & 0x03ff;\n let exp = bits & 0x7c00;\n if (exp === 0x7c00) {\n exp = 0x3fc00;\n }\n else if (exp !== 0) {\n exp += 0x1c000;\n if (mantissa === 0 && exp > 0x1c400) {\n return Float.intBitsToFloat((bits & 0x8000) << 16 | exp << 13 | 0x3ff);\n }\n }\n else if (mantissa !== 0) {\n exp = 0x1c400;\n do {\n mantissa <<= 1;\n exp -= 0x400;\n } while ((mantissa & 0x400) === 0);\n mantissa &= 0x3ff;\n }\n return Float.intBitsToFloat((bits & 0x8000) << 16 | (exp | mantissa) << 13);\n };\n})(Float16 || (Float16 = {}));\nexport var Float64;\n(function (Float64) {\n const EXP_BIT_MASK = 9218868437227405312n;\n const SIGNIFICANT_BIT_MASK = 4503599627370495n;\n const ARRAY_BUFFER = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT);\n const FLOAT64_VIEW = new Float64Array(ARRAY_BUFFER);\n const LONG_VIEW = new BigInt64Array(ARRAY_BUFFER);\n Float64.float64ToLongBits = (value) => {\n const result = Float64.float64ToRawLongBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0n) {\n return 0x7ff8000000000000n;\n }\n return result;\n };\n Float64.longBitsToFloat64 = (value) => {\n LONG_VIEW[0] = value;\n return FLOAT64_VIEW[0];\n };\n Float64.float64ToRawLongBits = (value) => {\n FLOAT64_VIEW[0] = value;\n return LONG_VIEW[0];\n };\n Float64.clamp = (value) => {\n dataView.setFloat64(0, value);\n return dataView.getFloat64(0);\n };\n})(Float64 || (Float64 = {}));\n", "import { isDefined } from \"./lang\";\nexport class Iterables {\n static *empty() { }\n static one(value) { return [value]; }\n static count(iterable) {\n let count = 0 | 0;\n for (const _ of iterable) {\n count++;\n }\n return count;\n }\n static some(iterable, predicate) {\n for (const value of iterable) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n }\n static every(iterable, predicate) {\n for (const value of iterable) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n }\n static reduce(iterable, callback, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const value of iterable) {\n accumulator = callback(accumulator, value, index++);\n }\n return accumulator;\n }\n static includes(iterable, include) {\n for (const value of iterable) {\n if (value === include) {\n return true;\n }\n }\n return false;\n }\n static forEach(iterable, procedure) {\n for (const value of iterable) {\n procedure(value);\n }\n }\n static *map(iterable, map) {\n let count = 0 | 0;\n for (const value of iterable) {\n yield map(value, count++);\n }\n }\n static *take(iterator, count) {\n let i = 0;\n for (const value of iterator) {\n if (i++ >= count) {\n return;\n }\n yield value;\n }\n }\n static filter(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n if (fn(value)) {\n result.push(value);\n }\n }\n return result;\n }\n static filterMap(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n const mapped = fn(value);\n if (isDefined(mapped)) {\n result.push(mapped);\n }\n }\n return result;\n }\n static reverse(iterable) {\n const result = [];\n for (const value of iterable) {\n result.push(value);\n }\n return result.reverse();\n }\n static *pairWise(iterable) {\n const iterator = iterable[Symbol.iterator]();\n const { done, value } = iterator.next();\n let prev = value;\n if (done === true) {\n return;\n }\n while (true) {\n const { done, value } = iterator.next();\n if (done === true) {\n yield [prev, null];\n return;\n }\n yield [prev, value];\n prev = value;\n }\n }\n}\n", "import { panic } from \"./lang\";\nimport { nextPowOf2 } from \"./math\";\nimport { Float, Float64 } from \"./numeric\";\nimport { Iterables } from \"./iterables\";\nexport class ByteArrayOutput {\n static create(initialCapacity = 1024) {\n return this.use(new ArrayBuffer(initialCapacity));\n }\n static use(buffer, byteOffset = 0 | 0) {\n return new ByteArrayOutput(new DataView(buffer, byteOffset));\n }\n littleEndian = false;\n #view;\n #position = 0;\n constructor(view) { this.#view = view; }\n get remaining() { return this.#view.byteLength - this.#position; }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n writeBoolean(value) { this.writeByte(value ? 1 : 0); }\n writeByte(value) {\n this.#ensureSpace(1);\n this.#view.setInt8(this.#position++, value);\n }\n writeShort(value) {\n this.#ensureSpace(Int16Array.BYTES_PER_ELEMENT);\n this.#view.setInt16(this.#position, value, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n }\n writeInt(value) {\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT);\n this.#view.setInt32(this.#position, value, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n }\n writeLong(value) {\n this.#ensureSpace(BigInt64Array.BYTES_PER_ELEMENT);\n this.#view.setBigInt64(this.#position, value, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n }\n writeFloat(value) {\n this.#ensureSpace(Float32Array.BYTES_PER_ELEMENT);\n this.#view.setFloat32(this.#position, value, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n }\n writeDouble(value) {\n this.#ensureSpace(Float64Array.BYTES_PER_ELEMENT);\n this.#view.setFloat64(this.#position, value, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n }\n writeBytes(bytes) {\n this.#ensureSpace(bytes.length);\n for (let i = 0; i < bytes.length; ++i) {\n this.#view.setInt8(this.#position++, bytes[i]);\n }\n }\n writeString(value) {\n const length = value.length;\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT + length * Int16Array.BYTES_PER_ELEMENT);\n this.writeInt(length);\n for (let i = 0; i < length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toArrayBuffer() { return this.#view.buffer.slice(0, this.#position); }\n #ensureSpace(count) {\n const capacity = this.#view.byteLength;\n if (this.#position + count > capacity) {\n const o = this.#view;\n this.#view = new DataView(new ArrayBuffer(nextPowOf2(capacity + count)));\n for (let i = 0; i < this.#position; i++) {\n this.#view.setInt8(i, o.getInt8(i));\n }\n }\n }\n}\nexport class ByteCounter {\n #count = 0 | 0;\n writeByte(_) { this.#count++; }\n writeShort(_) { this.#count += 2; }\n writeInt(_) { this.#count += 4; }\n writeLong(_) { this.#count += 8; }\n writeFloat(_) { this.#count += 4; }\n writeDouble(_) { this.#count += 8; }\n writeBoolean(_) { this.#count++; }\n writeBytes(bytes) { this.#count += bytes.length; }\n writeString(value) { this.#count += value.length + 4; }\n get count() { return this.#count; }\n}\nexport class Checksum {\n #result;\n #cursor = 0;\n constructor(length = 32) {\n this.#result = new Int8Array(length);\n }\n result() { return this.#result; }\n equals(other) {\n if (other === this) {\n return true;\n }\n return this.#result.every((value, index) => other.#result[index] === value);\n }\n writeBoolean(value) {\n this.writeByte(value ? 31 : 11);\n }\n writeShort(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n }\n writeByte(value) {\n if (this.#cursor >= this.#result.length) {\n this.#cursor = 0;\n }\n this.#result[this.#cursor++] ^= value;\n }\n writeInt(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n this.writeByte((value >>> 16) & 0xff);\n this.writeByte((value >>> 24) & 0xff);\n }\n writeBytes(bytes) {\n bytes.forEach(value => this.writeByte(value));\n }\n writeFloat(value) {\n this.writeInt(Float.floatToIntBits(value));\n }\n writeDouble(value) {\n this.writeLong(Float64.float64ToLongBits(value));\n }\n writeLong(value) {\n this.writeByte(Number(value) & 0xff);\n this.writeByte(Number(value >> 8n) & 0xff);\n this.writeByte(Number(value >> 16n) & 0xff);\n this.writeByte(Number(value >> 24n) & 0xff);\n this.writeByte(Number(value >> 32n) & 0xff);\n this.writeByte(Number(value >> 40n) & 0xff);\n this.writeByte(Number(value >> 48n) & 0xff);\n this.writeByte(Number(value >> 56n) & 0xff);\n }\n writeString(value) {\n for (let i = 0; i < value.length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toHexString() {\n return Array.from(Iterables.map(this.#result.values(), value => (value & 0xff).toString(16).padStart(2, \"0\"))).join(\"\");\n }\n}\nexport class ByteArrayInput {\n littleEndian = false;\n #view;\n #position = 0;\n constructor(buffer, byteOffset = 0) { this.#view = new DataView(buffer, byteOffset); }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n readByte() { return this.#view.getInt8(this.#position++); }\n readShort() {\n const read = this.#view.getInt16(this.#position, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n return read;\n }\n readInt() {\n const read = this.#view.getInt32(this.#position, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readLong() {\n const read = this.#view.getBigInt64(this.#position, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readFloat() {\n const read = this.#view.getFloat32(this.#position, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readDouble() {\n const read = this.#view.getFloat64(this.#position, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readBoolean() { return this.readByte() === 1; }\n readBytes(array) {\n for (let i = 0; i < array.length; i++) {\n array[i] = this.readByte();\n }\n }\n readString() {\n const length = this.readInt();\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += String.fromCharCode(this.readShort());\n }\n return result;\n }\n available(count) { return this.#position + count <= this.#view.byteLength; }\n remaining() { return this.#view.byteLength - this.#position; }\n skip(count) { this.position += count; }\n}\n", "import { Arrays } from \"./arrays\";\nimport { EmptyExec } from \"./lang\";\nexport const Terminable = Object.freeze({\n Empty: { terminate: EmptyExec },\n create: (exec) => ({ terminate: exec }),\n many: (...terminables) => ({ terminate: () => { while (terminables.length > 0) {\n terminables.pop().terminate();\n } } })\n});\nexport class Terminator {\n #terminables = [];\n isEmpty() { return this.#terminables.length === 0; }\n nonEmpty() { return this.#terminables.length > 0; }\n own(terminable) {\n this.#terminables.push(terminable);\n return terminable;\n }\n ownAll(...terminables) {\n for (const terminable of terminables) {\n this.#terminables.push(terminable);\n }\n }\n spawn() {\n const terminator = new Terminator();\n terminator.own({ terminate: () => Arrays.removeOpt(this.#terminables, terminator) });\n return this.own(terminator);\n }\n terminate() { while (this.#terminables.length > 0) {\n this.#terminables.pop().terminate();\n } }\n}\nexport class VitalSigns {\n #terminated = false;\n get isTerminated() { return this.#terminated; }\n terminate() { this.#terminated = true; }\n}\nexport class CascadingSubscriptions {\n #current;\n constructor() { this.#current = new Terminator(); }\n next() {\n const current = this.#current;\n const nested = current.own(new Terminator());\n this.#current = nested;\n return {\n own: (subscription) => {\n current.own(subscription);\n return current;\n },\n toObserver: (fn) => (value) => {\n nested.terminate();\n nested.own(fn(value));\n }\n };\n }\n append(subscribe, observer) {\n const current = this.#current;\n const nested = current.own(new Terminator());\n current.own(subscribe((value) => {\n nested.terminate();\n nested.own(observer(value));\n }));\n this.#current = nested;\n return current;\n }\n}\n", "import { Terminable } from \"./terminable\";\nexport class Notifier {\n static subscribeMany(observer, ...observables) {\n return Terminable.many(...observables\n .map(observable => observable.subscribe(() => observer(observable))));\n }\n #observers = new Set(); // A set allows us to remove while iterating\n subscribe(observer) {\n this.#observers.add(observer);\n return { terminate: () => this.#observers.delete(observer) };\n }\n isEmpty() { return this.#observers.size === 0; }\n notify(value) { this.#observers.forEach((observer) => observer(value)); }\n observers() { return this.#observers; }\n terminate() { this.#observers.clear(); }\n}\n", "import { assert, EmptyExec } from \"./lang\";\nimport { Option } from \"./option\";\nexport const RuntimeNotifier = (() => {\n let notifierOption = Option.None;\n return ({\n info: (request) => notifierOption.match({\n none: () => Promise.resolve(),\n some: notifier => notifier.info(request)\n }),\n approve: (request) => notifierOption.match({\n none: () => Promise.resolve(true),\n some: notifier => notifier.approve(request)\n }),\n progress: (request) => notifierOption.match({\n none: () => ({ message: \"\", terminate: EmptyExec }),\n some: notifier => notifier.progress(request)\n }),\n install: (notifier) => {\n assert(notifierOption.isEmpty(), \"RuntimeNotification already installed\");\n notifierOption = Option.wrap(notifier);\n }\n });\n})();\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static POSITIVE_INFINITY = new TimeSpan(Number.POSITIVE_INFINITY);\n static millis = (value) => new TimeSpan(value);\n static seconds = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_SECOND);\n static minutes = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_MINUTE);\n static hours = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_HOUR);\n static days = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_DAY);\n static #MILLI_SECONDS_PER_SECOND = 1_000;\n static #MILLI_SECONDS_PER_MINUTE = 60_000;\n static #MILLI_SECONDS_PER_HOUR = 3_600_000;\n static #MILLI_SECONDS_PER_DAY = 86_400_000;\n #ms;\n constructor(ms) { this.#ms = ms; }\n millis() { return this.#ms; }\n absSeconds() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_SECOND; }\n absMinutes() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_MINUTE; }\n absHours() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_HOUR; }\n absDays() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_DAY; }\n split() {\n return {\n d: Math.floor(this.absDays()),\n h: Math.floor(this.absHours()) % 24,\n m: Math.floor(this.absMinutes()) % 60,\n s: Math.floor(this.absSeconds()) % 60\n };\n }\n isNow() { return this.#ms === 0.0; }\n isPast() { return this.#ms < 0.0; }\n isFuture() { return this.#ms > 0.0; }\n toUnitString() {\n let value, unit;\n const seconds = Math.floor(Math.abs(this.#ms) / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (seconds < 60) {\n value = seconds;\n unit = \"second\";\n }\n else if (minutes < 60) {\n value = minutes;\n unit = \"minute\";\n }\n else if (hours < 24) {\n value = hours;\n unit = \"hour\";\n }\n else {\n value = days;\n unit = \"day\";\n }\n return new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\", style: \"long\" })\n .format(value * Math.sign(this.#ms), unit);\n }\n toString() {\n if (isNaN(this.#ms)) {\n return \"NaN\";\n }\n if (!isFinite(this.#ms)) {\n return \"\u221E\";\n }\n const { d, h, m, s } = this.split();\n if (d > 0) {\n return [\n TimeSpan.#quantity(\"d\", d), TimeSpan.#quantity(\"h\", h),\n TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (h > 0) {\n return [\n TimeSpan.#quantity(\"h\", h), TimeSpan.#quantity(\"m\", m),\n TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (m > 0) {\n return [TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)]\n .join(\", \");\n }\n else if (s > 0) {\n return TimeSpan.#quantity(\"s\", s);\n }\n else {\n return \"now\";\n }\n }\n static #quantity = (name, count) => {\n switch (name) {\n case \"d\":\n return `${count} ${count < 2 ? \"day\" : \"days\"}`;\n case \"h\":\n return `${count} ${count < 2 ? \"hour\" : \"hours\"}`;\n case \"m\":\n return `${count} ${count < 2 ? \"minute\" : \"minutes\"}`;\n case \"s\":\n return `${count} ${count < 2 ? \"second\" : \"seconds\"}`;\n default:\n return Unhandled(name);\n }\n };\n}\n", "import { asDefined, assert, isDefined, Iterables, panic } from \"@opendaw/lib-std\";\n/**\n * Communicator provides type-safe communication between Window, Worker, MessagePort, BroadcastChannel.\n * Passed objects are structured cloned: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n * It is highly advised not to pass classes with methods and or real private properties (starting with #).\n * They will lose their prototype and private property inheritance, and it is cumbersome to patch that up later.\n * Also read: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n */\nexport var Communicator;\n(function (Communicator) {\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n const extractTransferables = (args) => {\n const transferables = [];\n for (const arg of args) {\n if (arg instanceof MessagePort) {\n transferables.push(arg);\n }\n if (typeof ImageBitmap !== \"undefined\" && arg instanceof ImageBitmap) {\n transferables.push(arg);\n }\n if (typeof OffscreenCanvas !== \"undefined\" && arg instanceof OffscreenCanvas) {\n transferables.push(arg);\n }\n }\n return transferables;\n };\n class Sender {\n #messenger;\n #expected = new Map();\n #subscription;\n #returnId = 0;\n constructor(messenger) {\n this.#messenger = messenger;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n dispatchAndForget = (func, ...args) => {\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: arg })))\n }, transferables);\n };\n dispatchAndReturn = (func, ...args) => new Promise((resolve, reject) => {\n const entries = Iterables.reduce(args, (callbacks, arg, index) => {\n if (typeof arg === \"function\") {\n callbacks.push([index, arg]);\n }\n return callbacks;\n }, []);\n this.#expected.set(this.#returnId, {\n executorTuple: { resolve, reject },\n callbacks: new Map(entries)\n });\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: this.#returnId,\n func: func.name,\n args: Array.from(Iterables.map(args, (arg, index) => typeof arg === \"function\" ? ({ callback: index }) : ({ value: arg })))\n }, transferables);\n this.#returnId++;\n });\n #messageHandler = (message) => {\n const returns = this.#expected.get(message.returnId);\n if (isDefined(returns)) {\n if (message.type === \"resolve\") {\n returns.executorTuple.resolve(message.resolve);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"reject\") {\n returns.executorTuple.reject(message.reject);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"callback\") {\n returns.callbacks?.get(message.funcAt).apply(this, message.args);\n }\n }\n else {\n panic(`Promise has already been resolved. ${JSON.stringify(message)}`);\n }\n };\n }\n class Executor {\n #messenger;\n #protocol;\n #subscription;\n constructor(messenger, protocol) {\n this.#messenger = messenger;\n this.#protocol = protocol;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n #messageHandler = (message) => {\n assert(message.type === \"send\", () => \"Message type must be 'send'\");\n const object = Object.getPrototypeOf(this.#protocol) === Object.getPrototypeOf({})\n ? this.#protocol : Object.getPrototypeOf(this.#protocol);\n const func = asDefined(object[message.func], `${message.func.toString()} does not exists on ${this.#protocol}`);\n const returnId = message.returnId;\n if (returnId === false) {\n func.apply(this.#protocol, message.args.map((arg) => \"value\" in arg\n ? arg.value : panic(`${message.func.toString()} has no promise.`)));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg ? (...args) => this.#sendCallback(returnId, arg.callback, args) : arg.value));\n promise.then(value => {\n try {\n this.#sendResolve(returnId, value);\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }, reason => this.#sendReject(returnId, reason));\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }\n };\n #sendResolve = (returnId, value) => this.#messenger.send({ type: \"resolve\", returnId, resolve: value });\n #sendReject = (returnId, reason) => this.#messenger.send({ type: \"reject\", returnId, reject: reason });\n #sendCallback = (returnId, func, args) => this.#messenger.send({ type: \"callback\", returnId, funcAt: func, args });\n }\n Communicator.Executor = Executor;\n})(Communicator || (Communicator = {}));\n", "import { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nconst EmptyTransferables = [];\nclass NativeMessenger {\n #port;\n #notifier = new Notifier();\n constructor(port) {\n this.#port = port;\n if (isDefined(port.onmessage) || isDefined(port.onmessageerror)) {\n console.error(port);\n throw new Error(`${port} is already wrapped.`);\n }\n port.onmessage = (event) => this.#notifier.notify(event.data);\n port.onmessageerror = (event) => { throw new Error(event.type); };\n }\n send(message, transfer) {\n this.#port.postMessage(message, transfer ?? EmptyTransferables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#notifier.terminate();\n this.#port.onmessage = null;\n this.#port.onmessageerror = null;\n }\n}\n// with '__id__' we put in a little security that we are only communicating with the messenger we created\nclass Channel {\n #messages;\n #name;\n #notifier = new Notifier();\n #subscription;\n constructor(messages, name) {\n this.#messages = messages;\n this.#name = name;\n this.#subscription = messages.subscribe(data => {\n if (\"__id__\" in data && data.__id__ === \"42\" && \"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message, transferrables) {\n this.#messages.send({ __id__: \"42\", channel: this.#name, message }, transferrables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#subscription.terminate();\n this.#notifier.terminate();\n }\n}\n", "import { tryCatch } from \"@opendaw/lib-std\";\nexport var Wait;\n(function (Wait) {\n Wait.frame = () => new Promise(resolve => requestAnimationFrame(() => resolve()));\n Wait.frames = (numFrames) => new Promise(resolve => {\n let count = numFrames;\n const callback = () => { if (--count <= 0) {\n resolve();\n }\n else {\n requestAnimationFrame(callback);\n } };\n requestAnimationFrame(callback);\n });\n Wait.timeSpan = (time, ...args) => new Promise(resolve => setTimeout(resolve, time.millis(), ...args));\n Wait.event = (target, type) => new Promise(resolve => target.addEventListener(type, resolve, { once: true }));\n Wait.observable = (observable) => new Promise(resolve => {\n const terminable = observable.subscribe(() => {\n terminable.terminate();\n resolve();\n });\n });\n Wait.complete = (generator) => new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const { status, value: next, error } = tryCatch(() => generator.next());\n if (status === \"success\") {\n const { done, value } = next;\n if (done) {\n clearInterval(interval);\n resolve(value);\n }\n }\n else {\n clearInterval(interval);\n reject(error);\n }\n }, 0);\n });\n})(Wait || (Wait = {}));\n", "import { assert, InaccessibleProperty, isDefined, isNull, Option, RuntimeNotifier, safeExecute, Terminable, TimeSpan } from \"@opendaw/lib-std\";\nimport { Wait } from \"./wait\";\nexport class IntervalRetryOption {\n maxRetry;\n timeSpan;\n #count = 0 | 0;\n constructor(maxRetry, timeSpan) {\n this.maxRetry = maxRetry;\n this.timeSpan = timeSpan;\n }\n retry(reason, exec) {\n if (++this.#count === this.maxRetry) {\n return false;\n }\n console.debug(`${reason} > will retry in ${this.timeSpan.toString()}`);\n setTimeout(exec, this.timeSpan.millis());\n return true;\n }\n}\nexport var Promises;\n(function (Promises) {\n class ResolveResult {\n value;\n status = \"resolved\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when promise is resolved\");\n }\n Promises.ResolveResult = ResolveResult;\n class RejectedResult {\n error;\n status = \"rejected\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when promise is rejected\");\n }\n Promises.RejectedResult = RejectedResult;\n Promises.makeAbortable = async (owner, promise) => {\n let running = true;\n owner.own(Terminable.create(() => running = false));\n return new Promise((resolve, reject) => promise.then(value => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } }));\n };\n Promises.tryCatch = (promise) => promise.then(value => new ResolveResult(value), error => new RejectedResult(error));\n const DefaultRetryOption = new IntervalRetryOption(3, TimeSpan.seconds(3));\n Promises.retry = (factory, retryOption = DefaultRetryOption) => factory().catch(reason => new Promise((resolve, reject) => {\n const onFailure = (reason) => {\n if (!retryOption.retry(reason, () => factory().then((value) => resolve(value), onFailure))) {\n reject(reason);\n }\n };\n onFailure(reason);\n }));\n Promises.guardedRetry = (factory, retryIf) => {\n const attempt = async (count = 0) => {\n try {\n return await factory();\n }\n catch (reason) {\n if (retryIf(reason, ++count)) {\n console.debug(\"retrying after failure:\", reason);\n await Wait.timeSpan(TimeSpan.seconds(1));\n return attempt(count);\n }\n throw new Error(`Failed after ${count} retries: ${reason}`);\n }\n };\n return attempt();\n };\n Promises.approvedRetry = (factory, approve) => {\n const attempt = async () => {\n try {\n return await factory();\n }\n catch (reason) {\n if (await RuntimeNotifier.approve(approve(reason))) {\n return attempt();\n }\n throw reason;\n }\n };\n return attempt();\n };\n // this is for testing the catch branch\n Promises.fail = (after, thenUse) => {\n let use = () => new Promise((_, reject) => setTimeout(() => reject(\"fails first\"), after.millis()));\n return () => {\n const promise = use();\n use = thenUse;\n return promise;\n };\n };\n Promises.timeout = (promise, timeSpan, fail) => {\n return new Promise((resolve, reject) => {\n let running = true;\n const timeout = setTimeout(() => {\n running = false;\n reject(new Error(fail ?? \"timeout\"));\n }, timeSpan.millis());\n promise\n .then((value) => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } })\n .finally(() => clearTimeout(timeout));\n });\n };\n Promises.sequentialAll = (factories) => factories.reduce((promise, factory) => promise\n .then(async (results) => [...results, await factory()]), Promise.resolve([]));\n Promises.sequentialize = (handler) => {\n let lastPromise = Promise.resolve();\n return (arg) => {\n const execute = () => handler(arg);\n const currentPromise = lastPromise.then(execute, execute);\n lastPromise = currentPromise.catch(() => { });\n return currentPromise;\n };\n };\n Promises.memoizeAsync = (factory, timeout) => {\n let resolving = null;\n let lastCall = Date.now();\n return () => {\n const now = Date.now();\n if (isNull(resolving) || (isDefined(timeout) && now - lastCall > timeout.millis())) {\n lastCall = now;\n resolving = factory();\n resolving.catch(error => {\n resolving = null;\n return error;\n });\n }\n return resolving;\n };\n };\n Promises.allWithLimit = async (tasks, limit = 1) => {\n const results = new Array(tasks.length);\n let index = 0;\n let hasError = false;\n const run = async () => {\n while (index < tasks.length && !hasError) {\n const i = index++;\n try {\n const value = await tasks[i]();\n if (!hasError) {\n results[i] = value;\n }\n }\n catch (reason) {\n hasError = true;\n throw reason;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, run));\n return results;\n };\n Promises.allSettledWithLimit = async (tasks, limit = 1) => {\n const results = new Array(tasks.length);\n let index = 0;\n const run = async () => {\n while (index < tasks.length) {\n const i = index++;\n try {\n const value = await tasks[i]();\n results[i] = { status: \"fulfilled\", value };\n }\n catch (reason) {\n results[i] = { status: \"rejected\", reason };\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, run));\n return results;\n };\n class Limit {\n max;\n #waiting;\n #running = 0 | 0;\n constructor(max = 1) {\n this.max = max;\n this.#waiting = [];\n }\n async add(provider) {\n if (this.#running < this.max) {\n this.#running++;\n return provider().finally(() => this.#continue());\n }\n else {\n const resolvers = Promise.withResolvers();\n this.#waiting.push([provider, resolvers]);\n return resolvers.promise.finally(() => this.#continue());\n }\n }\n #continue() {\n assert(this.#running > 0, \"Internal Error in Promises.Limit\");\n if (--this.#running < this.max) {\n if (this.#waiting.length > 0) {\n const [provider, { resolve, reject }] = this.#waiting.shift();\n this.#running++;\n provider().then(resolve, reject);\n }\n }\n }\n }\n Promises.Limit = Limit;\n class Latest {\n #onResolve;\n #onReject;\n #onFinally;\n #latest = Option.None;\n constructor(onResolve, onReject, onFinally) {\n this.#onResolve = onResolve;\n this.#onReject = onReject;\n this.#onFinally = onFinally;\n }\n update(promise) {\n this.#latest = Option.wrap(promise);\n promise\n .then(value => { if (this.#latest.contains(promise)) {\n this.#onResolve(value);\n } })\n .catch(reason => { if (this.#latest.contains(promise)) {\n this.#onReject(reason);\n } })\n .finally(() => {\n if (this.#latest.contains(promise)) {\n this.terminate();\n safeExecute(this.#onFinally);\n }\n });\n }\n terminate() { this.#latest = Option.None; }\n }\n Promises.Latest = Latest;\n})(Promises || (Promises = {}));\n", "export const stopwatch = (level = \"debug\") => {\n const startTime = performance.now();\n return {\n lab: (label) => console[level].call(console, `${label} in ${(performance.now() - startTime).toFixed(1)}ms`)\n };\n};\n", "import { Arrays, assert, ByteArrayOutput, Float16, Unhandled } from \"@opendaw/lib-std\";\nexport var Peaks;\n(function (Peaks) {\n class Stage {\n shift;\n numPeaks;\n dataOffset;\n constructor(shift, numPeaks, dataOffset) {\n this.shift = shift;\n this.numPeaks = numPeaks;\n this.dataOffset = dataOffset;\n }\n unitsEachPeak() { return 1 << this.shift; }\n }\n Peaks.Stage = Stage;\n Peaks.unpack = (bits, index) => {\n switch (index) {\n case 0:\n return Float16.intBitsToFloat(bits);\n case 1:\n return Float16.intBitsToFloat(bits >> 16);\n default:\n return Unhandled(index);\n }\n };\n})(Peaks || (Peaks = {}));\nexport class SamplePeaks {\n stages;\n data;\n numFrames;\n numChannels;\n static from(input) {\n assert(input.readString() === \"PEAKS\", \"Wrong header\");\n const numStages = input.readInt();\n const stages = [];\n for (let i = 0; i < numStages; i++) {\n const dataOffset = input.readInt();\n const numPeaks = input.readInt();\n const shift = input.readInt();\n input.readInt(); // TODO deprecate (was mask)\n stages[i] = new Peaks.Stage(shift, numPeaks, dataOffset);\n }\n const numData = input.readInt();\n const data = [];\n for (let i = 0; i < numData; i++) {\n const array = new Int8Array(input.readInt());\n input.readBytes(array);\n data[i] = new Int32Array(array.buffer);\n }\n const numFrames = input.readInt();\n const numChannels = input.readInt();\n return new SamplePeaks(stages, data, numFrames, numChannels);\n }\n static None = new SamplePeaks([], [], 0, 0);\n static findBestFit = (numFrames, width = 1200) => {\n const ratio = numFrames / width;\n if (ratio <= 1.0) {\n return new Uint8Array(0);\n }\n const ShiftPadding = 3;\n const maxShift = Math.floor(Math.log(ratio) / Math.LN2);\n const numStages = Math.max(1, Math.floor(maxShift / ShiftPadding));\n return new Uint8Array(Arrays.create(index => ShiftPadding * (index + 1), numStages));\n };\n constructor(stages, data, numFrames, numChannels) {\n this.stages = stages;\n this.data = data;\n this.numFrames = numFrames;\n this.numChannels = numChannels;\n }\n nearest(unitsPerPixel) {\n if (this.stages.length === 0) {\n return null;\n }\n const shift = Math.floor(Math.log(Math.abs(unitsPerPixel)) / Math.LN2);\n let i = this.stages.length;\n while (--i > -1) {\n if (shift >= this.stages[i].shift) {\n return this.stages[i];\n }\n }\n return this.stages[0];\n }\n toArrayBuffer() {\n const output = ByteArrayOutput.create();\n output.writeString(\"PEAKS\");\n output.writeInt(this.stages.length);\n for (let i = 0; i < this.stages.length; i++) {\n const { dataOffset, numPeaks, shift } = this.stages[i];\n output.writeInt(dataOffset);\n output.writeInt(numPeaks);\n output.writeInt(shift);\n output.writeInt((1 << shift) - 1); // TODO deprecate (was mask)\n }\n output.writeInt(this.data.length);\n for (let i = 0; i < this.data.length; i++) {\n const array = new Int8Array(this.data[i].buffer);\n output.writeInt(array.length);\n output.writeBytes(array);\n }\n output.writeInt(this.numFrames);\n output.writeInt(this.numChannels);\n return output.toArrayBuffer();\n }\n toString() { return `{SamplePeaks num-stages: ${this.stages.length}}`; }\n}\n", "import { Arrays, Float16, panic } from \"@opendaw/lib-std\";\nimport { Communicator, stopwatch } from \"@opendaw/lib-runtime\";\nimport { Peaks, SamplePeaks } from \"./Peaks\";\nexport var SamplePeakWorker;\n(function (SamplePeakWorker) {\n SamplePeakWorker.install = (messenger) => Communicator.executor(messenger.channel(\"peaks\"), new class {\n async generateAsync(progress, shifts, frames, numFrames, numChannels) {\n return generatePeaks(progress, shifts, frames, numFrames, numChannels).toArrayBuffer();\n }\n });\n const generatePeaks = (progress, shifts, frames, numFrames, numChannels) => {\n if (frames.length !== numChannels) {\n return panic(`Invalid numberOfChannels. Expected: ${numChannels}. Got ${frames.length}`);\n }\n class State {\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n index = 0;\n }\n const time = stopwatch();\n const numShifts = shifts.length;\n const [stages, dataOffset] = initStages(shifts, numFrames);\n const data = Arrays.create(() => new Int32Array(dataOffset), numChannels);\n const minMask = (1 << stages[0].shift) - 1;\n const total = numChannels * numFrames;\n let count = 0;\n for (let channel = 0; channel < numChannels; ++channel) {\n const channelData = data[channel];\n const channelFrames = frames[channel];\n const states = Arrays.create(() => new State(), numShifts);\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let position = 0;\n for (let i = 0; i < numFrames; ++i) {\n const frame = channelFrames[i];\n min = Math.min(frame, min);\n max = Math.max(frame, max);\n if ((++position & minMask) === 0) {\n for (let j = 0; j < numShifts; ++j) {\n const stage = stages[j];\n const state = states[j];\n state.min = Math.min(state.min, min);\n state.max = Math.max(state.max, max);\n if ((((1 << stage.shift) - 1) & position) === 0) {\n channelData[stage.dataOffset + state.index++] = SamplePeakWorker.pack(state.min, state.max);\n state.min = Number.POSITIVE_INFINITY;\n state.max = Number.NEGATIVE_INFINITY;\n }\n }\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n }\n if ((++count & 0xFFFF) === 0) {\n progress(count / total);\n }\n }\n }\n progress(1.0);\n time.lab(`SamplePeaks '${self.constructor.name}'`);\n return new SamplePeaks(stages, data, numFrames, numChannels);\n };\n const initStages = (shifts, numFrames) => {\n let dataOffset = 0;\n const stages = Arrays.create((index) => {\n const shift = shifts[index];\n const numPeaks = Math.ceil(numFrames / (1 << shift));\n const stage = new Peaks.Stage(shift, numPeaks, dataOffset);\n dataOffset += numPeaks;\n return stage;\n }, shifts.length);\n return [stages, dataOffset];\n };\n SamplePeakWorker.pack = (f0, f1) => {\n const bits0 = Float16.floatToIntBits(f0);\n const bits1 = Float16.floatToIntBits(f1);\n return bits0 | (bits1 << 16);\n };\n})(SamplePeakWorker || (SamplePeakWorker = {}));\n", "import { Arrays, asDefined, isNotUndefined, panic } from \"@opendaw/lib-std\";\nimport { Communicator, Promises } from \"@opendaw/lib-runtime\";\nimport \"../types\";\nexport var OpfsWorker;\n(function (OpfsWorker) {\n const DEBUG = false;\n OpfsWorker.init = (messenger) => Communicator.executor(messenger.channel(\"opfs\"), new class {\n #locks = new Map();\n async write(path, data) {\n await this.#acquireLock(path, async () => {\n if (DEBUG) {\n console.debug(`write ${data.length}b to ${path}`);\n }\n const handle = await this.#resolveFile(path, { create: true });\n try {\n handle.truncate(data.length);\n handle.write(data.buffer, { at: 0 });\n handle.flush();\n }\n finally {\n handle.close();\n }\n });\n }\n async read(path) {\n return await this.#acquireLock(path, async () => {\n if (DEBUG) {\n console.debug(`read ${path}`);\n }\n const handle = await this.#resolveFile(path);\n try {\n const size = handle.getSize();\n const buffer = new Uint8Array(size);\n handle.read(buffer);\n return buffer;\n }\n finally {\n handle.close();\n }\n });\n }\n async delete(path) {\n await this.#acquireLock(path, async () => {\n const segments = pathToSegments(path);\n if (segments.length === 0) {\n return this.clear();\n }\n return this.#resolveFolder(segments.slice(0, -1))\n .then(folder => folder.removeEntry(asDefined(segments.at(-1)), { recursive: true }));\n });\n }\n async list(path) {\n const segments = pathToSegments(path);\n const { status, value: folder } = await Promises.tryCatch(this.#resolveFolder(segments));\n if (status === \"rejected\") {\n return Arrays.empty();\n }\n const result = [];\n for await (const { name, kind } of folder.values()) {\n result.push({ name, kind });\n }\n return result;\n }\n async clear() {\n const root = await navigator.storage.getDirectory();\n for await (const [name, handle] of root.entries()) {\n if (handle.kind === \"file\") {\n await root.removeEntry(name);\n }\n else if (handle.kind === \"directory\") {\n await root.removeEntry(name, { recursive: true });\n }\n }\n }\n async #acquireLock(path, operation) {\n while (true) {\n const existingLock = this.#locks.get(path);\n if (isNotUndefined(existingLock)) {\n await existingLock;\n continue;\n }\n let releaseLock = () => panic(\"Lock not acquired\");\n const lockPromise = new Promise(resolve => releaseLock = resolve);\n this.#locks.set(path, lockPromise);\n try {\n return await operation();\n }\n finally {\n if (this.#locks.get(path) === lockPromise) {\n this.#locks.delete(path);\n }\n releaseLock();\n }\n }\n }\n async #resolveFile(path, options) {\n const segments = pathToSegments(path);\n const folder = await this.#resolveFolder(segments.slice(0, -1), options);\n const fileHandle = await folder.getFileHandle(asDefined(segments.at(-1)), options);\n return await fileHandle.createSyncAccessHandle();\n }\n async #resolveFolder(segments, options) {\n let folder = await navigator.storage.getDirectory();\n for (const segment of segments) {\n folder = await folder.getDirectoryHandle(segment, options);\n }\n return folder;\n }\n });\n const pathToSegments = (path) => {\n const noSlashes = path.replace(/^\\/+|\\/+$/g, \"\");\n return noSlashes === \"\" ? [] : noSlashes.split(\"/\");\n };\n})(OpfsWorker || (OpfsWorker = {}));\n", "import { assert, clamp, TAU } from \"@opendaw/lib-std\";\n// turns out the following code is producing similar but different frequency responses\n// https://chromium.googlesource.com/chromium/blink/+/refs/heads/main/Source/platform/audio/Biquad.cpp\n// while this one produces the correct results\n// https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/audio/biquad.cc\n// quickly tested all biquad modes\nexport class BiquadCoeff {\n a1 = 0.0;\n a2 = 0.0;\n b0 = 0.0;\n b1 = 0.0;\n b2 = 0.0;\n constructor() { this.identity(); }\n identity() { this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0); }\n setLowpassParams(cutoff, resonance = Math.SQRT1_2) {\n cutoff = clamp(cutoff, 0.0, 1.0);\n if (cutoff >= 0.5) {\n this.setNormalizedCoefficients(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);\n }\n else if (cutoff > 0.0) {\n const theta = TAU * cutoff;\n const alpha = Math.sin(theta) / (2.0 * resonance);\n const cosw = Math.cos(theta);\n const beta = (1.0 - cosw) / 2.0;\n const b0 = beta;\n const b1 = 2.0 * beta;\n const b2 = beta;\n const a0 = 1.0 + alpha;\n const a1 = -2.0 * cosw;\n const a2 = 1.0 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(0.0, 0.0, 0.0, 1.0, 0.0, 0.0);\n }\n return this;\n }\n setHighpassParams(cutoff, resonance = Math.SQRT1_2) {\n cutoff = clamp(cutoff, 0.0, 1.0);\n if (cutoff === 1) {\n this.setNormalizedCoefficients(0, 0, 0, 1, 0, 0);\n }\n else if (cutoff > 0) {\n const theta = TAU * cutoff;\n const alpha = Math.sin(theta) / (2 * resonance);\n const cosw = Math.cos(theta);\n const beta = (1 + cosw) / 2;\n const b0 = beta;\n const b1 = -2 * beta;\n const b2 = beta;\n const a0 = 1 + alpha;\n const a1 = -2 * cosw;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setNormalizedCoefficients(b0, b1, b2, a0, a1, a2) {\n const a0_inverse = 1.0 / a0;\n this.b0 = b0 * a0_inverse;\n this.b1 = b1 * a0_inverse;\n this.b2 = b2 * a0_inverse;\n this.a1 = a1 * a0_inverse;\n this.a2 = a2 * a0_inverse;\n return this;\n }\n setLowShelfParams(frequency, db_gain) {\n frequency = clamp(frequency, 0.0, 1.0);\n const a = Math.pow(10.0, db_gain / 40);\n if (frequency === 1) {\n this.setNormalizedCoefficients(a * a, 0, 0, 1, 0, 0);\n }\n else if (frequency > 0) {\n const w0 = TAU * frequency;\n const s = 1;\n const alpha = 0.5 * Math.sin(w0) * Math.sqrt((a + 1 / a) * (1 / s - 1) + 2);\n const k = Math.cos(w0);\n const k2 = 2 * Math.sqrt(a) * alpha;\n const a_plus_one = a + 1;\n const a_minus_one = a - 1;\n const b0 = a * (a_plus_one - a_minus_one * k + k2);\n const b1 = 2 * a * (a_minus_one - a_plus_one * k);\n const b2 = a * (a_plus_one - a_minus_one * k - k2);\n const a0 = a_plus_one + a_minus_one * k + k2;\n const a1 = -2 * (a_minus_one + a_plus_one * k);\n const a2 = a_plus_one + a_minus_one * k - k2;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setHighShelfParams(frequency, db_gain) {\n frequency = clamp(frequency, 0.0, 1.0);\n const a = Math.pow(10.0, db_gain / 40);\n if (frequency === 1) {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n else if (frequency > 0) {\n const w0 = TAU * frequency;\n const s = 1;\n const alpha = 0.5 * Math.sin(w0) * Math.sqrt((a + 1 / a) * (1 / s - 1) + 2);\n const k = Math.cos(w0);\n const k2 = 2 * Math.sqrt(a) * alpha;\n const a_plus_one = a + 1;\n const a_minus_one = a - 1;\n const b0 = a * (a_plus_one + a_minus_one * k + k2);\n const b1 = -2 * a * (a_minus_one + a_plus_one * k);\n const b2 = a * (a_plus_one + a_minus_one * k - k2);\n const a0 = a_plus_one - a_minus_one * k + k2;\n const a1 = 2 * (a_minus_one - a_plus_one * k);\n const a2 = a_plus_one - a_minus_one * k - k2;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(a * a, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setPeakingParams(frequency, q, db_gain) {\n frequency = clamp(frequency, 0.0, 1.0);\n q = Math.max(0.0, q);\n const a = Math.pow(10.0, db_gain / 40);\n if (frequency > 0 && frequency < 1) {\n if (q > 0) {\n const w0 = TAU * frequency;\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = 1 + alpha * a;\n const b1 = -2 * k;\n const b2 = 1 - alpha * a;\n const a0 = 1 + alpha / a;\n const a1 = -2 * k;\n const a2 = 1 - alpha / a;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(a * a, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setAllpassParams(frequency, q) {\n frequency = clamp(frequency, 0.0, 1.0);\n q = Math.max(0.0, q);\n if (frequency > 0 && frequency < 1) {\n if (q > 0) {\n const w0 = TAU * frequency;\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = 1 - alpha;\n const b1 = -2 * k;\n const b2 = 1 + alpha;\n const a0 = 1 + alpha;\n const a1 = -2 * k;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(-1, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setNotchParams(frequency, q) {\n frequency = clamp(frequency, 0.0, 1.0);\n q = Math.max(0.0, q);\n if (frequency > 0 && frequency < 1) {\n if (q > 0) {\n const w0 = TAU * frequency;\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = 1;\n const b1 = -2 * k;\n const b2 = 1;\n const a0 = 1 + alpha;\n const a1 = -2 * k;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(0, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setBandpassParams(frequency, q) {\n frequency = Math.max(0.0, frequency);\n q = Math.max(0.0, q);\n if (frequency > 0 && frequency < 1) {\n const w0 = TAU * frequency;\n if (q > 0) {\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = alpha;\n const b1 = 0;\n const b2 = -alpha;\n const a0 = 1 + alpha;\n const a1 = -2 * k;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(0, 0, 0, 1, 0, 0);\n }\n return this;\n }\n getFrequencyResponse(frequency, magResponse, phaseResponse) {\n assert(frequency.length === magResponse.length && frequency.length === phaseResponse.length, \"Array lengths do not match\");\n const b0 = this.b0;\n const b1 = this.b1;\n const b2 = this.b2;\n const a1 = this.a1;\n const a2 = this.a2;\n for (let k = 0; k < frequency.length; ++k) {\n const omega = -Math.PI * 2 * frequency[k];\n const zReal = Math.cos(omega);\n const zImag = Math.sin(omega);\n const numeratorReal = b0 + ((b1 + b2 * zReal) * zReal - b2 * zImag * zImag);\n const numeratorImag = ((b1 + b2 * zReal) * zImag + b2 * zImag * zReal);\n const denominatorReal = 1 + ((a1 + a2 * zReal) * zReal - a2 * zImag * zImag);\n const denominatorImag = ((a1 + a2 * zReal) * zImag + a2 * zImag * zReal);\n const denom = denominatorReal * denominatorReal + denominatorImag * denominatorImag;\n const responseReal = (numeratorReal * denominatorReal + numeratorImag * denominatorImag) / denom;\n const responseImag = (numeratorImag * denominatorReal - numeratorReal * denominatorImag) / denom;\n magResponse[k] = Math.sqrt(responseReal * responseReal + responseImag * responseImag);\n phaseResponse[k] = Math.atan2(responseImag, responseReal);\n }\n }\n}\n", "import { BiquadCoeff } from \"./biquad-coeff\";\nimport { Arrays, clampUnit } from \"@opendaw/lib-std\";\nexport class BiquadMono {\n #x1 = 0.0;\n #x2 = 0.0;\n #y1 = 0.0;\n #y2 = 0.0;\n reset() {\n this.#x1 = 0.0;\n this.#x2 = 0.0;\n this.#y1 = 0.0;\n this.#y2 = 0.0;\n }\n process({ a1, a2, b0, b1, b2 }, source, target, fromIndex, toIndex) {\n let x1 = this.#x1;\n let x2 = this.#x2;\n let y1 = this.#y1;\n let y2 = this.#y2;\n for (let i = fromIndex; i < toIndex; i++) {\n const x = source[i];\n const y = target[i] = (b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2) + 1e-18 - 1e-18;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n }\n this.#x1 = x1;\n this.#x2 = x2;\n this.#y1 = y1;\n this.#y2 = y2;\n }\n processFrame({ a1, a2, b0, b1, b2 }, x) {\n const y = (b0 * x + b1 * this.#x1 + b2 * this.#x2 - a1 * this.#y1 - a2 * this.#y2) + 1e-18 - 1e-18;\n this.#x2 = this.#x1;\n this.#x1 = x;\n this.#y2 = this.#y1;\n this.#y1 = y;\n return y;\n }\n}\nexport class BiquadStack {\n #stack;\n #order;\n constructor(maxOrder) {\n this.#stack = Arrays.create(() => new BiquadMono(), maxOrder);\n this.#order = this.#stack.length;\n }\n get order() { return this.#order; }\n set order(value) {\n if (this.#order === value) {\n return;\n }\n this.#order = value;\n this.reset();\n }\n reset() { this.#stack.forEach(processor => processor.reset()); }\n process(coeff, source, target, fromIndex, toIndex) {\n for (let i = 0; i < this.#order; i++) {\n this.#stack[i].process(coeff, source, target, fromIndex, toIndex);\n source = target;\n }\n }\n processFrame(coeff, x) {\n for (let i = 0; i < this.#order; i++) {\n x = this.#stack[i].processFrame(coeff, x);\n }\n return x;\n }\n}\nconst LUT_SIZE = 512;\nexport class ModulatedBiquad {\n #freqLUT;\n #coeff = new BiquadCoeff();\n #filter;\n #lastIdx = -1;\n constructor(minFreq, maxFreq, sampleRate) {\n this.#filter = new BiquadStack(4);\n this.#freqLUT = new Float32Array(LUT_SIZE + 1);\n const logRatio = Math.log(maxFreq / minFreq);\n const invSampleRate = 1.0 / sampleRate;\n for (let i = 0; i <= LUT_SIZE; i++) {\n this.#freqLUT[i] = minFreq * Math.exp(i / LUT_SIZE * logRatio) * invSampleRate;\n }\n }\n get order() { return this.#filter.order; }\n set order(value) { this.#filter.order = value; }\n reset() { this.#filter.reset(); }\n process(input, output, cutoffs, q, fromIndex, toIndex) {\n const freqLUT = this.#freqLUT;\n const filter = this.#filter;\n const coeff = this.#coeff;\n const qReduced = q / (filter.order ** 1.25);\n let from = fromIndex;\n let lastIdx = this.#lastIdx;\n while (from < toIndex) {\n const idx = Math.floor(clampUnit(cutoffs[from]) * LUT_SIZE);\n let to = from + 1;\n while (to < toIndex && Math.floor(clampUnit(cutoffs[to]) * LUT_SIZE) === idx)\n ++to;\n if (idx !== lastIdx) {\n lastIdx = idx;\n coeff.setLowpassParams(freqLUT[idx], qReduced);\n }\n filter.process(coeff, input, output, from, to);\n from = to;\n }\n this.#lastIdx = lastIdx;\n }\n}\n", "import { BiquadCoeff } from \"./biquad-coeff\";\nimport { BiquadMono } from \"./biquad-processor\";\nimport { panic } from \"@opendaw/lib-std\";\nconst LR_ORDER = 48;\nconst LOW_CROSSOVER_HZ = 200.0;\nconst HIGH_CROSSOVER_HZ = 2000.0;\nconst RMS_WINDOW_MS = 20.0;\nconst MIN_TRANSIENT_COUNT = 2;\nconst ENERGY_DERIVATIVE_THRESHOLD = 0.0003;\nconst MAX_TRANSIENT_DENSITY_PER_SEC = 40.0;\nconst MIN_TRANSIENT_SEPARATION_MS = 120.0;\nconst VALLEY_BIAS = 0.2;\nconst MAX_VALLEY_SEARCH_MS = 20.0;\nconst ONSET_ENERGY_RATIO = 0.66;\nconst VALLEY_RMS = 0.006;\nconst BAND_WEIGHTS = {\n low: 1.0,\n mid: 4.0,\n high: 8.0\n};\nexport class TransientDetector {\n static detect(audio) {\n const now = performance.now();\n const duration = audio.numberOfFrames / audio.sampleRate;\n const result = new TransientDetector(audio).#detect();\n const took = (((performance.now() - now) / 1000.0) / duration * 100.0).toFixed(2);\n console.debug(`realtime factor: ${took}%`);\n return result;\n }\n #sampleRate;\n #numberOfFrames;\n #maxValleySearchSamples;\n #minSeparationSamples;\n #windowSamples;\n #halfWindow;\n #maxCount;\n #mono;\n constructor(audio) {\n this.#sampleRate = audio.sampleRate;\n this.#numberOfFrames = audio.numberOfFrames;\n this.#maxValleySearchSamples = Math.floor((MAX_VALLEY_SEARCH_MS / 1000.0) * this.#sampleRate);\n this.#minSeparationSamples = Math.floor((MIN_TRANSIENT_SEPARATION_MS / 1000.0) * this.#sampleRate);\n this.#windowSamples = Math.floor((RMS_WINDOW_MS / 1000.0) * this.#sampleRate);\n this.#halfWindow = Math.floor(this.#windowSamples / 2);\n const durationSeconds = this.#numberOfFrames / this.#sampleRate;\n this.#maxCount = Math.floor(durationSeconds * MAX_TRANSIENT_DENSITY_PER_SEC);\n this.#mono = this.#mixToMono(audio);\n }\n #detect() {\n // Phase 1: Collect rough candidates from all bands\n const candidates = this.#collectCandidates();\n // Phase 2: Refine each candidate to the valley between it and previous\n const refined = this.#refineToValleys(candidates);\n return refined.map(x => x / this.#sampleRate);\n }\n #collectCandidates() {\n const bands = this.#splitBands();\n const allOnsets = [];\n for (const band of [\"low\", \"mid\", \"high\"]) {\n const buffer = bands[band];\n const envelope = this.#computeEnergyEnvelope(buffer);\n const onsets = this.#detectOnsets(envelope);\n const weight = BAND_WEIGHTS[band];\n for (const onset of onsets) {\n allOnsets.push({ position: onset.position, energy: onset.energy * weight });\n }\n }\n // Sort by energy descending and greedily collect respecting minimum separation\n const collected = [0, this.#numberOfFrames];\n const sorted = [...allOnsets].sort((a, b) => b.energy - a.energy);\n for (const onset of sorted) {\n if (collected.length >= this.#maxCount + 2 && collected.length >= MIN_TRANSIENT_COUNT + 2) {\n break;\n }\n if (!this.#isTooClose(collected, onset.position)) {\n this.#insertSorted(collected, onset.position);\n }\n }\n return collected;\n }\n #refineToValleys(candidates) {\n if (candidates.length < 2) {\n return candidates;\n }\n const refined = [candidates[0]];\n const rmsWindow = Math.floor(this.#sampleRate * VALLEY_RMS);\n for (let i = 1; i < candidates.length - 1; i++) {\n const prev = candidates[i - 1];\n const curr = candidates[i];\n if (prev === 0) {\n refined.push(curr);\n continue;\n }\n const gap = curr - prev;\n const gapBasedStart = prev + Math.floor(gap * VALLEY_BIAS);\n const windowBasedStart = curr - this.#maxValleySearchSamples;\n const searchStart = Math.max(gapBasedStart, windowBasedStart);\n // Compute RMS at candidate position (the transient energy)\n let candidateRms = 0.0;\n for (let k = 0; k < rmsWindow && curr + k < this.#numberOfFrames; k++) {\n candidateRms += this.#mono[curr + k] * this.#mono[curr + k];\n }\n candidateRms = Math.sqrt(candidateRms / rmsWindow);\n const thresoldEnergy = candidateRms * ONSET_ENERGY_RATIO;\n let minRms = Infinity;\n let minPos = curr;\n for (let j = curr - 1; j >= searchStart; j--) {\n let sum = 0.0;\n for (let k = 0; k < rmsWindow && j + k < this.#numberOfFrames; k++) {\n sum += this.#mono[j + k] * this.#mono[j + k];\n }\n const rms = Math.sqrt(sum / rmsWindow);\n if (rms < minRms) {\n minRms = rms;\n minPos = j;\n }\n if (rms < thresoldEnergy) {\n break;\n }\n }\n refined.push(minPos);\n }\n refined.push(candidates[candidates.length - 1]);\n return refined;\n }\n #mixToMono(audio) {\n const { numberOfFrames, numberOfChannels, frames } = audio;\n if (numberOfChannels === 0) {\n return panic(\"Invalid sample. No channels found.\");\n }\n if (numberOfChannels === 1) {\n return new Float32Array(frames[0]);\n }\n const mono = new Float32Array(numberOfFrames);\n for (let ch = 0; ch < numberOfChannels; ch++) {\n const channel = frames[ch];\n for (let i = 0; i < numberOfFrames; i++) {\n mono[i] += channel[i];\n }\n }\n const scale = 1.0 / numberOfChannels;\n for (let i = 0; i < numberOfFrames; i++) {\n mono[i] *= scale;\n }\n return mono;\n }\n #applyLRFilter(input, freq, type, order) {\n const passes = order / 12;\n const coeff = new BiquadCoeff();\n const cutoff = freq / this.#sampleRate;\n if (type === \"lowpass\") {\n coeff.setLowpassParams(cutoff, Math.SQRT1_2);\n }\n else {\n coeff.setHighpassParams(cutoff, Math.SQRT1_2);\n }\n let result = input;\n for (let p = 0; p < passes; p++) {\n const filter1 = new BiquadMono();\n const filter2 = new BiquadMono();\n const temp1 = new Float32Array(result.length);\n const temp2 = new Float32Array(result.length);\n filter1.process(coeff, result, temp1, 0, result.length);\n filter2.process(coeff, temp1, temp2, 0, result.length);\n result = temp2;\n }\n return result;\n }\n #splitBands() {\n const low = this.#applyLRFilter(this.#mono, LOW_CROSSOVER_HZ, \"lowpass\", LR_ORDER);\n const highFromLow = this.#applyLRFilter(this.#mono, LOW_CROSSOVER_HZ, \"highpass\", LR_ORDER);\n const mid = this.#applyLRFilter(highFromLow, HIGH_CROSSOVER_HZ, \"lowpass\", LR_ORDER);\n const high = this.#applyLRFilter(highFromLow, HIGH_CROSSOVER_HZ, \"highpass\", LR_ORDER);\n return { low, mid, high };\n }\n #computeEnergyEnvelope(buffer) {\n const envelope = new Float32Array(buffer.length);\n let sumSq = 0.0;\n for (let i = 0; i < this.#windowSamples && i < buffer.length; i++) {\n sumSq += buffer[i] * buffer[i];\n }\n for (let i = 0; i < buffer.length; i++) {\n const windowStart = i - this.#halfWindow;\n const windowEnd = i + this.#halfWindow;\n if (windowStart > 0 && windowStart - 1 < buffer.length) {\n const old = buffer[windowStart - 1];\n sumSq -= old * old;\n }\n if (windowEnd < buffer.length) {\n const next = buffer[windowEnd];\n sumSq += next * next;\n }\n const count = Math.min(windowEnd, buffer.length - 1) - Math.max(windowStart, 0) + 1;\n envelope[i] = Math.sqrt(Math.max(0.0, sumSq) / count);\n }\n return envelope;\n }\n #detectOnsets(envelope) {\n let maxEnergy = 0.0;\n for (let i = 0; i < envelope.length; i++) {\n if (envelope[i] > maxEnergy) {\n maxEnergy = envelope[i];\n }\n }\n const threshold = maxEnergy * ENERGY_DERIVATIVE_THRESHOLD;\n const onsets = [];\n for (let i = 1; i < envelope.length - 1; i++) {\n const derivative = envelope[i] - envelope[i - 1];\n const nextDerivative = envelope[i + 1] - envelope[i];\n if (derivative > threshold && derivative > nextDerivative) {\n onsets.push({ position: i, energy: envelope[i] });\n }\n }\n return onsets;\n }\n #isTooClose(arr, position) {\n const idx = this.#binarySearchInsertPosition(arr, position);\n if (idx > 0 && position - arr[idx - 1] < this.#minSeparationSamples) {\n return true;\n }\n return idx < arr.length && arr[idx] - position < this.#minSeparationSamples;\n }\n #insertSorted(arr, value) {\n const idx = this.#binarySearchInsertPosition(arr, value);\n arr.splice(idx, 0, value);\n }\n #binarySearchInsertPosition(arr, value) {\n let lo = 0;\n let hi = arr.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (arr[mid] < value) {\n lo = mid + 1;\n }\n else {\n hi = mid;\n }\n }\n return lo;\n }\n}\n", "import {Communicator, Messenger} from \"@opendaw/lib-runtime\"\nimport {OpfsWorker, SamplePeakWorker} from \"@opendaw/lib-fusion\"\nimport {AudioData, TransientDetector, TransientProtocol} from \"@opendaw/lib-dsp\"\n\nconst messenger: Messenger = Messenger.for(self)\n\nOpfsWorker.init(messenger)\nSamplePeakWorker.install(messenger)\n\nCommunicator.executor(messenger.channel(\"transients\"), new class implements TransientProtocol {\n async detect(audioData: AudioData): Promise<Array<number>> {\n return TransientDetector.detect(audioData)\n }\n})\n\nmessenger.channel(\"initialize\").send(\"ready\")"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// noinspection JSUnusedGlobalSymbols\nexport const identity = (value) => value;\nexport const isDefined = (value) => value !== undefined && value !== null;\nexport const isNull = (value) => value === null;\nexport const isNotNull = (value) => value !== null;\nexport const isUndefined = (value) => value === undefined;\nexport const isNotUndefined = (value) => value !== undefined;\nexport const isAbsent = (value) => value === undefined || value === null;\nexport const ifDefined = (value, procedure) => value !== undefined && value !== null ? procedure(value) : undefined;\nexport const asDefined = (value, fail = \"asDefined failed\") => value === null || value === undefined ? panic(getOrProvide(fail)) : value;\nexport const isInstanceOf = (obj, clazz) => obj instanceof clazz;\nexport const asInstanceOf = (obj, clazz) => obj instanceof clazz ? obj : panic(`${obj} is not instance of ${clazz}`);\nexport const assertInstanceOf = (obj, clazz) => {\n if (!(obj instanceof clazz)) {\n panic(`${obj} is not instance of ${clazz}`);\n }\n};\nexport const isSameClass = (a, b) => a.constructor === b.constructor;\nexport const tryProvide = (provider) => {\n try {\n return provider();\n }\n catch (reason) {\n return panic(String(reason));\n }\n};\nexport const getOrProvide = (value) => value instanceof Function ? value() : value;\nexport const safeWrite = (object, property, value) => property in object ? object[property] = value : undefined;\nexport const safeExecute = (func, ...args) => func?.apply(null, args);\nexport const isRecord = (value) => isDefined(value) && typeof value === \"object\";\nexport const hasField = (record, key, type) => {\n if (!(key in record))\n return false;\n const value = record[key];\n return type === \"null\" ? value === null : typeof value === type;\n};\nexport const safeRead = (object, ...keys) => {\n let current = object;\n for (const key of keys) {\n if (!isRecord(current) || !(key in current)) {\n return undefined;\n }\n current = current[key];\n }\n return current;\n};\nexport const Unhandled = (empty) => { throw new Error(`Unhandled ${empty}`); };\nexport const panic = (issue) => {\n throw typeof issue === \"string\" ? new Error(issue) : issue;\n};\nexport const assert = (condition, fail) => condition ? undefined : panic(getOrProvide(fail));\nexport const checkIndex = (index, array) => index >= 0 && index < array.length ? index : panic(`Index ${index} is out of bounds`);\nexport const InaccessibleProperty = (failMessage) => new Proxy({}, { get() { return panic(failMessage); } });\nexport const canWrite = (obj, key) => {\n while (isDefined(obj)) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (isDefined(descriptor)) {\n return typeof descriptor.set === \"function\";\n }\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n};\nexport const requireProperty = (object, key) => {\n const { status, value } = tryCatch(() => object instanceof Function ? object.name : object.constructor.name);\n const feature = status === \"failure\" ? `${object}.${String(key)}` : `${value}.${String(key)}`;\n console.debug(`%c${feature}%c available`, \"color: hsl(200, 83%, 60%)\", \"color: inherit\");\n if (!(key in object)) {\n throw feature;\n }\n};\nexport class SuccessResult {\n value;\n status = \"success\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when succeeded\");\n}\nexport class FailureResult {\n error;\n status = \"failure\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when failed\");\n}\nexport const tryCatch = (statement) => {\n try {\n return new SuccessResult(statement());\n }\n catch (error) {\n return new FailureResult(error);\n }\n};\nexport const isValidIdentifier = (identifier) => /^[A-Za-z_$][A-Za-z0-9_]*$/.test(identifier);\nexport const asValidIdentifier = (identifier) => isValidIdentifier(identifier) ? identifier : panic(`'${identifier}' is not a valid identifier`);\nexport const asEnumValue = (value, enm) => {\n const keys = Object.keys(enm);\n if (keys.length === 0)\n return panic(\"Empty enum object (are you using `const enum`?)\");\n const values = Object.keys(enm)\n .filter(k => isNaN(Number(k)))\n .map(k => enm[k]);\n return values.includes(value) ? value : panic(`Invalid enum value: ${String(value)}`);\n};\nexport const EmptyExec = () => { };\nexport const EmptyProvider = () => { };\nexport const EmptyProcedure = (_) => { };\n", "import { asDefined, panic } from \"./lang\";\nexport var Sorting;\n(function (Sorting) {\n Sorting[Sorting[\"Ascending\"] = 1] = \"Ascending\";\n Sorting[Sorting[\"Descending\"] = -1] = \"Descending\";\n})(Sorting || (Sorting = {}));\nexport class Arrays {\n static #empty = Object.freeze(new Array(0));\n static empty = () => (() => this.#empty)();\n static clear = (array) => { array.length = 0; };\n static replace = (array, newValues) => {\n array.length = 0;\n array.push(...newValues);\n };\n static consume = (array, procedure) => {\n for (let index = 0; index < array.length;) {\n if (procedure(array[index])) {\n array.splice(index, 1);\n }\n else {\n index++;\n }\n }\n };\n static peekFirst = (array) => array.at(0) ?? null;\n static peekLast = (array) => array.at(-1) ?? null;\n static getFirst = (array, fail) => asDefined(array.at(0), fail);\n static getLast = (array, fail) => asDefined(array.at(-1), fail);\n static getPrev = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index - 1) % array.length), \"Internal Error\");\n };\n static getNext = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n return asDefined(array.at((index + 1) % array.length), \"Internal Error\");\n };\n static removeLast = (array, fail) => asDefined(array.pop(), fail);\n static create = (factory, n) => {\n const array = new Array(n);\n for (let i = 0; i < n; i++) {\n array[i] = factory(i);\n }\n return array;\n };\n static equals = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n /**\n * The satisfy method checks if all elements in a given array satisfy a provided predicate function\n * when compared with the first element of the array. That essentially means that all tested properties\n * in the predicate function are equal throughout the array.\n * [1, 1, 1, 1, 1] > (a, b) => a === b returns true\n * [1, 1, 1, 1, 2] > (a, b) => a === b returns false\n * [1, 1, 3, 2, 1] > (a, b) => a === b returns false\n */\n static satisfy = (array, predicate) => {\n if (array.length < 2) {\n return true;\n }\n const first = array[0];\n for (let i = 1; i < array.length; i++) {\n if (!predicate(first, array[i])) {\n return false;\n }\n }\n return true;\n };\n static remove = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return panic(`${element} not found in ${array}`);\n }\n array.splice(index, 1);\n };\n static removeIf = (array, predicate) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) {\n array.splice(i, 1);\n }\n }\n };\n static removeOpt = (array, element) => {\n const index = array.indexOf(element);\n if (index === -1) {\n return false;\n }\n array.splice(index, 1);\n return true;\n };\n static hasDuplicates = (array) => new Set(array).size < array.length;\n static removeDuplicates = (array) => {\n let index = 0 | 0;\n const result = new Set();\n for (const element of array) {\n if (!result.has(element)) {\n result.add(element);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static removeDuplicateKeys = (array, key) => {\n let index = 0 | 0;\n const seen = new Set();\n for (const element of array) {\n const value = element[key];\n if (!seen.has(value)) {\n seen.add(value);\n array[index++] = element;\n }\n }\n array.length = index;\n return array;\n };\n static subtract(array, excludeArray, compareFn) {\n return array.filter(item => !excludeArray.some(excludeItem => compareFn(item, excludeItem)));\n }\n static intersect(array, other, compareFn) {\n return array.filter(item => other.some(includeItem => compareFn(item, includeItem)));\n }\n static merge(baseArray, mergeIntoArray, compareFn) {\n return [...(baseArray\n .filter(baseItem => !mergeIntoArray\n .some(mergeItem => compareFn(baseItem, mergeItem)))), ...mergeIntoArray];\n }\n static *iterate(array) {\n for (let i = 0; i < array.length; i++) {\n yield array[i];\n }\n }\n static *iterateReverse(array) {\n for (let i = array.length - 1; i >= 0; i--) {\n yield array[i];\n }\n }\n static *iterateStateFull(array) {\n const maxIndex = array.length - 1;\n for (let i = 0; i <= maxIndex; i++) {\n yield { value: array[i], isFirst: i === 0, isLast: i === maxIndex };\n }\n }\n static *iterateAdjacent(array) {\n if (array.length <= 1) {\n return;\n }\n for (let i = 1, left = array[0]; i < array.length; i++) {\n const right = array[i];\n yield [left, right];\n left = right;\n }\n }\n static isSorted(array, sorting = Sorting.Ascending) {\n if (array.length < 2) {\n return true;\n }\n let prev = array[0];\n for (let i = 1; i < array.length; i++) {\n const next = array[i];\n if (Math.sign(prev - next) === sorting) {\n return false;\n }\n prev = next;\n }\n return true;\n }\n static toRecord(array, toKey) {\n return array.reduce((record, value) => {\n record[toKey(value)] = value;\n return record;\n }, {});\n }\n static concatArrayBuffers(a, b) {\n const result = new ArrayBuffer(a.byteLength + b.byteLength);\n const view = new Uint8Array(result);\n view.set(new Uint8Array(a), 0);\n view.set(new Uint8Array(b), a.byteLength);\n return result;\n }\n}\n", "import { asDefined, getOrProvide, isDefined, panic } from \"./lang\";\nexport var Option;\n(function (Option) {\n Option.wrap = (value) => isDefined(value) ? new Some(value) : Option.None;\n Option.from = (provider) => Option.wrap(provider());\n Option.tryFrom = (provider) => {\n try {\n return Option.wrap(provider());\n }\n catch (_error) {\n return Option.None;\n }\n };\n Option.execute = (func, ...args) => Option.wrap(func?.apply(null, args));\n Option.async = (promise) => promise.then(value => Option.wrap(value), () => Option.None);\n class Some {\n #value;\n constructor(value) { this.#value = asDefined(value); }\n unwrap() { return this.#value; }\n unwrapOrElse(_) { return this.#value; }\n unwrapOrNull() { return this.#value; }\n unwrapOrUndefined() { return this.#value; }\n contains(value) { return value === this.#value; }\n match(matchable) { return matchable.some(this.#value); }\n ifSome(run) { return run(this.#value); }\n ifAbsent(_func) { return undefined; }\n isEmpty() { return false; }\n nonEmpty() { return true; }\n map(callback) { return Option.wrap(callback(this.#value)); }\n mapOr(func, _or) { return func(this.#value); }\n flatMap(callback) { return callback(this.#value); }\n equals(other) { return this.unwrapOrNull() === other.unwrapOrNull(); }\n assert(_fail) { return this; }\n toString() { return `{Option.Some(${this.#value})}`; }\n get [Symbol.toStringTag]() { return this.toString(); }\n }\n Option.Some = Some;\n Option.None = new class {\n unwrap = (fail) => panic(isDefined(fail) ? getOrProvide(fail) : \"unwrap failed\");\n unwrapOrElse = (value) => getOrProvide(value);\n unwrapOrNull = () => null;\n unwrapOrUndefined = () => undefined;\n contains = (_) => false;\n match = (matchable) => matchable.none();\n ifSome = (_) => { };\n ifAbsent = (exec) => exec(undefined);\n isEmpty = () => true;\n nonEmpty = () => false;\n map = (_) => Option.None;\n mapOr = (_, or) => getOrProvide(or);\n flatMap = (_) => Option.None;\n equals = (other) => other.isEmpty();\n assert = (fail) => panic(getOrProvide(fail) ?? \"assert failed\");\n toString = () => \"{Option.None}\";\n get [Symbol.toStringTag]() { return this.toString(); }\n };\n})(Option || (Option = {}));\n", "// noinspection JSUnusedGlobalSymbols\nexport const TAU = Math.PI * 2.0;\nexport const PI_HALF = Math.PI / 2.0;\nexport const PI_QUART = Math.PI / 4.0;\nexport const INVERSE_SQRT_2 = 1.0 / Math.sqrt(2.0);\nexport const clamp = (value, min, max) => Math.max(min, Math.min(value, max));\nexport const clampUnit = (value) => Math.max(0.0, Math.min(value, 1.0));\nexport const squashUnit = (value, margin) => margin + (1.0 - 2.0 * margin) * Math.max(0.0, Math.min(value, 1.0));\nexport const quantizeFloor = (value, interval) => Math.floor(value / interval) * interval;\nexport const quantizeCeil = (value, interval) => Math.ceil(value / interval) * interval;\nexport const quantizeRound = (value, interval) => Math.round(value / interval) * interval;\nexport const linear = (y1, y2, mu) => y1 + (y2 - y1) * mu;\nexport const exponential = (y1, y2, mu) => y1 * Math.pow(y2 / y1, mu);\nexport const cosine = (y1, y2, mu) => {\n const mu2 = (1.0 - Math.cos(mu * Math.PI)) * 0.5;\n return y1 * (1.0 - mu2) + y2 * mu2;\n};\nexport const mod = (value, range) => fract(value / range) * range;\nexport const fract = (value) => value - Math.floor(value);\nexport const nextPowOf2 = (n) => Math.pow(2, Math.ceil(Math.log(n) / Math.log(2)));\nexport const radToDeg = (rad) => rad * 180.0 / Math.PI;\nexport const degToRad = (deg) => deg / 180.0 * Math.PI;\n// M\u00F6bius-Ease Curve\n// Only produces valid values between 0 and 1 (unitValues)\n// https://www.desmos.com/calculator/ht8cytaxsz\n// The inverse is h`=1-h\nexport const moebiusEase = (x, h) => (x * h) / ((2.0 * h - 1.0) * (x - 1.0) + h);\n", "const dataView = new DataView(new ArrayBuffer(8));\nexport var Integer;\n(function (Integer) {\n Integer.MIN_VALUE = -0x80000000;\n Integer.MAX_VALUE = 0x7fffffff;\n Integer.toByte = (value) => {\n dataView.setInt8(0, value);\n return dataView.getInt8(0);\n };\n Integer.toShort = (value) => {\n dataView.setInt16(0, value);\n return dataView.getInt16(0);\n };\n Integer.toInt = (value) => {\n dataView.setInt32(0, value);\n return dataView.getInt32(0);\n };\n})(Integer || (Integer = {}));\nexport var Float;\n(function (Float) {\n const EXP_BIT_MASK = 2139095040;\n const SIGNIFICANT_BIT_MASK = 8388607;\n const ARRAY_BUFFER = new ArrayBuffer(Float32Array.BYTES_PER_ELEMENT);\n const FLOAT_VIEW = new Float32Array(ARRAY_BUFFER);\n const INT_VIEW = new Int32Array(ARRAY_BUFFER);\n /**\n * Returns a representation of the specified floating-point value\n * according to the IEEE 754 floating-point \"single format\" bit layout.\n * @param value a floating-point number.\n * @returns the bits that represent the floating-point number.\n */\n Float.floatToIntBits = (value) => {\n const result = Float.floatToRawIntBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0) {\n return 0x7fc00000;\n }\n return result;\n };\n Float.intBitsToFloat = (value) => {\n INT_VIEW[0] = value;\n return FLOAT_VIEW[0];\n };\n Float.floatToRawIntBits = (value) => {\n FLOAT_VIEW[0] = value;\n return INT_VIEW[0];\n };\n Float.toFloat32 = (value) => {\n dataView.setFloat32(0, value);\n return dataView.getFloat32(0);\n };\n})(Float || (Float = {}));\nexport var Float16;\n(function (Float16) {\n Float16.floatToIntBits = (value) => {\n const bits = Float.floatToIntBits(value);\n const sign = bits >>> 16 & 0x8000;\n let val = (bits & 0x7fffffff) + 0x1000;\n if (val >= 0x47800000) {\n if ((bits & 0x7fffffff) >= 0x47800000) {\n if (val < 0x7f800000) {\n return sign | 0x7c00;\n }\n return sign | 0x7c00 | (bits & 0x007fffff) >>> 13;\n }\n return sign | 0x7bff;\n }\n if (val >= 0x38800000) {\n return sign | val - 0x38000000 >>> 13;\n }\n if (val < 0x33000000) {\n return sign;\n }\n val = (bits & 0x7fffffff) >>> 23;\n return sign | ((bits & 0x7fffff | 0x800000) + (0x800000 >>> val - 102) >>> 126 - val);\n };\n Float16.intBitsToFloat = (bits) => {\n let mantissa = bits & 0x03ff;\n let exp = bits & 0x7c00;\n if (exp === 0x7c00) {\n exp = 0x3fc00;\n }\n else if (exp !== 0) {\n exp += 0x1c000;\n if (mantissa === 0 && exp > 0x1c400) {\n return Float.intBitsToFloat((bits & 0x8000) << 16 | exp << 13 | 0x3ff);\n }\n }\n else if (mantissa !== 0) {\n exp = 0x1c400;\n do {\n mantissa <<= 1;\n exp -= 0x400;\n } while ((mantissa & 0x400) === 0);\n mantissa &= 0x3ff;\n }\n return Float.intBitsToFloat((bits & 0x8000) << 16 | (exp | mantissa) << 13);\n };\n})(Float16 || (Float16 = {}));\nexport var Float64;\n(function (Float64) {\n const EXP_BIT_MASK = 9218868437227405312n;\n const SIGNIFICANT_BIT_MASK = 4503599627370495n;\n const ARRAY_BUFFER = new ArrayBuffer(BigInt64Array.BYTES_PER_ELEMENT);\n const FLOAT64_VIEW = new Float64Array(ARRAY_BUFFER);\n const LONG_VIEW = new BigInt64Array(ARRAY_BUFFER);\n Float64.float64ToLongBits = (value) => {\n const result = Float64.float64ToRawLongBits(value);\n if ((result & EXP_BIT_MASK) === EXP_BIT_MASK && (result & SIGNIFICANT_BIT_MASK) !== 0n) {\n return 0x7ff8000000000000n;\n }\n return result;\n };\n Float64.longBitsToFloat64 = (value) => {\n LONG_VIEW[0] = value;\n return FLOAT64_VIEW[0];\n };\n Float64.float64ToRawLongBits = (value) => {\n FLOAT64_VIEW[0] = value;\n return LONG_VIEW[0];\n };\n Float64.clamp = (value) => {\n dataView.setFloat64(0, value);\n return dataView.getFloat64(0);\n };\n})(Float64 || (Float64 = {}));\n", "import { isDefined } from \"./lang\";\nexport class Iterables {\n static *empty() { }\n static one(value) { return [value]; }\n static count(iterable) {\n let count = 0 | 0;\n for (const _ of iterable) {\n count++;\n }\n return count;\n }\n static some(iterable, predicate) {\n for (const value of iterable) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n }\n static every(iterable, predicate) {\n for (const value of iterable) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n }\n static reduce(iterable, callback, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const value of iterable) {\n accumulator = callback(accumulator, value, index++);\n }\n return accumulator;\n }\n static includes(iterable, include) {\n for (const value of iterable) {\n if (value === include) {\n return true;\n }\n }\n return false;\n }\n static forEach(iterable, procedure) {\n for (const value of iterable) {\n procedure(value);\n }\n }\n static *map(iterable, map) {\n let count = 0 | 0;\n for (const value of iterable) {\n yield map(value, count++);\n }\n }\n static *take(iterator, count) {\n let i = 0;\n for (const value of iterator) {\n if (i++ >= count) {\n return;\n }\n yield value;\n }\n }\n static filter(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n if (fn(value)) {\n result.push(value);\n }\n }\n return result;\n }\n static filterMap(iterable, fn) {\n const result = [];\n for (const value of iterable) {\n const mapped = fn(value);\n if (isDefined(mapped)) {\n result.push(mapped);\n }\n }\n return result;\n }\n static reverse(iterable) {\n const result = [];\n for (const value of iterable) {\n result.push(value);\n }\n return result.reverse();\n }\n static *pairWise(iterable) {\n const iterator = iterable[Symbol.iterator]();\n const { done, value } = iterator.next();\n let prev = value;\n if (done === true) {\n return;\n }\n while (true) {\n const { done, value } = iterator.next();\n if (done === true) {\n yield [prev, null];\n return;\n }\n yield [prev, value];\n prev = value;\n }\n }\n}\n", "import { panic } from \"./lang\";\nimport { nextPowOf2 } from \"./math\";\nimport { Float, Float64 } from \"./numeric\";\nimport { Iterables } from \"./iterables\";\nexport class ByteArrayOutput {\n static create(initialCapacity = 1024) {\n return this.use(new ArrayBuffer(initialCapacity));\n }\n static use(buffer, byteOffset = 0 | 0) {\n return new ByteArrayOutput(new DataView(buffer, byteOffset));\n }\n littleEndian = false;\n #view;\n #position = 0;\n constructor(view) { this.#view = view; }\n get remaining() { return this.#view.byteLength - this.#position; }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n writeBoolean(value) { this.writeByte(value ? 1 : 0); }\n writeByte(value) {\n this.#ensureSpace(1);\n this.#view.setInt8(this.#position++, value);\n }\n writeShort(value) {\n this.#ensureSpace(Int16Array.BYTES_PER_ELEMENT);\n this.#view.setInt16(this.#position, value, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n }\n writeInt(value) {\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT);\n this.#view.setInt32(this.#position, value, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n }\n writeLong(value) {\n this.#ensureSpace(BigInt64Array.BYTES_PER_ELEMENT);\n this.#view.setBigInt64(this.#position, value, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n }\n writeFloat(value) {\n this.#ensureSpace(Float32Array.BYTES_PER_ELEMENT);\n this.#view.setFloat32(this.#position, value, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n }\n writeDouble(value) {\n this.#ensureSpace(Float64Array.BYTES_PER_ELEMENT);\n this.#view.setFloat64(this.#position, value, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n }\n writeBytes(bytes) {\n this.#ensureSpace(bytes.length);\n for (let i = 0; i < bytes.length; ++i) {\n this.#view.setInt8(this.#position++, bytes[i]);\n }\n }\n writeString(value) {\n const length = value.length;\n this.#ensureSpace(Int32Array.BYTES_PER_ELEMENT + length * Int16Array.BYTES_PER_ELEMENT);\n this.writeInt(length);\n for (let i = 0; i < length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toArrayBuffer() { return this.#view.buffer.slice(0, this.#position); }\n #ensureSpace(count) {\n const capacity = this.#view.byteLength;\n if (this.#position + count > capacity) {\n const o = this.#view;\n this.#view = new DataView(new ArrayBuffer(nextPowOf2(capacity + count)));\n for (let i = 0; i < this.#position; i++) {\n this.#view.setInt8(i, o.getInt8(i));\n }\n }\n }\n}\nexport class ByteCounter {\n #count = 0 | 0;\n writeByte(_) { this.#count++; }\n writeShort(_) { this.#count += 2; }\n writeInt(_) { this.#count += 4; }\n writeLong(_) { this.#count += 8; }\n writeFloat(_) { this.#count += 4; }\n writeDouble(_) { this.#count += 8; }\n writeBoolean(_) { this.#count++; }\n writeBytes(bytes) { this.#count += bytes.length; }\n writeString(value) { this.#count += value.length + 4; }\n get count() { return this.#count; }\n}\nexport class Checksum {\n #result;\n #cursor = 0;\n constructor(length = 32) {\n this.#result = new Int8Array(length);\n }\n result() { return this.#result; }\n equals(other) {\n if (other === this) {\n return true;\n }\n return this.#result.every((value, index) => other.#result[index] === value);\n }\n writeBoolean(value) {\n this.writeByte(value ? 31 : 11);\n }\n writeShort(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n }\n writeByte(value) {\n if (this.#cursor >= this.#result.length) {\n this.#cursor = 0;\n }\n this.#result[this.#cursor++] ^= value;\n }\n writeInt(value) {\n this.writeByte(value & 0xff);\n this.writeByte((value >>> 8) & 0xff);\n this.writeByte((value >>> 16) & 0xff);\n this.writeByte((value >>> 24) & 0xff);\n }\n writeBytes(bytes) {\n bytes.forEach(value => this.writeByte(value));\n }\n writeFloat(value) {\n this.writeInt(Float.floatToIntBits(value));\n }\n writeDouble(value) {\n this.writeLong(Float64.float64ToLongBits(value));\n }\n writeLong(value) {\n this.writeByte(Number(value) & 0xff);\n this.writeByte(Number(value >> 8n) & 0xff);\n this.writeByte(Number(value >> 16n) & 0xff);\n this.writeByte(Number(value >> 24n) & 0xff);\n this.writeByte(Number(value >> 32n) & 0xff);\n this.writeByte(Number(value >> 40n) & 0xff);\n this.writeByte(Number(value >> 48n) & 0xff);\n this.writeByte(Number(value >> 56n) & 0xff);\n }\n writeString(value) {\n for (let i = 0; i < value.length; i++) {\n this.writeShort(value.charCodeAt(i));\n }\n }\n toHexString() {\n return Array.from(Iterables.map(this.#result.values(), value => (value & 0xff).toString(16).padStart(2, \"0\"))).join(\"\");\n }\n}\nexport class ByteArrayInput {\n littleEndian = false;\n #view;\n #position = 0;\n constructor(buffer, byteOffset = 0) { this.#view = new DataView(buffer, byteOffset); }\n get position() { return this.#position; }\n set position(value) {\n if (value < 0) {\n panic(`position(${value}) cannot be negative.`);\n }\n else if (value > this.#view.byteLength) {\n panic(`position(${value}) is outside range (${this.#view.byteLength}).`);\n }\n else {\n this.#position = value;\n }\n }\n readByte() { return this.#view.getInt8(this.#position++); }\n readShort() {\n const read = this.#view.getInt16(this.#position, this.littleEndian);\n this.#position += Int16Array.BYTES_PER_ELEMENT;\n return read;\n }\n readInt() {\n const read = this.#view.getInt32(this.#position, this.littleEndian);\n this.#position += Int32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readLong() {\n const read = this.#view.getBigInt64(this.#position, this.littleEndian);\n this.#position += BigInt64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readFloat() {\n const read = this.#view.getFloat32(this.#position, this.littleEndian);\n this.#position += Float32Array.BYTES_PER_ELEMENT;\n return read;\n }\n readDouble() {\n const read = this.#view.getFloat64(this.#position, this.littleEndian);\n this.#position += Float64Array.BYTES_PER_ELEMENT;\n return read;\n }\n readBoolean() { return this.readByte() === 1; }\n readBytes(array) {\n for (let i = 0; i < array.length; i++) {\n array[i] = this.readByte();\n }\n }\n readString() {\n const length = this.readInt();\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += String.fromCharCode(this.readShort());\n }\n return result;\n }\n available(count) { return this.#position + count <= this.#view.byteLength; }\n remaining() { return this.#view.byteLength - this.#position; }\n skip(count) { this.position += count; }\n}\n", "import { Arrays } from \"./arrays\";\nimport { EmptyExec } from \"./lang\";\nexport const Terminable = Object.freeze({\n Empty: { terminate: EmptyExec },\n create: (exec) => ({ terminate: exec }),\n many: (...terminables) => ({ terminate: () => { while (terminables.length > 0) {\n terminables.pop().terminate();\n } } })\n});\nexport class Terminator {\n #terminables = [];\n isEmpty() { return this.#terminables.length === 0; }\n nonEmpty() { return this.#terminables.length > 0; }\n own(terminable) {\n this.#terminables.push(terminable);\n return terminable;\n }\n ownAll(...terminables) {\n for (const terminable of terminables) {\n this.#terminables.push(terminable);\n }\n }\n spawn() {\n const terminator = new Terminator();\n terminator.own({ terminate: () => Arrays.removeOpt(this.#terminables, terminator) });\n return this.own(terminator);\n }\n terminate() { while (this.#terminables.length > 0) {\n this.#terminables.pop().terminate();\n } }\n}\nexport class VitalSigns {\n #terminated = false;\n get isTerminated() { return this.#terminated; }\n terminate() { this.#terminated = true; }\n}\nexport class CascadingSubscriptions {\n #current;\n constructor() { this.#current = new Terminator(); }\n next() {\n const current = this.#current;\n const nested = current.own(new Terminator());\n this.#current = nested;\n return {\n own: (subscription) => {\n current.own(subscription);\n return current;\n },\n toObserver: (fn) => (value) => {\n nested.terminate();\n nested.own(fn(value));\n }\n };\n }\n append(subscribe, observer) {\n const current = this.#current;\n const nested = current.own(new Terminator());\n current.own(subscribe((value) => {\n nested.terminate();\n nested.own(observer(value));\n }));\n this.#current = nested;\n return current;\n }\n}\n", "import { Terminable } from \"./terminable\";\nexport class Notifier {\n static subscribeMany(observer, ...observables) {\n return Terminable.many(...observables\n .map(observable => observable.subscribe(() => observer(observable))));\n }\n #observers = new Set(); // A set allows us to remove while iterating\n subscribe(observer) {\n this.#observers.add(observer);\n return { terminate: () => this.#observers.delete(observer) };\n }\n isEmpty() { return this.#observers.size === 0; }\n notify(value) { this.#observers.forEach((observer) => observer(value)); }\n observers() { return this.#observers; }\n terminate() { this.#observers.clear(); }\n}\n", "import { assert, EmptyExec } from \"./lang\";\nimport { Option } from \"./option\";\nexport const RuntimeNotifier = (() => {\n let notifierOption = Option.None;\n return ({\n info: (request) => notifierOption.match({\n none: () => Promise.resolve(),\n some: notifier => notifier.info(request)\n }),\n approve: (request) => notifierOption.match({\n none: () => Promise.resolve(true),\n some: notifier => notifier.approve(request)\n }),\n progress: (request) => notifierOption.match({\n none: () => ({ message: \"\", terminate: EmptyExec }),\n some: notifier => notifier.progress(request)\n }),\n install: (notifier) => {\n assert(notifierOption.isEmpty(), \"RuntimeNotification already installed\");\n notifierOption = Option.wrap(notifier);\n }\n });\n})();\n", "import { Unhandled } from \"./lang\";\nexport class TimeSpan {\n static POSITIVE_INFINITY = new TimeSpan(Number.POSITIVE_INFINITY);\n static millis = (value) => new TimeSpan(value);\n static seconds = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_SECOND);\n static minutes = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_MINUTE);\n static hours = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_HOUR);\n static days = (value) => new TimeSpan(value * TimeSpan.#MILLI_SECONDS_PER_DAY);\n static #MILLI_SECONDS_PER_SECOND = 1_000;\n static #MILLI_SECONDS_PER_MINUTE = 60_000;\n static #MILLI_SECONDS_PER_HOUR = 3_600_000;\n static #MILLI_SECONDS_PER_DAY = 86_400_000;\n #ms;\n constructor(ms) { this.#ms = ms; }\n millis() { return this.#ms; }\n absSeconds() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_SECOND; }\n absMinutes() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_MINUTE; }\n absHours() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_HOUR; }\n absDays() { return Math.abs(this.#ms) / TimeSpan.#MILLI_SECONDS_PER_DAY; }\n split() {\n return {\n d: Math.floor(this.absDays()),\n h: Math.floor(this.absHours()) % 24,\n m: Math.floor(this.absMinutes()) % 60,\n s: Math.floor(this.absSeconds()) % 60\n };\n }\n isNow() { return this.#ms === 0.0; }\n isPast() { return this.#ms < 0.0; }\n isFuture() { return this.#ms > 0.0; }\n toUnitString() {\n let value, unit;\n const seconds = Math.floor(Math.abs(this.#ms) / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n if (seconds < 60) {\n value = seconds;\n unit = \"second\";\n }\n else if (minutes < 60) {\n value = minutes;\n unit = \"minute\";\n }\n else if (hours < 24) {\n value = hours;\n unit = \"hour\";\n }\n else {\n value = days;\n unit = \"day\";\n }\n return new Intl.RelativeTimeFormat(\"en\", { numeric: \"auto\", style: \"long\" })\n .format(value * Math.sign(this.#ms), unit);\n }\n toString() {\n if (isNaN(this.#ms)) {\n return \"NaN\";\n }\n if (!isFinite(this.#ms)) {\n return \"\u221E\";\n }\n const { d, h, m, s } = this.split();\n if (d > 0) {\n return [\n TimeSpan.#quantity(\"d\", d), TimeSpan.#quantity(\"h\", h),\n TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (h > 0) {\n return [\n TimeSpan.#quantity(\"h\", h), TimeSpan.#quantity(\"m\", m),\n TimeSpan.#quantity(\"s\", s)\n ]\n .join(\", \");\n }\n else if (m > 0) {\n return [TimeSpan.#quantity(\"m\", m), TimeSpan.#quantity(\"s\", s)]\n .join(\", \");\n }\n else if (s > 0) {\n return TimeSpan.#quantity(\"s\", s);\n }\n else {\n return \"now\";\n }\n }\n static #quantity = (name, count) => {\n switch (name) {\n case \"d\":\n return `${count} ${count < 2 ? \"day\" : \"days\"}`;\n case \"h\":\n return `${count} ${count < 2 ? \"hour\" : \"hours\"}`;\n case \"m\":\n return `${count} ${count < 2 ? \"minute\" : \"minutes\"}`;\n case \"s\":\n return `${count} ${count < 2 ? \"second\" : \"seconds\"}`;\n default:\n return Unhandled(name);\n }\n };\n}\n", "import { asDefined, assert, isDefined, Iterables, panic } from \"@opendaw/lib-std\";\n/**\n * Communicator provides type-safe communication between Window, Worker, MessagePort, BroadcastChannel.\n * Passed objects are structured cloned: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n * It is highly advised not to pass classes with methods and or real private properties (starting with #).\n * They will lose their prototype and private property inheritance, and it is cumbersome to patch that up later.\n * Also read: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n */\nexport var Communicator;\n(function (Communicator) {\n Communicator.sender = (messenger, bind) => bind(new Sender(messenger));\n Communicator.executor = (messenger, protocol) => new Executor(messenger, protocol);\n const extractTransferables = (args) => {\n const transferables = [];\n for (const arg of args) {\n if (arg instanceof MessagePort) {\n transferables.push(arg);\n }\n if (typeof ImageBitmap !== \"undefined\" && arg instanceof ImageBitmap) {\n transferables.push(arg);\n }\n if (typeof OffscreenCanvas !== \"undefined\" && arg instanceof OffscreenCanvas) {\n transferables.push(arg);\n }\n }\n return transferables;\n };\n class Sender {\n #messenger;\n #expected = new Map();\n #subscription;\n #returnId = 0;\n constructor(messenger) {\n this.#messenger = messenger;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n dispatchAndForget = (func, ...args) => {\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: false,\n func: func.name,\n args: Array.from(Iterables.map(args, arg => ({ value: arg })))\n }, transferables);\n };\n dispatchAndReturn = (func, ...args) => new Promise((resolve, reject) => {\n const entries = Iterables.reduce(args, (callbacks, arg, index) => {\n if (typeof arg === \"function\") {\n callbacks.push([index, arg]);\n }\n return callbacks;\n }, []);\n this.#expected.set(this.#returnId, {\n executorTuple: { resolve, reject },\n callbacks: new Map(entries)\n });\n const transferables = extractTransferables(args);\n this.#messenger.send({\n type: \"send\",\n returnId: this.#returnId,\n func: func.name,\n args: Array.from(Iterables.map(args, (arg, index) => typeof arg === \"function\" ? ({ callback: index }) : ({ value: arg })))\n }, transferables);\n this.#returnId++;\n });\n #messageHandler = (message) => {\n const returns = this.#expected.get(message.returnId);\n if (isDefined(returns)) {\n if (message.type === \"resolve\") {\n returns.executorTuple.resolve(message.resolve);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"reject\") {\n returns.executorTuple.reject(message.reject);\n this.#expected.delete(message.returnId);\n }\n else if (message.type === \"callback\") {\n returns.callbacks?.get(message.funcAt).apply(this, message.args);\n }\n }\n else {\n panic(`Promise has already been resolved. ${JSON.stringify(message)}`);\n }\n };\n }\n class Executor {\n #messenger;\n #protocol;\n #subscription;\n constructor(messenger, protocol) {\n this.#messenger = messenger;\n this.#protocol = protocol;\n this.#subscription = messenger.subscribe(this.#messageHandler);\n }\n terminate() { this.#subscription.terminate(); }\n #messageHandler = (message) => {\n assert(message.type === \"send\", () => \"Message type must be 'send'\");\n const object = Object.getPrototypeOf(this.#protocol) === Object.getPrototypeOf({})\n ? this.#protocol : Object.getPrototypeOf(this.#protocol);\n const func = asDefined(object[message.func], `${message.func.toString()} does not exists on ${this.#protocol}`);\n const returnId = message.returnId;\n if (returnId === false) {\n func.apply(this.#protocol, message.args.map((arg) => \"value\" in arg\n ? arg.value : panic(`${message.func.toString()} has no promise.`)));\n }\n else {\n try {\n const promise = func.apply(this.#protocol, message.args\n .map(arg => \"callback\" in arg ? (...args) => this.#sendCallback(returnId, arg.callback, args) : arg.value));\n promise.then(value => {\n try {\n this.#sendResolve(returnId, value);\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }, reason => this.#sendReject(returnId, reason));\n }\n catch (reason) {\n this.#sendReject(returnId, reason);\n }\n }\n };\n #sendResolve = (returnId, value) => this.#messenger.send({ type: \"resolve\", returnId, resolve: value });\n #sendReject = (returnId, reason) => this.#messenger.send({ type: \"reject\", returnId, reject: reason });\n #sendCallback = (returnId, func, args) => this.#messenger.send({ type: \"callback\", returnId, funcAt: func, args });\n }\n Communicator.Executor = Executor;\n})(Communicator || (Communicator = {}));\n", "import { isDefined, Notifier } from \"@opendaw/lib-std\";\nexport const Messenger = { for: (port) => new NativeMessenger(port) };\nconst EmptyTransferables = [];\nclass NativeMessenger {\n #port;\n #notifier = new Notifier();\n constructor(port) {\n this.#port = port;\n if (isDefined(port.onmessage) || isDefined(port.onmessageerror)) {\n console.error(port);\n throw new Error(`${port} is already wrapped.`);\n }\n port.onmessage = (event) => this.#notifier.notify(event.data);\n port.onmessageerror = (event) => { throw new Error(event.type); };\n }\n send(message, transfer) {\n this.#port.postMessage(message, transfer ?? EmptyTransferables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#notifier.terminate();\n this.#port.onmessage = null;\n this.#port.onmessageerror = null;\n }\n}\n// with '__id__' we put in a little security that we are only communicating with the messenger we created\nclass Channel {\n #messages;\n #name;\n #notifier = new Notifier();\n #subscription;\n constructor(messages, name) {\n this.#messages = messages;\n this.#name = name;\n this.#subscription = messages.subscribe(data => {\n if (\"__id__\" in data && data.__id__ === \"42\" && \"message\" in data && \"channel\" in data && data.channel === name) {\n this.#notifier.notify(data.message);\n }\n });\n }\n send(message, transferrables) {\n this.#messages.send({ __id__: \"42\", channel: this.#name, message }, transferrables);\n }\n channel(name) { return new Channel(this, name); }\n subscribe(observer) { return this.#notifier.subscribe(observer); }\n terminate() {\n this.#subscription.terminate();\n this.#notifier.terminate();\n }\n}\n", "import { tryCatch } from \"@opendaw/lib-std\";\nexport var Wait;\n(function (Wait) {\n Wait.frame = () => new Promise(resolve => requestAnimationFrame(() => resolve()));\n Wait.frames = (numFrames) => new Promise(resolve => {\n let count = numFrames;\n const callback = () => { if (--count <= 0) {\n resolve();\n }\n else {\n requestAnimationFrame(callback);\n } };\n requestAnimationFrame(callback);\n });\n Wait.timeSpan = (time, ...args) => new Promise(resolve => setTimeout(resolve, time.millis(), ...args));\n Wait.event = (target, type) => new Promise(resolve => target.addEventListener(type, resolve, { once: true }));\n Wait.observable = (observable) => new Promise(resolve => {\n const terminable = observable.subscribe(() => {\n terminable.terminate();\n resolve();\n });\n });\n Wait.complete = (generator) => new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const { status, value: next, error } = tryCatch(() => generator.next());\n if (status === \"success\") {\n const { done, value } = next;\n if (done) {\n clearInterval(interval);\n resolve(value);\n }\n }\n else {\n clearInterval(interval);\n reject(error);\n }\n }, 0);\n });\n})(Wait || (Wait = {}));\n", "import { assert, InaccessibleProperty, isDefined, isNull, Option, RuntimeNotifier, safeExecute, Terminable, TimeSpan } from \"@opendaw/lib-std\";\nimport { Wait } from \"./wait\";\nexport class IntervalRetryOption {\n maxRetry;\n timeSpan;\n #count = 0 | 0;\n constructor(maxRetry, timeSpan) {\n this.maxRetry = maxRetry;\n this.timeSpan = timeSpan;\n }\n retry(reason, exec) {\n if (++this.#count === this.maxRetry) {\n return false;\n }\n console.debug(`${reason} > will retry in ${this.timeSpan.toString()}`);\n setTimeout(exec, this.timeSpan.millis());\n return true;\n }\n}\nexport var Promises;\n(function (Promises) {\n class ResolveResult {\n value;\n status = \"resolved\";\n constructor(value) {\n this.value = value;\n }\n error = InaccessibleProperty(\"Cannot access error when promise is resolved\");\n }\n Promises.ResolveResult = ResolveResult;\n class RejectedResult {\n error;\n status = \"rejected\";\n constructor(error) {\n this.error = error;\n }\n value = InaccessibleProperty(\"Cannot access value when promise is rejected\");\n }\n Promises.RejectedResult = RejectedResult;\n Promises.makeAbortable = async (owner, promise) => {\n let running = true;\n owner.own(Terminable.create(() => running = false));\n return new Promise((resolve, reject) => promise.then(value => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } }));\n };\n Promises.tryCatch = (promise) => promise.then(value => new ResolveResult(value), error => new RejectedResult(error));\n const DefaultRetryOption = new IntervalRetryOption(3, TimeSpan.seconds(3));\n Promises.retry = (factory, retryOption = DefaultRetryOption) => factory().catch(reason => new Promise((resolve, reject) => {\n const onFailure = (reason) => {\n if (!retryOption.retry(reason, () => factory().then((value) => resolve(value), onFailure))) {\n reject(reason);\n }\n };\n onFailure(reason);\n }));\n Promises.guardedRetry = (factory, retryIf) => {\n const attempt = async (count = 0) => {\n try {\n return await factory();\n }\n catch (reason) {\n if (retryIf(reason, ++count)) {\n console.debug(\"retrying after failure:\", reason);\n await Wait.timeSpan(TimeSpan.seconds(1));\n return attempt(count);\n }\n throw new Error(`Failed after ${count} retries: ${reason}`);\n }\n };\n return attempt();\n };\n Promises.approvedRetry = (factory, approve) => {\n const attempt = async () => {\n try {\n return await factory();\n }\n catch (reason) {\n if (await RuntimeNotifier.approve(approve(reason))) {\n return attempt();\n }\n throw reason;\n }\n };\n return attempt();\n };\n // this is for testing the catch branch\n Promises.fail = (after, thenUse) => {\n let use = () => new Promise((_, reject) => setTimeout(() => reject(\"fails first\"), after.millis()));\n return () => {\n const promise = use();\n use = thenUse;\n return promise;\n };\n };\n Promises.timeout = (promise, timeSpan, fail) => {\n return new Promise((resolve, reject) => {\n let running = true;\n const timeout = setTimeout(() => {\n running = false;\n reject(new Error(fail ?? \"timeout\"));\n }, timeSpan.millis());\n promise\n .then((value) => { if (running) {\n resolve(value);\n } }, reason => { if (running) {\n reject(reason);\n } })\n .finally(() => clearTimeout(timeout));\n });\n };\n Promises.sequentialAll = (factories) => factories.reduce((promise, factory) => promise\n .then(async (results) => [...results, await factory()]), Promise.resolve([]));\n Promises.sequentialize = (handler) => {\n let lastPromise = Promise.resolve();\n return (arg) => {\n const execute = () => handler(arg);\n const currentPromise = lastPromise.then(execute, execute);\n lastPromise = currentPromise.catch(() => { });\n return currentPromise;\n };\n };\n Promises.memoizeAsync = (factory, timeout) => {\n let resolving = null;\n let lastCall = Date.now();\n return () => {\n const now = Date.now();\n if (isNull(resolving) || (isDefined(timeout) && now - lastCall > timeout.millis())) {\n lastCall = now;\n resolving = factory();\n resolving.catch(error => {\n resolving = null;\n return error;\n });\n }\n return resolving;\n };\n };\n Promises.allWithLimit = async (tasks, limit = 1) => {\n const results = new Array(tasks.length);\n let index = 0;\n let hasError = false;\n const run = async () => {\n while (index < tasks.length && !hasError) {\n const i = index++;\n try {\n const value = await tasks[i]();\n if (!hasError) {\n results[i] = value;\n }\n }\n catch (reason) {\n hasError = true;\n throw reason;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, run));\n return results;\n };\n Promises.allSettledWithLimit = async (tasks, limit = 1) => {\n const results = new Array(tasks.length);\n let index = 0;\n const run = async () => {\n while (index < tasks.length) {\n const i = index++;\n try {\n const value = await tasks[i]();\n results[i] = { status: \"fulfilled\", value };\n }\n catch (reason) {\n results[i] = { status: \"rejected\", reason };\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, run));\n return results;\n };\n class Limit {\n max;\n #waiting;\n #running = 0 | 0;\n constructor(max = 1) {\n this.max = max;\n this.#waiting = [];\n }\n async add(provider) {\n if (this.#running < this.max) {\n this.#running++;\n return provider().finally(() => this.#continue());\n }\n else {\n const resolvers = Promise.withResolvers();\n this.#waiting.push([provider, resolvers]);\n return resolvers.promise.finally(() => this.#continue());\n }\n }\n #continue() {\n assert(this.#running > 0, \"Internal Error in Promises.Limit\");\n if (--this.#running < this.max) {\n if (this.#waiting.length > 0) {\n const [provider, { resolve, reject }] = this.#waiting.shift();\n this.#running++;\n provider().then(resolve, reject);\n }\n }\n }\n }\n Promises.Limit = Limit;\n class Latest {\n #onResolve;\n #onReject;\n #onFinally;\n #latest = Option.None;\n constructor(onResolve, onReject, onFinally) {\n this.#onResolve = onResolve;\n this.#onReject = onReject;\n this.#onFinally = onFinally;\n }\n update(promise) {\n this.#latest = Option.wrap(promise);\n promise\n .then(value => { if (this.#latest.contains(promise)) {\n this.#onResolve(value);\n } })\n .catch(reason => { if (this.#latest.contains(promise)) {\n this.#onReject(reason);\n } })\n .finally(() => {\n if (this.#latest.contains(promise)) {\n this.terminate();\n safeExecute(this.#onFinally);\n }\n });\n }\n terminate() { this.#latest = Option.None; }\n }\n Promises.Latest = Latest;\n})(Promises || (Promises = {}));\n", "export const stopwatch = (level = \"debug\") => {\n const startTime = performance.now();\n return {\n lab: (label) => console[level].call(console, `${label} in ${(performance.now() - startTime).toFixed(1)}ms`)\n };\n};\n", "import { Arrays, assert, ByteArrayOutput, Float16, Unhandled } from \"@opendaw/lib-std\";\nexport var Peaks;\n(function (Peaks) {\n class Stage {\n shift;\n numPeaks;\n dataOffset;\n constructor(shift, numPeaks, dataOffset) {\n this.shift = shift;\n this.numPeaks = numPeaks;\n this.dataOffset = dataOffset;\n }\n unitsEachPeak() { return 1 << this.shift; }\n }\n Peaks.Stage = Stage;\n Peaks.unpack = (bits, index) => {\n switch (index) {\n case 0:\n return Float16.intBitsToFloat(bits);\n case 1:\n return Float16.intBitsToFloat(bits >> 16);\n default:\n return Unhandled(index);\n }\n };\n})(Peaks || (Peaks = {}));\nexport class SamplePeaks {\n stages;\n data;\n numFrames;\n numChannels;\n static from(input) {\n assert(input.readString() === \"PEAKS\", \"Wrong header\");\n const numStages = input.readInt();\n const stages = [];\n for (let i = 0; i < numStages; i++) {\n const dataOffset = input.readInt();\n const numPeaks = input.readInt();\n const shift = input.readInt();\n input.readInt(); // TODO deprecate (was mask)\n stages[i] = new Peaks.Stage(shift, numPeaks, dataOffset);\n }\n const numData = input.readInt();\n const data = [];\n for (let i = 0; i < numData; i++) {\n const array = new Int8Array(input.readInt());\n input.readBytes(array);\n data[i] = new Int32Array(array.buffer);\n }\n const numFrames = input.readInt();\n const numChannels = input.readInt();\n return new SamplePeaks(stages, data, numFrames, numChannels);\n }\n static None = new SamplePeaks([], [], 0, 0);\n static findBestFit = (numFrames, width = 1200) => {\n const ratio = numFrames / width;\n if (ratio <= 1.0) {\n return new Uint8Array(0);\n }\n const ShiftPadding = 3;\n const maxShift = Math.floor(Math.log(ratio) / Math.LN2);\n const numStages = Math.max(1, Math.floor(maxShift / ShiftPadding));\n return new Uint8Array(Arrays.create(index => ShiftPadding * (index + 1), numStages));\n };\n constructor(stages, data, numFrames, numChannels) {\n this.stages = stages;\n this.data = data;\n this.numFrames = numFrames;\n this.numChannels = numChannels;\n }\n nearest(unitsPerPixel) {\n if (this.stages.length === 0) {\n return null;\n }\n const shift = Math.floor(Math.log(Math.abs(unitsPerPixel)) / Math.LN2);\n let i = this.stages.length;\n while (--i > -1) {\n if (shift >= this.stages[i].shift) {\n return this.stages[i];\n }\n }\n return this.stages[0];\n }\n toArrayBuffer() {\n const output = ByteArrayOutput.create();\n output.writeString(\"PEAKS\");\n output.writeInt(this.stages.length);\n for (let i = 0; i < this.stages.length; i++) {\n const { dataOffset, numPeaks, shift } = this.stages[i];\n output.writeInt(dataOffset);\n output.writeInt(numPeaks);\n output.writeInt(shift);\n output.writeInt((1 << shift) - 1); // TODO deprecate (was mask)\n }\n output.writeInt(this.data.length);\n for (let i = 0; i < this.data.length; i++) {\n const array = new Int8Array(this.data[i].buffer);\n output.writeInt(array.length);\n output.writeBytes(array);\n }\n output.writeInt(this.numFrames);\n output.writeInt(this.numChannels);\n return output.toArrayBuffer();\n }\n toString() { return `{SamplePeaks num-stages: ${this.stages.length}}`; }\n}\n", "import { Arrays, Float16, panic } from \"@opendaw/lib-std\";\nimport { Communicator, stopwatch } from \"@opendaw/lib-runtime\";\nimport { Peaks, SamplePeaks } from \"./Peaks\";\nexport var SamplePeakWorker;\n(function (SamplePeakWorker) {\n SamplePeakWorker.install = (messenger) => Communicator.executor(messenger.channel(\"peaks\"), new class {\n async generateAsync(progress, shifts, frames, numFrames, numChannels) {\n return generatePeaks(progress, shifts, frames, numFrames, numChannels).toArrayBuffer();\n }\n });\n const generatePeaks = (progress, shifts, frames, numFrames, numChannels) => {\n if (frames.length !== numChannels) {\n return panic(`Invalid numberOfChannels. Expected: ${numChannels}. Got ${frames.length}`);\n }\n class State {\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n index = 0;\n }\n const time = stopwatch();\n const numShifts = shifts.length;\n const [stages, dataOffset] = initStages(shifts, numFrames);\n const data = Arrays.create(() => new Int32Array(dataOffset), numChannels);\n const minMask = (1 << stages[0].shift) - 1;\n const total = numChannels * numFrames;\n let count = 0;\n for (let channel = 0; channel < numChannels; ++channel) {\n const channelData = data[channel];\n const channelFrames = frames[channel];\n const states = Arrays.create(() => new State(), numShifts);\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let position = 0;\n for (let i = 0; i < numFrames; ++i) {\n const frame = channelFrames[i];\n min = Math.min(frame, min);\n max = Math.max(frame, max);\n if ((++position & minMask) === 0) {\n for (let j = 0; j < numShifts; ++j) {\n const stage = stages[j];\n const state = states[j];\n state.min = Math.min(state.min, min);\n state.max = Math.max(state.max, max);\n if ((((1 << stage.shift) - 1) & position) === 0) {\n channelData[stage.dataOffset + state.index++] = SamplePeakWorker.pack(state.min, state.max);\n state.min = Number.POSITIVE_INFINITY;\n state.max = Number.NEGATIVE_INFINITY;\n }\n }\n min = Number.POSITIVE_INFINITY;\n max = Number.NEGATIVE_INFINITY;\n }\n if ((++count & 0xFFFF) === 0) {\n progress(count / total);\n }\n }\n }\n progress(1.0);\n time.lab(`SamplePeaks '${self.constructor.name}'`);\n return new SamplePeaks(stages, data, numFrames, numChannels);\n };\n const initStages = (shifts, numFrames) => {\n let dataOffset = 0;\n const stages = Arrays.create((index) => {\n const shift = shifts[index];\n const numPeaks = Math.ceil(numFrames / (1 << shift));\n const stage = new Peaks.Stage(shift, numPeaks, dataOffset);\n dataOffset += numPeaks;\n return stage;\n }, shifts.length);\n return [stages, dataOffset];\n };\n SamplePeakWorker.pack = (f0, f1) => {\n const bits0 = Float16.floatToIntBits(f0);\n const bits1 = Float16.floatToIntBits(f1);\n return bits0 | (bits1 << 16);\n };\n})(SamplePeakWorker || (SamplePeakWorker = {}));\n", "import { Arrays, asDefined, isNotUndefined, panic } from \"@opendaw/lib-std\";\nimport { Communicator, Promises } from \"@opendaw/lib-runtime\";\nexport var OpfsWorker;\n(function (OpfsWorker) {\n const DEBUG = false;\n OpfsWorker.init = (messenger) => Communicator.executor(messenger.channel(\"opfs\"), new class {\n #locks = new Map();\n async write(path, data) {\n await this.#acquireLock(path, async () => {\n if (DEBUG) {\n console.debug(`write ${data.length}b to ${path}`);\n }\n const handle = await this.#resolveFile(path, { create: true });\n try {\n handle.truncate(data.length);\n handle.write(data.buffer, { at: 0 });\n handle.flush();\n }\n finally {\n handle.close();\n }\n });\n }\n async read(path) {\n return await this.#acquireLock(path, async () => {\n if (DEBUG) {\n console.debug(`read ${path}`);\n }\n const handle = await this.#resolveFile(path);\n try {\n const size = handle.getSize();\n const buffer = new Uint8Array(size);\n handle.read(buffer);\n return buffer;\n }\n finally {\n handle.close();\n }\n });\n }\n async delete(path) {\n await this.#acquireLock(path, async () => {\n const segments = pathToSegments(path);\n if (segments.length === 0) {\n return this.clear();\n }\n return this.#resolveFolder(segments.slice(0, -1))\n .then(folder => folder.removeEntry(asDefined(segments.at(-1)), { recursive: true }));\n });\n }\n async list(path) {\n const segments = pathToSegments(path);\n const { status, value: folder } = await Promises.tryCatch(this.#resolveFolder(segments));\n if (status === \"rejected\") {\n return Arrays.empty();\n }\n const result = [];\n for await (const { name, kind } of folder.values()) {\n result.push({ name, kind });\n }\n return result;\n }\n async clear() {\n const root = await navigator.storage.getDirectory();\n for await (const [name, handle] of root.entries()) {\n if (handle.kind === \"file\") {\n await root.removeEntry(name);\n }\n else if (handle.kind === \"directory\") {\n await root.removeEntry(name, { recursive: true });\n }\n }\n }\n async #acquireLock(path, operation) {\n while (true) {\n const existingLock = this.#locks.get(path);\n if (isNotUndefined(existingLock)) {\n await existingLock;\n continue;\n }\n let releaseLock = () => panic(\"Lock not acquired\");\n const lockPromise = new Promise(resolve => releaseLock = resolve);\n this.#locks.set(path, lockPromise);\n try {\n return await operation();\n }\n finally {\n if (this.#locks.get(path) === lockPromise) {\n this.#locks.delete(path);\n }\n releaseLock();\n }\n }\n }\n async #resolveFile(path, options) {\n const segments = pathToSegments(path);\n const folder = await this.#resolveFolder(segments.slice(0, -1), options);\n const fileHandle = await folder.getFileHandle(asDefined(segments.at(-1)), options);\n return await fileHandle.createSyncAccessHandle();\n }\n async #resolveFolder(segments, options) {\n let folder = await navigator.storage.getDirectory();\n for (const segment of segments) {\n folder = await folder.getDirectoryHandle(segment, options);\n }\n return folder;\n }\n });\n const pathToSegments = (path) => {\n const noSlashes = path.replace(/^\\/+|\\/+$/g, \"\");\n return noSlashes === \"\" ? [] : noSlashes.split(\"/\");\n };\n})(OpfsWorker || (OpfsWorker = {}));\n", "import { assert, clamp, TAU } from \"@opendaw/lib-std\";\n// turns out the following code is producing similar but different frequency responses\n// https://chromium.googlesource.com/chromium/blink/+/refs/heads/main/Source/platform/audio/Biquad.cpp\n// while this one produces the correct results\n// https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/audio/biquad.cc\n// quickly tested all biquad modes\nexport class BiquadCoeff {\n a1 = 0.0;\n a2 = 0.0;\n b0 = 0.0;\n b1 = 0.0;\n b2 = 0.0;\n constructor() { this.identity(); }\n identity() { this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0); }\n setLowpassParams(cutoff, resonance = Math.SQRT1_2) {\n cutoff = clamp(cutoff, 0.0, 1.0);\n if (cutoff >= 0.5) {\n this.setNormalizedCoefficients(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);\n }\n else if (cutoff > 0.0) {\n const theta = TAU * cutoff;\n const alpha = Math.sin(theta) / (2.0 * resonance);\n const cosw = Math.cos(theta);\n const beta = (1.0 - cosw) / 2.0;\n const b0 = beta;\n const b1 = 2.0 * beta;\n const b2 = beta;\n const a0 = 1.0 + alpha;\n const a1 = -2.0 * cosw;\n const a2 = 1.0 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(0.0, 0.0, 0.0, 1.0, 0.0, 0.0);\n }\n return this;\n }\n setHighpassParams(cutoff, resonance = Math.SQRT1_2) {\n cutoff = clamp(cutoff, 0.0, 1.0);\n if (cutoff === 1) {\n this.setNormalizedCoefficients(0, 0, 0, 1, 0, 0);\n }\n else if (cutoff > 0) {\n const theta = TAU * cutoff;\n const alpha = Math.sin(theta) / (2 * resonance);\n const cosw = Math.cos(theta);\n const beta = (1 + cosw) / 2;\n const b0 = beta;\n const b1 = -2 * beta;\n const b2 = beta;\n const a0 = 1 + alpha;\n const a1 = -2 * cosw;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setNormalizedCoefficients(b0, b1, b2, a0, a1, a2) {\n const a0_inverse = 1.0 / a0;\n this.b0 = b0 * a0_inverse;\n this.b1 = b1 * a0_inverse;\n this.b2 = b2 * a0_inverse;\n this.a1 = a1 * a0_inverse;\n this.a2 = a2 * a0_inverse;\n return this;\n }\n setLowShelfParams(frequency, db_gain) {\n frequency = clamp(frequency, 0.0, 1.0);\n const a = Math.pow(10.0, db_gain / 40);\n if (frequency === 1) {\n this.setNormalizedCoefficients(a * a, 0, 0, 1, 0, 0);\n }\n else if (frequency > 0) {\n const w0 = TAU * frequency;\n const s = 1;\n const alpha = 0.5 * Math.sin(w0) * Math.sqrt((a + 1 / a) * (1 / s - 1) + 2);\n const k = Math.cos(w0);\n const k2 = 2 * Math.sqrt(a) * alpha;\n const a_plus_one = a + 1;\n const a_minus_one = a - 1;\n const b0 = a * (a_plus_one - a_minus_one * k + k2);\n const b1 = 2 * a * (a_minus_one - a_plus_one * k);\n const b2 = a * (a_plus_one - a_minus_one * k - k2);\n const a0 = a_plus_one + a_minus_one * k + k2;\n const a1 = -2 * (a_minus_one + a_plus_one * k);\n const a2 = a_plus_one + a_minus_one * k - k2;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setHighShelfParams(frequency, db_gain) {\n frequency = clamp(frequency, 0.0, 1.0);\n const a = Math.pow(10.0, db_gain / 40);\n if (frequency === 1) {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n else if (frequency > 0) {\n const w0 = TAU * frequency;\n const s = 1;\n const alpha = 0.5 * Math.sin(w0) * Math.sqrt((a + 1 / a) * (1 / s - 1) + 2);\n const k = Math.cos(w0);\n const k2 = 2 * Math.sqrt(a) * alpha;\n const a_plus_one = a + 1;\n const a_minus_one = a - 1;\n const b0 = a * (a_plus_one + a_minus_one * k + k2);\n const b1 = -2 * a * (a_minus_one + a_plus_one * k);\n const b2 = a * (a_plus_one + a_minus_one * k - k2);\n const a0 = a_plus_one - a_minus_one * k + k2;\n const a1 = 2 * (a_minus_one - a_plus_one * k);\n const a2 = a_plus_one - a_minus_one * k - k2;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(a * a, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setPeakingParams(frequency, q, db_gain) {\n frequency = clamp(frequency, 0.0, 1.0);\n q = Math.max(0.0, q);\n const a = Math.pow(10.0, db_gain / 40);\n if (frequency > 0 && frequency < 1) {\n if (q > 0) {\n const w0 = TAU * frequency;\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = 1 + alpha * a;\n const b1 = -2 * k;\n const b2 = 1 - alpha * a;\n const a0 = 1 + alpha / a;\n const a1 = -2 * k;\n const a2 = 1 - alpha / a;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(a * a, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setAllpassParams(frequency, q) {\n frequency = clamp(frequency, 0.0, 1.0);\n q = Math.max(0.0, q);\n if (frequency > 0 && frequency < 1) {\n if (q > 0) {\n const w0 = TAU * frequency;\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = 1 - alpha;\n const b1 = -2 * k;\n const b2 = 1 + alpha;\n const a0 = 1 + alpha;\n const a1 = -2 * k;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(-1, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setNotchParams(frequency, q) {\n frequency = clamp(frequency, 0.0, 1.0);\n q = Math.max(0.0, q);\n if (frequency > 0 && frequency < 1) {\n if (q > 0) {\n const w0 = TAU * frequency;\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = 1;\n const b1 = -2 * k;\n const b2 = 1;\n const a0 = 1 + alpha;\n const a1 = -2 * k;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(0, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n return this;\n }\n setBandpassParams(frequency, q) {\n frequency = Math.max(0.0, frequency);\n q = Math.max(0.0, q);\n if (frequency > 0 && frequency < 1) {\n const w0 = TAU * frequency;\n if (q > 0) {\n const alpha = Math.sin(w0) / (2 * q);\n const k = Math.cos(w0);\n const b0 = alpha;\n const b1 = 0;\n const b2 = -alpha;\n const a0 = 1 + alpha;\n const a1 = -2 * k;\n const a2 = 1 - alpha;\n this.setNormalizedCoefficients(b0, b1, b2, a0, a1, a2);\n }\n else {\n this.setNormalizedCoefficients(1, 0, 0, 1, 0, 0);\n }\n }\n else {\n this.setNormalizedCoefficients(0, 0, 0, 1, 0, 0);\n }\n return this;\n }\n getFrequencyResponse(frequency, magResponse, phaseResponse) {\n assert(frequency.length === magResponse.length && frequency.length === phaseResponse.length, \"Array lengths do not match\");\n const b0 = this.b0;\n const b1 = this.b1;\n const b2 = this.b2;\n const a1 = this.a1;\n const a2 = this.a2;\n for (let k = 0; k < frequency.length; ++k) {\n const omega = -Math.PI * 2 * frequency[k];\n const zReal = Math.cos(omega);\n const zImag = Math.sin(omega);\n const numeratorReal = b0 + ((b1 + b2 * zReal) * zReal - b2 * zImag * zImag);\n const numeratorImag = ((b1 + b2 * zReal) * zImag + b2 * zImag * zReal);\n const denominatorReal = 1 + ((a1 + a2 * zReal) * zReal - a2 * zImag * zImag);\n const denominatorImag = ((a1 + a2 * zReal) * zImag + a2 * zImag * zReal);\n const denom = denominatorReal * denominatorReal + denominatorImag * denominatorImag;\n const responseReal = (numeratorReal * denominatorReal + numeratorImag * denominatorImag) / denom;\n const responseImag = (numeratorImag * denominatorReal - numeratorReal * denominatorImag) / denom;\n magResponse[k] = Math.sqrt(responseReal * responseReal + responseImag * responseImag);\n phaseResponse[k] = Math.atan2(responseImag, responseReal);\n }\n }\n}\n", "import { BiquadCoeff } from \"./biquad-coeff\";\nimport { Arrays, clampUnit } from \"@opendaw/lib-std\";\nexport class BiquadMono {\n #x1 = 0.0;\n #x2 = 0.0;\n #y1 = 0.0;\n #y2 = 0.0;\n reset() {\n this.#x1 = 0.0;\n this.#x2 = 0.0;\n this.#y1 = 0.0;\n this.#y2 = 0.0;\n }\n process({ a1, a2, b0, b1, b2 }, source, target, fromIndex, toIndex) {\n let x1 = this.#x1;\n let x2 = this.#x2;\n let y1 = this.#y1;\n let y2 = this.#y2;\n for (let i = fromIndex; i < toIndex; i++) {\n const x = source[i];\n const y = target[i] = (b0 * x + b1 * x1 + b2 * x2 - a1 * y1 - a2 * y2) + 1e-18 - 1e-18;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n }\n this.#x1 = x1;\n this.#x2 = x2;\n this.#y1 = y1;\n this.#y2 = y2;\n }\n processFrame({ a1, a2, b0, b1, b2 }, x) {\n const y = (b0 * x + b1 * this.#x1 + b2 * this.#x2 - a1 * this.#y1 - a2 * this.#y2) + 1e-18 - 1e-18;\n this.#x2 = this.#x1;\n this.#x1 = x;\n this.#y2 = this.#y1;\n this.#y1 = y;\n return y;\n }\n}\nexport class BiquadStack {\n #stack;\n #order;\n constructor(maxOrder) {\n this.#stack = Arrays.create(() => new BiquadMono(), maxOrder);\n this.#order = this.#stack.length;\n }\n get order() { return this.#order; }\n set order(value) {\n if (this.#order === value) {\n return;\n }\n this.#order = value;\n this.reset();\n }\n reset() { this.#stack.forEach(processor => processor.reset()); }\n process(coeff, source, target, fromIndex, toIndex) {\n for (let i = 0; i < this.#order; i++) {\n this.#stack[i].process(coeff, source, target, fromIndex, toIndex);\n source = target;\n }\n }\n processFrame(coeff, x) {\n for (let i = 0; i < this.#order; i++) {\n x = this.#stack[i].processFrame(coeff, x);\n }\n return x;\n }\n}\nconst LUT_SIZE = 512;\nexport class ModulatedBiquad {\n #freqLUT;\n #coeff = new BiquadCoeff();\n #filter;\n #lastIdx = -1;\n constructor(minFreq, maxFreq, sampleRate) {\n this.#filter = new BiquadStack(4);\n this.#freqLUT = new Float32Array(LUT_SIZE + 1);\n const logRatio = Math.log(maxFreq / minFreq);\n const invSampleRate = 1.0 / sampleRate;\n for (let i = 0; i <= LUT_SIZE; i++) {\n this.#freqLUT[i] = minFreq * Math.exp(i / LUT_SIZE * logRatio) * invSampleRate;\n }\n }\n get order() { return this.#filter.order; }\n set order(value) { this.#filter.order = value; }\n reset() { this.#filter.reset(); }\n process(input, output, cutoffs, q, fromIndex, toIndex) {\n const freqLUT = this.#freqLUT;\n const filter = this.#filter;\n const coeff = this.#coeff;\n const qReduced = q / (filter.order ** 1.25);\n let from = fromIndex;\n let lastIdx = this.#lastIdx;\n while (from < toIndex) {\n const idx = Math.floor(clampUnit(cutoffs[from]) * LUT_SIZE);\n let to = from + 1;\n while (to < toIndex && Math.floor(clampUnit(cutoffs[to]) * LUT_SIZE) === idx)\n ++to;\n if (idx !== lastIdx) {\n lastIdx = idx;\n coeff.setLowpassParams(freqLUT[idx], qReduced);\n }\n filter.process(coeff, input, output, from, to);\n from = to;\n }\n this.#lastIdx = lastIdx;\n }\n}\n", "import { BiquadCoeff } from \"./biquad-coeff\";\nimport { BiquadMono } from \"./biquad-processor\";\nimport { panic } from \"@opendaw/lib-std\";\nconst LR_ORDER = 48;\nconst LOW_CROSSOVER_HZ = 200.0;\nconst HIGH_CROSSOVER_HZ = 2000.0;\nconst RMS_WINDOW_MS = 20.0;\nconst MIN_TRANSIENT_COUNT = 2;\nconst ENERGY_DERIVATIVE_THRESHOLD = 0.0003;\nconst MAX_TRANSIENT_DENSITY_PER_SEC = 40.0;\nconst MIN_TRANSIENT_SEPARATION_MS = 120.0;\nconst VALLEY_BIAS = 0.2;\nconst MAX_VALLEY_SEARCH_MS = 20.0;\nconst ONSET_ENERGY_RATIO = 0.66;\nconst VALLEY_RMS = 0.006;\nconst BAND_WEIGHTS = {\n low: 1.0,\n mid: 4.0,\n high: 8.0\n};\nexport class TransientDetector {\n static detect(audio) {\n const now = performance.now();\n const duration = audio.numberOfFrames / audio.sampleRate;\n const result = new TransientDetector(audio).#detect();\n const took = (((performance.now() - now) / 1000.0) / duration * 100.0).toFixed(2);\n console.debug(`realtime factor: ${took}%`);\n return result;\n }\n #sampleRate;\n #numberOfFrames;\n #maxValleySearchSamples;\n #minSeparationSamples;\n #windowSamples;\n #halfWindow;\n #maxCount;\n #mono;\n constructor(audio) {\n this.#sampleRate = audio.sampleRate;\n this.#numberOfFrames = audio.numberOfFrames;\n this.#maxValleySearchSamples = Math.floor((MAX_VALLEY_SEARCH_MS / 1000.0) * this.#sampleRate);\n this.#minSeparationSamples = Math.floor((MIN_TRANSIENT_SEPARATION_MS / 1000.0) * this.#sampleRate);\n this.#windowSamples = Math.floor((RMS_WINDOW_MS / 1000.0) * this.#sampleRate);\n this.#halfWindow = Math.floor(this.#windowSamples / 2);\n const durationSeconds = this.#numberOfFrames / this.#sampleRate;\n this.#maxCount = Math.floor(durationSeconds * MAX_TRANSIENT_DENSITY_PER_SEC);\n this.#mono = this.#mixToMono(audio);\n }\n #detect() {\n // Phase 1: Collect rough candidates from all bands\n const candidates = this.#collectCandidates();\n // Phase 2: Refine each candidate to the valley between it and previous\n const refined = this.#refineToValleys(candidates);\n return refined.map(x => x / this.#sampleRate);\n }\n #collectCandidates() {\n const bands = this.#splitBands();\n const allOnsets = [];\n for (const band of [\"low\", \"mid\", \"high\"]) {\n const buffer = bands[band];\n const envelope = this.#computeEnergyEnvelope(buffer);\n const onsets = this.#detectOnsets(envelope);\n const weight = BAND_WEIGHTS[band];\n for (const onset of onsets) {\n allOnsets.push({ position: onset.position, energy: onset.energy * weight });\n }\n }\n // Sort by energy descending and greedily collect respecting minimum separation\n const collected = [0, this.#numberOfFrames];\n const sorted = [...allOnsets].sort((a, b) => b.energy - a.energy);\n for (const onset of sorted) {\n if (collected.length >= this.#maxCount + 2 && collected.length >= MIN_TRANSIENT_COUNT + 2) {\n break;\n }\n if (!this.#isTooClose(collected, onset.position)) {\n this.#insertSorted(collected, onset.position);\n }\n }\n return collected;\n }\n #refineToValleys(candidates) {\n if (candidates.length < 2) {\n return candidates;\n }\n const refined = [candidates[0]];\n const rmsWindow = Math.floor(this.#sampleRate * VALLEY_RMS);\n for (let i = 1; i < candidates.length - 1; i++) {\n const prev = candidates[i - 1];\n const curr = candidates[i];\n if (prev === 0) {\n refined.push(curr);\n continue;\n }\n const gap = curr - prev;\n const gapBasedStart = prev + Math.floor(gap * VALLEY_BIAS);\n const windowBasedStart = curr - this.#maxValleySearchSamples;\n const searchStart = Math.max(gapBasedStart, windowBasedStart);\n // Compute RMS at candidate position (the transient energy)\n let candidateRms = 0.0;\n for (let k = 0; k < rmsWindow && curr + k < this.#numberOfFrames; k++) {\n candidateRms += this.#mono[curr + k] * this.#mono[curr + k];\n }\n candidateRms = Math.sqrt(candidateRms / rmsWindow);\n const thresoldEnergy = candidateRms * ONSET_ENERGY_RATIO;\n let minRms = Infinity;\n let minPos = curr;\n for (let j = curr - 1; j >= searchStart; j--) {\n let sum = 0.0;\n for (let k = 0; k < rmsWindow && j + k < this.#numberOfFrames; k++) {\n sum += this.#mono[j + k] * this.#mono[j + k];\n }\n const rms = Math.sqrt(sum / rmsWindow);\n if (rms < minRms) {\n minRms = rms;\n minPos = j;\n }\n if (rms < thresoldEnergy) {\n break;\n }\n }\n refined.push(minPos);\n }\n refined.push(candidates[candidates.length - 1]);\n return refined;\n }\n #mixToMono(audio) {\n const { numberOfFrames, numberOfChannels, frames } = audio;\n if (numberOfChannels === 0) {\n return panic(\"Invalid sample. No channels found.\");\n }\n if (numberOfChannels === 1) {\n return new Float32Array(frames[0]);\n }\n const mono = new Float32Array(numberOfFrames);\n for (let ch = 0; ch < numberOfChannels; ch++) {\n const channel = frames[ch];\n for (let i = 0; i < numberOfFrames; i++) {\n mono[i] += channel[i];\n }\n }\n const scale = 1.0 / numberOfChannels;\n for (let i = 0; i < numberOfFrames; i++) {\n mono[i] *= scale;\n }\n return mono;\n }\n #applyLRFilter(input, freq, type, order) {\n const passes = order / 12;\n const coeff = new BiquadCoeff();\n const cutoff = freq / this.#sampleRate;\n if (type === \"lowpass\") {\n coeff.setLowpassParams(cutoff, Math.SQRT1_2);\n }\n else {\n coeff.setHighpassParams(cutoff, Math.SQRT1_2);\n }\n let result = input;\n for (let p = 0; p < passes; p++) {\n const filter1 = new BiquadMono();\n const filter2 = new BiquadMono();\n const temp1 = new Float32Array(result.length);\n const temp2 = new Float32Array(result.length);\n filter1.process(coeff, result, temp1, 0, result.length);\n filter2.process(coeff, temp1, temp2, 0, result.length);\n result = temp2;\n }\n return result;\n }\n #splitBands() {\n const low = this.#applyLRFilter(this.#mono, LOW_CROSSOVER_HZ, \"lowpass\", LR_ORDER);\n const highFromLow = this.#applyLRFilter(this.#mono, LOW_CROSSOVER_HZ, \"highpass\", LR_ORDER);\n const mid = this.#applyLRFilter(highFromLow, HIGH_CROSSOVER_HZ, \"lowpass\", LR_ORDER);\n const high = this.#applyLRFilter(highFromLow, HIGH_CROSSOVER_HZ, \"highpass\", LR_ORDER);\n return { low, mid, high };\n }\n #computeEnergyEnvelope(buffer) {\n const envelope = new Float32Array(buffer.length);\n let sumSq = 0.0;\n for (let i = 0; i < this.#windowSamples && i < buffer.length; i++) {\n sumSq += buffer[i] * buffer[i];\n }\n for (let i = 0; i < buffer.length; i++) {\n const windowStart = i - this.#halfWindow;\n const windowEnd = i + this.#halfWindow;\n if (windowStart > 0 && windowStart - 1 < buffer.length) {\n const old = buffer[windowStart - 1];\n sumSq -= old * old;\n }\n if (windowEnd < buffer.length) {\n const next = buffer[windowEnd];\n sumSq += next * next;\n }\n const count = Math.min(windowEnd, buffer.length - 1) - Math.max(windowStart, 0) + 1;\n envelope[i] = Math.sqrt(Math.max(0.0, sumSq) / count);\n }\n return envelope;\n }\n #detectOnsets(envelope) {\n let maxEnergy = 0.0;\n for (let i = 0; i < envelope.length; i++) {\n if (envelope[i] > maxEnergy) {\n maxEnergy = envelope[i];\n }\n }\n const threshold = maxEnergy * ENERGY_DERIVATIVE_THRESHOLD;\n const onsets = [];\n for (let i = 1; i < envelope.length - 1; i++) {\n const derivative = envelope[i] - envelope[i - 1];\n const nextDerivative = envelope[i + 1] - envelope[i];\n if (derivative > threshold && derivative > nextDerivative) {\n onsets.push({ position: i, energy: envelope[i] });\n }\n }\n return onsets;\n }\n #isTooClose(arr, position) {\n const idx = this.#binarySearchInsertPosition(arr, position);\n if (idx > 0 && position - arr[idx - 1] < this.#minSeparationSamples) {\n return true;\n }\n return idx < arr.length && arr[idx] - position < this.#minSeparationSamples;\n }\n #insertSorted(arr, value) {\n const idx = this.#binarySearchInsertPosition(arr, value);\n arr.splice(idx, 0, value);\n }\n #binarySearchInsertPosition(arr, value) {\n let lo = 0;\n let hi = arr.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (arr[mid] < value) {\n lo = mid + 1;\n }\n else {\n hi = mid;\n }\n }\n return lo;\n }\n}\n", "import {Communicator, Messenger} from \"@opendaw/lib-runtime\"\nimport {OpfsWorker, SamplePeakWorker} from \"@opendaw/lib-fusion\"\nimport {AudioData, TransientDetector, TransientProtocol} from \"@opendaw/lib-dsp\"\n\nconst messenger: Messenger = Messenger.for(self)\n\nOpfsWorker.init(messenger)\nSamplePeakWorker.install(messenger)\n\nCommunicator.executor(messenger.channel(\"transients\"), new class implements TransientProtocol {\n async detect(audioData: AudioData): Promise<Array<number>> {\n return TransientDetector.detect(audioData)\n }\n})\n\nmessenger.channel(\"initialize\").send(\"ready\")"],
5
+ "mappings": "AAEO,IAAMA,EAAaC,GAAiCA,GAAU,KACxDC,GAAUD,GAAUA,IAAU,KAGpC,IAAME,GAAkBC,GAAUA,IAAU,OAG5C,IAAMC,EAAY,CAACC,EAAOC,EAAO,qBAAuBD,GAAwCE,EAAMC,EAAaF,CAAI,CAAC,EAiBxH,IAAMG,EAAgBC,GAAUA,aAAiB,SAAWA,EAAM,EAAIA,EAEtE,IAAMC,GAAc,CAACC,KAASC,IAASD,GAAM,MAAM,KAAMC,CAAI,EAkB7D,IAAMC,EAAaC,GAAU,CAAE,MAAM,IAAI,MAAM,aAAaA,CAAK,EAAE,CAAG,EAChEC,EAASC,GAAU,CAC5B,MAAM,OAAOA,GAAU,SAAW,IAAI,MAAMA,CAAK,EAAIA,CACzD,EACaC,EAAS,CAACC,EAAWC,IAASD,EAAY,OAAYH,EAAMK,EAAaD,CAAI,CAAC,EAEpF,IAAME,EAAwBC,GAAgB,IAAI,MAAM,CAAC,EAAG,CAAE,KAAM,CAAE,OAAOC,EAAMD,CAAW,CAAG,CAAE,CAAC,EAmBpG,IAAME,GAAN,KAAoB,CACvB,MACA,OAAS,UACT,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACA,MAAQC,EAAqB,oCAAoC,CACrE,EACaC,GAAN,KAAoB,CACvB,MACA,OAAS,UACT,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACA,MAAQF,EAAqB,iCAAiC,CAClE,EACaG,GAAYC,GAAc,CACnC,GAAI,CACA,OAAO,IAAIN,GAAcM,EAAU,CAAC,CACxC,OACOF,EAAO,CACV,OAAO,IAAID,GAAcC,CAAK,CAClC,CACJ,EAYO,IAAMG,EAAY,IAAM,CAAE,ECzG1B,IAAIC,IACV,SAAUA,EAAS,CAChBA,EAAQA,EAAQ,UAAe,CAAC,EAAI,YACpCA,EAAQA,EAAQ,WAAgB,EAAE,EAAI,YAC1C,GAAGA,KAAYA,GAAU,CAAC,EAAE,EACrB,IAAMC,EAAN,KAAa,CAChB,MAAOC,GAAS,OAAO,OAAO,IAAI,MAAM,CAAC,CAAC,EAC1C,OAAO,MAAQ,IAAa,KAAKA,GACjC,OAAO,MAASC,GAAU,CAAEA,EAAM,OAAS,CAAG,EAC9C,OAAO,QAAU,CAACA,EAAOC,IAAc,CACnCD,EAAM,OAAS,EACfA,EAAM,KAAK,GAAGC,CAAS,CAC3B,EACA,OAAO,QAAU,CAACD,EAAOE,IAAc,CACnC,QAASC,EAAQ,EAAGA,EAAQH,EAAM,QAC1BE,EAAUF,EAAMG,CAAK,CAAC,EACtBH,EAAM,OAAOG,EAAO,CAAC,EAGrBA,GAGZ,EACA,OAAO,UAAaH,GAAUA,EAAM,GAAG,CAAC,GAAK,KAC7C,OAAO,SAAYA,GAAUA,EAAM,GAAG,EAAE,GAAK,KAC7C,OAAO,SAAW,CAACA,EAAOI,IAASC,EAAUL,EAAM,GAAG,CAAC,EAAGI,CAAI,EAC9D,OAAO,QAAU,CAACJ,EAAOI,IAASC,EAAUL,EAAM,GAAG,EAAE,EAAGI,CAAI,EAC9D,OAAO,QAAU,CAACJ,EAAOM,IAAY,CACjC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,OAAIH,IAAU,GACHI,EAAM,GAAGD,CAAO,iBAAiBN,CAAK,EAAE,EAE5CK,EAAUL,EAAM,IAAIG,EAAQ,GAAKH,EAAM,MAAM,EAAG,gBAAgB,CAC3E,EACA,OAAO,QAAU,CAACA,EAAOM,IAAY,CACjC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,OAAIH,IAAU,GACHI,EAAM,GAAGD,CAAO,iBAAiBN,CAAK,EAAE,EAE5CK,EAAUL,EAAM,IAAIG,EAAQ,GAAKH,EAAM,MAAM,EAAG,gBAAgB,CAC3E,EACA,OAAO,WAAa,CAACA,EAAOI,IAASC,EAAUL,EAAM,IAAI,EAAGI,CAAI,EAChE,OAAO,OAAS,CAACI,EAASC,IAAM,CAC5B,IAAMT,EAAQ,IAAI,MAAMS,CAAC,EACzB,QAASC,EAAI,EAAGA,EAAID,EAAGC,IACnBV,EAAMU,CAAC,EAAIF,EAAQE,CAAC,EAExB,OAAOV,CACX,EACA,OAAO,OAAS,CAACW,EAAGC,IAAM,CACtB,GAAID,EAAE,SAAWC,EAAE,OACf,MAAO,GAEX,QAASF,EAAI,EAAGA,EAAIC,EAAE,OAAQD,IAC1B,GAAIC,EAAED,CAAC,IAAME,EAAEF,CAAC,EACZ,MAAO,GAGf,MAAO,EACX,EASA,OAAO,QAAU,CAACV,EAAOa,IAAc,CACnC,GAAIb,EAAM,OAAS,EACf,MAAO,GAEX,IAAMc,EAAQd,EAAM,CAAC,EACrB,QAASU,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAC9B,GAAI,CAACG,EAAUC,EAAOd,EAAMU,CAAC,CAAC,EAC1B,MAAO,GAGf,MAAO,EACX,EACA,OAAO,OAAS,CAACV,EAAOM,IAAY,CAChC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,GAAIH,IAAU,GACV,OAAOI,EAAM,GAAGD,CAAO,iBAAiBN,CAAK,EAAE,EAEnDA,EAAM,OAAOG,EAAO,CAAC,CACzB,EACA,OAAO,SAAW,CAACH,EAAOa,IAAc,CACpC,QAASH,EAAIV,EAAM,OAAS,EAAGU,GAAK,EAAGA,IAC/BG,EAAUb,EAAMU,CAAC,CAAC,GAClBV,EAAM,OAAOU,EAAG,CAAC,CAG7B,EACA,OAAO,UAAY,CAACV,EAAOM,IAAY,CACnC,IAAMH,EAAQH,EAAM,QAAQM,CAAO,EACnC,OAAIH,IAAU,GACH,IAEXH,EAAM,OAAOG,EAAO,CAAC,EACd,GACX,EACA,OAAO,cAAiBH,GAAU,IAAI,IAAIA,CAAK,EAAE,KAAOA,EAAM,OAC9D,OAAO,iBAAoBA,GAAU,CACjC,IAAIG,EAAQ,EACNY,EAAS,IAAI,IACnB,QAAWT,KAAWN,EACbe,EAAO,IAAIT,CAAO,IACnBS,EAAO,IAAIT,CAAO,EAClBN,EAAMG,GAAO,EAAIG,GAGzB,OAAAN,EAAM,OAASG,EACRH,CACX,EACA,OAAO,oBAAsB,CAACA,EAAOgB,IAAQ,CACzC,IAAIb,EAAQ,EACNc,EAAO,IAAI,IACjB,QAAWX,KAAWN,EAAO,CACzB,IAAMkB,EAAQZ,EAAQU,CAAG,EACpBC,EAAK,IAAIC,CAAK,IACfD,EAAK,IAAIC,CAAK,EACdlB,EAAMG,GAAO,EAAIG,EAEzB,CACA,OAAAN,EAAM,OAASG,EACRH,CACX,EACA,OAAO,SAASA,EAAOmB,EAAcC,EAAW,CAC5C,OAAOpB,EAAM,OAAOqB,GAAQ,CAACF,EAAa,KAAKG,GAAeF,EAAUC,EAAMC,CAAW,CAAC,CAAC,CAC/F,CACA,OAAO,UAAUtB,EAAOuB,EAAOH,EAAW,CACtC,OAAOpB,EAAM,OAAOqB,GAAQE,EAAM,KAAKC,GAAeJ,EAAUC,EAAMG,CAAW,CAAC,CAAC,CACvF,CACA,OAAO,MAAMC,EAAWC,EAAgBN,EAAW,CAC/C,MAAO,CAAC,GAAIK,EACH,OAAOE,GAAY,CAACD,EACpB,KAAKE,GAAaR,EAAUO,EAAUC,CAAS,CAAC,CAAC,EAAI,GAAGF,CAAc,CACnF,CACA,OAAQ,QAAQ1B,EAAO,CACnB,QAASU,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAC9B,MAAMV,EAAMU,CAAC,CAErB,CACA,OAAQ,eAAeV,EAAO,CAC1B,QAASU,EAAIV,EAAM,OAAS,EAAGU,GAAK,EAAGA,IACnC,MAAMV,EAAMU,CAAC,CAErB,CACA,OAAQ,iBAAiBV,EAAO,CAC5B,IAAM6B,EAAW7B,EAAM,OAAS,EAChC,QAASU,EAAI,EAAGA,GAAKmB,EAAUnB,IAC3B,KAAM,CAAE,MAAOV,EAAMU,CAAC,EAAG,QAASA,IAAM,EAAG,OAAQA,IAAMmB,CAAS,CAE1E,CACA,OAAQ,gBAAgB7B,EAAO,CAC3B,GAAI,EAAAA,EAAM,QAAU,GAGpB,QAASU,EAAI,EAAGoB,EAAO9B,EAAM,CAAC,EAAGU,EAAIV,EAAM,OAAQU,IAAK,CACpD,IAAMqB,EAAQ/B,EAAMU,CAAC,EACrB,KAAM,CAACoB,EAAMC,CAAK,EAClBD,EAAOC,CACX,CACJ,CACA,OAAO,SAAS/B,EAAOgC,EAAUnC,GAAQ,UAAW,CAChD,GAAIG,EAAM,OAAS,EACf,MAAO,GAEX,IAAIiC,EAAOjC,EAAM,CAAC,EAClB,QAASU,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAAK,CACnC,IAAMwB,EAAOlC,EAAMU,CAAC,EACpB,GAAI,KAAK,KAAKuB,EAAOC,CAAI,IAAMF,EAC3B,MAAO,GAEXC,EAAOC,CACX,CACA,MAAO,EACX,CACA,OAAO,SAASlC,EAAOmC,EAAO,CAC1B,OAAOnC,EAAM,OAAO,CAACoC,EAAQlB,KACzBkB,EAAOD,EAAMjB,CAAK,CAAC,EAAIA,EAChBkB,GACR,CAAC,CAAC,CACT,CACA,OAAO,mBAAmBzB,EAAGC,EAAG,CAC5B,IAAMG,EAAS,IAAI,YAAYJ,EAAE,WAAaC,EAAE,UAAU,EACpDyB,EAAO,IAAI,WAAWtB,CAAM,EAClC,OAAAsB,EAAK,IAAI,IAAI,WAAW1B,CAAC,EAAG,CAAC,EAC7B0B,EAAK,IAAI,IAAI,WAAWzB,CAAC,EAAGD,EAAE,UAAU,EACjCI,CACX,CACJ,EChMO,IAAIuB,GACV,SAAUA,EAAQ,CACfA,EAAO,KAAQC,GAAUC,EAAUD,CAAK,EAAI,IAAIE,EAAKF,CAAK,EAAID,EAAO,KACrEA,EAAO,KAAQI,GAAaJ,EAAO,KAAKI,EAAS,CAAC,EAClDJ,EAAO,QAAWI,GAAa,CAC3B,GAAI,CACA,OAAOJ,EAAO,KAAKI,EAAS,CAAC,CACjC,MACe,CACX,OAAOJ,EAAO,IAClB,CACJ,EACAA,EAAO,QAAU,CAACK,KAASC,IAASN,EAAO,KAAKK,GAAM,MAAM,KAAMC,CAAI,CAAC,EACvEN,EAAO,MAASO,GAAYA,EAAQ,KAAKN,GAASD,EAAO,KAAKC,CAAK,EAAG,IAAMD,EAAO,IAAI,EACvF,MAAMG,CAAK,CACPK,GACA,YAAYP,EAAO,CAAE,KAAKO,GAASC,EAAUR,CAAK,CAAG,CACrD,QAAS,CAAE,OAAO,KAAKO,EAAQ,CAC/B,aAAaE,EAAG,CAAE,OAAO,KAAKF,EAAQ,CACtC,cAAe,CAAE,OAAO,KAAKA,EAAQ,CACrC,mBAAoB,CAAE,OAAO,KAAKA,EAAQ,CAC1C,SAASP,EAAO,CAAE,OAAOA,IAAU,KAAKO,EAAQ,CAChD,MAAMG,EAAW,CAAE,OAAOA,EAAU,KAAK,KAAKH,EAAM,CAAG,CACvD,OAAOI,EAAK,CAAE,OAAOA,EAAI,KAAKJ,EAAM,CAAG,CACvC,SAASK,EAAO,CAAoB,CACpC,SAAU,CAAE,MAAO,EAAO,CAC1B,UAAW,CAAE,MAAO,EAAM,CAC1B,IAAIC,EAAU,CAAE,OAAOd,EAAO,KAAKc,EAAS,KAAKN,EAAM,CAAC,CAAG,CAC3D,MAAMH,EAAMU,EAAK,CAAE,OAAOV,EAAK,KAAKG,EAAM,CAAG,CAC7C,QAAQM,EAAU,CAAE,OAAOA,EAAS,KAAKN,EAAM,CAAG,CAClD,OAAOQ,EAAO,CAAE,OAAO,KAAK,aAAa,IAAMA,EAAM,aAAa,CAAG,CACrE,OAAOC,EAAO,CAAE,OAAO,IAAM,CAC7B,UAAW,CAAE,MAAO,gBAAgB,KAAKT,EAAM,IAAM,CACrD,IAAK,OAAO,WAAW,GAAI,CAAE,OAAO,KAAK,SAAS,CAAG,CACzD,CACAR,EAAO,KAAOG,EACdH,EAAO,KAAO,IAAI,KAAM,CACpB,OAAUkB,GAASC,EAAMjB,EAAUgB,CAAI,EAAIE,EAAaF,CAAI,EAAI,eAAe,EAC/E,aAAgBjB,GAAUmB,EAAanB,CAAK,EAC5C,aAAe,IAAM,KACrB,kBAAoB,IAAG,GACvB,SAAYS,GAAM,GAClB,MAASC,GAAcA,EAAU,KAAK,EACtC,OAAUD,GAAM,CAAE,EAClB,SAAYW,GAASA,EAAK,MAAS,EACnC,QAAU,IAAM,GAChB,SAAW,IAAM,GACjB,IAAOX,GAAMV,EAAO,KACpB,MAAQ,CAACU,EAAGY,IAAOF,EAAaE,CAAE,EAClC,QAAWZ,GAAMV,EAAO,KACxB,OAAUgB,GAAUA,EAAM,QAAQ,EAClC,OAAUE,GAASC,EAAMC,EAAaF,CAAI,GAAK,eAAe,EAC9D,SAAW,IAAM,gBACjB,IAAK,OAAO,WAAW,GAAI,CAAE,OAAO,KAAK,SAAS,CAAG,CACzD,CACJ,GAAGlB,IAAWA,EAAS,CAAC,EAAE,ECvDnB,IAAMuB,EAAM,KAAK,GAAK,EAChBC,GAAU,KAAK,GAAK,EACpBC,GAAW,KAAK,GAAK,EACrBC,GAAiB,EAAM,KAAK,KAAK,CAAG,EACpCC,EAAQ,CAACC,EAAOC,EAAKC,IAAQ,KAAK,IAAID,EAAK,KAAK,IAAID,EAAOE,CAAG,CAAC,EAcrE,IAAMC,GAAcC,GAAM,KAAK,IAAI,EAAG,KAAK,KAAK,KAAK,IAAIA,CAAC,EAAI,KAAK,IAAI,CAAC,CAAC,CAAC,ECnBjF,IAAMC,EAAW,IAAI,SAAS,IAAI,YAAY,CAAC,CAAC,EACrCC,IACV,SAAUA,EAAS,CAChBA,EAAQ,UAAY,YACpBA,EAAQ,UAAY,WACpBA,EAAQ,OAAUC,IACdF,EAAS,QAAQ,EAAGE,CAAK,EAClBF,EAAS,QAAQ,CAAC,GAE7BC,EAAQ,QAAWC,IACfF,EAAS,SAAS,EAAGE,CAAK,EACnBF,EAAS,SAAS,CAAC,GAE9BC,EAAQ,MAASC,IACbF,EAAS,SAAS,EAAGE,CAAK,EACnBF,EAAS,SAAS,CAAC,EAElC,GAAGC,KAAYA,GAAU,CAAC,EAAE,EACrB,IAAIE,GACV,SAAUA,EAAO,CAGd,IAAMC,EAAe,IAAI,YAAY,aAAa,iBAAiB,EAC7DC,EAAa,IAAI,aAAaD,CAAY,EAC1CE,EAAW,IAAI,WAAWF,CAAY,EAO5CD,EAAM,eAAkBD,GAAU,CAC9B,IAAMK,EAASJ,EAAM,kBAAkBD,CAAK,EAC5C,OAAKK,EAAS,cAAkB,aAAiBA,EAAS,WAA0B,EACzE,WAEJA,CACX,EACAJ,EAAM,eAAkBD,IACpBI,EAAS,CAAC,EAAIJ,EACPG,EAAW,CAAC,GAEvBF,EAAM,kBAAqBD,IACvBG,EAAW,CAAC,EAAIH,EACTI,EAAS,CAAC,GAErBH,EAAM,UAAaD,IACfF,EAAS,WAAW,EAAGE,CAAK,EACrBF,EAAS,WAAW,CAAC,EAEpC,GAAGG,IAAUA,EAAQ,CAAC,EAAE,EACjB,IAAIK,GACV,SAAUA,EAAS,CAChBA,EAAQ,eAAkBN,GAAU,CAChC,IAAMO,EAAON,EAAM,eAAeD,CAAK,EACjCQ,EAAOD,IAAS,GAAK,MACvBE,GAAOF,EAAO,YAAc,KAChC,OAAIE,GAAO,YACFF,EAAO,aAAe,WACnBE,EAAM,WACCD,EAAO,MAEXA,EAAO,OAAUD,EAAO,WAAgB,GAE5CC,EAAO,MAEdC,GAAO,UACAD,EAAOC,EAAM,YAAe,GAEnCA,EAAM,UACCD,GAEXC,GAAOF,EAAO,cAAgB,GACvBC,GAASD,EAAO,QAAW,UAAa,UAAaE,EAAM,OAAS,IAAMA,EACrF,EACAH,EAAQ,eAAkBC,GAAS,CAC/B,IAAIG,EAAWH,EAAO,KAClBI,EAAMJ,EAAO,MACjB,GAAII,IAAQ,MACRA,EAAM,eAEDA,IAAQ,GAEb,GADAA,GAAO,OACHD,IAAa,GAAKC,EAAM,OACxB,OAAOV,EAAM,gBAAgBM,EAAO,QAAW,GAAKI,GAAO,GAAK,IAAK,UAGpED,IAAa,EAAG,CACrBC,EAAM,OACN,GACID,IAAa,EACbC,GAAO,YACDD,EAAW,QAAW,GAChCA,GAAY,IAChB,CACA,OAAOT,EAAM,gBAAgBM,EAAO,QAAW,IAAMI,EAAMD,IAAa,EAAE,CAC9E,CACJ,GAAGJ,IAAYA,EAAU,CAAC,EAAE,EACrB,IAAIM,IACV,SAAUA,EAAS,CAChB,IAAMC,EAAe,qBACfC,EAAuB,kBACvBZ,EAAe,IAAI,YAAY,cAAc,iBAAiB,EAC9Da,EAAe,IAAI,aAAab,CAAY,EAC5Cc,EAAY,IAAI,cAAcd,CAAY,EAChDU,EAAQ,kBAAqBZ,GAAU,CACnC,IAAMK,EAASO,EAAQ,qBAAqBZ,CAAK,EACjD,OAAKK,EAASQ,KAAkBA,IAAiBR,EAASS,KAA0B,GACzE,oBAEJT,CACX,EACAO,EAAQ,kBAAqBZ,IACzBgB,EAAU,CAAC,EAAIhB,EACRe,EAAa,CAAC,GAEzBH,EAAQ,qBAAwBZ,IAC5Be,EAAa,CAAC,EAAIf,EACXgB,EAAU,CAAC,GAEtBJ,EAAQ,MAASZ,IACbF,EAAS,WAAW,EAAGE,CAAK,EACrBF,EAAS,WAAW,CAAC,EAEpC,GAAGc,KAAYA,GAAU,CAAC,EAAE,EC3HrB,IAAMK,EAAN,KAAgB,CACnB,OAAQ,OAAQ,CAAE,CAClB,OAAO,IAAIC,EAAO,CAAE,MAAO,CAACA,CAAK,CAAG,CACpC,OAAO,MAAMC,EAAU,CACnB,IAAIC,EAAQ,EACZ,QAAWC,KAAKF,EACZC,IAEJ,OAAOA,CACX,CACA,OAAO,KAAKD,EAAUG,EAAW,CAC7B,QAAWJ,KAASC,EAChB,GAAIG,EAAUJ,CAAK,EACf,MAAO,GAGf,MAAO,EACX,CACA,OAAO,MAAMC,EAAUG,EAAW,CAC9B,QAAWJ,KAASC,EAChB,GAAI,CAACG,EAAUJ,CAAK,EAChB,MAAO,GAGf,MAAO,EACX,CACA,OAAO,OAAOC,EAAUI,EAAUC,EAAc,CAC5C,IAAIC,EAAcD,EACdE,EAAQ,EACZ,QAAWR,KAASC,EAChBM,EAAcF,EAASE,EAAaP,EAAOQ,GAAO,EAEtD,OAAOD,CACX,CACA,OAAO,SAASN,EAAUQ,EAAS,CAC/B,QAAWT,KAASC,EAChB,GAAID,IAAUS,EACV,MAAO,GAGf,MAAO,EACX,CACA,OAAO,QAAQR,EAAUS,EAAW,CAChC,QAAWV,KAASC,EAChBS,EAAUV,CAAK,CAEvB,CACA,OAAQ,IAAIC,EAAUU,EAAK,CACvB,IAAIT,EAAQ,EACZ,QAAWF,KAASC,EAChB,MAAMU,EAAIX,EAAOE,GAAO,CAEhC,CACA,OAAQ,KAAKU,EAAUV,EAAO,CAC1B,IAAIW,EAAI,EACR,QAAWb,KAASY,EAAU,CAC1B,GAAIC,KAAOX,EACP,OAEJ,MAAMF,CACV,CACJ,CACA,OAAO,OAAOC,EAAUa,EAAI,CACxB,IAAMC,EAAS,CAAC,EAChB,QAAWf,KAASC,EACZa,EAAGd,CAAK,GACRe,EAAO,KAAKf,CAAK,EAGzB,OAAOe,CACX,CACA,OAAO,UAAUd,EAAUa,EAAI,CAC3B,IAAMC,EAAS,CAAC,EAChB,QAAWf,KAASC,EAAU,CAC1B,IAAMe,EAASF,EAAGd,CAAK,EACnBiB,EAAUD,CAAM,GAChBD,EAAO,KAAKC,CAAM,CAE1B,CACA,OAAOD,CACX,CACA,OAAO,QAAQd,EAAU,CACrB,IAAMc,EAAS,CAAC,EAChB,QAAWf,KAASC,EAChBc,EAAO,KAAKf,CAAK,EAErB,OAAOe,EAAO,QAAQ,CAC1B,CACA,OAAQ,SAASd,EAAU,CACvB,IAAMW,EAAWX,EAAS,OAAO,QAAQ,EAAE,EACrC,CAAE,KAAAiB,EAAM,MAAAlB,CAAM,EAAIY,EAAS,KAAK,EAClCO,EAAOnB,EACX,GAAIkB,IAAS,GAGb,OAAa,CACT,GAAM,CAAE,KAAAA,EAAM,MAAAlB,CAAM,EAAIY,EAAS,KAAK,EACtC,GAAIM,IAAS,GAAM,CACf,KAAM,CAACC,EAAM,IAAI,EACjB,MACJ,CACA,KAAM,CAACA,EAAMnB,CAAK,EAClBmB,EAAOnB,CACX,CACJ,CACJ,ECtGO,IAAMoB,EAAN,MAAMC,CAAgB,CACzB,OAAO,OAAOC,EAAkB,KAAM,CAClC,OAAO,KAAK,IAAI,IAAI,YAAYA,CAAe,CAAC,CACpD,CACA,OAAO,IAAIC,EAAQC,EAAa,EAAO,CACnC,OAAO,IAAIH,EAAgB,IAAI,SAASE,EAAQC,CAAU,CAAC,CAC/D,CACA,aAAe,GACfC,GACAC,GAAY,EACZ,YAAYC,EAAM,CAAE,KAAKF,GAAQE,CAAM,CACvC,IAAI,WAAY,CAAE,OAAO,KAAKF,GAAM,WAAa,KAAKC,EAAW,CACjE,IAAI,UAAW,CAAE,OAAO,KAAKA,EAAW,CACxC,IAAI,SAASE,EAAO,CACZA,EAAQ,EACRC,EAAM,YAAYD,CAAK,uBAAuB,EAEzCA,EAAQ,KAAKH,GAAM,WACxBI,EAAM,YAAYD,CAAK,uBAAuB,KAAKH,GAAM,UAAU,IAAI,EAGvE,KAAKC,GAAYE,CAEzB,CACA,aAAaA,EAAO,CAAE,KAAK,UAAUA,EAAQ,EAAI,CAAC,CAAG,CACrD,UAAUA,EAAO,CACb,KAAKE,GAAa,CAAC,EACnB,KAAKL,GAAM,QAAQ,KAAKC,KAAaE,CAAK,CAC9C,CACA,WAAWA,EAAO,CACd,KAAKE,GAAa,WAAW,iBAAiB,EAC9C,KAAKL,GAAM,SAAS,KAAKC,GAAWE,EAAO,KAAK,YAAY,EAC5D,KAAKF,IAAa,WAAW,iBACjC,CACA,SAASE,EAAO,CACZ,KAAKE,GAAa,WAAW,iBAAiB,EAC9C,KAAKL,GAAM,SAAS,KAAKC,GAAWE,EAAO,KAAK,YAAY,EAC5D,KAAKF,IAAa,WAAW,iBACjC,CACA,UAAUE,EAAO,CACb,KAAKE,GAAa,cAAc,iBAAiB,EACjD,KAAKL,GAAM,YAAY,KAAKC,GAAWE,EAAO,KAAK,YAAY,EAC/D,KAAKF,IAAa,cAAc,iBACpC,CACA,WAAWE,EAAO,CACd,KAAKE,GAAa,aAAa,iBAAiB,EAChD,KAAKL,GAAM,WAAW,KAAKC,GAAWE,EAAO,KAAK,YAAY,EAC9D,KAAKF,IAAa,aAAa,iBACnC,CACA,YAAYE,EAAO,CACf,KAAKE,GAAa,aAAa,iBAAiB,EAChD,KAAKL,GAAM,WAAW,KAAKC,GAAWE,EAAO,KAAK,YAAY,EAC9D,KAAKF,IAAa,aAAa,iBACnC,CACA,WAAWK,EAAO,CACd,KAAKD,GAAaC,EAAM,MAAM,EAC9B,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQ,EAAEC,EAChC,KAAKP,GAAM,QAAQ,KAAKC,KAAaK,EAAMC,CAAC,CAAC,CAErD,CACA,YAAYJ,EAAO,CACf,IAAMK,EAASL,EAAM,OACrB,KAAKE,GAAa,WAAW,kBAAoBG,EAAS,WAAW,iBAAiB,EACtF,KAAK,SAASA,CAAM,EACpB,QAASD,EAAI,EAAGA,EAAIC,EAAQD,IACxB,KAAK,WAAWJ,EAAM,WAAWI,CAAC,CAAC,CAE3C,CACA,eAAgB,CAAE,OAAO,KAAKP,GAAM,OAAO,MAAM,EAAG,KAAKC,EAAS,CAAG,CACrEI,GAAaI,EAAO,CAChB,IAAMC,EAAW,KAAKV,GAAM,WAC5B,GAAI,KAAKC,GAAYQ,EAAQC,EAAU,CACnC,IAAMC,EAAI,KAAKX,GACf,KAAKA,GAAQ,IAAI,SAAS,IAAI,YAAYY,GAAWF,EAAWD,CAAK,CAAC,CAAC,EACvE,QAASF,EAAI,EAAGA,EAAI,KAAKN,GAAWM,IAChC,KAAKP,GAAM,QAAQO,EAAGI,EAAE,QAAQJ,CAAC,CAAC,CAE1C,CACJ,CACJ,ECjFO,IAAMM,EAAa,OAAO,OAAO,CACpC,MAAO,CAAE,UAAWC,CAAU,EAC9B,OAASC,IAAU,CAAE,UAAWA,CAAK,GACrC,KAAM,IAAIC,KAAiB,CAAE,UAAW,IAAM,CAAE,KAAOA,EAAY,OAAS,GACpEA,EAAY,IAAI,EAAE,UAAU,CAC9B,CAAE,EACZ,CAAC,ECPM,IAAMC,EAAN,KAAe,CAClB,OAAO,cAAcC,KAAaC,EAAa,CAC3C,OAAOC,EAAW,KAAK,GAAGD,EACrB,IAAIE,GAAcA,EAAW,UAAU,IAAMH,EAASG,CAAU,CAAC,CAAC,CAAC,CAC5E,CACAC,GAAa,IAAI,IACjB,UAAUJ,EAAU,CAChB,YAAKI,GAAW,IAAIJ,CAAQ,EACrB,CAAE,UAAW,IAAM,KAAKI,GAAW,OAAOJ,CAAQ,CAAE,CAC/D,CACA,SAAU,CAAE,OAAO,KAAKI,GAAW,OAAS,CAAG,CAC/C,OAAOC,EAAO,CAAE,KAAKD,GAAW,QAASJ,GAAaA,EAASK,CAAK,CAAC,CAAG,CACxE,WAAY,CAAE,OAAO,KAAKD,EAAY,CACtC,WAAY,CAAE,KAAKA,GAAW,MAAM,CAAG,CAC3C,ECbO,IAAME,IAAmB,IAAM,CAClC,IAAIC,EAAiBC,EAAO,KAC5B,MAAQ,CACJ,KAAOC,GAAYF,EAAe,MAAM,CACpC,KAAM,IAAM,QAAQ,QAAQ,EAC5B,KAAMG,GAAYA,EAAS,KAAKD,CAAO,CAC3C,CAAC,EACD,QAAUA,GAAYF,EAAe,MAAM,CACvC,KAAM,IAAM,QAAQ,QAAQ,EAAI,EAChC,KAAMG,GAAYA,EAAS,QAAQD,CAAO,CAC9C,CAAC,EACD,SAAWA,GAAYF,EAAe,MAAM,CACxC,KAAM,KAAO,CAAE,QAAS,GAAI,UAAWI,CAAU,GACjD,KAAMD,GAAYA,EAAS,SAASD,CAAO,CAC/C,CAAC,EACD,QAAUC,GAAa,CACnBE,EAAOL,EAAe,QAAQ,EAAG,uCAAuC,EACxEA,EAAiBC,EAAO,KAAKE,CAAQ,CACzC,CACJ,CACJ,GAAG,ECrBI,IAAMG,EAAN,MAAMC,CAAS,CAClB,OAAO,kBAAoB,IAAIA,EAAS,OAAO,iBAAiB,EAChE,OAAO,OAAUC,GAAU,IAAID,EAASC,CAAK,EAC7C,OAAO,QAAWA,GAAU,IAAID,EAASC,EAAQD,EAASE,EAAyB,EACnF,OAAO,QAAWD,GAAU,IAAID,EAASC,EAAQD,EAASG,EAAyB,EACnF,OAAO,MAASF,GAAU,IAAID,EAASC,EAAQD,EAASI,EAAuB,EAC/E,OAAO,KAAQH,GAAU,IAAID,EAASC,EAAQD,EAASK,EAAsB,EAC7E,MAAOH,GAA4B,IACnC,MAAOC,GAA4B,IACnC,MAAOC,GAA0B,KACjC,MAAOC,GAAyB,MAChCC,GACA,YAAYC,EAAI,CAAE,KAAKD,GAAMC,CAAI,CACjC,QAAS,CAAE,OAAO,KAAKD,EAAK,CAC5B,YAAa,CAAE,OAAO,KAAK,IAAI,KAAKA,EAAG,EAAIN,EAASE,EAA2B,CAC/E,YAAa,CAAE,OAAO,KAAK,IAAI,KAAKI,EAAG,EAAIN,EAASG,EAA2B,CAC/E,UAAW,CAAE,OAAO,KAAK,IAAI,KAAKG,EAAG,EAAIN,EAASI,EAAyB,CAC3E,SAAU,CAAE,OAAO,KAAK,IAAI,KAAKE,EAAG,EAAIN,EAASK,EAAwB,CACzE,OAAQ,CACJ,MAAO,CACH,EAAG,KAAK,MAAM,KAAK,QAAQ,CAAC,EAC5B,EAAG,KAAK,MAAM,KAAK,SAAS,CAAC,EAAI,GACjC,EAAG,KAAK,MAAM,KAAK,WAAW,CAAC,EAAI,GACnC,EAAG,KAAK,MAAM,KAAK,WAAW,CAAC,EAAI,EACvC,CACJ,CACA,OAAQ,CAAE,OAAO,KAAKC,KAAQ,CAAK,CACnC,QAAS,CAAE,OAAO,KAAKA,GAAM,CAAK,CAClC,UAAW,CAAE,OAAO,KAAKA,GAAM,CAAK,CACpC,cAAe,CACX,IAAIL,EAAOO,EACLC,EAAU,KAAK,MAAM,KAAK,IAAI,KAAKH,EAAG,EAAI,GAAI,EAC9CI,EAAU,KAAK,MAAMD,EAAU,EAAE,EACjCE,EAAQ,KAAK,MAAMD,EAAU,EAAE,EAC/BE,EAAO,KAAK,MAAMD,EAAQ,EAAE,EAClC,OAAIF,EAAU,IACVR,EAAQQ,EACRD,EAAO,UAEFE,EAAU,IACfT,EAAQS,EACRF,EAAO,UAEFG,EAAQ,IACbV,EAAQU,EACRH,EAAO,SAGPP,EAAQW,EACRJ,EAAO,OAEJ,IAAI,KAAK,mBAAmB,KAAM,CAAE,QAAS,OAAQ,MAAO,MAAO,CAAC,EACtE,OAAOP,EAAQ,KAAK,KAAK,KAAKK,EAAG,EAAGE,CAAI,CACjD,CACA,UAAW,CACP,GAAI,MAAM,KAAKF,EAAG,EACd,MAAO,MAEX,GAAI,CAAC,SAAS,KAAKA,EAAG,EAClB,MAAO,SAEX,GAAM,CAAE,EAAAO,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,CAAE,EAAI,KAAK,MAAM,EAClC,OAAIH,EAAI,EACG,CACHb,EAASiB,GAAU,IAAKJ,CAAC,EAAGb,EAASiB,GAAU,IAAKH,CAAC,EACrDd,EAASiB,GAAU,IAAKF,CAAC,EAAGf,EAASiB,GAAU,IAAKD,CAAC,CACzD,EACK,KAAK,IAAI,EAETF,EAAI,EACF,CACHd,EAASiB,GAAU,IAAKH,CAAC,EAAGd,EAASiB,GAAU,IAAKF,CAAC,EACrDf,EAASiB,GAAU,IAAKD,CAAC,CAC7B,EACK,KAAK,IAAI,EAETD,EAAI,EACF,CAACf,EAASiB,GAAU,IAAKF,CAAC,EAAGf,EAASiB,GAAU,IAAKD,CAAC,CAAC,EACzD,KAAK,IAAI,EAETA,EAAI,EACFhB,EAASiB,GAAU,IAAKD,CAAC,EAGzB,KAEf,CACA,MAAOC,GAAY,CAACC,EAAMC,IAAU,CAChC,OAAQD,EAAM,CACV,IAAK,IACD,MAAO,GAAGC,CAAK,IAAIA,EAAQ,EAAI,MAAQ,MAAM,GACjD,IAAK,IACD,MAAO,GAAGA,CAAK,IAAIA,EAAQ,EAAI,OAAS,OAAO,GACnD,IAAK,IACD,MAAO,GAAGA,CAAK,IAAIA,EAAQ,EAAI,SAAW,SAAS,GACvD,IAAK,IACD,MAAO,GAAGA,CAAK,IAAIA,EAAQ,EAAI,SAAW,SAAS,GACvD,QACI,OAAOC,EAAUF,CAAI,CAC7B,CACJ,CACJ,EC9FO,IAAIG,GACV,SAAUA,EAAc,CACrBA,EAAa,OAAS,CAACC,EAAWC,IAASA,EAAK,IAAIC,EAAOF,CAAS,CAAC,EACrED,EAAa,SAAW,CAACC,EAAWG,IAAa,IAAIC,EAASJ,EAAWG,CAAQ,EACjF,IAAME,EAAwBC,GAAS,CACnC,IAAMC,EAAgB,CAAC,EACvB,QAAWC,KAAOF,EACVE,aAAe,aACfD,EAAc,KAAKC,CAAG,EAEtB,OAAO,YAAgB,KAAeA,aAAe,aACrDD,EAAc,KAAKC,CAAG,EAEtB,OAAO,gBAAoB,KAAeA,aAAe,iBACzDD,EAAc,KAAKC,CAAG,EAG9B,OAAOD,CACX,EACA,MAAML,CAAO,CACTO,GACAC,GAAY,IAAI,IAChBC,GACAC,GAAY,EACZ,YAAYZ,EAAW,CACnB,KAAKS,GAAaT,EAClB,KAAKW,GAAgBX,EAAU,UAAU,KAAKa,EAAe,CACjE,CACA,WAAY,CAAE,KAAKF,GAAc,UAAU,CAAG,CAC9C,kBAAoB,CAACG,KAASR,IAAS,CACnC,IAAMC,EAAgBF,EAAqBC,CAAI,EAC/C,KAAKG,GAAW,KAAK,CACjB,KAAM,OACN,SAAU,GACV,KAAMK,EAAK,KACX,KAAM,MAAM,KAAKC,EAAU,IAAIT,EAAME,IAAQ,CAAE,MAAOA,CAAI,EAAE,CAAC,CACjE,EAAGD,CAAa,CACpB,EACA,kBAAoB,CAACO,KAASR,IAAS,IAAI,QAAQ,CAACU,EAASC,IAAW,CACpE,IAAMC,EAAUH,EAAU,OAAOT,EAAM,CAACa,EAAWX,EAAKY,KAChD,OAAOZ,GAAQ,YACfW,EAAU,KAAK,CAACC,EAAOZ,CAAG,CAAC,EAExBW,GACR,CAAC,CAAC,EACL,KAAKT,GAAU,IAAI,KAAKE,GAAW,CAC/B,cAAe,CAAE,QAAAI,EAAS,OAAAC,CAAO,EACjC,UAAW,IAAI,IAAIC,CAAO,CAC9B,CAAC,EACD,IAAMX,EAAgBF,EAAqBC,CAAI,EAC/C,KAAKG,GAAW,KAAK,CACjB,KAAM,OACN,SAAU,KAAKG,GACf,KAAME,EAAK,KACX,KAAM,MAAM,KAAKC,EAAU,IAAIT,EAAM,CAACE,EAAKY,IAAU,OAAOZ,GAAQ,WAAc,CAAE,SAAUY,CAAM,EAAM,CAAE,MAAOZ,CAAI,CAAE,CAAC,CAC9H,EAAGD,CAAa,EAChB,KAAKK,IACT,CAAC,EACDC,GAAmBQ,GAAY,CAC3B,IAAMC,EAAU,KAAKZ,GAAU,IAAIW,EAAQ,QAAQ,EAC/CE,EAAUD,CAAO,EACbD,EAAQ,OAAS,WACjBC,EAAQ,cAAc,QAAQD,EAAQ,OAAO,EAC7C,KAAKX,GAAU,OAAOW,EAAQ,QAAQ,GAEjCA,EAAQ,OAAS,UACtBC,EAAQ,cAAc,OAAOD,EAAQ,MAAM,EAC3C,KAAKX,GAAU,OAAOW,EAAQ,QAAQ,GAEjCA,EAAQ,OAAS,YACtBC,EAAQ,WAAW,IAAID,EAAQ,MAAM,EAAE,MAAM,KAAMA,EAAQ,IAAI,EAInEG,EAAM,sCAAsC,KAAK,UAAUH,CAAO,CAAC,EAAE,CAE7E,CACJ,CACA,MAAMjB,CAAS,CACXK,GACAgB,GACAd,GACA,YAAYX,EAAWG,EAAU,CAC7B,KAAKM,GAAaT,EAClB,KAAKyB,GAAYtB,EACjB,KAAKQ,GAAgBX,EAAU,UAAU,KAAKa,EAAe,CACjE,CACA,WAAY,CAAE,KAAKF,GAAc,UAAU,CAAG,CAC9CE,GAAmBQ,GAAY,CAC3BK,EAAOL,EAAQ,OAAS,OAAQ,IAAM,6BAA6B,EACnE,IAAMM,EAAS,OAAO,eAAe,KAAKF,EAAS,IAAM,OAAO,eAAe,CAAC,CAAC,EAC3E,KAAKA,GAAY,OAAO,eAAe,KAAKA,EAAS,EACrDX,EAAOc,EAAUD,EAAON,EAAQ,IAAI,EAAG,GAAGA,EAAQ,KAAK,SAAS,CAAC,uBAAuB,KAAKI,EAAS,EAAE,EACxGI,EAAWR,EAAQ,SACzB,GAAIQ,IAAa,GACbf,EAAK,MAAM,KAAKW,GAAWJ,EAAQ,KAAK,IAAKb,GAAQ,UAAWA,EAC1DA,EAAI,MAAQgB,EAAM,GAAGH,EAAQ,KAAK,SAAS,CAAC,kBAAkB,CAAC,CAAC,MAGtE,IAAI,CACgBP,EAAK,MAAM,KAAKW,GAAWJ,EAAQ,KAC9C,IAAIb,GAAO,aAAcA,EAAM,IAAIF,IAAS,KAAKwB,GAAcD,EAAUrB,EAAI,SAAUF,CAAI,EAAIE,EAAI,KAAK,CAAC,EACtG,KAAKuB,GAAS,CAClB,GAAI,CACA,KAAKC,GAAaH,EAAUE,CAAK,CACrC,OACOE,EAAQ,CACX,KAAKC,GAAYL,EAAUI,CAAM,CACrC,CACJ,EAAGA,GAAU,KAAKC,GAAYL,EAAUI,CAAM,CAAC,CACnD,OACOA,EAAQ,CACX,KAAKC,GAAYL,EAAUI,CAAM,CACrC,CAER,EACAD,GAAe,CAACH,EAAUE,IAAU,KAAKtB,GAAW,KAAK,CAAE,KAAM,UAAW,SAAAoB,EAAU,QAASE,CAAM,CAAC,EACtGG,GAAc,CAACL,EAAUI,IAAW,KAAKxB,GAAW,KAAK,CAAE,KAAM,SAAU,SAAAoB,EAAU,OAAQI,CAAO,CAAC,EACrGH,GAAgB,CAACD,EAAUf,EAAMR,IAAS,KAAKG,GAAW,KAAK,CAAE,KAAM,WAAY,SAAAoB,EAAU,OAAQf,EAAM,KAAAR,CAAK,CAAC,CACrH,CACAP,EAAa,SAAWK,CAC5B,GAAGL,IAAiBA,EAAe,CAAC,EAAE,EChI/B,IAAMoC,GAAY,CAAE,IAAMC,GAAS,IAAIC,GAAgBD,CAAI,CAAE,EAC9DE,GAAqB,CAAC,EACtBD,GAAN,KAAsB,CAClBE,GACAC,GAAY,IAAIC,EAChB,YAAYL,EAAM,CAEd,GADA,KAAKG,GAAQH,EACTM,EAAUN,EAAK,SAAS,GAAKM,EAAUN,EAAK,cAAc,EAC1D,cAAQ,MAAMA,CAAI,EACZ,IAAI,MAAM,GAAGA,CAAI,sBAAsB,EAEjDA,EAAK,UAAaO,GAAU,KAAKH,GAAU,OAAOG,EAAM,IAAI,EAC5DP,EAAK,eAAkBO,GAAU,CAAE,MAAM,IAAI,MAAMA,EAAM,IAAI,CAAG,CACpE,CACA,KAAKC,EAASC,EAAU,CACpB,KAAKN,GAAM,YAAYK,EAASC,GAAYP,EAAkB,CAClE,CACA,QAAQQ,EAAM,CAAE,OAAO,IAAIC,GAAQ,KAAMD,CAAI,CAAG,CAChD,UAAUE,EAAU,CAAE,OAAO,KAAKR,GAAU,UAAUQ,CAAQ,CAAG,CACjE,WAAY,CACR,KAAKR,GAAU,UAAU,EACzB,KAAKD,GAAM,UAAY,KACvB,KAAKA,GAAM,eAAiB,IAChC,CACJ,EAEMQ,GAAN,MAAME,CAAQ,CACVC,GACAC,GACAX,GAAY,IAAIC,EAChBW,GACA,YAAYC,EAAUP,EAAM,CACxB,KAAKI,GAAYG,EACjB,KAAKF,GAAQL,EACb,KAAKM,GAAgBC,EAAS,UAAUC,GAAQ,CACxC,WAAYA,GAAQA,EAAK,SAAW,MAAQ,YAAaA,GAAQ,YAAaA,GAAQA,EAAK,UAAYR,GACvG,KAAKN,GAAU,OAAOc,EAAK,OAAO,CAE1C,CAAC,CACL,CACA,KAAKV,EAASW,EAAgB,CAC1B,KAAKL,GAAU,KAAK,CAAE,OAAQ,KAAM,QAAS,KAAKC,GAAO,QAAAP,CAAQ,EAAGW,CAAc,CACtF,CACA,QAAQT,EAAM,CAAE,OAAO,IAAIG,EAAQ,KAAMH,CAAI,CAAG,CAChD,UAAUE,EAAU,CAAE,OAAO,KAAKR,GAAU,UAAUQ,CAAQ,CAAG,CACjE,WAAY,CACR,KAAKI,GAAc,UAAU,EAC7B,KAAKZ,GAAU,UAAU,CAC7B,CACJ,ECjDO,IAAIgB,GACV,SAAUA,EAAM,CACbA,EAAK,MAAQ,IAAM,IAAI,QAAQC,GAAW,sBAAsB,IAAMA,EAAQ,CAAC,CAAC,EAChFD,EAAK,OAAUE,GAAc,IAAI,QAAQD,GAAW,CAChD,IAAIE,EAAQD,EACNE,EAAW,IAAM,CAAM,EAAED,GAAS,EACpCF,EAAQ,EAGR,sBAAsBG,CAAQ,CAChC,EACF,sBAAsBA,CAAQ,CAClC,CAAC,EACDJ,EAAK,SAAW,CAACK,KAASC,IAAS,IAAI,QAAQL,GAAW,WAAWA,EAASI,EAAK,OAAO,EAAG,GAAGC,CAAI,CAAC,EACrGN,EAAK,MAAQ,CAACO,EAAQC,IAAS,IAAI,QAAQP,GAAWM,EAAO,iBAAiBC,EAAMP,EAAS,CAAE,KAAM,EAAK,CAAC,CAAC,EAC5GD,EAAK,WAAcS,GAAe,IAAI,QAAQR,GAAW,CACrD,IAAMS,EAAaD,EAAW,UAAU,IAAM,CAC1CC,EAAW,UAAU,EACrBT,EAAQ,CACZ,CAAC,CACL,CAAC,EACDD,EAAK,SAAYW,GAAc,IAAI,QAAQ,CAACV,EAASW,IAAW,CAC5D,IAAMC,EAAW,YAAY,IAAM,CAC/B,GAAM,CAAE,OAAAC,EAAQ,MAAOC,EAAM,MAAAC,CAAM,EAAIC,GAAS,IAAMN,EAAU,KAAK,CAAC,EACtE,GAAIG,IAAW,UAAW,CACtB,GAAM,CAAE,KAAAI,EAAM,MAAAC,CAAM,EAAIJ,EACpBG,IACA,cAAcL,CAAQ,EACtBZ,EAAQkB,CAAK,EAErB,MAEI,cAAcN,CAAQ,EACtBD,EAAOI,CAAK,CAEpB,EAAG,CAAC,CACR,CAAC,CACL,GAAGhB,IAASA,EAAO,CAAC,EAAE,ECpCf,IAAMoB,GAAN,KAA0B,CAC7B,SACA,SACAC,GAAS,EACT,YAAYC,EAAUC,EAAU,CAC5B,KAAK,SAAWD,EAChB,KAAK,SAAWC,CACpB,CACA,MAAMC,EAAQC,EAAM,CAChB,MAAI,EAAE,KAAKJ,KAAW,KAAK,SAChB,IAEX,QAAQ,MAAM,GAAGG,CAAM,oBAAoB,KAAK,SAAS,SAAS,CAAC,EAAE,EACrE,WAAWC,EAAM,KAAK,SAAS,OAAO,CAAC,EAChC,GACX,CACJ,EACWC,GACV,SAAUA,EAAU,CACjB,MAAMC,CAAc,CAChB,MACA,OAAS,WACT,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACA,MAAQC,EAAqB,8CAA8C,CAC/E,CACAH,EAAS,cAAgBC,EACzB,MAAMG,CAAe,CACjB,MACA,OAAS,WACT,YAAYC,EAAO,CACf,KAAK,MAAQA,CACjB,CACA,MAAQF,EAAqB,8CAA8C,CAC/E,CACAH,EAAS,eAAiBI,EAC1BJ,EAAS,cAAgB,MAAOM,EAAOC,IAAY,CAC/C,IAAIC,EAAU,GACd,OAAAF,EAAM,IAAIG,EAAW,OAAO,IAAMD,EAAU,EAAK,CAAC,EAC3C,IAAI,QAAQ,CAACE,EAASC,IAAWJ,EAAQ,KAAKL,GAAS,CAAMM,GAChEE,EAAQR,CAAK,CACf,EAAGJ,GAAU,CAAMU,GACjBG,EAAOb,CAAM,CACf,CAAC,CAAC,CACR,EACAE,EAAS,SAAYO,GAAYA,EAAQ,KAAKL,GAAS,IAAID,EAAcC,CAAK,EAAGG,GAAS,IAAID,EAAeC,CAAK,CAAC,EACnH,IAAMO,EAAqB,IAAIlB,GAAoB,EAAGmB,EAAS,QAAQ,CAAC,CAAC,EACzEb,EAAS,MAAQ,CAACc,EAASC,EAAcH,IAAuBE,EAAQ,EAAE,MAAMhB,GAAU,IAAI,QAAQ,CAACY,EAASC,IAAW,CACvH,IAAMK,EAAalB,GAAW,CACrBiB,EAAY,MAAMjB,EAAQ,IAAMgB,EAAQ,EAAE,KAAMZ,GAAUQ,EAAQR,CAAK,EAAGc,CAAS,CAAC,GACrFL,EAAOb,CAAM,CAErB,EACAkB,EAAUlB,CAAM,CACpB,CAAC,CAAC,EACFE,EAAS,aAAe,CAACc,EAASG,IAAY,CAC1C,IAAMC,EAAU,MAAOC,EAAQ,IAAM,CACjC,GAAI,CACA,OAAO,MAAML,EAAQ,CACzB,OACOhB,EAAQ,CACX,GAAImB,EAAQnB,EAAQ,EAAEqB,CAAK,EACvB,eAAQ,MAAM,0BAA2BrB,CAAM,EAC/C,MAAMsB,EAAK,SAASP,EAAS,QAAQ,CAAC,CAAC,EAChCK,EAAQC,CAAK,EAExB,MAAM,IAAI,MAAM,gBAAgBA,CAAK,aAAarB,CAAM,EAAE,CAC9D,CACJ,EACA,OAAOoB,EAAQ,CACnB,EACAlB,EAAS,cAAgB,CAACc,EAASO,IAAY,CAC3C,IAAMH,EAAU,SAAY,CACxB,GAAI,CACA,OAAO,MAAMJ,EAAQ,CACzB,OACOhB,EAAQ,CACX,GAAI,MAAMwB,GAAgB,QAAQD,EAAQvB,CAAM,CAAC,EAC7C,OAAOoB,EAAQ,EAEnB,MAAMpB,CACV,CACJ,EACA,OAAOoB,EAAQ,CACnB,EAEAlB,EAAS,KAAO,CAACuB,EAAOC,IAAY,CAChC,IAAIC,EAAM,IAAM,IAAI,QAAQ,CAACC,EAAGf,IAAW,WAAW,IAAMA,EAAO,aAAa,EAAGY,EAAM,OAAO,CAAC,CAAC,EAClG,MAAO,IAAM,CACT,IAAMhB,EAAUkB,EAAI,EACpB,OAAAA,EAAMD,EACCjB,CACX,CACJ,EACAP,EAAS,QAAU,CAACO,EAASV,EAAU8B,IAC5B,IAAI,QAAQ,CAACjB,EAASC,IAAW,CACpC,IAAIH,EAAU,GACRoB,EAAU,WAAW,IAAM,CAC7BpB,EAAU,GACVG,EAAO,IAAI,MAAMgB,GAAQ,SAAS,CAAC,CACvC,EAAG9B,EAAS,OAAO,CAAC,EACpBU,EACK,KAAML,GAAU,CAAMM,GACvBE,EAAQR,CAAK,CACf,EAAGJ,GAAU,CAAMU,GACjBG,EAAOb,CAAM,CACf,CAAC,EACE,QAAQ,IAAM,aAAa8B,CAAO,CAAC,CAC5C,CAAC,EAEL5B,EAAS,cAAiB6B,GAAcA,EAAU,OAAO,CAACtB,EAASO,IAAYP,EAC1E,KAAK,MAAOuB,GAAY,CAAC,GAAGA,EAAS,MAAMhB,EAAQ,CAAC,CAAC,EAAG,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAChFd,EAAS,cAAiB+B,GAAY,CAClC,IAAIC,EAAc,QAAQ,QAAQ,EAClC,OAAQC,GAAQ,CACZ,IAAMC,EAAU,IAAMH,EAAQE,CAAG,EAC3BE,EAAiBH,EAAY,KAAKE,EAASA,CAAO,EACxD,OAAAF,EAAcG,EAAe,MAAM,IAAM,CAAE,CAAC,EACrCA,CACX,CACJ,EACAnC,EAAS,aAAe,CAACc,EAASc,IAAY,CAC1C,IAAIQ,EAAY,KACZC,EAAW,KAAK,IAAI,EACxB,MAAO,IAAM,CACT,IAAMC,EAAM,KAAK,IAAI,EACrB,OAAIC,GAAOH,CAAS,GAAMI,EAAUZ,CAAO,GAAKU,EAAMD,EAAWT,EAAQ,OAAO,KAC5ES,EAAWC,EACXF,EAAYtB,EAAQ,EACpBsB,EAAU,MAAM/B,IACZ+B,EAAY,KACL/B,EACV,GAEE+B,CACX,CACJ,EACApC,EAAS,aAAe,MAAOyC,EAAOC,EAAQ,IAAM,CAChD,IAAMZ,EAAU,IAAI,MAAMW,EAAM,MAAM,EAClCE,EAAQ,EACRC,EAAW,GACTC,EAAM,SAAY,CACpB,KAAOF,EAAQF,EAAM,QAAU,CAACG,GAAU,CACtC,IAAME,EAAIH,IACV,GAAI,CACA,IAAMzC,EAAQ,MAAMuC,EAAMK,CAAC,EAAE,EACxBF,IACDd,EAAQgB,CAAC,EAAI5C,EAErB,OACOJ,EAAQ,CACX,MAAA8C,EAAW,GACL9C,CACV,CACJ,CACJ,EACA,aAAM,QAAQ,IAAI,MAAM,KAAK,CAAE,OAAQ,KAAK,IAAI4C,EAAOD,EAAM,MAAM,CAAE,EAAGI,CAAG,CAAC,EACrEf,CACX,EACA9B,EAAS,oBAAsB,MAAOyC,EAAOC,EAAQ,IAAM,CACvD,IAAMZ,EAAU,IAAI,MAAMW,EAAM,MAAM,EAClCE,EAAQ,EACNE,EAAM,SAAY,CACpB,KAAOF,EAAQF,EAAM,QAAQ,CACzB,IAAMK,EAAIH,IACV,GAAI,CACA,IAAMzC,EAAQ,MAAMuC,EAAMK,CAAC,EAAE,EAC7BhB,EAAQgB,CAAC,EAAI,CAAE,OAAQ,YAAa,MAAA5C,CAAM,CAC9C,OACOJ,EAAQ,CACXgC,EAAQgB,CAAC,EAAI,CAAE,OAAQ,WAAY,OAAAhD,CAAO,CAC9C,CACJ,CACJ,EACA,aAAM,QAAQ,IAAI,MAAM,KAAK,CAAE,OAAQ,KAAK,IAAI4C,EAAOD,EAAM,MAAM,CAAE,EAAGI,CAAG,CAAC,EACrEf,CACX,EACA,MAAMiB,CAAM,CACR,IACAC,GACAC,GAAW,EACX,YAAYC,EAAM,EAAG,CACjB,KAAK,IAAMA,EACX,KAAKF,GAAW,CAAC,CACrB,CACA,MAAM,IAAIG,EAAU,CAChB,GAAI,KAAKF,GAAW,KAAK,IACrB,YAAKA,KACEE,EAAS,EAAE,QAAQ,IAAM,KAAKC,GAAU,CAAC,EAE/C,CACD,IAAMC,EAAY,QAAQ,cAAc,EACxC,YAAKL,GAAS,KAAK,CAACG,EAAUE,CAAS,CAAC,EACjCA,EAAU,QAAQ,QAAQ,IAAM,KAAKD,GAAU,CAAC,CAC3D,CACJ,CACAA,IAAY,CAER,GADAE,EAAO,KAAKL,GAAW,EAAG,kCAAkC,EACxD,EAAE,KAAKA,GAAW,KAAK,KACnB,KAAKD,GAAS,OAAS,EAAG,CAC1B,GAAM,CAACG,EAAU,CAAE,QAAAzC,EAAS,OAAAC,CAAO,CAAC,EAAI,KAAKqC,GAAS,MAAM,EAC5D,KAAKC,KACLE,EAAS,EAAE,KAAKzC,EAASC,CAAM,CACnC,CAER,CACJ,CACAX,EAAS,MAAQ+C,EACjB,MAAMQ,CAAO,CACTC,GACAC,GACAC,GACAC,GAAUC,EAAO,KACjB,YAAYC,EAAWC,EAAUC,EAAW,CACxC,KAAKP,GAAaK,EAClB,KAAKJ,GAAYK,EACjB,KAAKJ,GAAaK,CACtB,CACA,OAAOxD,EAAS,CACZ,KAAKoD,GAAUC,EAAO,KAAKrD,CAAO,EAClCA,EACK,KAAKL,GAAS,CAAM,KAAKyD,GAAQ,SAASpD,CAAO,GAClD,KAAKiD,GAAWtD,CAAK,CACvB,CAAC,EACE,MAAMJ,GAAU,CAAM,KAAK6D,GAAQ,SAASpD,CAAO,GACpD,KAAKkD,GAAU3D,CAAM,CACvB,CAAC,EACE,QAAQ,IAAM,CACX,KAAK6D,GAAQ,SAASpD,CAAO,IAC7B,KAAK,UAAU,EACfyD,GAAY,KAAKN,EAAU,EAEnC,CAAC,CACL,CACA,WAAY,CAAE,KAAKC,GAAUC,EAAO,IAAM,CAC9C,CACA5D,EAAS,OAASuD,CACtB,GAAGvD,IAAaA,EAAW,CAAC,EAAE,EChPvB,IAAMiE,GAAY,CAACC,EAAQ,UAAY,CAC1C,IAAMC,EAAY,YAAY,IAAI,EAClC,MAAO,CACH,IAAMC,GAAU,QAAQF,CAAK,EAAE,KAAK,QAAS,GAAGE,CAAK,QAAQ,YAAY,IAAI,EAAID,GAAW,QAAQ,CAAC,CAAC,IAAI,CAC9G,CACJ,ECJO,IAAIE,GACV,SAAUA,EAAO,CACd,MAAMC,CAAM,CACR,MACA,SACA,WACA,YAAYC,EAAOC,EAAUC,EAAY,CACrC,KAAK,MAAQF,EACb,KAAK,SAAWC,EAChB,KAAK,WAAaC,CACtB,CACA,eAAgB,CAAE,MAAO,IAAK,KAAK,KAAO,CAC9C,CACAJ,EAAM,MAAQC,EACdD,EAAM,OAAS,CAACK,EAAMC,IAAU,CAC5B,OAAQA,EAAO,CACX,IAAK,GACD,OAAOC,EAAQ,eAAeF,CAAI,EACtC,IAAK,GACD,OAAOE,EAAQ,eAAeF,GAAQ,EAAE,EAC5C,QACI,OAAOG,EAAUF,CAAK,CAC9B,CACJ,CACJ,GAAGN,IAAUA,EAAQ,CAAC,EAAE,EACjB,IAAMS,EAAN,MAAMC,CAAY,CACrB,OACA,KACA,UACA,YACA,OAAO,KAAKC,EAAO,CACfC,EAAOD,EAAM,WAAW,IAAM,QAAS,cAAc,EACrD,IAAME,EAAYF,EAAM,QAAQ,EAC1BG,EAAS,CAAC,EAChB,QAASC,EAAI,EAAGA,EAAIF,EAAWE,IAAK,CAChC,IAAMX,EAAaO,EAAM,QAAQ,EAC3BR,EAAWQ,EAAM,QAAQ,EACzBT,EAAQS,EAAM,QAAQ,EAC5BA,EAAM,QAAQ,EACdG,EAAOC,CAAC,EAAI,IAAIf,EAAM,MAAME,EAAOC,EAAUC,CAAU,CAC3D,CACA,IAAMY,EAAUL,EAAM,QAAQ,EACxBM,EAAO,CAAC,EACd,QAASF,EAAI,EAAGA,EAAIC,EAASD,IAAK,CAC9B,IAAMG,EAAQ,IAAI,UAAUP,EAAM,QAAQ,CAAC,EAC3CA,EAAM,UAAUO,CAAK,EACrBD,EAAKF,CAAC,EAAI,IAAI,WAAWG,EAAM,MAAM,CACzC,CACA,IAAMC,EAAYR,EAAM,QAAQ,EAC1BS,EAAcT,EAAM,QAAQ,EAClC,OAAO,IAAID,EAAYI,EAAQG,EAAME,EAAWC,CAAW,CAC/D,CACA,OAAO,KAAO,IAAIV,EAAY,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,EAC1C,OAAO,YAAc,CAACS,EAAWE,EAAQ,OAAS,CAC9C,IAAMC,EAAQH,EAAYE,EAC1B,GAAIC,GAAS,EACT,OAAO,IAAI,WAAW,CAAC,EAE3B,IAAMC,EAAe,EACfC,EAAW,KAAK,MAAM,KAAK,IAAIF,CAAK,EAAI,KAAK,GAAG,EAChDT,EAAY,KAAK,IAAI,EAAG,KAAK,MAAMW,EAAWD,CAAY,CAAC,EACjE,OAAO,IAAI,WAAWE,EAAO,OAAOnB,GAASiB,GAAgBjB,EAAQ,GAAIO,CAAS,CAAC,CACvF,EACA,YAAYC,EAAQG,EAAME,EAAWC,EAAa,CAC9C,KAAK,OAASN,EACd,KAAK,KAAOG,EACZ,KAAK,UAAYE,EACjB,KAAK,YAAcC,CACvB,CACA,QAAQM,EAAe,CACnB,GAAI,KAAK,OAAO,SAAW,EACvB,OAAO,KAEX,IAAMxB,EAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,IAAIwB,CAAa,CAAC,EAAI,KAAK,GAAG,EACjEX,EAAI,KAAK,OAAO,OACpB,KAAO,EAAEA,EAAI,IACT,GAAIb,GAAS,KAAK,OAAOa,CAAC,EAAE,MACxB,OAAO,KAAK,OAAOA,CAAC,EAG5B,OAAO,KAAK,OAAO,CAAC,CACxB,CACA,eAAgB,CACZ,IAAMY,EAASC,EAAgB,OAAO,EACtCD,EAAO,YAAY,OAAO,EAC1BA,EAAO,SAAS,KAAK,OAAO,MAAM,EAClC,QAASZ,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAAK,CACzC,GAAM,CAAE,WAAAX,EAAY,SAAAD,EAAU,MAAAD,CAAM,EAAI,KAAK,OAAOa,CAAC,EACrDY,EAAO,SAASvB,CAAU,EAC1BuB,EAAO,SAASxB,CAAQ,EACxBwB,EAAO,SAASzB,CAAK,EACrByB,EAAO,UAAU,GAAKzB,GAAS,CAAC,CACpC,CACAyB,EAAO,SAAS,KAAK,KAAK,MAAM,EAChC,QAASZ,EAAI,EAAGA,EAAI,KAAK,KAAK,OAAQA,IAAK,CACvC,IAAMG,EAAQ,IAAI,UAAU,KAAK,KAAKH,CAAC,EAAE,MAAM,EAC/CY,EAAO,SAAST,EAAM,MAAM,EAC5BS,EAAO,WAAWT,CAAK,CAC3B,CACA,OAAAS,EAAO,SAAS,KAAK,SAAS,EAC9BA,EAAO,SAAS,KAAK,WAAW,EACzBA,EAAO,cAAc,CAChC,CACA,UAAW,CAAE,MAAO,4BAA4B,KAAK,OAAO,MAAM,GAAK,CAC3E,ECtGO,IAAIE,GACV,SAAUA,EAAkB,CACzBA,EAAiB,QAAWC,GAAcC,EAAa,SAASD,EAAU,QAAQ,OAAO,EAAG,IAAI,KAAM,CAClG,MAAM,cAAcE,EAAUC,EAAQC,EAAQC,EAAWC,EAAa,CAClE,OAAOC,EAAcL,EAAUC,EAAQC,EAAQC,EAAWC,CAAW,EAAE,cAAc,CACzF,CACJ,CAAC,EACD,IAAMC,EAAgB,CAACL,EAAUC,EAAQC,EAAQC,EAAWC,IAAgB,CACxE,GAAIF,EAAO,SAAWE,EAClB,OAAOE,EAAM,uCAAuCF,CAAW,SAASF,EAAO,MAAM,EAAE,EAE3F,MAAMK,CAAM,CACR,IAAM,OAAO,kBACb,IAAM,OAAO,kBACb,MAAQ,CACZ,CACA,IAAMC,EAAOC,GAAU,EACjBC,EAAYT,EAAO,OACnB,CAACU,EAAQC,CAAU,EAAIC,EAAWZ,EAAQE,CAAS,EACnDW,EAAOC,EAAO,OAAO,IAAM,IAAI,WAAWH,CAAU,EAAGR,CAAW,EAClEY,GAAW,GAAKL,EAAO,CAAC,EAAE,OAAS,EACnCM,EAAQb,EAAcD,EACxBe,EAAQ,EACZ,QAASC,EAAU,EAAGA,EAAUf,EAAa,EAAEe,EAAS,CACpD,IAAMC,EAAcN,EAAKK,CAAO,EAC1BE,EAAgBnB,EAAOiB,CAAO,EAC9BG,GAASP,EAAO,OAAO,IAAM,IAAIR,EAASG,CAAS,EACrDa,EAAM,OAAO,kBACbC,EAAM,OAAO,kBACbC,GAAW,EACf,QAASC,GAAI,EAAGA,GAAIvB,EAAW,EAAEuB,GAAG,CAChC,IAAMC,GAAQN,EAAcK,EAAC,EAG7B,GAFAH,EAAM,KAAK,IAAII,GAAOJ,CAAG,EACzBC,EAAM,KAAK,IAAIG,GAAOH,CAAG,GACpB,EAAEC,GAAWT,KAAa,EAAG,CAC9B,QAASY,EAAI,EAAGA,EAAIlB,EAAW,EAAEkB,EAAG,CAChC,IAAMC,GAAQlB,EAAOiB,CAAC,EAChBE,EAAQR,GAAOM,CAAC,EACtBE,EAAM,IAAM,KAAK,IAAIA,EAAM,IAAKP,CAAG,EACnCO,EAAM,IAAM,KAAK,IAAIA,EAAM,IAAKN,CAAG,IAC5B,GAAKK,GAAM,OAAS,EAAKJ,MAAc,IAC1CL,EAAYS,GAAM,WAAaC,EAAM,OAAO,EAAIjC,EAAiB,KAAKiC,EAAM,IAAKA,EAAM,GAAG,EAC1FA,EAAM,IAAM,OAAO,kBACnBA,EAAM,IAAM,OAAO,kBAE3B,CACAP,EAAM,OAAO,kBACbC,EAAM,OAAO,iBACjB,EACK,EAAEN,EAAQ,SAAY,GACvBlB,EAASkB,EAAQD,CAAK,CAE9B,CACJ,CACA,OAAAjB,EAAS,CAAG,EACZQ,EAAK,IAAI,gBAAgB,KAAK,YAAY,IAAI,GAAG,EAC1C,IAAIuB,EAAYpB,EAAQG,EAAMX,EAAWC,CAAW,CAC/D,EACMS,EAAa,CAACZ,EAAQE,IAAc,CACtC,IAAIS,EAAa,EAQjB,MAAO,CAPQG,EAAO,OAAQiB,GAAU,CACpC,IAAMC,EAAQhC,EAAO+B,CAAK,EACpBE,EAAW,KAAK,KAAK/B,GAAa,GAAK8B,EAAM,EAC7CJ,EAAQ,IAAIM,EAAM,MAAMF,EAAOC,EAAUtB,CAAU,EACzD,OAAAA,GAAcsB,EACPL,CACX,EAAG5B,EAAO,MAAM,EACAW,CAAU,CAC9B,EACAf,EAAiB,KAAO,CAACuC,EAAIC,IAAO,CAChC,IAAMC,EAAQC,EAAQ,eAAeH,CAAE,EACjCI,EAAQD,EAAQ,eAAeF,CAAE,EACvC,OAAOC,EAASE,GAAS,EAC7B,CACJ,GAAG3C,IAAqBA,EAAmB,CAAC,EAAE,EC3EvC,IAAI4C,GACV,SAAUA,EAAY,CAEnBA,EAAW,KAAQC,GAAcC,EAAa,SAASD,EAAU,QAAQ,MAAM,EAAG,IAAI,KAAM,CACxFE,GAAS,IAAI,IACb,MAAM,MAAMC,EAAMC,EAAM,CACpB,MAAM,KAAKC,GAAaF,EAAM,SAAY,CAItC,IAAMG,EAAS,MAAM,KAAKC,GAAaJ,EAAM,CAAE,OAAQ,EAAK,CAAC,EAC7D,GAAI,CACAG,EAAO,SAASF,EAAK,MAAM,EAC3BE,EAAO,MAAMF,EAAK,OAAQ,CAAE,GAAI,CAAE,CAAC,EACnCE,EAAO,MAAM,CACjB,QACA,CACIA,EAAO,MAAM,CACjB,CACJ,CAAC,CACL,CACA,MAAM,KAAKH,EAAM,CACb,OAAO,MAAM,KAAKE,GAAaF,EAAM,SAAY,CAI7C,IAAMG,EAAS,MAAM,KAAKC,GAAaJ,CAAI,EAC3C,GAAI,CACA,IAAMK,EAAOF,EAAO,QAAQ,EACtBG,EAAS,IAAI,WAAWD,CAAI,EAClC,OAAAF,EAAO,KAAKG,CAAM,EACXA,CACX,QACA,CACIH,EAAO,MAAM,CACjB,CACJ,CAAC,CACL,CACA,MAAM,OAAOH,EAAM,CACf,MAAM,KAAKE,GAAaF,EAAM,SAAY,CACtC,IAAMO,EAAWC,EAAeR,CAAI,EACpC,OAAIO,EAAS,SAAW,EACb,KAAK,MAAM,EAEf,KAAKE,GAAeF,EAAS,MAAM,EAAG,EAAE,CAAC,EAC3C,KAAKG,GAAUA,EAAO,YAAYC,EAAUJ,EAAS,GAAG,EAAE,CAAC,EAAG,CAAE,UAAW,EAAK,CAAC,CAAC,CAC3F,CAAC,CACL,CACA,MAAM,KAAKP,EAAM,CACb,IAAMO,EAAWC,EAAeR,CAAI,EAC9B,CAAE,OAAAY,EAAQ,MAAOF,CAAO,EAAI,MAAMG,EAAS,SAAS,KAAKJ,GAAeF,CAAQ,CAAC,EACvF,GAAIK,IAAW,WACX,OAAOE,EAAO,MAAM,EAExB,IAAMC,EAAS,CAAC,EAChB,aAAiB,CAAE,KAAAC,EAAM,KAAAC,CAAK,IAAKP,EAAO,OAAO,EAC7CK,EAAO,KAAK,CAAE,KAAAC,EAAM,KAAAC,CAAK,CAAC,EAE9B,OAAOF,CACX,CACA,MAAM,OAAQ,CACV,IAAMG,EAAO,MAAM,UAAU,QAAQ,aAAa,EAClD,aAAiB,CAACF,EAAMb,CAAM,IAAKe,EAAK,QAAQ,EACxCf,EAAO,OAAS,OAChB,MAAMe,EAAK,YAAYF,CAAI,EAEtBb,EAAO,OAAS,aACrB,MAAMe,EAAK,YAAYF,EAAM,CAAE,UAAW,EAAK,CAAC,CAG5D,CACA,KAAMd,GAAaF,EAAMmB,EAAW,CAChC,OAAa,CACT,IAAMC,EAAe,KAAKrB,GAAO,IAAIC,CAAI,EACzC,GAAIqB,GAAeD,CAAY,EAAG,CAC9B,MAAMA,EACN,QACJ,CACA,IAAIE,EAAc,IAAMC,EAAM,mBAAmB,EAC3CC,EAAc,IAAI,QAAQC,GAAWH,EAAcG,CAAO,EAChE,KAAK1B,GAAO,IAAIC,EAAMwB,CAAW,EACjC,GAAI,CACA,OAAO,MAAML,EAAU,CAC3B,QACA,CACQ,KAAKpB,GAAO,IAAIC,CAAI,IAAMwB,GAC1B,KAAKzB,GAAO,OAAOC,CAAI,EAE3BsB,EAAY,CAChB,CACJ,CACJ,CACA,KAAMlB,GAAaJ,EAAM0B,EAAS,CAC9B,IAAMnB,EAAWC,EAAeR,CAAI,EAGpC,OAAO,MADY,MADJ,MAAM,KAAKS,GAAeF,EAAS,MAAM,EAAG,EAAE,EAAGmB,CAAO,GACvC,cAAcf,EAAUJ,EAAS,GAAG,EAAE,CAAC,EAAGmB,CAAO,GACzD,uBAAuB,CACnD,CACA,KAAMjB,GAAeF,EAAUmB,EAAS,CACpC,IAAIhB,EAAS,MAAM,UAAU,QAAQ,aAAa,EAClD,QAAWiB,KAAWpB,EAClBG,EAAS,MAAMA,EAAO,mBAAmBiB,EAASD,CAAO,EAE7D,OAAOhB,CACX,CACJ,CAAC,EACD,IAAMF,EAAkBR,GAAS,CAC7B,IAAM4B,EAAY5B,EAAK,QAAQ,aAAc,EAAE,EAC/C,OAAO4B,IAAc,GAAK,CAAC,EAAIA,EAAU,MAAM,GAAG,CACtD,CACJ,GAAGhC,IAAeA,EAAa,CAAC,EAAE,EC1G3B,IAAMiC,EAAN,KAAkB,CACrB,GAAK,EACL,GAAK,EACL,GAAK,EACL,GAAK,EACL,GAAK,EACL,aAAc,CAAE,KAAK,SAAS,CAAG,CACjC,UAAW,CAAE,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAAG,CAC/D,iBAAiBC,EAAQC,EAAY,KAAK,QAAS,CAE/C,GADAD,EAASE,EAAMF,EAAQ,EAAK,CAAG,EAC3BA,GAAU,GACV,KAAK,0BAA0B,EAAK,EAAK,EAAK,EAAK,EAAK,CAAG,UAEtDA,EAAS,EAAK,CACnB,IAAMG,EAAQC,EAAMJ,EACdK,EAAQ,KAAK,IAAIF,CAAK,GAAK,EAAMF,GACjCK,EAAO,KAAK,IAAIH,CAAK,EACrBI,GAAQ,EAAMD,GAAQ,EACtBE,EAAKD,EACLE,EAAK,EAAMF,EACXG,EAAKH,EACLI,EAAK,EAAMN,EACXO,EAAK,GAAON,EACZO,EAAK,EAAMR,EACjB,KAAK,0BAA0BG,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0B,EAAK,EAAK,EAAK,EAAK,EAAK,CAAG,EAE/D,OAAO,IACX,CACA,kBAAkBb,EAAQC,EAAY,KAAK,QAAS,CAEhD,GADAD,EAASE,EAAMF,EAAQ,EAAK,CAAG,EAC3BA,IAAW,EACX,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,UAE1CA,EAAS,EAAG,CACjB,IAAMG,EAAQC,EAAMJ,EACdK,EAAQ,KAAK,IAAIF,CAAK,GAAK,EAAIF,GAC/BK,EAAO,KAAK,IAAIH,CAAK,EACrBI,GAAQ,EAAID,GAAQ,EACpBE,EAAKD,EACLE,EAAK,GAAKF,EACVG,EAAKH,EACLI,EAAK,EAAIN,EACTO,EAAK,GAAKN,EACVO,EAAK,EAAIR,EACf,KAAK,0BAA0BG,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEnD,OAAO,IACX,CACA,0BAA0BL,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAI,CAC9C,IAAMC,EAAa,EAAMH,EACzB,YAAK,GAAKH,EAAKM,EACf,KAAK,GAAKL,EAAKK,EACf,KAAK,GAAKJ,EAAKI,EACf,KAAK,GAAKF,EAAKE,EACf,KAAK,GAAKD,EAAKC,EACR,IACX,CACA,kBAAkBC,EAAWC,EAAS,CAClCD,EAAYb,EAAMa,EAAW,EAAK,CAAG,EACrC,IAAME,EAAI,KAAK,IAAI,GAAMD,EAAU,EAAE,EACrC,GAAID,IAAc,EACd,KAAK,0BAA0BE,EAAIA,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,UAE9CF,EAAY,EAAG,CACpB,IAAMG,EAAKd,EAAMW,EAEXV,EAAQ,GAAM,KAAK,IAAIa,CAAE,EAAI,KAAK,MAAMD,EAAI,EAAIA,IAAM,EADlD,EAC0D,GAAK,CAAC,EACpEE,EAAI,KAAK,IAAID,CAAE,EACfE,EAAK,EAAI,KAAK,KAAKH,CAAC,EAAIZ,EACxBgB,EAAaJ,EAAI,EACjBK,EAAcL,EAAI,EAClBT,EAAKS,GAAKI,EAAaC,EAAcH,EAAIC,GACzCX,EAAK,EAAIQ,GAAKK,EAAcD,EAAaF,GACzCT,EAAKO,GAAKI,EAAaC,EAAcH,EAAIC,GACzCT,EAAKU,EAAaC,EAAcH,EAAIC,EACpCR,EAAK,IAAMU,EAAcD,EAAaF,GACtCN,EAAKQ,EAAaC,EAAcH,EAAIC,EAC1C,KAAK,0BAA0BZ,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEnD,OAAO,IACX,CACA,mBAAmBE,EAAWC,EAAS,CACnCD,EAAYb,EAAMa,EAAW,EAAK,CAAG,EACrC,IAAME,EAAI,KAAK,IAAI,GAAMD,EAAU,EAAE,EACrC,GAAID,IAAc,EACd,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,UAE1CA,EAAY,EAAG,CACpB,IAAMG,EAAKd,EAAMW,EAEXV,EAAQ,GAAM,KAAK,IAAIa,CAAE,EAAI,KAAK,MAAMD,EAAI,EAAIA,IAAM,EADlD,EAC0D,GAAK,CAAC,EACpEE,EAAI,KAAK,IAAID,CAAE,EACfE,EAAK,EAAI,KAAK,KAAKH,CAAC,EAAIZ,EACxBgB,EAAaJ,EAAI,EACjBK,EAAcL,EAAI,EAClBT,EAAKS,GAAKI,EAAaC,EAAcH,EAAIC,GACzCX,EAAK,GAAKQ,GAAKK,EAAcD,EAAaF,GAC1CT,EAAKO,GAAKI,EAAaC,EAAcH,EAAIC,GACzCT,EAAKU,EAAaC,EAAcH,EAAIC,EACpCR,EAAK,GAAKU,EAAcD,EAAaF,GACrCN,EAAKQ,EAAaC,EAAcH,EAAIC,EAC1C,KAAK,0BAA0BZ,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0BI,EAAIA,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEvD,OAAO,IACX,CACA,iBAAiBF,EAAWQ,EAAGP,EAAS,CACpCD,EAAYb,EAAMa,EAAW,EAAK,CAAG,EACrCQ,EAAI,KAAK,IAAI,EAAKA,CAAC,EACnB,IAAMN,EAAI,KAAK,IAAI,GAAMD,EAAU,EAAE,EACrC,GAAID,EAAY,GAAKA,EAAY,EAC7B,GAAIQ,EAAI,EAAG,CACP,IAAML,EAAKd,EAAMW,EACXV,EAAQ,KAAK,IAAIa,CAAE,GAAK,EAAIK,GAC5BJ,EAAI,KAAK,IAAID,CAAE,EACfV,EAAK,EAAIH,EAAQY,EACjBR,EAAK,GAAKU,EACVT,EAAK,EAAIL,EAAQY,EACjBN,EAAK,EAAIN,EAAQY,EACjBL,EAAK,GAAKO,EACVN,EAAK,EAAIR,EAAQY,EACvB,KAAK,0BAA0BT,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0BI,EAAIA,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,OAIvD,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEnD,OAAO,IACX,CACA,iBAAiBF,EAAWQ,EAAG,CAG3B,GAFAR,EAAYb,EAAMa,EAAW,EAAK,CAAG,EACrCQ,EAAI,KAAK,IAAI,EAAKA,CAAC,EACfR,EAAY,GAAKA,EAAY,EAC7B,GAAIQ,EAAI,EAAG,CACP,IAAML,EAAKd,EAAMW,EACXV,EAAQ,KAAK,IAAIa,CAAE,GAAK,EAAIK,GAC5BJ,EAAI,KAAK,IAAID,CAAE,EACfV,EAAK,EAAIH,EACTI,EAAK,GAAKU,EACVT,EAAK,EAAIL,EACTM,EAAK,EAAIN,EACTO,EAAK,GAAKO,EACVN,EAAK,EAAIR,EACf,KAAK,0BAA0BG,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0B,GAAI,EAAG,EAAG,EAAG,EAAG,CAAC,OAIpD,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEnD,OAAO,IACX,CACA,eAAeE,EAAWQ,EAAG,CAGzB,GAFAR,EAAYb,EAAMa,EAAW,EAAK,CAAG,EACrCQ,EAAI,KAAK,IAAI,EAAKA,CAAC,EACfR,EAAY,GAAKA,EAAY,EAC7B,GAAIQ,EAAI,EAAG,CACP,IAAML,EAAKd,EAAMW,EACXV,EAAQ,KAAK,IAAIa,CAAE,GAAK,EAAIK,GAC5BJ,EAAI,KAAK,IAAID,CAAE,EACfV,EAAK,EACLC,EAAK,GAAKU,EACVT,EAAK,EACLC,EAAK,EAAIN,EACTO,EAAK,GAAKO,EACVN,EAAK,EAAIR,EACf,KAAK,0BAA0BG,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,OAInD,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEnD,OAAO,IACX,CACA,kBAAkBE,EAAWQ,EAAG,CAG5B,GAFAR,EAAY,KAAK,IAAI,EAAKA,CAAS,EACnCQ,EAAI,KAAK,IAAI,EAAKA,CAAC,EACfR,EAAY,GAAKA,EAAY,EAAG,CAChC,IAAMG,EAAKd,EAAMW,EACjB,GAAIQ,EAAI,EAAG,CACP,IAAMlB,EAAQ,KAAK,IAAIa,CAAE,GAAK,EAAIK,GAC5BJ,EAAI,KAAK,IAAID,CAAE,EACfV,EAAKH,EACLI,EAAK,EACLC,EAAK,CAACL,EACNM,EAAK,EAAIN,EACTO,EAAK,GAAKO,EACVN,EAAK,EAAIR,EACf,KAAK,0BAA0BG,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CACzD,MAEI,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAEvD,MAEI,KAAK,0BAA0B,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEnD,OAAO,IACX,CACA,qBAAqBE,EAAWS,EAAaC,EAAe,CACxDC,EAAOX,EAAU,SAAWS,EAAY,QAAUT,EAAU,SAAWU,EAAc,OAAQ,4BAA4B,EACzH,IAAMjB,EAAK,KAAK,GACVC,EAAK,KAAK,GACVC,EAAK,KAAK,GACVE,EAAK,KAAK,GACVC,EAAK,KAAK,GAChB,QAASM,EAAI,EAAGA,EAAIJ,EAAU,OAAQ,EAAEI,EAAG,CACvC,IAAMQ,EAAQ,CAAC,KAAK,GAAK,EAAIZ,EAAUI,CAAC,EAClCS,EAAQ,KAAK,IAAID,CAAK,EACtBE,EAAQ,KAAK,IAAIF,CAAK,EACtBG,EAAgBtB,IAAOC,EAAKC,EAAKkB,GAASA,EAAQlB,EAAKmB,EAAQA,GAC/DE,GAAkBtB,EAAKC,EAAKkB,GAASC,EAAQnB,EAAKmB,EAAQD,EAC1DI,EAAkB,IAAMpB,EAAKC,EAAKe,GAASA,EAAQf,EAAKgB,EAAQA,GAChEI,GAAoBrB,EAAKC,EAAKe,GAASC,EAAQhB,EAAKgB,EAAQD,EAC5DM,EAAQF,EAAkBA,EAAkBC,EAAkBA,EAC9DE,GAAgBL,EAAgBE,EAAkBD,EAAgBE,GAAmBC,EACrFE,GAAgBL,EAAgBC,EAAkBF,EAAgBG,GAAmBC,EAC3FV,EAAYL,CAAC,EAAI,KAAK,KAAKgB,EAAeA,EAAeC,EAAeA,CAAY,EACpFX,EAAcN,CAAC,EAAI,KAAK,MAAMiB,EAAcD,CAAY,CAC5D,CACJ,CACJ,ECpPO,IAAME,EAAN,KAAiB,CACpBC,GAAM,EACNC,GAAM,EACNC,GAAM,EACNC,GAAM,EACN,OAAQ,CACJ,KAAKH,GAAM,EACX,KAAKC,GAAM,EACX,KAAKC,GAAM,EACX,KAAKC,GAAM,CACf,CACA,QAAQ,CAAE,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,EAAGC,EAAQC,EAAQC,EAAWC,EAAS,CAChE,IAAIC,EAAK,KAAKb,GACVc,EAAK,KAAKb,GACVc,EAAK,KAAKb,GACVc,EAAK,KAAKb,GACd,QAASc,EAAIN,EAAWM,EAAIL,EAASK,IAAK,CACtC,IAAMC,EAAIT,EAAOQ,CAAC,EACZE,EAAIT,EAAOO,CAAC,EAAKX,EAAKY,EAAIX,EAAKM,EAAKL,EAAKM,EAAKV,EAAKW,EAAKV,EAAKW,EAAM,MAAQ,MACjFF,EAAKD,EACLA,EAAKK,EACLF,EAAKD,EACLA,EAAKI,CACT,CACA,KAAKnB,GAAMa,EACX,KAAKZ,GAAMa,EACX,KAAKZ,GAAMa,EACX,KAAKZ,GAAMa,CACf,CACA,aAAa,CAAE,GAAAZ,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,EAAGU,EAAG,CACpC,IAAMC,EAAKb,EAAKY,EAAIX,EAAK,KAAKP,GAAMQ,EAAK,KAAKP,GAAMG,EAAK,KAAKF,GAAMG,EAAK,KAAKF,GAAO,MAAQ,MAC7F,YAAKF,GAAM,KAAKD,GAChB,KAAKA,GAAMkB,EACX,KAAKf,GAAM,KAAKD,GAChB,KAAKA,GAAMiB,EACJA,CACX,CACJ,ECpCA,IAAMC,EAAW,GACXC,GAAmB,IACnBC,GAAoB,IACpBC,GAAgB,GAChBC,GAAsB,EACtBC,GAA8B,KAC9BC,GAAgC,GAChCC,GAA8B,IAC9BC,GAAc,GACdC,GAAuB,GACvBC,GAAqB,IACrBC,GAAa,KACbC,GAAe,CACjB,IAAK,EACL,IAAK,EACL,KAAM,CACV,EACaC,GAAN,MAAMC,CAAkB,CAC3B,OAAO,OAAOC,EAAO,CACjB,IAAMC,EAAM,YAAY,IAAI,EACtBC,EAAWF,EAAM,eAAiBA,EAAM,WACxCG,EAAS,IAAIJ,EAAkBC,CAAK,EAAEI,GAAQ,EAC9CC,IAAU,YAAY,IAAI,EAAIJ,GAAO,IAAUC,EAAW,KAAO,QAAQ,CAAC,EAChF,eAAQ,MAAM,oBAAoBG,CAAI,GAAG,EAClCF,CACX,CACAG,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACA,YAAYb,EAAO,CACf,KAAKM,GAAcN,EAAM,WACzB,KAAKO,GAAkBP,EAAM,eAC7B,KAAKQ,GAA0B,KAAK,MAAOd,GAAuB,IAAU,KAAKY,EAAW,EAC5F,KAAKG,GAAwB,KAAK,MAAOjB,GAA8B,IAAU,KAAKc,EAAW,EACjG,KAAKI,GAAiB,KAAK,MAAOtB,GAAgB,IAAU,KAAKkB,EAAW,EAC5E,KAAKK,GAAc,KAAK,MAAM,KAAKD,GAAiB,CAAC,EACrD,IAAMI,EAAkB,KAAKP,GAAkB,KAAKD,GACpD,KAAKM,GAAY,KAAK,MAAME,EAAkBvB,EAA6B,EAC3E,KAAKsB,GAAQ,KAAKE,GAAWf,CAAK,CACtC,CACAI,IAAU,CAEN,IAAMY,EAAa,KAAKC,GAAmB,EAG3C,OADgB,KAAKC,GAAiBF,CAAU,EACjC,IAAIG,GAAKA,EAAI,KAAKb,EAAW,CAChD,CACAW,IAAqB,CACjB,IAAMG,EAAQ,KAAKC,GAAY,EACzBC,EAAY,CAAC,EACnB,QAAWC,IAAQ,CAAC,MAAO,MAAO,MAAM,EAAG,CACvC,IAAMC,EAASJ,EAAMG,CAAI,EACnBE,EAAW,KAAKC,GAAuBF,CAAM,EAC7CG,EAAS,KAAKC,GAAcH,CAAQ,EACpCI,EAAShC,GAAa0B,CAAI,EAChC,QAAWO,KAASH,EAChBL,EAAU,KAAK,CAAE,SAAUQ,EAAM,SAAU,OAAQA,EAAM,OAASD,CAAO,CAAC,CAElF,CAEA,IAAME,EAAY,CAAC,EAAG,KAAKxB,EAAe,EACpCyB,EAAS,CAAC,GAAGV,CAAS,EAAE,KAAK,CAACW,EAAGC,IAAMA,EAAE,OAASD,EAAE,MAAM,EAChE,QAAWH,KAASE,EAAQ,CACxB,GAAID,EAAU,QAAU,KAAKnB,GAAY,GAAKmB,EAAU,QAAU1C,GAAsB,EACpF,MAEC,KAAK8C,GAAYJ,EAAWD,EAAM,QAAQ,GAC3C,KAAKM,GAAcL,EAAWD,EAAM,QAAQ,CAEpD,CACA,OAAOC,CACX,CACAb,GAAiBF,EAAY,CACzB,GAAIA,EAAW,OAAS,EACpB,OAAOA,EAEX,IAAMqB,EAAU,CAACrB,EAAW,CAAC,CAAC,EACxBsB,EAAY,KAAK,MAAM,KAAKhC,GAAcV,EAAU,EAC1D,QAAS2C,EAAI,EAAGA,EAAIvB,EAAW,OAAS,EAAGuB,IAAK,CAC5C,IAAMC,EAAOxB,EAAWuB,EAAI,CAAC,EACvBE,EAAOzB,EAAWuB,CAAC,EACzB,GAAIC,IAAS,EAAG,CACZH,EAAQ,KAAKI,CAAI,EACjB,QACJ,CACA,IAAMC,EAAMD,EAAOD,EACbG,EAAgBH,EAAO,KAAK,MAAME,EAAMjD,EAAW,EACnDmD,EAAmBH,EAAO,KAAKjC,GAC/BqC,EAAc,KAAK,IAAIF,EAAeC,CAAgB,EAExDE,EAAe,EACnB,QAASC,EAAI,EAAGA,EAAIT,GAAaG,EAAOM,EAAI,KAAKxC,GAAiBwC,IAC9DD,GAAgB,KAAKjC,GAAM4B,EAAOM,CAAC,EAAI,KAAKlC,GAAM4B,EAAOM,CAAC,EAE9DD,EAAe,KAAK,KAAKA,EAAeR,CAAS,EACjD,IAAMU,EAAiBF,EAAenD,GAClCsD,EAAS,IACTC,EAAST,EACb,QAASU,EAAIV,EAAO,EAAGU,GAAKN,EAAaM,IAAK,CAC1C,IAAIC,EAAM,EACV,QAASL,EAAI,EAAGA,EAAIT,GAAaa,EAAIJ,EAAI,KAAKxC,GAAiBwC,IAC3DK,GAAO,KAAKvC,GAAMsC,EAAIJ,CAAC,EAAI,KAAKlC,GAAMsC,EAAIJ,CAAC,EAE/C,IAAMM,EAAM,KAAK,KAAKD,EAAMd,CAAS,EAKrC,GAJIe,EAAMJ,IACNA,EAASI,EACTH,EAASC,GAETE,EAAML,EACN,KAER,CACAX,EAAQ,KAAKa,CAAM,CACvB,CACA,OAAAb,EAAQ,KAAKrB,EAAWA,EAAW,OAAS,CAAC,CAAC,EACvCqB,CACX,CACAtB,GAAWf,EAAO,CACd,GAAM,CAAE,eAAAsD,EAAgB,iBAAAC,EAAkB,OAAAC,CAAO,EAAIxD,EACrD,GAAIuD,IAAqB,EACrB,OAAOE,EAAM,oCAAoC,EAErD,GAAIF,IAAqB,EACrB,OAAO,IAAI,aAAaC,EAAO,CAAC,CAAC,EAErC,IAAME,EAAO,IAAI,aAAaJ,CAAc,EAC5C,QAASK,EAAK,EAAGA,EAAKJ,EAAkBI,IAAM,CAC1C,IAAMC,EAAUJ,EAAOG,CAAE,EACzB,QAASpB,EAAI,EAAGA,EAAIe,EAAgBf,IAChCmB,EAAKnB,CAAC,GAAKqB,EAAQrB,CAAC,CAE5B,CACA,IAAMsB,EAAQ,EAAMN,EACpB,QAAShB,EAAI,EAAGA,EAAIe,EAAgBf,IAChCmB,EAAKnB,CAAC,GAAKsB,EAEf,OAAOH,CACX,CACAI,GAAeC,EAAOC,EAAMC,EAAMC,EAAO,CACrC,IAAMC,EAASD,EAAQ,GACjBE,EAAQ,IAAIC,EACZC,EAASN,EAAO,KAAK1D,GACvB2D,IAAS,UACTG,EAAM,iBAAiBE,EAAQ,KAAK,OAAO,EAG3CF,EAAM,kBAAkBE,EAAQ,KAAK,OAAO,EAEhD,IAAInE,EAAS4D,EACb,QAASQ,EAAI,EAAGA,EAAIJ,EAAQI,IAAK,CAC7B,IAAMC,EAAU,IAAIC,EACdC,EAAU,IAAID,EACdE,EAAQ,IAAI,aAAaxE,EAAO,MAAM,EACtCyE,EAAQ,IAAI,aAAazE,EAAO,MAAM,EAC5CqE,EAAQ,QAAQJ,EAAOjE,EAAQwE,EAAO,EAAGxE,EAAO,MAAM,EACtDuE,EAAQ,QAAQN,EAAOO,EAAOC,EAAO,EAAGzE,EAAO,MAAM,EACrDA,EAASyE,CACb,CACA,OAAOzE,CACX,CACAkB,IAAc,CACV,IAAMwD,EAAM,KAAKf,GAAe,KAAKjD,GAAO3B,GAAkB,UAAWD,CAAQ,EAC3E6F,EAAc,KAAKhB,GAAe,KAAKjD,GAAO3B,GAAkB,WAAYD,CAAQ,EACpF8F,EAAM,KAAKjB,GAAegB,EAAa3F,GAAmB,UAAWF,CAAQ,EAC7E+F,EAAO,KAAKlB,GAAegB,EAAa3F,GAAmB,WAAYF,CAAQ,EACrF,MAAO,CAAE,IAAA4F,EAAK,IAAAE,EAAK,KAAAC,CAAK,CAC5B,CACAtD,GAAuBF,EAAQ,CAC3B,IAAMC,EAAW,IAAI,aAAaD,EAAO,MAAM,EAC3CyD,EAAQ,EACZ,QAAS1C,EAAI,EAAGA,EAAI,KAAK7B,IAAkB6B,EAAIf,EAAO,OAAQe,IAC1D0C,GAASzD,EAAOe,CAAC,EAAIf,EAAOe,CAAC,EAEjC,QAASA,EAAI,EAAGA,EAAIf,EAAO,OAAQe,IAAK,CACpC,IAAM2C,EAAc3C,EAAI,KAAK5B,GACvBwE,EAAY5C,EAAI,KAAK5B,GAC3B,GAAIuE,EAAc,GAAKA,EAAc,EAAI1D,EAAO,OAAQ,CACpD,IAAM4D,EAAM5D,EAAO0D,EAAc,CAAC,EAClCD,GAASG,EAAMA,CACnB,CACA,GAAID,EAAY3D,EAAO,OAAQ,CAC3B,IAAM6D,EAAO7D,EAAO2D,CAAS,EAC7BF,GAASI,EAAOA,CACpB,CACA,IAAMC,EAAQ,KAAK,IAAIH,EAAW3D,EAAO,OAAS,CAAC,EAAI,KAAK,IAAI0D,EAAa,CAAC,EAAI,EAClFzD,EAASc,CAAC,EAAI,KAAK,KAAK,KAAK,IAAI,EAAK0C,CAAK,EAAIK,CAAK,CACxD,CACA,OAAO7D,CACX,CACAG,GAAcH,EAAU,CACpB,IAAI8D,EAAY,EAChB,QAAShD,EAAI,EAAGA,EAAId,EAAS,OAAQc,IAC7Bd,EAASc,CAAC,EAAIgD,IACdA,EAAY9D,EAASc,CAAC,GAG9B,IAAMiD,EAAYD,EAAYjG,GACxBqC,EAAS,CAAC,EAChB,QAASY,EAAI,EAAGA,EAAId,EAAS,OAAS,EAAGc,IAAK,CAC1C,IAAMkD,EAAahE,EAASc,CAAC,EAAId,EAASc,EAAI,CAAC,EACzCmD,EAAiBjE,EAASc,EAAI,CAAC,EAAId,EAASc,CAAC,EAC/CkD,EAAaD,GAAaC,EAAaC,GACvC/D,EAAO,KAAK,CAAE,SAAUY,EAAG,OAAQd,EAASc,CAAC,CAAE,CAAC,CAExD,CACA,OAAOZ,CACX,CACAQ,GAAYwD,EAAKC,EAAU,CACvB,IAAMC,EAAM,KAAKC,GAA4BH,EAAKC,CAAQ,EAC1D,OAAIC,EAAM,GAAKD,EAAWD,EAAIE,EAAM,CAAC,EAAI,KAAKpF,GACnC,GAEJoF,EAAMF,EAAI,QAAUA,EAAIE,CAAG,EAAID,EAAW,KAAKnF,EAC1D,CACA2B,GAAcuD,EAAKI,EAAO,CACtB,IAAMF,EAAM,KAAKC,GAA4BH,EAAKI,CAAK,EACvDJ,EAAI,OAAOE,EAAK,EAAGE,CAAK,CAC5B,CACAD,GAA4BH,EAAKI,EAAO,CACpC,IAAIC,EAAK,EACLC,EAAKN,EAAI,OACb,KAAOK,EAAKC,GAAI,CACZ,IAAMlB,EAAOiB,EAAKC,IAAQ,EACtBN,EAAIZ,CAAG,EAAIgB,EACXC,EAAKjB,EAAM,EAGXkB,EAAKlB,CAEb,CACA,OAAOiB,CACX,CACJ,EC5OA,IAAME,GAAuBC,GAAU,IAAI,IAAI,EAE/CC,EAAW,KAAKF,EAAS,EACzBG,EAAiB,QAAQH,EAAS,EAElCI,EAAa,SAASJ,GAAU,QAAQ,YAAY,EAAG,IAAI,KAAmC,CAC1F,MAAM,OAAOK,EAA8C,CACvD,OAAOC,GAAkB,OAAOD,CAAS,CAC7C,CACJ,CAAC,EAEDL,GAAU,QAAQ,YAAY,EAAE,KAAK,OAAO",
6
6
  "names": ["isDefined", "value", "isNull", "isNotUndefined", "value", "asDefined", "value", "fail", "panic", "getOrProvide", "getOrProvide", "value", "safeExecute", "func", "args", "Unhandled", "empty", "panic", "issue", "assert", "condition", "fail", "getOrProvide", "InaccessibleProperty", "failMessage", "panic", "SuccessResult", "value", "InaccessibleProperty", "FailureResult", "error", "tryCatch", "statement", "EmptyExec", "Sorting", "Arrays", "#empty", "array", "newValues", "procedure", "index", "fail", "asDefined", "element", "panic", "factory", "n", "i", "a", "b", "predicate", "first", "result", "key", "seen", "value", "excludeArray", "compareFn", "item", "excludeItem", "other", "includeItem", "baseArray", "mergeIntoArray", "baseItem", "mergeItem", "maxIndex", "left", "right", "sorting", "prev", "next", "toKey", "record", "view", "Option", "value", "isDefined", "Some", "provider", "func", "args", "promise", "#value", "asDefined", "_", "matchable", "run", "_func", "callback", "_or", "other", "_fail", "fail", "panic", "getOrProvide", "exec", "or", "TAU", "PI_HALF", "PI_QUART", "INVERSE_SQRT_2", "clamp", "value", "min", "max", "nextPowOf2", "n", "dataView", "Integer", "value", "Float", "ARRAY_BUFFER", "FLOAT_VIEW", "INT_VIEW", "result", "Float16", "bits", "sign", "val", "mantissa", "exp", "Float64", "EXP_BIT_MASK", "SIGNIFICANT_BIT_MASK", "FLOAT64_VIEW", "LONG_VIEW", "Iterables", "value", "iterable", "count", "_", "predicate", "callback", "initialValue", "accumulator", "index", "include", "procedure", "map", "iterator", "i", "fn", "result", "mapped", "isDefined", "done", "prev", "ByteArrayOutput", "_ByteArrayOutput", "initialCapacity", "buffer", "byteOffset", "#view", "#position", "view", "value", "panic", "#ensureSpace", "bytes", "i", "length", "count", "capacity", "o", "nextPowOf2", "Terminable", "EmptyExec", "exec", "terminables", "Notifier", "observer", "observables", "Terminable", "observable", "#observers", "value", "RuntimeNotifier", "notifierOption", "Option", "request", "notifier", "EmptyExec", "assert", "TimeSpan", "_TimeSpan", "value", "#MILLI_SECONDS_PER_SECOND", "#MILLI_SECONDS_PER_MINUTE", "#MILLI_SECONDS_PER_HOUR", "#MILLI_SECONDS_PER_DAY", "#ms", "ms", "unit", "seconds", "minutes", "hours", "days", "d", "h", "m", "s", "#quantity", "name", "count", "Unhandled", "Communicator", "messenger", "bind", "Sender", "protocol", "Executor", "extractTransferables", "args", "transferables", "arg", "#messenger", "#expected", "#subscription", "#returnId", "#messageHandler", "func", "Iterables", "resolve", "reject", "entries", "callbacks", "index", "message", "returns", "isDefined", "panic", "#protocol", "assert", "object", "asDefined", "returnId", "#sendCallback", "value", "#sendResolve", "reason", "#sendReject", "Messenger", "port", "NativeMessenger", "EmptyTransferables", "#port", "#notifier", "Notifier", "isDefined", "event", "message", "transfer", "name", "Channel", "observer", "_Channel", "#messages", "#name", "#subscription", "messages", "data", "transferrables", "Wait", "resolve", "numFrames", "count", "callback", "time", "args", "target", "type", "observable", "terminable", "generator", "reject", "interval", "status", "next", "error", "tryCatch", "done", "value", "IntervalRetryOption", "#count", "maxRetry", "timeSpan", "reason", "exec", "Promises", "ResolveResult", "value", "InaccessibleProperty", "RejectedResult", "error", "owner", "promise", "running", "Terminable", "resolve", "reject", "DefaultRetryOption", "TimeSpan", "factory", "retryOption", "onFailure", "retryIf", "attempt", "count", "Wait", "approve", "RuntimeNotifier", "after", "thenUse", "use", "_", "fail", "timeout", "factories", "results", "handler", "lastPromise", "arg", "execute", "currentPromise", "resolving", "lastCall", "now", "isNull", "isDefined", "tasks", "limit", "index", "hasError", "run", "i", "Limit", "#waiting", "#running", "max", "provider", "#continue", "resolvers", "assert", "Latest", "#onResolve", "#onReject", "#onFinally", "#latest", "Option", "onResolve", "onReject", "onFinally", "safeExecute", "stopwatch", "level", "startTime", "label", "Peaks", "Stage", "shift", "numPeaks", "dataOffset", "bits", "index", "Float16", "Unhandled", "SamplePeaks", "_SamplePeaks", "input", "assert", "numStages", "stages", "i", "numData", "data", "array", "numFrames", "numChannels", "width", "ratio", "ShiftPadding", "maxShift", "Arrays", "unitsPerPixel", "output", "ByteArrayOutput", "SamplePeakWorker", "messenger", "Communicator", "progress", "shifts", "frames", "numFrames", "numChannels", "generatePeaks", "panic", "State", "time", "stopwatch", "numShifts", "stages", "dataOffset", "initStages", "data", "Arrays", "minMask", "total", "count", "channel", "channelData", "channelFrames", "states", "min", "max", "position", "i", "frame", "j", "stage", "state", "SamplePeaks", "index", "shift", "numPeaks", "Peaks", "f0", "f1", "bits0", "Float16", "bits1", "OpfsWorker", "messenger", "Communicator", "#locks", "path", "data", "#acquireLock", "handle", "#resolveFile", "size", "buffer", "segments", "pathToSegments", "#resolveFolder", "folder", "asDefined", "status", "Promises", "Arrays", "result", "name", "kind", "root", "operation", "existingLock", "isNotUndefined", "releaseLock", "panic", "lockPromise", "resolve", "options", "segment", "noSlashes", "BiquadCoeff", "cutoff", "resonance", "clamp", "theta", "TAU", "alpha", "cosw", "beta", "b0", "b1", "b2", "a0", "a1", "a2", "a0_inverse", "frequency", "db_gain", "a", "w0", "k", "k2", "a_plus_one", "a_minus_one", "q", "magResponse", "phaseResponse", "assert", "omega", "zReal", "zImag", "numeratorReal", "numeratorImag", "denominatorReal", "denominatorImag", "denom", "responseReal", "responseImag", "BiquadMono", "#x1", "#x2", "#y1", "#y2", "a1", "a2", "b0", "b1", "b2", "source", "target", "fromIndex", "toIndex", "x1", "x2", "y1", "y2", "i", "x", "y", "LR_ORDER", "LOW_CROSSOVER_HZ", "HIGH_CROSSOVER_HZ", "RMS_WINDOW_MS", "MIN_TRANSIENT_COUNT", "ENERGY_DERIVATIVE_THRESHOLD", "MAX_TRANSIENT_DENSITY_PER_SEC", "MIN_TRANSIENT_SEPARATION_MS", "VALLEY_BIAS", "MAX_VALLEY_SEARCH_MS", "ONSET_ENERGY_RATIO", "VALLEY_RMS", "BAND_WEIGHTS", "TransientDetector", "_TransientDetector", "audio", "now", "duration", "result", "#detect", "took", "#sampleRate", "#numberOfFrames", "#maxValleySearchSamples", "#minSeparationSamples", "#windowSamples", "#halfWindow", "#maxCount", "#mono", "durationSeconds", "#mixToMono", "candidates", "#collectCandidates", "#refineToValleys", "x", "bands", "#splitBands", "allOnsets", "band", "buffer", "envelope", "#computeEnergyEnvelope", "onsets", "#detectOnsets", "weight", "onset", "collected", "sorted", "a", "b", "#isTooClose", "#insertSorted", "refined", "rmsWindow", "i", "prev", "curr", "gap", "gapBasedStart", "windowBasedStart", "searchStart", "candidateRms", "k", "thresoldEnergy", "minRms", "minPos", "j", "sum", "rms", "numberOfFrames", "numberOfChannels", "frames", "panic", "mono", "ch", "channel", "scale", "#applyLRFilter", "input", "freq", "type", "order", "passes", "coeff", "BiquadCoeff", "cutoff", "p", "filter1", "BiquadMono", "filter2", "temp1", "temp2", "low", "highFromLow", "mid", "high", "sumSq", "windowStart", "windowEnd", "old", "next", "count", "maxEnergy", "threshold", "derivative", "nextDerivative", "arr", "position", "idx", "#binarySearchInsertPosition", "value", "lo", "hi", "messenger", "Messenger", "OpfsWorker", "SamplePeakWorker", "Communicator", "audioData", "TransientDetector"]
7
7
  }