{
  "version": 3,
  "sources": ["../src/index.ts", "../src/algorithm/binarySearch.ts", "../src/algorithm/traverse.ts", "../src/array/arrayRange.ts", "../src/array/arraySerial.ts", "../src/array/arraySet.ts", "../src/array/constants.ts", "../src/array/utils.ts", "../src/BinaryHeap.ts", "../src/CDS/CDS.ts", "../src/Clock/Clock.ts", "../src/Clock/ClockFrame.ts", "../src/Clock/ClockRealtime.ts", "../src/color/colorFromAtariST.ts", "../src/color/colorFromHex.ts", "../src/math/lerp.ts", "../src/color/colorHSV2RGB.ts", "../src/math/clamp.ts", "../src/math/saturate.ts", "../src/color/colorToHex.ts", "../src/math/vec/vecDot.ts", "../src/color/colorTurbo.ts", "../src/color/eotfRec709.ts", "../src/color/oetfRec709.ts", "../src/dag/dagEdgesParents.ts", "../src/dag/dagEdgesAncestors.ts", "../src/dag/dagEdgesChildren.ts", "../src/dag/dagEdgesDescendants.ts", "../src/dag/dagEdgesParent.ts", "../src/dag/dagEdgesResolve.ts", "../src/debounce.ts", "../src/dsp/BiquadFilter/BiquadFilter.ts", "../src/dsp/BiquadFilter/BPF.ts", "../src/dsp/BiquadFilter/HPF.ts", "../src/dsp/BiquadFilter/LPF.ts", "../src/dsp/Phasor.ts", "../src/dsp/SawtoothOscillator.ts", "../src/dsp/SineOscillator.ts", "../src/dsp/SquareOscillator.ts", "../src/dsp/TriangleOscillator.ts", "../src/ExpSmooth/ExpSmooth.ts", "../src/edt/edt.ts", "../src/float32ArrayToWav.ts", "../src/fmix32.ts", "../src/Pool/Pool.ts", "../src/GPUTimer/GPUTimer.ts", "../src/HistoryMeanCalculator/HistoryMeanCalculator.ts", "../src/HistoryMeanCalculator/HistoryPercentileCalculator.ts", "../src/HistoryMeanCalculator/HistoryMedianCalculator.ts", "../src/int16ArrayToWav.ts", "../src/MapOfSet/MapOfSet.ts", "../src/math/vec/vecScale.ts", "../src/math/mat3/mat3FromMat4Transpose.ts", "../src/math/mat3/mat3Inverse.ts", "../src/math/mat3/mat3CreateNormalMatrix.ts", "../src/math/mat3/mat3Determinant.ts", "../src/math/mat3/mat3FromMat4.ts", "../src/math/mat3/mat3FromQuaternion.ts", "../src/math/mat3/mat3Multiply.ts", "../src/math/mat3/mat3Transpose.ts", "../src/math/mat3/Matrix3.ts", "../src/math/mat4/mat4FromQuaternion.ts", "../src/math/mat4/mat4Compose.ts", "../src/math/quat/quatFromMatrix3.ts", "../src/math/quat/quatFromMatrix4.ts", "../src/math/vec/vecLength.ts", "../src/math/mat4/mat4Determinant.ts", "../src/math/mat4/mat4Decompose.ts", "../src/math/mat4/mat4FromMat3.ts", "../src/math/mat4/mat4Inverse.ts", "../src/math/vec/vecAdd.ts", "../src/math/vec/vecNormalize.ts", "../src/math/vec/vecSub.ts", "../src/math/vec3/vec3Cross.ts", "../src/math/mat4/mat4LookAt.ts", "../src/math/mat4/mat4LookAtInverse.ts", "../src/math/mat4/mat4Multiply.ts", "../src/math/mat4/mat4Perspective.ts", "../src/math/mat4/mat4RotationX.ts", "../src/math/mat4/mat4RotationY.ts", "../src/math/mat4/mat4RotationZ.ts", "../src/math/mat4/mat4Scale.ts", "../src/math/mat4/mat4ScaleScalar.ts", "../src/math/mat4/mat4Translate.ts", "../src/math/mat4/mat4Transpose.ts", "../src/math/mat4/Matrix4.ts", "../src/math/vec/vecLengthSq.ts", "../src/math/vec/vecAbs.ts", "../src/math/vec/vecDivide.ts", "../src/math/vec/vecLerp.ts", "../src/math/vec/vecManhattanLength.ts", "../src/math/vec/vecMultiply.ts", "../src/math/vec/vecNeg.ts", "../src/math/vec/Vector.ts", "../src/math/quat/quatExp.ts", "../src/math/quat/quatFromAxisAngle.ts", "../src/math/quat/quatInverse.ts", "../src/math/quat/quatLog.ts", "../src/math/quat/quatLogVec3.ts", "../src/math/vec3/vec3OrthoNormalize.ts", "../src/math/quat/quatLookRotation.ts", "../src/math/quat/quatMultiply.ts", "../src/math/quat/quatNlerp.ts", "../src/math/quat/quatNormalize.ts", "../src/math/quat/quatRotationX.ts", "../src/math/quat/quatRotationY.ts", "../src/math/quat/quatRotationZ.ts", "../src/math/quat/quatSlerp.ts", "../src/math/quat/Quaternion.ts", "../src/math/vec3/vec3ApplyMatrix3.ts", "../src/math/vec4/vec4ApplyMatrix4.ts", "../src/math/vec3/vec3ApplyMatrix4.ts", "../src/math/vec3/vec3ApplyQuaternion.ts", "../src/math/vec3/vec3QuatExp.ts", "../src/math/vec3/Vector3.ts", "../src/math/box3/box3ContainsPoint.ts", "../src/math/box3/Box3.ts", "../src/math/quat/quatFromEuler.ts", "../src/math/mod.ts", "../src/math/sanitizeAngle.ts", "../src/math/euler/eulerFromMat3.ts", "../src/math/euler/eulerFromMat4.ts", "../src/math/euler/eulerFromQuaternion.ts", "../src/math/euler/Euler.ts", "../src/math/ray3/ray3DistanceToSphere.ts", "../src/math/line3/line3Delta.ts", "../src/math/ray3/ray3FromLine3.ts", "../src/math/ray3/Ray3.ts", "../src/math/line3/line3ApplyMatrix4.ts", "../src/math/line3/line3At.ts", "../src/math/line3/line3ClosestPointToPoint.ts", "../src/math/line3/line3DistanceToPoint.ts", "../src/math/line3/Line3.ts", "../src/math/linearstep.ts", "../src/math/mat2/mat2Determinant.ts", "../src/math/mat2/mat2Inverse.ts", "../src/math/mat2/mat2Multiply.ts", "../src/math/mat2/mat2Transpose.ts", "../src/math/mat2/Matrix2.ts", "../src/math/plane3/plane3ApplyMatrix4.ts", "../src/math/plane3/plane3DistanceToPoint.ts", "../src/math/plane3/plane3Normalize.ts", "../src/math/plane3/Plane3.ts", "../src/math/plane3/planes3ContainPoint.ts", "../src/math/plane3/planes3FromBox3.ts", "../src/math/plane3/planes3FromProjectionMatrix.ts", "../src/math/plane3/planes3IntersectBox3.ts", "../src/math/plane3/planes3IntersectSphere3.ts", "../src/math/plane3/Planes3.ts", "../src/math/range.ts", "../src/math/smootherstep.ts", "../src/math/smootheststep.ts", "../src/math/smoothstep.ts", "../src/math/sphere3/sphere3ContainsPoint.ts", "../src/math/sphere3/Sphere3.ts", "../src/math/step.ts", "../src/math/vec4/vec4ApplyMatrix3.ts", "../src/math/vec4/Vector4.ts", "../src/midi/midiParse.ts", "../src/notifyObservers.ts", "../src/poker/pokerRanksByStrength.ts", "../src/poker/pokerSuitsByIndex.ts", "../src/poker/createPokerDeck.ts", "../src/poker/pokerHandStrengthMap.ts", "../src/poker/pokerRankStrengthMap.ts", "../src/poker/pokerSuitIndexMap.ts", "../src/poker/sortPokerCardsByRank.ts", "../src/poker/evaluatePokerHand.ts", "../src/poker/pokerCardToUnicode.ts", "../src/poker/pokerHandsByStrength.ts", "../src/retry/asyncRetry.ts", "../src/retry/retry.ts", "../src/SmoothDamp/SmoothDamp.ts", "../src/Swap/Swap.ts", "../src/stniccc/parseSTNICCC.ts", "../src/stniccc/stnicccToSVG.ts", "../src/TapTempo/TapTempo.ts", "../src/throttle.ts", "../src/tinyseq/createTinyseqPolyReader.ts", "../src/tinyseq/createTinyseqReader.ts", "../src/tinyseq/tinyseqFromMidiParseResult.ts", "../src/Xorshift/Xorshift.ts", "../src/yugop/getYugopText.ts"],
  "sourcesContent": ["export * from './algorithm';\nexport * from './array';\nexport * from './BinaryHeap';\nexport * from './CDS';\nexport * from './Clock';\nexport * from './color';\nexport * from './dag';\nexport { debounce } from './debounce';\nexport * from './dsp';\nexport * from './ExpSmooth';\nexport * from './edt';\nexport { float32ArrayToWav } from './float32ArrayToWav';\nexport { fmix32 } from './fmix32';\nexport * from './GPUTimer';\nexport * from './HistoryMeanCalculator';\nexport { int16ArrayToWav } from './int16ArrayToWav';\nexport * from './MapOfSet';\nexport * from './math';\nexport * from './midi';\nexport { notifyObservers, Observer } from './notifyObservers';\nexport * from './Pool';\nexport * from './poker';\nexport * from './retry';\nexport * from './SmoothDamp';\nexport * from './Swap';\nexport * from './stniccc';\nexport * from './TapTempo';\nexport { throttle } from './throttle';\nexport * from './tinyseq';\nexport * from './Xorshift';\nexport * from './yugop';\n\n// This is somehow very not treeshaking friendly so removing\n// export * from './FizzBuzz';\n", "// yoinked from https://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers\n\n/**\n * Look for an index from a sorted list using binary search.\n *\n * If you don't provide a compare function, it will look for **the first same value** it can find.\n * If it cannot find an exactly matching value, it can return N where the length of given array is N.\n *\n * @param array A sorted array\n * @param compare Make this function return `false` if you want to point right side of given element, `true` if you want to point left side of given element.\n * @returns An index found\n */\nexport function binarySearch<T>(array: ArrayLike<T>, element: T): number;\nexport function binarySearch<T>(array: ArrayLike<T>, compare: (element: T) => boolean): number;\nexport function binarySearch<T>(\n  array: ArrayLike<T>,\n  elementOrCompare: T | ((element: T) => boolean),\n): number {\n  if (typeof elementOrCompare !== 'function') {\n    return binarySearch(array, (element) => element < elementOrCompare);\n  }\n  const compare = elementOrCompare as (element: T) => boolean;\n\n  let start = 0;\n  let end = array.length;\n\n  while (start < end) {\n    const center = (start + end) >> 1;\n    const centerElement = array[center];\n\n    const compareResult = compare(centerElement);\n\n    if (compareResult) {\n      start = center + 1;\n    } else {\n      end = center;\n    }\n  }\n\n  return start;\n}\n", "/**\n * Generic traverse function.\n *\n * It performs Depth-First Search.\n *\n * The `traverser` function will be executed for each descendants.\n * You need to return their \"children\" in an array.\n * If you want to stop the traversal, return `false` instead.\n *\n * @example\n * ```js\n * // replicate Three.js traverse for no reason\n * const meshes = [];\n * traverse( object3DRoot, ( object ) => {\n *   if ( object.isMesh ) {\n *     meshes.push( object );\n *   }\n *   return object3DRoot.children;\n * } );\n * ```\n *\n * @param root The \"root\" node\n * @param traverser The traverse function. If the node has \"children\" return them in an array.\n */\nexport function traverse<TNode>(root: TNode, traverser: (node: TNode) => TNode[] | false): void {\n  const nodesNeedProcess: TNode[] = [root];\n  const nodesSeen = new Set<TNode>(nodesNeedProcess);\n\n  while (nodesNeedProcess.length > 0) {\n    const currentNode = nodesNeedProcess.shift()!;\n\n    const children = traverser(currentNode);\n\n    if (!children) {\n      break;\n    }\n\n    const nodesFound = children.filter((node) => !nodesSeen.has(node));\n    nodesNeedProcess.unshift(...nodesFound);\n    nodesFound.map((node) => nodesSeen.add(node));\n  }\n}\n", "export function arrayRange(start: number, end: number, step?: number): number[] {\n  let current = start;\n  const ret: number[] = [];\n\n  if (start < end) {\n    step = step ?? 1;\n    while (current < end) {\n      ret.push(current);\n      current += step;\n    }\n  } else {\n    step = step ?? -1;\n    while (current > end) {\n      ret.push(current);\n      current += step;\n    }\n  }\n\n  return ret;\n}\n", "export const arraySerial = (count: number): number[] => [...Array(count)].map((_, i) => i);\n", "export function arraySetDelete<T>(array: Array<T>, value: T): boolean {\n  const index = array.indexOf(value);\n  if (index === -1) {\n    return false;\n  }\n\n  array.splice(index, 1);\n  return true;\n}\n\nexport function arraySetHas<T>(array: Array<T>, value: T): boolean {\n  return array.indexOf(value) !== -1;\n}\n\nexport function arraySetAdd<T>(array: Array<T>, value: T): boolean {\n  const index = array.indexOf(value);\n  if (index !== -1) {\n    return false;\n  }\n\n  array.push(value);\n  return true;\n}\n\nexport function arraySetUnion<T>(a: Array<T>, b: Array<T>): Array<T> {\n  const out = [...a];\n  b.forEach((v) => {\n    if (!arraySetHas(out, v)) {\n      out.push(v);\n    }\n  });\n  return out;\n}\n\nexport function arraySetDiff<T>(from: Array<T>, diff: Array<T>): Array<T> {\n  const out = [...from];\n  diff.forEach((v) => {\n    arraySetDelete(out, v);\n  });\n  return out;\n}\n", "/**\n * `[ -1, -1, 1, -1, -1, 1, 1, 1 ]`\n */\nexport const TRIANGLE_STRIP_QUAD = [-1, -1, 1, -1, -1, 1, 1, 1];\n\n/**\n * `[ -1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0 ]`\n */\nexport const TRIANGLE_STRIP_QUAD_3D = [-1, -1, 0, 1, -1, 0, -1, 1, 0, 1, 1, 0];\n\n/**\n * `[ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1 ]`\n */\nexport const TRIANGLE_STRIP_QUAD_NORMAL = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1];\n\n/**\n * `[ 0, 0, 1, 0, 0, 1, 1, 1 ]`\n */\nexport const TRIANGLE_STRIP_QUAD_UV = [0, 0, 1, 0, 0, 1, 1, 1];\n", "/**\n * Shuffle given `array` using given `dice` RNG. **Destructive**.\n */\nexport function shuffleArray<T>(array: T[], dice?: () => number): T[] {\n  const f = dice ? dice : () => Math.random();\n  for (let i = 0; i < array.length - 1; i++) {\n    const ir = i + Math.floor(f() * (array.length - i));\n    const temp = array[ir];\n    array[ir] = array[i];\n    array[i] = temp;\n  }\n  return array;\n}\n\n/**\n * I like wireframe\n *\n * `triIndexToLineIndex( [ 0, 1, 2, 5, 6, 7 ] )` -> `[ 0, 1, 1, 2, 2, 0, 5, 6, 6, 7, 7, 5 ]`\n */\nexport function triIndexToLineIndex<T>(array: T[]): T[] {\n  const ret: T[] = [];\n  for (let i = 0; i < array.length / 3; i++) {\n    const head = i * 3;\n    ret.push(\n      array[head],\n      array[head + 1],\n      array[head + 1],\n      array[head + 2],\n      array[head + 2],\n      array[head],\n    );\n  }\n  return ret;\n}\n\n/**\n * `matrix2d( 3, 2 )` -> `[ 0, 0, 0, 1, 0, 2, 1, 0, 1, 1, 1, 2 ]`\n */\nexport function matrix2d(w: number, h: number): number[] {\n  const arr: number[] = [];\n  for (let iy = 0; iy < h; iy++) {\n    for (let ix = 0; ix < w; ix++) {\n      arr.push(ix, iy);\n    }\n  }\n  return arr;\n}\n\n/**\n * See also: {@link matrix2d}\n */\nexport function matrix3d(w: number, h: number, d: number): number[] {\n  const arr: number[] = [];\n  for (let iz = 0; iz < d; iz++) {\n    for (let iy = 0; iy < h; iy++) {\n      for (let ix = 0; ix < w; ix++) {\n        arr.push(ix, iy, iz);\n      }\n    }\n  }\n  return arr;\n}\n", "export class BinaryHeap<T> {\n  public readonly array: T[];\n  public readonly elementIndexMap: Map<T, number>;\n  public comparator: (a: T, b: T) => number;\n\n  public static defaultComparator(a: unknown, b: unknown): number {\n    const aStr = `${a}`;\n    const bStr = `${b}`;\n\n    if (aStr > bStr) {\n      return 1;\n    } else if (aStr < bStr) {\n      return -1;\n    } else {\n      return 0;\n    }\n  }\n\n  public get length(): number {\n    return this.array.length;\n  }\n\n  public get isEmpty(): boolean {\n    return this.array.length === 0;\n  }\n\n  public get root(): T {\n    return this.array[0];\n  }\n\n  public constructor(init?: T[], comparator?: (a: T, b: T) => number) {\n    this.array = [];\n    this.elementIndexMap = new Map();\n    this.comparator = comparator ?? BinaryHeap.defaultComparator;\n\n    if (init != null) {\n      for (const el of init) {\n        this.push(el);\n      }\n    }\n  }\n\n  public push(...elements: T[]): void {\n    elements.map((el) => {\n      const i = this.length;\n      this.array.push(el);\n      this.elementIndexMap.set(el, i);\n      this.__up(i, el);\n    });\n  }\n\n  public pop(): T | null {\n    if (this.isEmpty) {\n      return null;\n    }\n\n    const el = this.array[0];\n    this.elementIndexMap.delete(el);\n\n    if (this.length === 1) {\n      this.array.splice(0);\n    } else {\n      const rep = this.array.pop();\n      this.__down(0, rep!);\n    }\n\n    return el;\n  }\n\n  public delete(i: number): boolean {\n    this.elementIndexMap.delete(this.array[i]);\n\n    const rep = this.array.pop();\n    if (rep != null) {\n      i = this.__up(i, rep);\n      i = this.__down(i, rep);\n    }\n\n    return true;\n  }\n\n  public replace(i: number, rep: T): number | null {\n    if (i != null) {\n      this.elementIndexMap.delete(this.array[i]);\n\n      i = this.__up(i, rep);\n      i = this.__down(i, rep);\n    }\n\n    return i ?? null;\n  }\n\n  private __up(i: number, el: T): number {\n    let ic = i;\n\n    while (ic !== 0) {\n      const ip = (ic - 1) >> 1;\n\n      const p = this.array[ip];\n      if (this.comparator(el, p) < 0) {\n        this.array[ic] = p;\n        this.elementIndexMap.set(p, ic);\n        ic = ip;\n      } else {\n        break;\n      }\n    }\n\n    this.array[ic] = el;\n    this.elementIndexMap.set(el, ic);\n    return ic;\n  }\n\n  private __down(i: number, el: T): number {\n    let ip = i;\n\n    while ((ip << 1) + 1 < this.length) {\n      const ic1 = (ip << 1) + 1;\n      const ic2 = (ip << 1) + 2;\n\n      if (ic2 < this.length) {\n        const c1 = this.array[ic1];\n        const c2 = this.array[ic2];\n\n        const pickLeft = this.comparator(c1, c2) < 0;\n        const c = pickLeft ? c1 : c2;\n        const ic = pickLeft ? ic1 : ic2;\n\n        if (this.comparator(c, el) < 0) {\n          this.array[ip] = c;\n          this.elementIndexMap.set(c, ip);\n          ip = ic;\n        } else {\n          break;\n        }\n      } else if (this.comparator(this.array[ic1], el) < 0) {\n        this.array[ip] = this.array[ic1];\n        this.elementIndexMap.set(this.array[ip], ip);\n        ip = ic1;\n      } else {\n        break;\n      }\n    }\n\n    this.array[ip] = el;\n    this.elementIndexMap.set(el, ip);\n    return ip;\n  }\n}\n", "/**\n * The implementation of Critical Damped Spring (CDS).\n *\n * This is the very naive implementation. No `deltaTime` clamping or sub-stepping.\n * You may want to do such improvement yourself if you need this to be more robust.\n *\n * Shoutouts to Keijiro Takahashi\n */\nexport class CDS {\n  /**\n   * The factor (stiffness) of the spring.\n   * I recomment a value around 100 or 1000.\n   */\n  public factor = 100.0;\n\n  /**\n   * The ratio (damping) of the spring.\n   * 1.0 == critical damping.\n   */\n  public ratio = 1.0;\n\n  /**\n   * The current velocity of the spring.\n   */\n  public velocity = 0.0;\n\n  /**\n   * The current value of the spring.\n   */\n  public value = 0.0;\n\n  /**\n   * The target value of the spring.\n   * You usually want to set this value to control the spring.\n   */\n  public target = 0.0;\n\n  public update(deltaTime: number): number {\n    this.velocity +=\n      (this.factor * (this.target - this.value) -\n        2.0 * this.velocity * Math.sqrt(this.factor) * this.ratio) *\n      deltaTime;\n\n    this.value += this.velocity * deltaTime;\n    return this.value;\n  }\n}\n", "/**\n * Class that deals with time.\n * In this base class, you need to set time manually from `Automaton.update()`.\n * Best for sync with external clock stuff.\n */\nexport class Clock {\n  /**\n   * Its current time.\n   */\n  protected __time = 0.0;\n\n  /**\n   * Its deltaTime of last update.\n   */\n  protected __deltaTime = 0.0;\n\n  /**\n   * Whether its currently playing or not.\n   */\n  protected __isPlaying = false;\n\n  /**\n   * Its current time.\n   */\n  public get time(): number {\n    return this.__time;\n  }\n\n  /**\n   * Its deltaTime of last update.\n   */\n  public get deltaTime(): number {\n    return this.__deltaTime;\n  }\n\n  /**\n   * Whether its currently playing or not.\n   */\n  public get isPlaying(): boolean {\n    return this.__isPlaying;\n  }\n\n  /**\n   * Update the clock.\n   * @param time Time. You need to set manually when you are using manual Clock\n   */\n  public update(time?: number): void {\n    const prevTime = this.__time;\n    this.__time = time || 0.0;\n    this.__deltaTime = this.__time - prevTime;\n  }\n\n  /**\n   * Start the clock.\n   */\n  public play(): void {\n    this.__isPlaying = true;\n  }\n\n  /**\n   * Stop the clock.\n   */\n  public pause(): void {\n    this.__isPlaying = false;\n  }\n\n  /**\n   * Set the time manually.\n   * @param time Time\n   */\n  public setTime(time: number): void {\n    this.__time = time;\n  }\n}\n", "import { Clock } from './Clock';\n\n/**\n * Class that deals with time.\n * This is \"frame\" type clock, the frame increases every {@link ClockFrame#update} call.\n * @param fps Frames per second\n */\nexport class ClockFrame extends Clock {\n  /**\n   * Its current frame.\n   */\n  private __frame = 0;\n\n  /**\n   * Its fps.\n   */\n  private __fps: number;\n\n  public constructor(fps = 60) {\n    super();\n    this.__fps = fps;\n  }\n\n  /**\n   * Its current frame.\n   */\n  public get frame(): number {\n    return this.__frame;\n  }\n\n  /**\n   * Its fps.\n   */\n  public get fps(): number {\n    return this.__fps;\n  }\n\n  /**\n   * Update the clock. It will increase the frame by 1.\n   */\n  public update(): void {\n    if (this.__isPlaying) {\n      this.__time = this.__frame / this.__fps;\n      this.__deltaTime = 1.0 / this.__fps;\n      this.__frame++;\n    } else {\n      this.__deltaTime = 0.0;\n    }\n  }\n\n  /**\n   * Set the time manually.\n   * The set time will be converted into internal frame count, so the time will not be exactly same as set one.\n   * @param time Time\n   */\n  public setTime(time: number): void {\n    this.__frame = Math.floor(this.__fps * time);\n    this.__time = this.__frame / this.__fps;\n  }\n}\n", "import { Clock } from './Clock';\n\n/**\n * Class that deals with time.\n * This is \"realtime\" type clock, the time goes on as real world.\n */\nexport class ClockRealtime extends Clock {\n  /**\n   * \"You set the time manually to `__rtTime` when it's `__rtDate`.\"\n   */\n  private __rtTime = 0.0;\n\n  /**\n   * \"You set the time manually to `__rtTime` when it's `__rtDate`.\"\n   */\n  private __rtDate: number = performance.now();\n\n  /**\n   * The clock is realtime. yeah.\n   */\n  public get isRealtime(): boolean {\n    return true;\n  }\n\n  /**\n   * Update the clock. Time is calculated based on time in real world.\n   */\n  public update(): void {\n    const now = performance.now();\n\n    if (this.__isPlaying) {\n      const prevTime = this.__time;\n      const deltaDate = now - this.__rtDate;\n      this.__time = this.__rtTime + deltaDate / 1000.0;\n      this.__deltaTime = this.time - prevTime;\n    } else {\n      this.__rtTime = this.time;\n      this.__rtDate = now;\n      this.__deltaTime = 0.0;\n    }\n  }\n\n  /**\n   * Set the time manually.\n   * @param time Time\n   */\n  public setTime(time: number): void {\n    this.__time = time;\n    this.__rtTime = this.time;\n    this.__rtDate = performance.now();\n  }\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * Converts the input color in Atari-ST color palette format to a {@link RawRGB}.\n *\n * @param stColor A color in Atari-ST format\n */\nexport function colorFromAtariST(stColor: number): RawRGB {\n  return [((stColor >> 8) & 7) / 7.0, ((stColor >> 4) & 7) / 7.0, (stColor & 7) / 7.0];\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * Converts the input hex color to {@link RawRGB}.\n *\n * Supported formats:\n * - `#RRGGBB`\n * - `#RGB`\n * - `0xRRGGBB`\n *\n * @param hex - Hex representation of the color\n * @returns Color in {@link RawRGB}\n */\nexport function colorFromHex(hex: number | string): RawRGB {\n  if (typeof hex === 'number') {\n    hex = hex.toString(16).padStart(6, '0');\n  }\n\n  if (hex.startsWith('#')) {\n    hex = hex.slice(1);\n  }\n\n  if (hex.length === 6) {\n    const r = parseInt(hex.slice(0, 2), 16) / 255.0;\n    const g = parseInt(hex.slice(2, 4), 16) / 255.0;\n    const b = parseInt(hex.slice(4, 6), 16) / 255.0;\n    return [r, g, b];\n  } else if (hex.length === 3) {\n    const r = parseInt(hex[0] + hex[0], 16) / 255.0;\n    const g = parseInt(hex[1] + hex[1], 16) / 255.0;\n    const b = parseInt(hex[2] + hex[2], 16) / 255.0;\n    return [r, g, b];\n  } else {\n    throw new Error(`Invalid hex color: ${hex}`);\n  }\n}\n", "/**\n * `lerp`, or `mix`.\n * Return a linear interpolation of two numbers.\n * The {@link t} won't be clamped.\n *\n * @param a - A number\n * @param b - Another number\n * @param t - A number interpolating two numbers. Usually in range [0, 1] but not clamped\n */\nexport function lerp(a: number, b: number, t: number): number {\n  return a + (b - a) * t;\n}\n", "import { lerp } from '../math/lerp';\nimport type { RawRGB } from './RawRGB';\n\n/**\n * Convert a color from HSV to RGB.\n * Each component of the HSV must be given in [0 - 1] range.\n *\n * Ref: https://en.wikipedia.org/wiki/HSV_color_space\n */\nexport function colorHSV2RGB([h, s, v]: [number, number, number]): RawRGB {\n  const ht = (h % 1.0) * 6.0;\n\n  return [0.0, 4.0, 2.0].map((p) => {\n    const colH = Math.min(Math.max(Math.abs(((ht + p) % 6.0) - 3.0) - 1.0, 0.0), 1.0);\n    const colS = lerp(1.0, colH, s);\n    return v * colS;\n  }) as RawRGB;\n}\n", "/**\n * `clamp`\n *\n * @param x - value to clamp\n * @param minVal - lower bound\n * @param maxVal - upper bound\n */\nexport function clamp(x: number, minVal: number, maxVal: number): number {\n  return Math.min(Math.max(x, minVal), maxVal);\n}\n", "import { clamp } from './clamp';\n\n/**\n * `clamp(x, 0.0, 1.0)`\n *\n * @param x - value to clamp\n */\nexport function saturate(x: number): number {\n  return clamp(x, 0.0, 1.0);\n}\n", "import { saturate } from '../math/saturate';\nimport type { RawRGB } from './RawRGB';\n\n/**\n * Converts the input {@link RawRGB} to hex representation (e.g. #7f7f7f)\n *\n * @param color - color in {@link RawRGB}\n * @returns Hex representation of the color\n */\nexport function colorToHex(color: RawRGB): string {\n  const hexArray = color.map((v) =>\n    Math.round(saturate(v) * 255.0)\n      .toString(16)\n      .padStart(2, '0'),\n  );\n  return `#${hexArray.join('')}`;\n}\n", "/**\n * Return a dot product of given two vectors.\n */\nexport function vecDot<T extends number[]>(vecA: T, vecB: T): number {\n  return vecA.reduce((sum, v, i) => sum + v * vecB[i], 0.0);\n}\n", "/*!\n * Turbo colormap\n *\n * Copyright 2019 Google LLC. (Apache-2.0)\n *\n * https://gist.github.com/mikhailov-work/0d177465a8151eb6ede1768d51d476c7\n */\n\nimport { saturate } from '../math/saturate';\nimport { vecDot } from '../math/vec/vecDot';\nimport type { RawRGB } from './RawRGB';\n\n/**\n * Generate a turbo gradient.\n *\n * Ref: https://gist.github.com/mikhailov-work/0d177465a8151eb6ede1768d51d476c7\n */\nexport function colorTurbo(x: number): RawRGB {\n  const kr = [0.13572138, 4.6153926, -42.66032258, 132.13108234, -152.94239396, 59.28637943];\n  const kg = [0.09140261, 2.19418839, 4.84296658, -14.18503333, 4.27729857, 2.82956604];\n  const kb = [0.1066733, 12.64194608, -60.58204836, 110.36276771, -89.90310912, 27.34824973];\n\n  const xt = saturate(x);\n  const xv = [1.0, xt, xt * xt, xt * xt * xt, xt * xt * xt * xt, xt * xt * xt * xt * xt];\n\n  const col = [saturate(vecDot(kr, xv)), saturate(vecDot(kg, xv)), saturate(vecDot(kb, xv))];\n\n  return col as RawRGB;\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * EOTF of Rec.709 a.k.a. sRGB-to-Linear\n */\nexport function eotfRec709(value: RawRGB): RawRGB {\n  return value.map((v) => (v < 0.081 ? v / 4.5 : ((v + 0.099) / 1.099) ** (1.0 / 0.45))) as RawRGB;\n}\n", "import type { RawRGB } from './RawRGB';\n\n/**\n * OETF of Rec.709 a.k.a. Linear-to-sRGB\n */\nexport function oetfRec709(luminance: RawRGB): RawRGB {\n  return luminance.map((l) => (l < 0.018 ? 4.5 * l : 1.099 * l ** 0.45 - 0.099)) as RawRGB;\n}\n", "import type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all parent sources the specified destination has.\n * @param edges An array of dag edge\n * @param destination The target destination\n *\n * See also: {@link dagEdgesChildren}\n */\nexport function dagEdgesParents<T>(edges: RawDagEdge<T>[], destination: T): T[] {\n  return edges.filter((edge) => edge[1] === destination).map((edge) => edge[0]);\n}\n", "import { traverse } from '../algorithm/traverse';\nimport { dagEdgesParents } from './dagEdgesParents';\nimport type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all ancestor sources the specified destination has.\n * @param edges An array of dag edge\n * @param destination The target destination\n *\n * See also: {@link dagEdgesChildren}\n */\nexport function dagEdgesAncestors<T>(edges: RawDagEdge<T>[], destination: T): T[] {\n  const ancestors = new Set<T>();\n\n  traverse(destination, (node) => {\n    const parents = dagEdgesParents(edges, node);\n    parents.map((parent) => ancestors.add(parent));\n    return parents;\n  });\n\n  return Array.from(ancestors);\n}\n", "import type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all children destinations the specified source has.\n * @param edges An array of dag edge\n * @param source The target source\n *\n * See also: {@link dagEdgesDescendant}\n */\nexport function dagEdgesChildren<T>(edges: RawDagEdge<T>[], source: T): T[] {\n  return edges.filter((edge) => edge[0] === source).map((edge) => edge[1]);\n}\n", "import { traverse } from '../algorithm/traverse';\nimport { dagEdgesChildren } from './dagEdgesChildren';\nimport type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return all descendant destinations the specified source has.\n * @param edges An array of dag edge\n * @param source The target source\n *\n * See also: {@link dagEdgesChildren}\n */\nexport function dagEdgesDescendants<T>(edges: RawDagEdge<T>[], source: T): T[] {\n  const descendants = new Set<T>();\n\n  traverse(source, (node) => {\n    const children = dagEdgesChildren(edges, node);\n    children.map((child) => descendants.add(child));\n    return children;\n  });\n\n  return Array.from(descendants);\n}\n", "import type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Return first parent source the specified destination has.\n * If it can't find a parent, it will return `null` instead.\n *\n * @param edges An array of dag edge\n * @param destination The target destination\n *\n * See also: {@link dagEdgesParents}\n */\nexport function dagEdgesParent<T>(edges: RawDagEdge<T>[], destination: T): T | null {\n  return edges.find((edge) => edge[1] === destination)?.[0] ?? null;\n}\n", "import { dagEdgesParent } from './dagEdgesParent';\nimport type { RawDagEdge } from './RawDagEdge';\n\n/**\n * Resolve dag dependency relationship and give you a correct order.\n *\n * @param edges An array of dag edges\n * @param nodes An array of dag nodes\n */\nexport function dagEdgesResolve<T>(edges: RawDagEdge<T>[], nodes: T[]): T[] {\n  const order: T[] = [];\n\n  const nodeSet = new Set(nodes);\n  let tempEdges = edges.concat();\n\n  while (tempEdges.length > 0) {\n    nodeSet.forEach((node) => {\n      // is this an entrypoint?\n      const hasParents = dagEdgesParent(tempEdges, node) != null;\n\n      if (!hasParents) {\n        nodeSet.delete(node);\n        order.push(node);\n\n        // delete the structure of tempEdges from entrypoint side\n        tempEdges = tempEdges.filter(([src]) => src !== node);\n      }\n    });\n  }\n\n  return order.concat(Array.from(nodeSet));\n  //                   ^^^^^^^^^^^^^^^^^^^^^ terminator nodes\n}\n", "/**\n * Make the given function a debounced one.\n *\n * @example\n * ```ts\n * const func = debounce( 100, () => {\n *   // some expensive procedure\n * } );\n *\n * func();\n * func();\n * func();\n * ```\n */\nexport function debounce(func: () => void, timeoutMs: number): () => void {\n  /** Timeout ID for the queued function call */\n  let queueId: ReturnType<typeof setTimeout> | null | undefined;\n\n  return () => {\n    // clear any previously queued calls\n    if (queueId) {\n      clearTimeout(queueId);\n    }\n\n    // queue for execution after the timeout\n    queueId = setTimeout(() => {\n      func();\n      queueId = null;\n    }, timeoutMs);\n  };\n}\n", "/**\n * A biquad IIR filter.\n */\nexport class BiquadFilter {\n  /** Normalized feed-forward coefficient (b0 / a0). */\n  public b0a0 = 0.0;\n  /** Normalized feed-forward coefficient (b1 / a0). */\n  public b1a0 = 0.0;\n  /** Normalized feed-forward coefficient (b2 / a0). */\n  public b2a0 = 0.0;\n  /** Normalized feedback coefficient (a1 / a0). */\n  public a1a0 = 0.0;\n  /** Normalized feedback coefficient (a2 / a0). */\n  public a2a0 = 0.0;\n\n  /** Previous input sample x[n-1]. */\n  public x1 = 0.0;\n  /** Previous input sample x[n-2]. */\n  public x2 = 0.0;\n  /** Previous output sample y[n-1]. */\n  public y1 = 0.0;\n  /** Previous output sample y[n-2]. */\n  public y2 = 0.0;\n\n  /**\n   * Process a single sample.\n   *\n   * @param x0 Input sample.\n   * @returns Output sample.\n   */\n  public process(x0: number): number {\n    const y0 =\n      this.b0a0 * x0 +\n      this.b1a0 * this.x1 +\n      this.b2a0 * this.x2 -\n      this.a1a0 * this.y1 -\n      this.a2a0 * this.y2;\n\n    this.x2 = this.x1;\n    this.x1 = x0;\n    this.y2 = this.y1;\n    this.y1 = y0;\n\n    return y0;\n  }\n}\n", "import { BiquadFilter } from './BiquadFilter';\n\n/**\n * BPF made of {@link BiquadFilter}.\n */\nexport class BPF extends BiquadFilter {\n  /**\n   * @param f0Norm Normalized center frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  constructor(f0Norm: number, Q: number) {\n    super();\n    this.setCoefficientsFromParams(f0Norm, Q);\n  }\n\n  /**\n   * Update coefficients from normalized center frequency and Q.\n   *\n   * @param f0Norm Normalized center frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  public setCoefficientsFromParams(f0Norm: number, Q: number): void {\n    const omega0 = 2.0 * Math.PI * f0Norm;\n    const cosOmega0 = Math.cos(omega0);\n    const sinOmega0 = Math.sin(omega0);\n    const alpha = (0.5 * sinOmega0) / Q;\n\n    const a0 = 1.0 + alpha;\n    this.a1a0 = (-2.0 * cosOmega0) / a0;\n    this.a2a0 = (1.0 - alpha) / a0;\n    this.b0a0 = alpha / a0;\n    this.b1a0 = 0.0;\n    this.b2a0 = -this.b0a0;\n  }\n}\n", "import { BiquadFilter } from './BiquadFilter';\n\n/**\n * HPF made of {@link BiquadFilter}.\n */\nexport class HPF extends BiquadFilter {\n  /**\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  constructor(f0Norm: number, Q: number) {\n    super();\n    this.setCoefficientsFromParams(f0Norm, Q);\n  }\n\n  /**\n   * Update coefficients from normalized cutoff and Q.\n   *\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  public setCoefficientsFromParams(f0Norm: number, Q: number): void {\n    const omega0 = 2.0 * Math.PI * f0Norm;\n    const cosOmega0 = Math.cos(omega0);\n    const sinOmega0 = Math.sin(omega0);\n    const alpha = (0.5 * sinOmega0) / Q;\n\n    const a0 = 1.0 + alpha;\n    this.a1a0 = (-2.0 * cosOmega0) / a0;\n    this.a2a0 = (1.0 - alpha) / a0;\n    this.b1a0 = (cosOmega0 - 1.0) / a0;\n    this.b0a0 = this.b2a0 = -this.b1a0 / 2.0;\n  }\n}\n", "import { BiquadFilter } from './BiquadFilter';\n\n/**\n * LPF made of {@link BiquadFilter}.\n */\nexport class LPF extends BiquadFilter {\n  /**\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  constructor(f0Norm: number, Q: number) {\n    super();\n    this.setCoefficientsFromParams(f0Norm, Q);\n  }\n\n  /**\n   * Update coefficients from normalized cutoff and Q.\n   *\n   * @param f0Norm Normalized cutoff frequency. `f0 / sampleRate`.\n   * @param Q Quality factor. \"Resonance\".\n   */\n  public setCoefficientsFromParams(f0Norm: number, Q: number): void {\n    const omega0 = 2.0 * Math.PI * f0Norm;\n    const cosOmega0 = Math.cos(omega0);\n    const sinOmega0 = Math.sin(omega0);\n    const alpha = (0.5 * sinOmega0) / Q;\n\n    const a0 = 1.0 + alpha;\n    this.a1a0 = (-2.0 * cosOmega0) / a0;\n    this.a2a0 = (1.0 - alpha) / a0;\n    this.b1a0 = (1.0 - cosOmega0) / a0;\n    this.b0a0 = this.b2a0 = this.b1a0 / 2.0;\n  }\n}\n", "/**\n * A Pure Data like phasor.\n */\nexport class Phasor {\n  public freqNorm: number;\n  public phase: number;\n\n  /**\n   * @param freqNorm Normalized frequency. `freq / sampleRate`.\n   */\n  constructor(freqNorm: number) {\n    this.freqNorm = freqNorm;\n    this.phase = 0.0;\n  }\n\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const out = this.phase;\n    this.phase = (this.phase + this.freqNorm) % 1.0;\n    return out;\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A sawtooth wave oscillator.\n */\nexport class SawtoothOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return phase * 2.0 - 1.0;\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A sine wave oscillator.\n */\nexport class SineOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return Math.sin(phase * 2.0 * Math.PI);\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A square wave oscillator.\n */\nexport class SquareOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return phase < 0.5 ? 1.0 : -1.0;\n  }\n}\n", "import { Phasor } from './Phasor';\n\n/**\n * A triangle wave oscillator.\n */\nexport class TriangleOscillator extends Phasor {\n  /**\n   * Process one sample.\n   *\n   * @returns Output sample.\n   */\n  public process(): number {\n    const phase = super.process();\n    return 1.0 - 4.0 * Math.abs(phase - 0.5);\n  }\n}\n", "import { lerp } from '../math/lerp';\n\n/**\n * Do exp smoothing\n */\nexport class ExpSmooth {\n  public factor = 10.0;\n  public target = 0.0;\n  public value = 0.0;\n\n  public update(deltaTime: number): number {\n    this.value = lerp(this.target, this.value, Math.exp(-this.factor * deltaTime));\n    return this.value;\n  }\n}\n", "// yoinked from https://github.com/mapbox/tiny-sdf (BSD 2-Clause)\n// implements http://people.cs.uchicago.edu/~pff/papers/dt.pdf\n\n/**\n * Compute a one dimensional edt from the source data.\n * Returning distance will be squared.\n * Intended to be used internally in {@link edt2d}.\n *\n * @param data Data of the source\n * @param offset Offset of the source from beginning\n * @param stride Stride of the source\n * @param length Length of the source\n */\nexport function edt1d(data: Float32Array, offset: number, stride: number, length: number): void {\n  // index of rightmost parabola in lower envelope\n  let k = 0;\n\n  // locations of parabolas in lower envelope\n  const v = new Float32Array(length);\n  v[0] = 0.0;\n\n  // locations of boundaries between parabolas\n  const z = new Float32Array(length + 1);\n  z[0] = -Infinity;\n  z[1] = Infinity;\n\n  // create a straight array of input data\n  const f = new Float32Array(length);\n  for (let q = 0; q < length; q++) {\n    f[q] = data[offset + q * stride];\n  }\n\n  // compute lower envelope\n  for (let q = 1; q < length; q++) {\n    let s = 0.0;\n\n    while (0 <= k) {\n      s = (f[q] + q * q - f[v[k]] - v[k] * v[k]) / (2.0 * q - 2.0 * v[k]);\n      if (s <= z[k]) {\n        k--;\n      } else {\n        break;\n      }\n    }\n\n    k++;\n    v[k] = q;\n    z[k] = s;\n    z[k + 1] = Infinity;\n  }\n\n  k = 0;\n\n  // fill in values of distance transform\n  for (let q = 0; q < length; q++) {\n    while (z[k + 1] < q) {\n      k++;\n    }\n    const qSubVK = q - v[k];\n    data[offset + q * stride] = f[v[k]] + qSubVK * qSubVK;\n  }\n}\n\n/**\n * Compute a two dimensional edt from the source data.\n * Returning distance will be squared.\n *\n * @param data Data of the source.\n * @param width Width of the source.\n * @param height Height of the source.\n */\nexport function edt2d(data: Float32Array, width: number, height: number): void {\n  for (let x = 0; x < width; x++) {\n    edt1d(data, x, width, height);\n  }\n\n  for (let y = 0; y < height; y++) {\n    edt1d(data, y * width, 1, width);\n  }\n}\n", "/**\n * Convert given Float32Array to 32 bit float wav format.\n *\n * @param src An array of Float32Array, each representing a channel.\n * @param sampleRate The output sample rate.\n * @returns An ArrayBuffer containing the wav data.\n */\nexport function float32ArrayToWav(src: Float32Array[], sampleRate: number): ArrayBuffer {\n  const channels = src.length;\n  const samples = src[0].length;\n  const byteLength = channels * samples * 4 + 44;\n  const array = new Uint8Array(byteLength);\n  const view = new DataView(array.buffer);\n\n  let head = 0;\n\n  // 'RIFF'\n  array[head++] = 0x52;\n  array[head++] = 0x49;\n  array[head++] = 0x46;\n  array[head++] = 0x46;\n\n  // chunk size\n  const riffChunkSize = byteLength - 8;\n  array[head++] = riffChunkSize & 255;\n  array[head++] = (riffChunkSize >> 8) & 255;\n  array[head++] = (riffChunkSize >> 16) & 255;\n  array[head++] = (riffChunkSize >> 24) & 255;\n\n  // 'WAVE'\n  array[head++] = 0x57;\n  array[head++] = 0x41;\n  array[head++] = 0x56;\n  array[head++] = 0x45;\n\n  // 'fmt '\n  array[head++] = 0x66;\n  array[head++] = 0x6d;\n  array[head++] = 0x74;\n  array[head++] = 0x20;\n\n  // chunk size\n  array[head++] = 16;\n  array[head++] = 0;\n  array[head++] = 0;\n  array[head++] = 0;\n\n  // format tag: IEEE float\n  array[head++] = 3;\n  array[head++] = 0;\n\n  // channels\n  array[head++] = channels;\n  array[head++] = 0;\n\n  // samples per sec\n  array[head++] = sampleRate & 255;\n  array[head++] = (sampleRate >> 8) & 255;\n  array[head++] = (sampleRate >> 16) & 255;\n  array[head++] = (sampleRate >> 24) & 255;\n\n  // avg bytes per sec\n  const avgBytesPerSec = 4 * channels * sampleRate;\n  array[head++] = avgBytesPerSec & 255;\n  array[head++] = (avgBytesPerSec >> 8) & 255;\n  array[head++] = (avgBytesPerSec >> 16) & 255;\n  array[head++] = (avgBytesPerSec >> 24) & 255;\n\n  // block align\n  array[head++] = 4 * channels;\n  array[head++] = 0;\n\n  // bits per sample\n  array[head++] = 32;\n  array[head++] = 0;\n\n  // 'data'\n  array[head++] = 0x64;\n  array[head++] = 0x61;\n  array[head++] = 0x74;\n  array[head++] = 0x61;\n\n  // chunk size\n  const dataChunkSize = 4 * channels * samples;\n  array[head++] = dataChunkSize & 255;\n  array[head++] = (dataChunkSize >> 8) & 255;\n  array[head++] = (dataChunkSize >> 16) & 255;\n  array[head++] = (dataChunkSize >> 24) & 255;\n\n  // data\n  for (let iSample = 0; iSample < samples; iSample++) {\n    for (let iCh = 0; iCh < channels; iCh++) {\n      view.setFloat32(head, src[iCh][iSample], true);\n      head += 4;\n    }\n  }\n\n  return array.buffer;\n}\n", "/**\n * The finalization mix function used in MurmurHash3 to avalanche the bits of a hash to finalize it.\n * Useful for generating a nice-looking hash from a simple integer sequence.\n *\n * @param h - the hash to finalize\n * @returns the finalized hash\n */\nexport function fmix32(h: number): number {\n  h ^= h >>> 16;\n  h = Math.imul(h, 0x85ebca6b);\n  h ^= h >>> 13;\n  h = Math.imul(h, 0xc2b2ae35);\n  h ^= h >>> 16;\n\n  return h >>> 0;\n}\n", "export class Pool<T> {\n  public array: T[];\n\n  public index = 0;\n\n  public get current(): T {\n    return this.array[this.index];\n  }\n\n  public constructor(array: T[]) {\n    this.array = array;\n  }\n\n  public next(): T {\n    this.index = (this.index + 1) % this.array.length;\n    return this.current;\n  }\n}\n", "import { Pool } from '../Pool/Pool';\n\ninterface EXT_disjoint_timer_query_webgl2 {\n  readonly TIME_ELAPSED_EXT: number;\n}\n\nexport class GPUTimer {\n  public queries: Pool<WebGLQuery>;\n  public stack: Promise<number>[];\n  public ext: EXT_disjoint_timer_query_webgl2;\n  public readonly gl: WebGL2RenderingContext;\n\n  private __loopTasks: Set<() => void>;\n\n  public static isSupported(gl: WebGLRenderingContext | WebGL2RenderingContext): boolean {\n    return new Set(gl.getSupportedExtensions()).has('EXT_disjoint_timer_query_webgl2');\n  }\n\n  public constructor(gl: WebGL2RenderingContext) {\n    this.gl = gl;\n\n    const queries = new Array(1024).fill(1).map(() => gl.createQuery()!);\n    this.queries = new Pool(queries);\n\n    this.stack = [];\n\n    const ext = gl.getExtension('EXT_disjoint_timer_query_webgl2');\n    if (!ext) {\n      throw new Error('EXT_disjoint_timer_query_webgl2 is not supported');\n    }\n    this.ext = ext;\n\n    this.__loopTasks = new Set();\n\n    // loop\n    const update = (): void => {\n      this.update();\n      requestAnimationFrame(update);\n    };\n    update();\n  }\n\n  public update(): void {\n    Array.from(this.__loopTasks).forEach((task) => task());\n  }\n\n  public async measure(func: () => void): Promise<number> {\n    const { gl } = this;\n\n    if (this.stack.length !== 0) {\n      gl.endQuery(this.ext.TIME_ELAPSED_EXT);\n      const promiseFinishingPrev = this.check(this.queries.current);\n\n      this.stack = this.stack.map(async (promiseAccum) => {\n        return (await promiseAccum) + (await promiseFinishingPrev);\n      });\n    }\n\n    this.stack.push(Promise.resolve(0.0));\n\n    gl.beginQuery(this.ext.TIME_ELAPSED_EXT, this.queries.next());\n\n    func();\n\n    gl.endQuery(this.ext.TIME_ELAPSED_EXT);\n\n    const promiseAccum = this.stack.pop()!;\n    const promiseThis = this.check(this.queries.current);\n\n    if (this.stack.length !== 0) {\n      this.stack = this.stack.map(async (promiseAccum) => {\n        return (await promiseAccum) + (await promiseThis);\n      });\n\n      gl.beginQuery(this.ext.TIME_ELAPSED_EXT, this.queries.next());\n    }\n\n    return (await promiseAccum) + (await promiseThis);\n  }\n\n  public check(query: WebGLQuery): Promise<number> {\n    const { gl } = this;\n\n    return new Promise((resolve) => {\n      const task = (): void => {\n        const isAvailable = gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE);\n\n        if (isAvailable) {\n          this.__loopTasks.delete(task);\n          resolve(gl.getQueryParameter(query, gl.QUERY_RESULT) * 0.001 * 0.001);\n        }\n      };\n\n      this.__loopTasks.add(task);\n    });\n  }\n}\n", "/**\n * Useful for tap tempo\n * See also: {@link HistoryMeanCalculator}\n */\nexport class HistoryMeanCalculator {\n  private __recalcForEach = 0;\n  private __countUntilRecalc = 0;\n  private __history: number[] = [];\n  private __index = 0;\n  private __length: number;\n  private __count = 0;\n  private __cache = 0;\n\n  public constructor(length: number) {\n    this.__length = length;\n    this.__recalcForEach = length;\n    for (let i = 0; i < length; i++) {\n      this.__history[i] = 0;\n    }\n  }\n\n  public get mean(): number {\n    const count = Math.min(this.__count, this.__length);\n    return count === 0 ? 0.0 : this.__cache / count;\n  }\n\n  public get recalcForEach(): number {\n    return this.__recalcForEach;\n  }\n\n  public set recalcForEach(value: number) {\n    const delta = value - this.__recalcForEach;\n    this.__recalcForEach = value;\n    this.__countUntilRecalc = Math.max(0, this.__countUntilRecalc + delta);\n  }\n\n  public reset(): void {\n    this.__index = 0;\n    this.__count = 0;\n    this.__cache = 0;\n    this.__countUntilRecalc = 0;\n    for (let i = 0; i < this.__length; i++) {\n      this.__history[i] = 0;\n    }\n  }\n\n  public push(value: number): void {\n    const prev = this.__history[this.__index];\n    this.__history[this.__index] = value;\n    this.__count++;\n    this.__index = (this.__index + 1) % this.__length;\n\n    if (this.__countUntilRecalc === 0) {\n      this.recalc();\n    } else {\n      this.__countUntilRecalc--;\n      this.__cache -= prev;\n      this.__cache += value;\n    }\n  }\n\n  public recalc(): void {\n    this.__countUntilRecalc = this.__recalcForEach;\n    const sum = this.__history\n      .slice(0, Math.min(this.__count, this.__length))\n      .reduce((sum, v) => sum + v, 0);\n    this.__cache = sum;\n  }\n}\n", "import { binarySearch } from '../algorithm/binarySearch';\n\n/**\n * Useful for fps calc\n * See also: {@link HistoryMeanCalculator}\n */\nexport class HistoryPercentileCalculator {\n  private __history: number[] = [];\n  private __sorted: number[] = [];\n  private __index = 0;\n  private readonly __length: number;\n\n  public constructor(length: number) {\n    this.__length = length;\n  }\n\n  public get median(): number {\n    return this.percentile(50.0);\n  }\n\n  public percentile(percentile: number): number {\n    if (this.__history.length === 0) {\n      return 0.0;\n    }\n    return this.__sorted[Math.round(percentile * 0.01 * (this.__history.length - 1))];\n  }\n\n  public reset(): void {\n    this.__index = 0;\n    this.__history = [];\n    this.__sorted = [];\n  }\n\n  public push(value: number): void {\n    const prev = this.__history[this.__index];\n    this.__history[this.__index] = value;\n    this.__index = (this.__index + 1) % this.__length;\n\n    // remove the prev from sorted array\n    if (this.__sorted.length === this.__length) {\n      const prevIndex = binarySearch(this.__sorted, prev);\n      this.__sorted.splice(prevIndex, 1);\n    }\n\n    const index = binarySearch(this.__sorted, value);\n    this.__sorted.splice(index, 0, value);\n  }\n}\n", "import { HistoryPercentileCalculator } from './HistoryPercentileCalculator';\n\n/**\n * @deprecated It's actually just a special case of {@link HistoryPercentileCalculator}\n */\nexport class HistoryMedianCalculator extends HistoryPercentileCalculator {\n  public constructor(length: number) {\n    super(length);\n    console.warn('HistoryMedianCalculator: Deprecated. Use HistoryPercentileCalculator instead');\n  }\n}\n", "/**\n * Convert given Int16Array to 16 bit wav format.\n *\n * @param src An array of Int16Array, each representing a channel.\n * @param sampleRate The output sample rate.\n * @returns An ArrayBuffer containing the wav data.\n */\nexport function int16ArrayToWav(src: Int16Array[], sampleRate: number): ArrayBuffer {\n  const channels = src.length;\n  const samples = src[0].length;\n  const byteLength = channels * samples * 2 + 44;\n  const array = new Uint8Array(byteLength);\n\n  let head = 0;\n\n  // 'RIFF'\n  array[head++] = 0x52;\n  array[head++] = 0x49;\n  array[head++] = 0x46;\n  array[head++] = 0x46;\n\n  // chunk size\n  const riffChunkSize = byteLength - 8;\n  array[head++] = riffChunkSize & 255;\n  array[head++] = (riffChunkSize >> 8) & 255;\n  array[head++] = (riffChunkSize >> 16) & 255;\n  array[head++] = (riffChunkSize >> 24) & 255;\n\n  // 'WAVE'\n  array[head++] = 0x57;\n  array[head++] = 0x41;\n  array[head++] = 0x56;\n  array[head++] = 0x45;\n\n  // 'fmt '\n  array[head++] = 0x66;\n  array[head++] = 0x6d;\n  array[head++] = 0x74;\n  array[head++] = 0x20;\n\n  // chunk size\n  array[head++] = 16;\n  array[head++] = 0;\n  array[head++] = 0;\n  array[head++] = 0;\n\n  // format tag\n  array[head++] = 1;\n  array[head++] = 0;\n\n  // channels\n  array[head++] = channels;\n  array[head++] = 0;\n\n  // samples per sec\n  array[head++] = sampleRate & 255;\n  array[head++] = (sampleRate >> 8) & 255;\n  array[head++] = (sampleRate >> 16) & 255;\n  array[head++] = (sampleRate >> 24) & 255;\n\n  // avg bytes per sec\n  const avgBytesPerSec = 2 * channels * sampleRate;\n  array[head++] = avgBytesPerSec & 255;\n  array[head++] = (avgBytesPerSec >> 8) & 255;\n  array[head++] = (avgBytesPerSec >> 16) & 255;\n  array[head++] = (avgBytesPerSec >> 24) & 255;\n\n  // block align\n  array[head++] = 2 * channels;\n  array[head++] = 0;\n\n  // bits per sample\n  array[head++] = 16;\n  array[head++] = 0;\n\n  // 'data'\n  array[head++] = 0x64;\n  array[head++] = 0x61;\n  array[head++] = 0x74;\n  array[head++] = 0x61;\n\n  // chunk size\n  const dataChunkSize = 2 * channels * samples;\n  array[head++] = dataChunkSize & 255;\n  array[head++] = (dataChunkSize >> 8) & 255;\n  array[head++] = (dataChunkSize >> 16) & 255;\n  array[head++] = (dataChunkSize >> 24) & 255;\n\n  // data\n  for (let iSample = 0; iSample < samples; iSample++) {\n    for (let iCh = 0; iCh < channels; iCh++) {\n      const data = src[iCh][iSample];\n      array[head++] = data & 255;\n      array[head++] = (data >> 8) & 255;\n    }\n  }\n\n  return array.buffer;\n}\n", "export class MapOfSet<K, V> {\n  public readonly map: Map<K, Set<V>>;\n\n  public constructor() {\n    this.map = new Map();\n  }\n\n  public get(key: K): Set<V> {\n    return this.map.get(key) ?? new Set();\n  }\n\n  public add(key: K, value: V): void {\n    let set = this.map.get(key);\n    if (set == null) {\n      set = new Set();\n      this.map.set(key, set);\n    }\n    set.add(value);\n  }\n}\n", "/**\n * Scale the given vector by a scalar.\n */\nexport function vecScale<T extends number[]>(vec: T, scalar: number): T {\n  return vec.map((v) => v * scalar) as T;\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Who needs this?\n *\n * Intended to be used by {@link mat3CreateNormalMatrix}.\n */\nexport function mat3FromMat4Transpose(source: RawMatrix4): RawMatrix3 {\n  return [\n    source[0],\n    source[4],\n    source[8],\n    source[1],\n    source[5],\n    source[9],\n    source[2],\n    source[6],\n    source[10],\n  ];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Return an inverse of given mat3.\n *\n * Yoinked from Three.js\n */\nexport function mat3Inverse(m: RawMatrix3): RawMatrix3 {\n  const n11 = m[0],\n    n21 = m[1],\n    n31 = m[2],\n    n12 = m[3],\n    n22 = m[4],\n    n32 = m[5],\n    n13 = m[6],\n    n23 = m[7],\n    n33 = m[8],\n    t11 = n33 * n22 - n32 * n23,\n    t12 = n32 * n13 - n33 * n12,\n    t13 = n23 * n12 - n22 * n13,\n    det = n11 * t11 + n21 * t12 + n31 * t13;\n\n  if (det === 0.0) {\n    return vecScale(m, 0.0);\n  }\n\n  return vecScale(\n    [\n      t11,\n      n31 * n23 - n33 * n21,\n      n32 * n21 - n31 * n22,\n      t12,\n      n33 * n11 - n31 * n13,\n      n31 * n12 - n32 * n11,\n      t13,\n      n21 * n13 - n23 * n11,\n      n22 * n11 - n21 * n12,\n    ],\n    1.0 / det,\n  );\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { mat3FromMat4Transpose } from './mat3FromMat4Transpose';\nimport { mat3Inverse } from './mat3Inverse';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Create a normal matrix out of a matrix4.\n *\n * @param matrix A matrix4\n */\nexport function mat3CreateNormalMatrix(m: RawMatrix4): RawMatrix3 {\n  return mat3Inverse(mat3FromMat4Transpose(m));\n}\n", "import type { RawMatrix3 } from './RawMatrix3';\n\nexport function mat3Determinant(m: RawMatrix3): number {\n  const n11 = m[0],\n    n21 = m[1],\n    n31 = m[2],\n    n12 = m[3],\n    n22 = m[4],\n    n32 = m[5],\n    n13 = m[6],\n    n23 = m[7],\n    n33 = m[8],\n    t11 = n33 * n22 - n32 * n23,\n    t12 = n32 * n13 - n33 * n12,\n    t13 = n23 * n12 - n22 * n13;\n\n  return n11 * t11 + n21 * t12 + n31 * t13;\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Create a matrix3 from matrix4.\n */\nexport function mat3FromMat4(source: RawMatrix4): RawMatrix3 {\n  return [\n    source[0],\n    source[1],\n    source[2],\n    source[4],\n    source[5],\n    source[6],\n    source[8],\n    source[9],\n    source[10],\n  ];\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Convert a quaternion into a matrix3.\n *\n * Yoinked from Three.js.\n *\n * See: https://threejs.org/docs/#api/en/math/Matrix4.makeRotationFromQuaternion\n */\nexport function mat3FromQuaternion(quat: RawQuaternion): RawMatrix3 {\n  const x = quat[0];\n  const y = quat[1];\n  const z = quat[2];\n  const w = quat[3];\n\n  return [\n    1.0 - 2.0 * y * y - 2.0 * z * z,\n    2.0 * x * y + 2.0 * z * w,\n    2.0 * x * z - 2.0 * y * w,\n    2.0 * x * y - 2.0 * z * w,\n    1.0 - 2.0 * x * x - 2.0 * z * z,\n    2.0 * y * z + 2.0 * x * w,\n    2.0 * x * z + 2.0 * y * w,\n    2.0 * y * z - 2.0 * x * w,\n    1.0 - 2.0 * x * x - 2.0 * y * y,\n  ];\n}\n", "import type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Return a multiplication result of matrices.\n */\nexport function mat3Multiply(...mats: RawMatrix3[]): RawMatrix3 {\n  if (mats.length < 2) {\n    return mats[0];\n  }\n\n  const a = mats.shift()!;\n  const b = mat3Multiply(...mats);\n  const a00 = a[0],\n    a01 = a[1],\n    a02 = a[2],\n    a10 = a[3],\n    a11 = a[4],\n    a12 = a[5],\n    a20 = a[6],\n    a21 = a[7],\n    a22 = a[8],\n    b00 = b[0],\n    b01 = b[1],\n    b02 = b[2],\n    b10 = b[3],\n    b11 = b[4],\n    b12 = b[5],\n    b20 = b[6],\n    b21 = b[7],\n    b22 = b[8];\n\n  return [\n    a00 * b00 + a10 * b01 + a20 * b02,\n    a01 * b00 + a11 * b01 + a21 * b02,\n    a02 * b00 + a12 * b01 + a22 * b02,\n\n    a00 * b10 + a10 * b11 + a20 * b12,\n    a01 * b10 + a11 * b11 + a21 * b12,\n    a02 * b10 + a12 * b11 + a22 * b12,\n\n    a00 * b20 + a10 * b21 + a20 * b22,\n    a01 * b20 + a11 * b21 + a21 * b22,\n    a02 * b20 + a12 * b21 + a22 * b22,\n  ];\n}\n", "import type { RawMatrix3 } from './RawMatrix3';\n\n/**\n * Transpose a mat3.\n */\nexport function mat3Transpose(source: RawMatrix3): RawMatrix3 {\n  return [\n    source[0],\n    source[3],\n    source[6],\n    source[1],\n    source[4],\n    source[7],\n    source[2],\n    source[5],\n    source[8],\n  ];\n}\n", "import { Matrix4 } from '../mat4/Matrix4';\nimport type { Quaternion } from '../quat/Quaternion';\nimport { vecScale } from '../vec/vecScale';\nimport { mat3CreateNormalMatrix } from './mat3CreateNormalMatrix';\nimport { mat3Determinant } from './mat3Determinant';\nimport { mat3FromMat4 } from './mat3FromMat4';\nimport { mat3FromQuaternion } from './mat3FromQuaternion';\nimport { mat3Inverse } from './mat3Inverse';\nimport { mat3Multiply } from './mat3Multiply';\nimport { mat3Transpose } from './mat3Transpose';\nimport type { RawMatrix3 } from './RawMatrix3';\n\n// biome-ignore format: matrix\nconst rawIdentityMatrix3: RawMatrix3 = [\n  1.0, 0.0, 0.0,\n  0.0, 1.0, 0.0,\n  0.0, 0.0, 1.0,\n];\n\n/**\n * A Matrix3.\n */\nexport class Matrix3 {\n  public elements: RawMatrix3;\n\n  public constructor(v: RawMatrix3 = rawIdentityMatrix3) {\n    this.elements = v;\n  }\n\n  /**\n   * Itself but transposed.\n   */\n  public get transpose(): Matrix3 {\n    return new Matrix3(mat3Transpose(this.elements));\n  }\n\n  /**\n   * Its determinant.\n   */\n  public get determinant(): number {\n    return mat3Determinant(this.elements);\n  }\n\n  /**\n   * Itself but inverted.\n   */\n  public get inverse(): Matrix3 {\n    return new Matrix3(mat3Inverse(this.elements));\n  }\n\n  /**\n   * Itself but matrix4.\n   */\n  public get matrix4(): Matrix4 {\n    return Matrix4.fromMatrix3(this);\n  }\n\n  public toString(): string {\n    const m = this.elements.map((v) => v.toFixed(3));\n    return `Matrix3( ${m[0]}, ${m[3]}, ${m[6]}; ${m[1]}, ${m[4]}, ${m[7]}; ${m[2]}, ${m[5]}, ${m[8]} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Matrix3 {\n    return new Matrix3(this.elements.concat() as RawMatrix3);\n  }\n\n  /**\n   * Multiply this Matrix3 by one or more Matrix3s.\n   */\n  public multiply(...matrices: Matrix3[]): Matrix3 {\n    return Matrix3.multiply(this, ...matrices);\n  }\n\n  /**\n   * Multiply this Matrix3 by a scalar.\n   */\n  public scaleScalar(scalar: number): Matrix3 {\n    return new Matrix3(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * An identity Matrix4.\n   */\n  public static get identity(): Matrix3 {\n    return new Matrix3(rawIdentityMatrix3);\n  }\n\n  /**\n   * Multiply two or more matrices.\n   * @param matrices Matrices\n   */\n  public static multiply(...matrices: Matrix3[]): Matrix3 {\n    if (matrices.length === 0) {\n      return Matrix3.identity;\n    } else {\n      return new Matrix3(mat3Multiply(...matrices.map((m) => m.elements)));\n    }\n  }\n\n  /**\n   * Create a normal matrix out of matrix4.\n   * @param matrix4 A matrix4\n   */\n  public static createNormalMatrix(matrix4: Matrix4): Matrix3 {\n    return new Matrix3(mat3CreateNormalMatrix(matrix4.elements));\n  }\n\n  /**\n   * Cast a {@link Matrix4} into a Matrix3.\n   * @param matrix4 A matrix4\n   */\n  public static fromMatrix4(matrix4: Matrix4): Matrix3 {\n    return new Matrix3(mat3FromMat4(matrix4.elements));\n  }\n\n  /**\n   * Create a matrix out of a {@link Quaternion}.\n   * @param quaternion A quaternion\n   */\n  public static fromQuaternion(quaternion: Quaternion): Matrix3 {\n    return new Matrix3(mat3FromQuaternion(quaternion.elements));\n  }\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawMatrix4 } from '.';\n\n/**\n * Convert a quaternion into a matrix4.\n *\n * Yoinked from Three.js.\n *\n * See: https://threejs.org/docs/#api/en/math/Matrix4.makeRotationFromQuaternion\n */\nexport function mat4FromQuaternion(quat: RawQuaternion): RawMatrix4 {\n  const x = quat[0];\n  const y = quat[1];\n  const z = quat[2];\n  const w = quat[3];\n\n  return [\n    1.0 - 2.0 * y * y - 2.0 * z * z,\n    2.0 * x * y + 2.0 * z * w,\n    2.0 * x * z - 2.0 * y * w,\n    0.0,\n    2.0 * x * y - 2.0 * z * w,\n    1.0 - 2.0 * x * x - 2.0 * z * z,\n    2.0 * y * z + 2.0 * x * w,\n    0.0,\n    2.0 * x * z + 2.0 * y * w,\n    2.0 * y * z - 2.0 * x * w,\n    1.0 - 2.0 * x * x - 2.0 * y * y,\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    1.0,\n  ];\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { mat4FromQuaternion } from './mat4FromQuaternion';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Compose a matrix out of position, scale, and rotation.\n * Yoinked from Three.js.\n */\nexport function mat4Compose(\n  position: RawVector3,\n  rotation: RawQuaternion,\n  scale: RawVector3,\n): RawMatrix4 {\n  const matRot = mat4FromQuaternion(rotation);\n\n  const sx = scale[0],\n    sy = scale[1],\n    sz = scale[2];\n\n  return [\n    matRot[0] * sx,\n    matRot[1] * sx,\n    matRot[2] * sx,\n    0.0,\n\n    matRot[4] * sy,\n    matRot[5] * sy,\n    matRot[6] * sy,\n    0.0,\n\n    matRot[8] * sz,\n    matRot[9] * sz,\n    matRot[10] * sz,\n    0.0,\n\n    position[0],\n    position[1],\n    position[2],\n    1.0,\n  ];\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of a rotation matrix.\n * Yoinked from Three.js.\n */\nexport function quatFromMatrix3(m: RawMatrix3): RawQuaternion {\n  const m11 = m[0],\n    m12 = m[3],\n    m13 = m[6],\n    m21 = m[1],\n    m22 = m[4],\n    m23 = m[7],\n    m31 = m[2],\n    m32 = m[5],\n    m33 = m[8],\n    trace = m11 + m22 + m33;\n\n  if (trace > 0) {\n    const s = 0.5 / Math.sqrt(trace + 1.0);\n    return [(m32 - m23) * s, (m13 - m31) * s, (m21 - m12) * s, 0.25 / s];\n  } else if (m11 > m22 && m11 > m33) {\n    const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n    return [0.25 * s, (m12 + m21) / s, (m13 + m31) / s, (m32 - m23) / s];\n  } else if (m22 > m33) {\n    const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n    return [(m12 + m21) / s, 0.25 * s, (m23 + m32) / s, (m13 - m31) / s];\n  } else {\n    const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n    return [(m13 + m31) / s, (m23 + m32) / s, 0.25 * s, (m21 - m12) / s];\n  }\n}\n", "import { mat3FromMat4 } from '../mat3/mat3FromMat4';\nimport type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { quatFromMatrix3 } from './quatFromMatrix3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of a rotation matrix.\n */\nexport function quatFromMatrix4(m: RawMatrix4): RawQuaternion {\n  return quatFromMatrix3(mat3FromMat4(m));\n}\n", "/**\n * Return an euclidean length of given vector.\n */\nexport function vecLength<T extends number[]>(vec: T): number {\n  return Math.sqrt(vec.reduce((sum, v) => sum + v * v, 0.0));\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Return a determinant of given mat4.\n */\nexport function mat4Determinant(m: RawMatrix4): number {\n  const a00 = m[0],\n    a01 = m[1],\n    a02 = m[2],\n    a03 = m[3],\n    a10 = m[4],\n    a11 = m[5],\n    a12 = m[6],\n    a13 = m[7],\n    a20 = m[8],\n    a21 = m[9],\n    a22 = m[10],\n    a23 = m[11],\n    a30 = m[12],\n    a31 = m[13],\n    a32 = m[14],\n    a33 = m[15],\n    b00 = a00 * a11 - a01 * a10,\n    b01 = a00 * a12 - a02 * a10,\n    b02 = a00 * a13 - a03 * a10,\n    b03 = a01 * a12 - a02 * a11,\n    b04 = a01 * a13 - a03 * a11,\n    b05 = a02 * a13 - a03 * a12,\n    b06 = a20 * a31 - a21 * a30,\n    b07 = a20 * a32 - a22 * a30,\n    b08 = a20 * a33 - a23 * a30,\n    b09 = a21 * a32 - a22 * a31,\n    b10 = a21 * a33 - a23 * a31,\n    b11 = a22 * a33 - a23 * a32;\n\n  return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n", "import { quatFromMatrix4 } from '../quat/quatFromMatrix4';\nimport type { RawQuaternion } from '../quat/RawQuaternion';\nimport { vecLength } from '../vec/vecLength';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { mat4Determinant } from './mat4Determinant';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Decompose a matrix into a position, a scale, and a rotation.\n * Yoinked from Three.js.\n */\nexport function mat4Decompose(m: RawMatrix4): {\n  position: RawVector3;\n  scale: RawVector3;\n  rotation: RawQuaternion;\n} {\n  let sx = vecLength([m[0], m[1], m[2]]);\n  const sy = vecLength([m[4], m[5], m[6]]);\n  const sz = vecLength([m[8], m[9], m[10]]);\n\n  // if determinant is negative, we need to invert one scale\n  const det = mat4Determinant(m);\n  if (det < 0) {\n    sx = -sx;\n  }\n\n  const invSx = 1.0 / sx;\n  const invSy = 1.0 / sy;\n  const invSz = 1.0 / sz;\n\n  const rotationMatrix = m.concat() as RawMatrix4;\n\n  rotationMatrix[0] *= invSx;\n  rotationMatrix[1] *= invSx;\n  rotationMatrix[2] *= invSx;\n\n  rotationMatrix[4] *= invSy;\n  rotationMatrix[5] *= invSy;\n  rotationMatrix[6] *= invSy;\n\n  rotationMatrix[8] *= invSz;\n  rotationMatrix[9] *= invSz;\n  rotationMatrix[10] *= invSz;\n\n  return {\n    position: [m[12], m[13], m[14]],\n    scale: [sx, sy, sz],\n    rotation: quatFromMatrix4(rotationMatrix),\n  };\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Create a matrix4 from matrix3.\n */\nexport function mat4FromMat3(source: RawMatrix3): RawMatrix4 {\n  return [\n    source[0],\n    source[1],\n    source[2],\n    0.0,\n    source[3],\n    source[4],\n    source[5],\n    0.0,\n    source[6],\n    source[7],\n    source[8],\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    1.0,\n  ];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n *  an inverse of given mat4.\n */\nexport function mat4Inverse(m: RawMatrix4): RawMatrix4 {\n  const a00 = m[0],\n    a01 = m[1],\n    a02 = m[2],\n    a03 = m[3],\n    a10 = m[4],\n    a11 = m[5],\n    a12 = m[6],\n    a13 = m[7],\n    a20 = m[8],\n    a21 = m[9],\n    a22 = m[10],\n    a23 = m[11],\n    a30 = m[12],\n    a31 = m[13],\n    a32 = m[14],\n    a33 = m[15],\n    b00 = a00 * a11 - a01 * a10,\n    b01 = a00 * a12 - a02 * a10,\n    b02 = a00 * a13 - a03 * a10,\n    b03 = a01 * a12 - a02 * a11,\n    b04 = a01 * a13 - a03 * a11,\n    b05 = a02 * a13 - a03 * a12,\n    b06 = a20 * a31 - a21 * a30,\n    b07 = a20 * a32 - a22 * a30,\n    b08 = a20 * a33 - a23 * a30,\n    b09 = a21 * a32 - a22 * a31,\n    b10 = a21 * a33 - a23 * a31,\n    b11 = a22 * a33 - a23 * a32;\n\n  const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (det === 0.0) {\n    return vecScale(m, 0.0);\n  }\n\n  return vecScale(\n    [\n      a11 * b11 - a12 * b10 + a13 * b09,\n      a02 * b10 - a01 * b11 - a03 * b09,\n      a31 * b05 - a32 * b04 + a33 * b03,\n      a22 * b04 - a21 * b05 - a23 * b03,\n      a12 * b08 - a10 * b11 - a13 * b07,\n      a00 * b11 - a02 * b08 + a03 * b07,\n      a32 * b02 - a30 * b05 - a33 * b01,\n      a20 * b05 - a22 * b02 + a23 * b01,\n      a10 * b10 - a11 * b08 + a13 * b06,\n      a01 * b08 - a00 * b10 - a03 * b06,\n      a30 * b04 - a31 * b02 + a33 * b00,\n      a21 * b02 - a20 * b04 - a23 * b00,\n      a11 * b07 - a10 * b09 - a12 * b06,\n      a00 * b09 - a01 * b07 + a02 * b06,\n      a31 * b01 - a30 * b03 - a32 * b00,\n      a20 * b03 - a21 * b01 + a22 * b00,\n    ],\n    1.0 / det,\n  );\n}\n", "/**\n * Return a sum of vectors.\n */\nexport function vecAdd<T extends number[]>(...vecs: T[]): T {\n  if (vecs.length < 2) {\n    return vecs[0];\n  }\n\n  const a = vecs.shift()!;\n  const b = vecAdd(...vecs);\n\n  return a.map((v, i) => v + b[i]) as T;\n}\n", "import { vecLength } from './vecLength';\nimport { vecScale } from './vecScale';\n\n/**\n * Normalize given vector.\n * If the length of given vector is 0.0, it will return a zero vector instead.\n */\nexport function vecNormalize<T extends number[]>(vec: T): T {\n  const len = vecLength(vec);\n  const invLen = len === 0.0 ? 0.0 : 1.0 / len;\n  return vecScale(vec, invLen);\n}\n", "/**\n * Subtract a vector from a vector.\n */\nexport function vecSub<T extends number[]>(vecA: T, vecB: T): T {\n  return vecA.map((v, i) => v - vecB[i]) as T;\n}\n", "import type { RawVector3 } from './RawVector3';\n\n/**\n * Return a cross product of two vec3s.\n */\nexport function vec3Cross(vecA: RawVector3, vecB: RawVector3): RawVector3 {\n  return [\n    vecA[1] * vecB[2] - vecA[2] * vecB[1],\n    vecA[2] * vecB[0] - vecA[0] * vecB[2],\n    vecA[0] * vecB[1] - vecA[1] * vecB[0],\n  ];\n}\n", "import { vecAdd } from '../vec/vecAdd';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3Cross } from '../vec3/vec3Cross';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a \"LookAt\" matrix.\n *\n * See also: {@link mat4LookAtInverse}\n */\nexport function mat4LookAt(\n  position: RawVector3,\n  target: RawVector3 = [0.0, 0.0, 0.0],\n  up: RawVector3 = [0.0, 1.0, 0.0],\n  roll = 0.0,\n): RawMatrix4 {\n  const dir = vecNormalize(vecSub(position, target));\n\n  let sid = vecNormalize(vec3Cross(up, dir));\n\n  if (roll !== 0.0) {\n    sid = vecAdd(vecScale(sid, Math.cos(roll)), vecScale(vec3Cross(dir, sid), Math.sin(roll)));\n  }\n\n  const top = vec3Cross(dir, sid);\n\n  // biome-ignore format: matrix\n  return [\n    sid[0], sid[1], sid[2], 0.0,\n    top[0], top[1], top[2], 0.0,\n    dir[0], dir[1], dir[2], 0.0,\n    position[0], position[1], position[2], 1.0,\n  ];\n}\n", "import { vecAdd } from '../vec/vecAdd';\nimport { vecDot } from '../vec/vecDot';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3Cross } from '../vec3/vec3Cross';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate an inverse of \"LookAt\" matrix. Good for creating a view matrix.\n *\n * See also: {@link mat4LookAt}\n */\nexport function mat4LookAtInverse(\n  position: RawVector3,\n  target: RawVector3 = [0.0, 0.0, 0.0],\n  up: RawVector3 = [0.0, 1.0, 0.0],\n  roll = 0.0,\n): RawMatrix4 {\n  const dir = vecNormalize(vecSub(position, target));\n\n  let sid = vecNormalize(vec3Cross(up, dir));\n\n  if (roll !== 0.0) {\n    // biome-ignore format: readability\n    sid = vecAdd(\n      vecScale(sid, Math.cos(roll)),\n      vecScale(vec3Cross(dir, sid), Math.sin(roll)),\n    );\n  }\n\n  const top = vec3Cross(dir, sid);\n\n  // biome-ignore format: matrix\n  return [\n    sid[0], top[0], dir[0], 0.0,\n    sid[1], top[1], dir[1], 0.0,\n    sid[2], top[2], dir[2], 0.0,\n    -vecDot(sid, position), -vecDot(top, position), -vecDot(dir, position), 1.0,\n  ];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Return a multiplication result of matrices.\n */\nexport function mat4Multiply(...mats: RawMatrix4[]): RawMatrix4 {\n  if (mats.length < 2) {\n    return mats[0];\n  }\n\n  const a = mats.shift()!;\n  const b = mat4Multiply(...mats);\n  const a00 = a[0],\n    a01 = a[1],\n    a02 = a[2],\n    a03 = a[3],\n    a10 = a[4],\n    a11 = a[5],\n    a12 = a[6],\n    a13 = a[7],\n    a20 = a[8],\n    a21 = a[9],\n    a22 = a[10],\n    a23 = a[11],\n    a30 = a[12],\n    a31 = a[13],\n    a32 = a[14],\n    a33 = a[15],\n    b00 = b[0],\n    b01 = b[1],\n    b02 = b[2],\n    b03 = b[3],\n    b10 = b[4],\n    b11 = b[5],\n    b12 = b[6],\n    b13 = b[7],\n    b20 = b[8],\n    b21 = b[9],\n    b22 = b[10],\n    b23 = b[11],\n    b30 = b[12],\n    b31 = b[13],\n    b32 = b[14],\n    b33 = b[15];\n\n  return [\n    a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03,\n    a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03,\n    a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03,\n    a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03,\n\n    a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13,\n    a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13,\n    a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13,\n    a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13,\n\n    a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23,\n    a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23,\n    a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23,\n    a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23,\n\n    a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33,\n    a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33,\n    a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33,\n    a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33,\n  ];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a \"Perspective\" projection matrix.\n *\n * @param fov Field of View Y, **IN DEGREES**\n * @param near Near clip plane\n * @param far Far clip plane\n * @param aspect Aspect ratio. **`1.0` BY DEFAULT**\n */\nexport function mat4Perspective(fov = 45.0, near = 0.01, far = 100.0, aspect = 1.0): RawMatrix4 {\n  const p = 1.0 / Math.tan((fov * Math.PI) / 360.0);\n  const d = far - near;\n  return [\n    p / aspect,\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    p,\n    0.0,\n    0.0,\n    0.0,\n    0.0,\n    -(far + near) / d,\n    -1.0,\n    0.0,\n    0.0,\n    (-2 * far * near) / d,\n    0.0,\n  ];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d rotation matrix, rotates around x axis.\n */\nexport function mat4RotationX(theta: number): RawMatrix4 {\n  const c = Math.cos(theta);\n  const s = Math.sin(theta);\n\n  return [1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d rotation matrix, rotates around y axis.\n */\nexport function mat4RotationY(theta: number): RawMatrix4 {\n  const c = Math.cos(theta);\n  const s = Math.sin(theta);\n\n  return [c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d rotation matrix, rotates around z axis.\n */\nexport function mat4RotationZ(theta: number): RawMatrix4 {\n  const c = Math.cos(theta);\n  const s = Math.sin(theta);\n\n  return [c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d scaling matrix.\n */\nexport function mat4Scale(vec: RawVector3): RawMatrix4 {\n  return [vec[0], 0, 0, 0, 0, vec[1], 0, 0, 0, 0, vec[2], 0, 0, 0, 0, 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a 3d scaling matrix by a scalar.\n */\nexport function mat4ScaleScalar(scalar: number): RawMatrix4 {\n  return [scalar, 0, 0, 0, 0, scalar, 0, 0, 0, 0, scalar, 0, 0, 0, 0, 1];\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Generate a translation matrix.\n */\nexport function mat4Translate(vec: RawVector3): RawMatrix4 {\n  return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, vec[0], vec[1], vec[2], 1];\n}\n", "import type { RawMatrix4 } from './RawMatrix4';\n\n/**\n * Transpose a mat4.\n */\nexport function mat4Transpose(m: RawMatrix4): RawMatrix4 {\n  return [\n    m[0],\n    m[4],\n    m[8],\n    m[12],\n    m[1],\n    m[5],\n    m[9],\n    m[13],\n    m[2],\n    m[6],\n    m[10],\n    m[14],\n    m[3],\n    m[7],\n    m[11],\n    m[15],\n  ];\n}\n", "import { Matrix3 } from '../mat3/Matrix3';\nimport { Quaternion } from '../quat/Quaternion';\nimport { vecScale } from '../vec/vecScale';\nimport { Vector3 } from '../vec3/Vector3';\nimport { mat4Compose } from './mat4Compose';\nimport { mat4Decompose } from './mat4Decompose';\nimport { mat4Determinant } from './mat4Determinant';\nimport { mat4FromMat3 } from './mat4FromMat3';\nimport { mat4FromQuaternion } from './mat4FromQuaternion';\nimport { mat4Inverse } from './mat4Inverse';\nimport { mat4LookAt } from './mat4LookAt';\nimport { mat4LookAtInverse } from './mat4LookAtInverse';\nimport { mat4Multiply } from './mat4Multiply';\nimport { mat4Perspective } from './mat4Perspective';\nimport { mat4RotationX } from './mat4RotationX';\nimport { mat4RotationY } from './mat4RotationY';\nimport { mat4RotationZ } from './mat4RotationZ';\nimport { mat4Scale } from './mat4Scale';\nimport { mat4ScaleScalar } from './mat4ScaleScalar';\nimport { mat4Translate } from './mat4Translate';\nimport { mat4Transpose } from './mat4Transpose';\nimport type { RawMatrix4 } from './RawMatrix4';\n\n// biome-ignore format: matrix\nconst rawIdentityMatrix4: RawMatrix4 = [\n  1.0, 0.0, 0.0, 0.0,\n  0.0, 1.0, 0.0, 0.0,\n  0.0, 0.0, 1.0, 0.0,\n  0.0, 0.0, 0.0, 1.0,\n];\n\n/**\n * A Matrix4.\n */\nexport class Matrix4 {\n  public elements: RawMatrix4;\n\n  public constructor(v: RawMatrix4 = rawIdentityMatrix4) {\n    this.elements = v;\n  }\n\n  /**\n   * Itself but transposed.\n   */\n  public get transpose(): Matrix4 {\n    return new Matrix4(mat4Transpose(this.elements));\n  }\n\n  /**\n   * Its determinant.\n   */\n  public get determinant(): number {\n    return mat4Determinant(this.elements);\n  }\n\n  /**\n   * Itself but inverted.\n   */\n  public get inverse(): Matrix4 {\n    return new Matrix4(mat4Inverse(this.elements));\n  }\n\n  /**\n   * Itself but matrix3.\n   */\n  public get matrix3(): Matrix3 {\n    return Matrix3.fromMatrix4(this);\n  }\n\n  /**\n   * Itself but normal matrix.\n   */\n  public get normalMatrix(): Matrix3 {\n    return Matrix3.createNormalMatrix(this);\n  }\n\n  public toString(): string {\n    const m = this.elements.map((v) => v.toFixed(3));\n    return `Matrix4( ${m[0]}, ${m[4]}, ${m[8]}, ${m[12]}; ${m[1]}, ${m[5]}, ${m[9]}, ${m[13]}; ${m[2]}, ${m[6]}, ${m[10]}, ${m[14]}; ${m[3]}, ${m[7]}, ${m[11]}, ${m[15]} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Matrix4 {\n    return new Matrix4(this.elements.concat() as RawMatrix4);\n  }\n\n  /**\n   * Multiply this Matrix4 by one or more Matrix4s.\n   */\n  public multiply(...matrices: Matrix4[]): Matrix4 {\n    return Matrix4.multiply(this, ...matrices);\n  }\n\n  /**\n   * Multiply this Matrix4 by a scalar.\n   */\n  public scaleScalar(scalar: number): Matrix4 {\n    return new Matrix4(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * Decompose this matrix into a position, a scale, and a rotation.\n   */\n  public decompose(): {\n    position: Vector3;\n    scale: Vector3;\n    rotation: Quaternion;\n  } {\n    const { position, scale, rotation } = mat4Decompose(this.elements);\n\n    return {\n      position: new Vector3(position),\n      scale: new Vector3(scale),\n      rotation: new Quaternion(rotation),\n    };\n  }\n\n  /**\n   * An identity Matrix4.\n   */\n  public static get identity(): Matrix4 {\n    return new Matrix4(rawIdentityMatrix4);\n  }\n\n  /**\n   * Multiply two or more matrices.\n   * @param matrices Matrices\n   */\n  public static multiply(...matrices: Matrix4[]): Matrix4 {\n    if (matrices.length === 0) {\n      return Matrix4.identity;\n    } else {\n      return new Matrix4(mat4Multiply(...matrices.map((m) => m.elements)));\n    }\n  }\n\n  /**\n   * Create a matrix out of a {@link Quaternion}.\n   * @param quaternion A quaternion\n   */\n  public static fromQuaternion(quaternion: Quaternion): Matrix4 {\n    return new Matrix4(mat4FromQuaternion(quaternion.elements));\n  }\n\n  /**\n   * Cast a {@link Matrix3} into a Matrix4.\n   * @param matrix3 A matrix3\n   */\n  public static fromMatrix3(matrix3: Matrix3): Matrix4 {\n    return new Matrix4(mat4FromMat3(matrix3.elements));\n  }\n\n  /**\n   * Generate a translation matrix.\n   * @param vector Translation\n   */\n  public static translate(vector: Vector3): Matrix4 {\n    return new Matrix4(mat4Translate(vector.elements));\n  }\n\n  /**\n   * Generate a 3d scaling matrix.\n   * @param vector Scale\n   */\n  public static scale(vector: Vector3): Matrix4 {\n    return new Matrix4(mat4Scale(vector.elements));\n  }\n\n  /**\n   * Generate a 3d scaling matrix by a scalar.\n   * @param vector Scale\n   */\n  public static scaleScalar(scalar: number): Matrix4 {\n    return new Matrix4(mat4ScaleScalar(scalar));\n  }\n\n  /**\n   * Generate a 3d rotation matrix, rotates around x axis.\n   * @param vector Scale\n   */\n  public static rotationX(theta: number): Matrix4 {\n    return new Matrix4(mat4RotationX(theta));\n  }\n\n  /**\n   * Generate a 3d rotation matrix, rotates around y axis.\n   * @param vector Scale\n   */\n  public static rotationY(theta: number): Matrix4 {\n    return new Matrix4(mat4RotationY(theta));\n  }\n\n  /**\n   * Generate a 3d rotation matrix, rotates around z axis.\n   * @param vector Scale\n   */\n  public static rotationZ(theta: number): Matrix4 {\n    return new Matrix4(mat4RotationZ(theta));\n  }\n\n  /**\n   * Generate a \"LookAt\" matrix.\n   *\n   * See also: {@link lookAtInverse}\n   */\n  public static lookAt(\n    position: Vector3,\n    target = new Vector3([0.0, 0.0, 0.0]),\n    up = new Vector3([0.0, 1.0, 0.0]),\n    roll = 0.0,\n  ): Matrix4 {\n    return new Matrix4(mat4LookAt(position.elements, target.elements, up.elements, roll));\n  }\n\n  /**\n   * Generate an inverse of \"LookAt\" matrix. Good for creating a view matrix.\n   *\n   * See also: {@link lookAt}\n   */\n  public static lookAtInverse(\n    position: Vector3,\n    target = new Vector3([0.0, 0.0, 0.0]),\n    up = new Vector3([0.0, 1.0, 0.0]),\n    roll = 0.0,\n  ): Matrix4 {\n    return new Matrix4(mat4LookAtInverse(position.elements, target.elements, up.elements, roll));\n  }\n\n  /**\n   * Generate a \"Perspective\" projection matrix.\n   * It won't include aspect!\n   */\n  public static perspective(fov = 45.0, near = 0.01, far = 100.0): Matrix4 {\n    return new Matrix4(mat4Perspective(fov, near, far));\n  }\n\n  /**\n   * Compose a matrix out of position, scale, and rotation.\n   * Yoinked from Three.js.\n   */\n  public static compose(position: Vector3, rotation: Quaternion, scale: Vector3): Matrix4 {\n    return new Matrix4(mat4Compose(position.elements, rotation.elements, scale.elements));\n  }\n}\n", "/**\n * Return an squared euclidean length of given vector.\n */\nexport function vecLengthSq<T extends number[]>(vec: T): number {\n  return vec.reduce((sum, v) => sum + v * v, 0.0);\n}\n", "/**\n * Return a vector with the absolute of each component of the given vector.\n */\nexport function vecAbs<T extends number[]>(vec: T): T {\n  return vec.map((v) => Math.abs(v)) as T;\n}\n", "/**\n * Divide a vector by a vector.\n */\nexport function vecDivide<T extends number[]>(vecA: T, vecB: T): T {\n  return vecA.map((v, i) => v / vecB[i]) as T;\n}\n", "/**\n * Return a linear interpolation of two vectors.\n * The {@link t} won't be clamped.\n *\n * @param vecA - A vector\n * @param vecB - Another vector\n * @param t - A number interpolating two vectors. Usually in range [0, 1] but not clamped\n */\nexport function vecLerp<T extends number[]>(vecA: T, vecB: T, t: number): T {\n  return vecA.map((v, i) => v + (vecB[i] - v) * t) as T;\n}\n", "/**\n * Return a manhattan length of given vector.\n */\nexport function vecManhattanLength<T extends number[]>(vec: T): number {\n  return vec.reduce((sum, v) => sum + Math.abs(v), 0.0);\n}\n", "/**\n * Return a product of vectors.\n */\nexport function vecMultiply<T extends number[]>(...vecs: T[]): T {\n  if (vecs.length < 2) {\n    return vecs[0];\n  }\n\n  const a = vecs.shift()!;\n  const b = vecMultiply(...vecs);\n\n  return a.map((v, i) => v * b[i]) as T;\n}\n", "/**\n * Negate a vector.\n */\nexport function vecNeg<T extends number[]>(vec: T): T {\n  return vec.map((v) => -v) as T;\n}\n", "import { vecAbs } from './vecAbs';\nimport { vecAdd } from './vecAdd';\nimport { vecDivide } from './vecDivide';\nimport { vecDot } from './vecDot';\nimport { vecLength } from './vecLength';\nimport { vecLengthSq } from './vecLengthSq';\nimport { vecLerp } from './vecLerp';\nimport { vecManhattanLength } from './vecManhattanLength';\nimport { vecMultiply } from './vecMultiply';\nimport { vecNeg } from './vecNeg';\nimport { vecNormalize } from './vecNormalize';\nimport { vecScale } from './vecScale';\nimport { vecSub } from './vecSub';\n\n/**\n * A Vector.\n */\nexport abstract class Vector<T extends Vector<T>> {\n  public abstract elements: number[];\n\n  /**\n   * The length of this.\n   * a.k.a. `magnitude`\n   */\n  public get length(): number {\n    return vecLength(this.elements);\n  }\n\n  /**\n   * The squared length of this.\n   */\n  public get lengthSq(): number {\n    return vecLengthSq(this.elements);\n  }\n\n  /**\n   * The manhattan length of this.\n   */\n  public get manhattanLength(): number {\n    return vecManhattanLength(this.elements);\n  }\n\n  /**\n   * A normalized Vector3 of this.\n   */\n  public get normalized(): T {\n    return this.__new(vecNormalize(this.elements));\n  }\n\n  /**\n   * This but negated.\n   */\n  public get negated(): T {\n    return this.__new(vecNeg(this.elements));\n  }\n\n  /**\n   * This but each component is the absolute.\n   */\n  public get abs(): T {\n    return this.__new(vecAbs(this.elements));\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): T {\n    return this.__new(this.elements.concat());\n  }\n\n  /**\n   * Add one or more Vector into this.\n   * @param vectors Other Vectors\n   */\n  public add(...vectors: T[]): T {\n    return this.__new(vecAdd(this.elements, ...vectors.map((v) => v.elements)));\n  }\n\n  /**\n   * Substract this from another Vector.\n   * @param v Another vector\n   */\n  public sub(vector: T): T {\n    return this.__new(vecSub(this.elements, vector.elements));\n  }\n\n  /**\n   * Multiply one or more Vector with this.\n   * @param vectors Other Vectors\n   */\n  public multiply(...vectors: T[]): T {\n    return this.__new(vecMultiply(this.elements, ...vectors.map((v) => v.elements)));\n  }\n\n  /**\n   * Divide this from another Vector.\n   * @param vector Another Vector\n   */\n  public divide(vector: T): T {\n    return this.__new(vecDivide(this.elements, vector.elements));\n  }\n\n  /**\n   * Scale this by scalar.\n   * a.k.a. `multiplyScalar`\n   * @param scalar A scalar\n   */\n  public scale(scalar: number): T {\n    return this.__new(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * Linearly interpolate the vector with another vector.\n   * The {@link t} won't be clamped.\n   *\n   * @param vector - Another vector\n   * @param t - A number interpolating two vectors. Usually in range [0, 1] but not clamped\n   */\n  public lerp(vector: T, t: number): T {\n    return this.__new(vecLerp(this.elements, vector.elements, t));\n  }\n\n  /**\n   * Dot two Vectors.\n   * @param vector Another vector\n   */\n  public dot(vector: T): number {\n    return vecDot(this.elements, vector.elements);\n  }\n\n  protected abstract __new(v: number[]): T;\n}\n", "import { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from '../vec3';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst EPSILON = 1e-6;\n\n/**\n * Return an exponential map of a quaternion.\n */\nexport function quatExp(quat: RawQuaternion): RawQuaternion {\n  const [x, y, z, w] = quat;\n  const v: RawVector3 = [x, y, z];\n\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0, Math.exp(w)];\n  }\n\n  return vecScale([...vecScale(v, Math.sin(vl) / vl), Math.cos(vl)], Math.exp(w));\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of axis and angle.\n * Assumes axis is normalized.\n */\nexport function quatFromAxisAngle(axis: RawVector3, angle: number): RawQuaternion {\n  const halfAngle = angle / 2.0;\n  const sinHalfAngle = Math.sin(halfAngle);\n  return [\n    axis[0] * sinHalfAngle,\n    axis[1] * sinHalfAngle,\n    axis[2] * sinHalfAngle,\n    Math.cos(halfAngle),\n  ];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Return an inverse of a quaternion.\n */\nexport function quatInverse(quat: RawQuaternion): RawQuaternion {\n  return [-quat[0], -quat[1], -quat[2], quat[3]];\n}\n", "import { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from '../vec3';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst EPSILON = 1e-6;\n\n/**\n * Return a logarithm map of a quaternion.\n */\nexport function quatLog(quat: RawQuaternion): RawQuaternion {\n  const [x, y, z, w] = quat;\n  const v: RawVector3 = [x, y, z];\n\n  const ql = vecLength(quat);\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0, Math.log(ql)];\n  }\n\n  return [...vecScale(v, Math.acos(w / ql) / vl), Math.log(ql)];\n}\n", "import { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst EPSILON = 1e-6;\n\n/**\n * Return a logarithm map of a quaternion as a vec3.\n */\nexport function quatLogVec3(quat: RawQuaternion): RawVector3 {\n  const [x, y, z, w] = quat;\n  const v: RawVector3 = [x, y, z];\n\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0];\n  }\n\n  return vecScale(v, Math.acos(w) / vl);\n}\n", "import { vecDot } from '../vec/vecDot';\nimport { vecNeg } from '../vec/vecNeg';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from './RawVector3';\nimport { vec3Cross } from './vec3Cross';\n\n/**\n * Return a tangent which is orthogonal to normal.\n * If binormal is specified, it is also returned and it's orthogonal to both normal and tangent.\n */\nexport function vec3OrthoNormalize(\n  normal: RawVector3,\n  tangent: RawVector3 = [0.0, 1.0, 0.0],\n  binormal?: RawVector3,\n): {\n  normal: RawVector3;\n  tangent: RawVector3;\n  binormal: RawVector3;\n} {\n  const n = vecNormalize(normal);\n  let t = vecNormalize(tangent);\n\n  let dotNT = vecDot(n, t);\n\n  if (dotNT === 1.0) {\n    if (Math.abs(n[1]) > Math.abs(n[2])) {\n      t = [0.0, 0.0, 1.0];\n    } else {\n      t = [0.0, 1.0, 0.0];\n    }\n    dotNT = vecDot(n, t);\n  }\n\n  t = vecNormalize(vecSub(t, vecScale(n, dotNT)));\n\n  let b = vec3Cross(t, n);\n  if (binormal && vecDot(b, binormal) < 0.0) {\n    b = vecNeg(b);\n  }\n\n  return {\n    normal: n,\n    tangent: t,\n    binormal: b,\n  };\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3OrthoNormalize } from '../vec3/vec3OrthoNormalize';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Return a quaternion which looks at the direction of `look`.\n */\nexport function quatLookRotation(look: RawVector3, up?: RawVector3): RawQuaternion {\n  const { normal, tangent, binormal } = vec3OrthoNormalize(look, up ?? [0.0, 1.0, 0.0]);\n\n  const w = Math.sqrt(1.0 + binormal[0] + tangent[1] + normal[2]) * 0.5;\n  const invW4 = 0.25 / w;\n\n  return [\n    (tangent[2] - normal[1]) * invW4,\n    (normal[0] - binormal[2]) * invW4,\n    (binormal[1] - tangent[0]) * invW4,\n    w,\n  ];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Return a multiplication result of quaternions.\n */\nexport function quatMultiply(...quats: RawQuaternion[]): RawQuaternion {\n  if (quats.length < 2) {\n    return quats[0];\n  }\n\n  const a = quats.shift()!;\n  const b = quatMultiply(...quats);\n\n  return [\n    a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n    a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n    a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n    a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n  ];\n}\n", "import { vecDot } from '../vec/vecDot';\nimport { vecLerp } from '../vec/vecLerp';\nimport { vecNeg } from '../vec/vecNeg';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Interpolate between two quaternions using normalized lerp.\n * When the dot product of the two quaternions is negative, the second quaternion is negated to ensure the shortest path is taken.\n *\n * This should behave the same as Unity's `Quaternion.LerpUnclamped`.\n *\n * @param a - \"from\" quaternion\n * @param b - \"to\" quaternion\n * @param t - How much do we want to rotate the a to b\n * @returns The interpolated quaternion\n */\nexport function quatNlerp(a: RawQuaternion, b: RawQuaternion, t: number): RawQuaternion {\n  const bt = vecDot(a, b) < 0 ? vecNeg(b) : b;\n  return vecNormalize(vecLerp(a, bt, t));\n}\n", "import { vecLength } from '../vec/vecLength';\nimport { vecScale } from '../vec/vecScale';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Normalize given quaternion.\n *\n * It's almost identical as {@link vecNormalize},\n * but it will return an identity quaternion instead\n * when it recieves a quaternion which length is zero.\n */\nexport function quatNormalize(vec: RawQuaternion): RawQuaternion {\n  const len = vecLength(vec);\n  if (len === 0.0) {\n    return [0.0, 0.0, 0.0, 1.0];\n  }\n  return vecScale(vec, 1.0 / len);\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a quaternion rotates around x axis.\n * @param theta An angle around x axis, in degree\n */\nexport function quatRotationX(theta: number): RawQuaternion {\n  return [Math.sin(theta / 2.0), 0.0, 0.0, Math.cos(theta / 2.0)];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a quaternion rotates around y axis.\n * @param theta An angle around y axis, in degree\n */\nexport function quatRotationY(theta: number): RawQuaternion {\n  return [0.0, Math.sin(theta / 2.0), 0.0, Math.cos(theta / 2.0)];\n}\n", "import type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a quaternion rotates around z axis.\n * @param theta An angle around z axis, in degree\n */\nexport function quatRotationZ(theta: number): RawQuaternion {\n  return [0.0, 0.0, Math.sin(theta / 2.0), Math.cos(theta / 2.0)];\n}\n", "import { vecDot, vecNeg, vecNormalize } from '..';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Interpolate between two quaternions using spherical lerp.\n *\n * @param a - \"from\" quaternion\n * @param b - \"to\" quaternion\n * @param t - How much do we want to rotate the a to b\n * @returns The interpolated quaternion\n */\nexport function quatSlerp(a: RawQuaternion, b: RawQuaternion, t: number): RawQuaternion {\n  if (t === 0.0) {\n    return a.concat() as RawQuaternion;\n  }\n  if (t === 1.0) {\n    return b.concat() as RawQuaternion;\n  }\n\n  // Ref: https://github.com/mrdoob/three.js/blob/master/src/math/Quaternion.js\n  // Ref: http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n  let cosHalfTheta = vecDot(a, b);\n\n  if (cosHalfTheta < 0.0) {\n    b = vecNeg(b);\n    cosHalfTheta = -cosHalfTheta;\n  }\n\n  // I think you two are same\n  if (cosHalfTheta >= 1.0) {\n    return a.concat() as RawQuaternion;\n  }\n\n  const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n  // fallback to simple lerp\n  if (sqrSinHalfTheta <= Number.EPSILON) {\n    const s = 1.0 - t;\n\n    return vecNormalize([\n      s * a[0] + t * b[0],\n      s * a[1] + t * b[1],\n      s * a[2] + t * b[2],\n      s * a[3] + t * b[3],\n    ]);\n  }\n\n  // welcome\n  const sinHalfTheta = Math.sqrt(sqrSinHalfTheta);\n  const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);\n  const ratioA = Math.sin((1.0 - t) * halfTheta) / sinHalfTheta;\n  const ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n\n  return [\n    a[0] * ratioA + b[0] * ratioB,\n    a[1] * ratioA + b[1] * ratioB,\n    a[2] * ratioA + b[2] * ratioB,\n    a[3] * ratioA + b[3] * ratioB,\n  ];\n}\n", "import { Matrix4 } from '../mat4/Matrix4';\nimport { mat4FromQuaternion } from '../mat4/mat4FromQuaternion';\nimport { vecLength } from '../vec/vecLength';\nimport { vecLengthSq } from '../vec/vecLengthSq';\nimport { Vector3 } from '../vec3/Vector3';\nimport { quatExp } from './quatExp';\nimport { quatFromAxisAngle } from './quatFromAxisAngle';\nimport { quatFromMatrix4 } from './quatFromMatrix4';\nimport { quatInverse } from './quatInverse';\nimport { quatLog } from './quatLog';\nimport { quatLogVec3 } from './quatLogVec3';\nimport { quatLookRotation } from './quatLookRotation';\nimport { quatMultiply } from './quatMultiply';\nimport { quatNlerp } from './quatNlerp';\nimport { quatNormalize } from './quatNormalize';\nimport { quatRotationX } from './quatRotationX';\nimport { quatRotationY } from './quatRotationY';\nimport { quatRotationZ } from './quatRotationZ';\nimport { quatSlerp } from './quatSlerp';\nimport type { RawQuaternion } from './RawQuaternion';\n\nconst rawIdentityQuaternion: RawQuaternion = [0.0, 0.0, 0.0, 1.0];\n\n/**\n * A Quaternion.\n */\nexport class Quaternion {\n  public elements: RawQuaternion; // [ x, y, z; w ]\n\n  public constructor(elements: RawQuaternion = rawIdentityQuaternion) {\n    this.elements = elements;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  /**\n   * An y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  /**\n   * An z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  /**\n   * An w component of this.\n   */\n  public get w(): number {\n    return this.elements[3];\n  }\n\n  public toString(): string {\n    return `Quaternion( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)}, ${this.w.toFixed(3)} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Quaternion {\n    return new Quaternion(this.elements.concat() as RawQuaternion);\n  }\n\n  /**\n   * Itself but converted into a Matrix4.\n   */\n  public get matrix4(): Matrix4 {\n    return new Matrix4(mat4FromQuaternion(this.elements));\n  }\n\n  /**\n   * An inverse of this.\n   */\n  public get inversed(): Quaternion {\n    return new Quaternion(quatInverse(this.elements));\n  }\n\n  /**\n   * The length of this.\n   */\n  public get length(): number {\n    return vecLength(this.elements);\n  }\n\n  /**\n   * The squared length of this.\n   */\n  public get lengthSq(): number {\n    return vecLengthSq(this.elements);\n  }\n\n  /**\n   * A normalized this.\n   */\n  public get normalized(): Quaternion {\n    return new Quaternion(quatNormalize(this.elements));\n  }\n\n  /**\n   * An exponential map of this.\n   */\n  public get exp(): Quaternion {\n    return new Quaternion(quatExp(this.elements));\n  }\n\n  /**\n   * A logarithm map of this.\n   */\n  public get log(): Quaternion {\n    return new Quaternion(quatLog(this.elements));\n  }\n\n  /**\n   * A logarithm map of this as a Vector3.\n   */\n  public get logVec3(): Vector3 {\n    return new Vector3(quatLogVec3(this.elements));\n  }\n\n  /**\n   * Multiply one or more Quaternions with this.\n   * @param quaternions Other Quaternions\n   */\n  public multiply(...quaternions: Quaternion[]): Quaternion {\n    return Quaternion.multiply(this, ...quaternions);\n  }\n\n  /**\n   * Interpolate between this and given quaternion using normalized lerp.\n   * When the dot product of the two quaternions is negative, the given quaternion is negated to ensure the shortest path is taken.\n   *\n   * This should behave the same as Unity's `Quaternion.LerpUnclamped`.\n   *\n   * @param b - \"to\" quaternion\n   * @param t - How much do we want to rotate this to b\n   * @returns The interpolated quaternion\n   */\n  public nlerp(b: Quaternion, t: number): Quaternion {\n    return Quaternion.nlerp(this, b, t);\n  }\n\n  /**\n   * Interpolate between this and given quaternion using spherical lerp.\n   *\n   * @param b - Another Quaternion\n   * @param t - How much do we want to rotate this to b\n   * @returns The interpolated quaternion\n   */\n  public slerp(b: Quaternion, t: number): Quaternion {\n    return Quaternion.slerp(this, b, t);\n  }\n\n  /**\n   * An identity Quaternion.\n   */\n  public static get identity(): Quaternion {\n    return new Quaternion(rawIdentityQuaternion);\n  }\n\n  /**\n   * Multiply two or more quaternions.\n   * @param quaternion Quaternions\n   */\n  public static multiply(...quaternions: Quaternion[]): Quaternion {\n    if (quaternions.length === 0) {\n      return Quaternion.identity;\n    } else {\n      return new Quaternion(quatMultiply(...quaternions.map((q) => q.elements)));\n    }\n  }\n\n  /**\n   * Interpolate between two quaternions using normalized lerp.\n   * When the dot product of the two quaternions is negative, the second quaternion is negated to ensure the shortest path is taken.\n   *\n   * This should behave the same as Unity's `Quaternion.LerpUnclamped`.\n   *\n   * @param a - \"from\" quaternion\n   * @param b - \"to\" quaternion\n   * @param t - How much do we want to rotate the a to b\n   * @returns The interpolated quaternion\n   */\n  public static nlerp(a: Quaternion, b: Quaternion, t: number): Quaternion {\n    return new Quaternion(quatNlerp(a.elements, b.elements, t));\n  }\n\n  /**\n   * Interpolate between two quaternions using spherical lerp.\n   *\n   * @param a - \"from\" quaternion\n   * @param b - \"to\" quaternion\n   * @param t - How much do we want to rotate the a to b\n   * @returns The interpolated quaternion\n   */\n  public static slerp(a: Quaternion, b: Quaternion, t: number): Quaternion {\n    return new Quaternion(quatSlerp(a.elements, b.elements, t));\n  }\n\n  /**\n   * Return a quaternion which rotates around x axis.\n   * @param theta An angle around x axis, in degree\n   */\n  public static rotationX(theta: number): Quaternion {\n    return new Quaternion(quatRotationX(theta));\n  }\n\n  /**\n   * Return a quaternion which rotates around y axis.\n   * @param theta An angle around y axis, in degree\n   */\n  public static rotationY(theta: number): Quaternion {\n    return new Quaternion(quatRotationY(theta));\n  }\n\n  /**\n   * Return a quaternion which rotates around z axis.\n   * @param theta An angle around z axis, in degree\n   */\n  public static rotationZ(theta: number): Quaternion {\n    return new Quaternion(quatRotationZ(theta));\n  }\n\n  /**\n   * Return a quaternion which looks at the direction of `look`.\n   * @param look Position where the quaternion will look at\n   * @param up The \"up vector\"\n   */\n  public static lookRotation(look: Vector3, up: Vector3): Quaternion {\n    return new Quaternion(quatLookRotation(look.elements, up.elements));\n  }\n\n  /**\n   * Generate a Quaternion out of angle and axis.\n   */\n  public static fromAxisAngle(axis: Vector3, angle: number): Quaternion {\n    return new Quaternion(quatFromAxisAngle(axis.elements, angle));\n  }\n\n  /**\n   * Generate a Quaternion out of a rotation matrix.\n   */\n  public static fromMatrix4(matrix: Matrix4): Quaternion {\n    return new Quaternion(quatFromMatrix4(matrix.elements));\n  }\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawVector3 } from './RawVector3';\n\n/**\n * Apply a 3x3 matrix to a vec3.\n */\nexport function vec3ApplyMatrix3(v: RawVector3, m: RawMatrix3): RawVector3 {\n  return [\n    m[0] * v[0] + m[3] * v[1] + m[6] * v[2],\n    m[1] * v[0] + m[4] * v[1] + m[7] * v[2],\n    m[2] * v[0] + m[5] * v[1] + m[8] * v[2],\n  ];\n}\n", "import type { RawMatrix4 } from '../mat4';\nimport type { RawVector4 } from './RawVector4';\n\n/**\n * Multiply a vec4 by a mat4.\n */\nexport function vec4ApplyMatrix4(v: RawVector4, m: RawMatrix4): RawVector4 {\n  return [\n    m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12] * v[3],\n    m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13] * v[3],\n    m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14] * v[3],\n    m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3],\n  ];\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { vecScale } from '../vec/vecScale';\nimport { vec4ApplyMatrix4 } from '../vec4/vec4ApplyMatrix4';\nimport type { RawVector3 } from './RawVector3';\n\n/**\n * Apply a 4x4 matrix to a vec3 (with an implicit 1 in the 4th dimension).\n */\nexport function vec3ApplyMatrix4(v: RawVector3, m: RawMatrix4): RawVector3 {\n  const vec4 = vec4ApplyMatrix4([...v, 1], m);\n  const xyz: RawVector3 = [vec4[0], vec4[1], vec4[2]];\n  const w = vec4[3];\n  return vecScale(xyz, 1.0 / w);\n}\n", "import { quatInverse } from '../quat/quatInverse';\nimport { quatMultiply } from '../quat/quatMultiply';\nimport type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawVector3 } from './RawVector3';\n\n/**\n * Apply a vec3 (with an implicit 1 in the 4th dimension) a quaternion.\n */\nexport function vec3ApplyQuaternion(vec: RawVector3, quat: RawQuaternion): RawVector3 {\n  const p: RawQuaternion = [...vec, 0.0];\n  const r = quatInverse(quat);\n  const res = quatMultiply(quat, p, r);\n  res.pop();\n  return res as unknown as RawVector3;\n}\n", "import type { RawQuaternion } from '../quat/RawQuaternion';\nimport { vecLength, vecScale } from '../vec';\nimport type { RawVector3 } from './RawVector3';\n\nconst EPSILON = 1e-6;\n\n/**\n * Treating the given vec3 as a quaternion with w = 0, return its exponential map.\n */\nexport function vec3QuatExp(v: RawVector3): RawQuaternion {\n  const vl = vecLength(v);\n  if (vl < EPSILON) {\n    return [0.0, 0.0, 0.0, 1.0];\n  }\n\n  return [...vecScale(v, Math.sin(vl) / vl), Math.cos(vl)];\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Quaternion } from '../quat/Quaternion';\nimport { Vector } from '../vec/Vector';\nimport type { RawVector3 } from './RawVector3';\nimport { vec3ApplyMatrix3 } from './vec3ApplyMatrix3';\nimport { vec3ApplyMatrix4 } from './vec3ApplyMatrix4';\nimport { vec3ApplyQuaternion } from './vec3ApplyQuaternion';\nimport { vec3Cross } from './vec3Cross';\nimport { vec3OrthoNormalize } from './vec3OrthoNormalize';\nimport { vec3QuatExp } from './vec3QuatExp';\n\n/**\n * A Vector3.\n */\nexport class Vector3 extends Vector<Vector3> {\n  public elements: RawVector3;\n\n  public constructor(v: RawVector3 = [0.0, 0.0, 0.0]) {\n    super();\n    this.elements = v;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  public set x(x: number) {\n    this.elements[0] = x;\n  }\n\n  /**\n   * An y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  public set y(y: number) {\n    this.elements[1] = y;\n  }\n\n  /**\n   * An z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  public set z(z: number) {\n    this.elements[2] = z;\n  }\n\n  public toString(): string {\n    return `Vector3( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)} )`;\n  }\n\n  /**\n   * Return a cross of this and another Vector3.\n   * @param vector Another vector\n   */\n  public cross(vector: Vector3): Vector3 {\n    return new Vector3(vec3Cross(this.elements, vector.elements));\n  }\n\n  /**\n   * Rotate this vector using a Quaternion.\n   * @param quaternion A quaternion\n   */\n  public applyQuaternion(quaternion: Quaternion): Vector3 {\n    return new Vector3(vec3ApplyQuaternion(this.elements, quaternion.elements));\n  }\n\n  /**\n   * Apply a 3x3 matrix to this vector.\n   */\n  public applyMatrix3(matrix: Matrix3): Vector3 {\n    return new Vector3(vec3ApplyMatrix3(this.elements, matrix.elements));\n  }\n\n  /**\n   * Apply a 4x4 matrix to this vector (with an implicit 1 in the 4th dimension).\n   */\n  public applyMatrix4(matrix: Matrix4): Vector3 {\n    return new Vector3(vec3ApplyMatrix4(this.elements, matrix.elements));\n  }\n\n  /**\n   * Treating this as a quaternion with w = 0, an exponential map of the quaternion.\n   */\n  public get quatExp(): Quaternion {\n    return new Quaternion(vec3QuatExp(this.elements));\n  }\n\n  protected __new(v: RawVector3): Vector3 {\n    return new Vector3(v);\n  }\n\n  /**\n   * Vector3( 0.0, 0.0, 0.0 )\n   */\n  public static get zero(): Vector3 {\n    return new Vector3([0.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 1.0, 0.0, 0.0 )\n   */\n  public static get px(): Vector3 {\n    return new Vector3([1.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector3( -1.0, 0.0, 0.0 )\n   */\n  public static get nx(): Vector3 {\n    return new Vector3([-1.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 0.0, 1.0, 0.0 )\n   */\n  public static get py(): Vector3 {\n    return new Vector3([0.0, 1.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 0.0, -1.0, 0.0 )\n   */\n  public static get ny(): Vector3 {\n    return new Vector3([0.0, -1.0, 0.0]);\n  }\n\n  /**\n   * Vector3( 0.0, 0.0, 1.0 )\n   */\n  public static get pz(): Vector3 {\n    return new Vector3([0.0, 0.0, 1.0]);\n  }\n\n  /**\n   * Vector3( 0.0, 0.0, -1.0 )\n   */\n  public static get nz(): Vector3 {\n    return new Vector3([0.0, 0.0, -1.0]);\n  }\n\n  /**\n   * Vector3( 1.0, 1.0, 1.0 )\n   */\n  public static get one(): Vector3 {\n    return new Vector3([1.0, 1.0, 1.0]);\n  }\n\n  /**\n   * Return a tangent which is orthogonal to normal.\n   * If binormal is specified, it is also returned and it's orthogonal to both normal and tangent.\n   */\n  public static orthoNormalize(\n    normal: Vector3,\n    tangent: Vector3,\n    binormal: Vector3,\n  ): {\n    normal: Vector3;\n    tangent: Vector3;\n    binormal: Vector3;\n  } {\n    const result = vec3OrthoNormalize(normal.elements, tangent.elements, binormal.elements);\n    return {\n      normal: new Vector3(result.normal),\n      tangent: new Vector3(result.tangent),\n      binormal: new Vector3(result.binormal),\n    };\n  }\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawBox3 } from './RawBox3';\n\n/**\n * Test if given point is contained in given box or not.\n * @param box A box\n * @param point A point\n */\nexport function box3ContainsPoint(box: RawBox3, point: RawVector3): boolean {\n  return (\n    box[0][0] <= point[0] &&\n    box[1][0] >= point[0] &&\n    box[0][1] <= point[1] &&\n    box[1][1] >= point[1] &&\n    box[0][2] <= point[2] &&\n    box[1][2] >= point[2]\n  );\n}\n", "import { Vector3 } from '../vec3/Vector3';\nimport { box3ContainsPoint } from './box3ContainsPoint';\nimport type { RawBox3 } from './RawBox3';\n\n/**\n * A 3D box.\n */\nexport class Box3 {\n  public min: Vector3;\n  public max: Vector3;\n\n  public constructor(min: Vector3 = Vector3.zero, max: Vector3 = Vector3.zero) {\n    this.min = min;\n    this.max = max;\n  }\n\n  /**\n   * Itself but {@link RawBox3} form.\n   */\n  public get raw(): RawBox3 {\n    return [this.min.elements, this.max.elements];\n  }\n\n  /**\n   * Test if given point is contained in the box or not.\n   *\n   * @param point A point\n   */\n  public containsPoint(point: Vector3): boolean {\n    return box3ContainsPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Convert {@link RawBox3} to class form.\n   * @param box A {@link RawBox3}\n   */\n  public static fromRaw(box: RawBox3): Box3 {\n    return new Box3(new Vector3(box[0]), new Vector3(box[1]));\n  }\n}\n", "import type { EulerOrder } from '../euler/EulerOrder';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawQuaternion } from './RawQuaternion';\n\n/**\n * Generate a Quaternion out of euler angles.\n */\nexport function quatFromEuler(euler: RawVector3, order?: EulerOrder): RawQuaternion {\n  const [i, j, k, sign] =\n    !order || order === 'XYZ'\n      ? [0, 1, 2, 1]\n      : order === 'XZY'\n        ? [0, 2, 1, -1]\n        : order === 'YXZ'\n          ? [1, 0, 2, -1]\n          : order === 'YZX'\n            ? [1, 2, 0, 1]\n            : order === 'ZXY'\n              ? [2, 0, 1, 1]\n              : [2, 1, 0, -1];\n\n  const ti = 0.5 * euler[i];\n  const tj = 0.5 * sign * euler[j];\n  const tk = 0.5 * euler[k];\n\n  const ci = Math.cos(ti);\n  const cj = Math.cos(tj);\n  const ck = Math.cos(tk);\n  const si = Math.sin(ti);\n  const sj = Math.sin(tj);\n  const sk = Math.sin(tk);\n\n  const result: RawQuaternion = [0.0, 0.0, 0.0, ck * cj * ci + sk * sj * si];\n  result[i] = ck * cj * si - sk * sj * ci;\n  result[j] = sign * (ck * sj * ci + sk * cj * si);\n  result[k] = sk * cj * ci - ck * sj * si;\n\n  return result;\n}\n", "/**\n * GLSL Style `mod` function.\n * \"compute value of one parameter modulo another\"\n *\n * @param value - value to mod\n * @param divisor - divisor to mod by\n */\nexport function mod(value: number, divisor: number): number {\n  return value - Math.floor(value / divisor) * divisor;\n}\n", "import { mod } from './mod';\n\n/**\n * Enclose arbitrary angle (in radian) into [-\u03C0, \u03C0)\n */\nexport function sanitizeAngle(angle: number): number {\n  return mod(angle + Math.PI, 2.0 * Math.PI) - Math.PI;\n}\n", "import { clamp } from '../clamp';\nimport type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport { sanitizeAngle } from '../sanitizeAngle';\nimport { vecManhattanLength } from '../vec/vecManhattanLength';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\n\n/**\n * Return a euler angles out of a matrix3.\n * Make sure the input matrix is normalized.\n *\n * @param m An input rotation matrix\n * @param order An order of output euler angles. Assume as `XYZ` if not specified\n */\nexport function eulerFromMat3(m: RawMatrix3, order?: EulerOrder): RawVector3 {\n  const [i, j, k, sign] =\n    !order || order === 'XYZ'\n      ? [0, 1, 2, 1]\n      : order === 'XZY'\n        ? [0, 2, 1, -1]\n        : order === 'YXZ'\n          ? [1, 0, 2, -1]\n          : order === 'YZX'\n            ? [1, 2, 0, 1]\n            : order === 'ZXY'\n              ? [2, 0, 1, 1]\n              : [2, 1, 0, -1];\n\n  const result: RawVector3 = [0.0, 0.0, 0.0];\n\n  const c = m[k + i * 3];\n  result[j] = -sign * Math.asin(clamp(c, -1.0, 1.0));\n\n  if (Math.abs(c) < 0.999999) {\n    result[i] = sign * Math.atan2(m[k + j * 3], m[k * 4]);\n    result[k] = sign * Math.atan2(m[j + i * 3], m[i * 4]);\n  } else {\n    // \"y is 90deg\" cases\n    result[i] = sign * Math.atan2(-m[j + k * 3], m[j * 4]);\n  }\n\n  if (vecManhattanLength(result) > 1.5 * Math.PI) {\n    // \"two big revolutions\" cases\n    result[i] = sanitizeAngle(result[i] + Math.PI);\n    result[j] = sanitizeAngle(Math.PI - result[j]);\n    result[k] = sanitizeAngle(result[k] + Math.PI);\n  }\n\n  return result;\n}\n", "import { mat3FromMat4 } from '../mat3/mat3FromMat4';\nimport type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\nimport { eulerFromMat3 } from './eulerFromMat3';\n\n/**\n * Return a euler angles out of a matrix4.\n * Make sure the input matrix is normalized.\n *\n * @param m An input rotation matrix\n * @param order An order of output euler angles. Assume as `XYZ` if not specified\n */\nexport function eulerFromMat4(m: RawMatrix4, order?: EulerOrder): RawVector3 {\n  return eulerFromMat3(mat3FromMat4(m), order);\n}\n", "import { mat3FromQuaternion } from '../mat3/mat3FromQuaternion';\nimport type { RawQuaternion } from '../quat/RawQuaternion';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\nimport { eulerFromMat3 } from './eulerFromMat3';\n\n/**\n * Return a euler angles out of a quaternion.\n *\n * @param m An input quaternion\n * @param order An order of output euler angles. Assume as `XYZ` if not specified\n */\nexport function eulerFromQuaternion(m: RawQuaternion, order?: EulerOrder): RawVector3 {\n  return eulerFromMat3(mat3FromQuaternion(m), order);\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Quaternion } from '../quat/Quaternion';\nimport { quatFromEuler } from '../quat/quatFromEuler';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { EulerOrder } from './EulerOrder';\nimport { eulerFromMat3 } from './eulerFromMat3';\nimport { eulerFromMat4 } from './eulerFromMat4';\nimport { eulerFromQuaternion } from './eulerFromQuaternion';\n\n/**\n * An Euler rotations.\n */\nexport class Euler {\n  public elements: RawVector3; // [ x, y, z ]\n\n  /**\n   * An order of this euler.\n   * 'XYZ' by default.\n   *\n   * Note that this is **extrinsic** rotations (which is same as Blender, Maya, and Unity).\n   * Three.js uses intrinsic rotations so you have to reverse the order if you want to match the behavior with Three.js.\n   */\n  public order: EulerOrder;\n\n  public constructor(elements: RawVector3 = [0.0, 0.0, 0.0], order: EulerOrder = 'XYZ') {\n    this.elements = elements;\n    this.order = order;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  /**\n   * An y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  /**\n   * An z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  public toString(): string {\n    return `Euler( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)} (${this.order}) )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Euler {\n    return new Euler(this.elements.concat() as RawVector3, this.order);\n  }\n\n  /**\n   * Itself but converted into a Quaternion.\n   */\n  public get quaternion(): Quaternion {\n    return new Quaternion(quatFromEuler(this.elements, this.order));\n  }\n\n  /**\n   * Itself but converted into a Matrix4.\n   */\n  public get matrix4(): Matrix4 {\n    return this.quaternion.matrix4;\n  }\n\n  /**\n   * Generate an Euler out of a matrix3.\n   */\n  public static fromMatrix3(matrix: Matrix3, order: EulerOrder): Euler {\n    return new Euler(eulerFromMat3(matrix.elements, order), order);\n  }\n\n  /**\n   * Generate an Euler out of a matrix4.\n   */\n  public static fromMatrix4(matrix: Matrix4, order: EulerOrder): Euler {\n    return new Euler(eulerFromMat4(matrix.elements, order), order);\n  }\n\n  /**\n   * Generate an Euler out of a quaternion.\n   */\n  public static fromQuaternion(quaternion: Quaternion, order: EulerOrder): Euler {\n    return new Euler(eulerFromQuaternion(quaternion.elements, order), order);\n  }\n}\n", "import type { RawSphere3 } from '../sphere3/RawSphere3';\nimport { vecDot } from '../vec/vecDot';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawRay3 } from './RawRay3';\n\n/**\n * Return distances from given ray to sphere.\n *\n * The returning distance can be negative.\n *\n * The first returning value will be the distance of the incident point.\n * If the ray does not intersect with sphere, it will return `null`.\n *\n * @param ray A ray\n * @param sphere A target sphere\n */\nexport function ray3DistanceToSphere(\n  [ro, rd]: RawRay3,\n  sphere: RawSphere3,\n): [number, number] | null {\n  const v = vecSub(ro, sphere[0]);\n  const b = vecDot(v, rd);\n  const c = vecDot(v, v) - sphere[1];\n  const d = b * b - c;\n\n  if (d < 0.0) {\n    return null;\n  }\n\n  const sqrtD = Math.sqrt(d);\n\n  return [-b - sqrtD, -b + sqrtD];\n}\n", "import { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a vector that represents delta of given line.\n *\n * @param line A line\n */\nexport function line3Delta(line: RawLine3): RawVector3 {\n  return vecSub(line[1], line[0]);\n}\n", "import { line3Delta } from '../line3/line3Delta';\nimport type { RawLine3 } from '../line3/RawLine3';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport type { RawRay3 } from './RawRay3';\n\n/**\n * Convert the given line to a ray.\n *\n * @param line A line\n */\nexport function ray3FromLine3(line: RawLine3): RawRay3 {\n  return [line[0], vecNormalize(line3Delta(line))];\n}\n", "import type { Line3 } from '../line3/Line3';\nimport type { Sphere3 } from '../sphere3/Sphere3';\nimport { Vector3 } from '../vec3/Vector3';\nimport type { RawRay3 } from './RawRay3';\nimport { ray3DistanceToSphere } from './ray3DistanceToSphere';\nimport { ray3FromLine3 } from './ray3FromLine3';\n\n/**\n * A 3D ray.\n */\nexport class Ray3 {\n  /**\n   * The origin of the ray.\n   */\n  public origin: Vector3;\n\n  /**\n   * The direction of the ray.\n   * Make sure the direction is normalized.\n   */\n  public direction: Vector3;\n\n  public constructor(start: Vector3 = Vector3.zero, end: Vector3 = Vector3.pz) {\n    this.origin = start;\n    this.direction = end;\n  }\n\n  /**\n   * Itself but {@link RawRay3} form.\n   */\n  public get raw(): RawRay3 {\n    return [this.origin.elements, this.direction.elements];\n  }\n\n  /**\n   * Return distances from given ray to sphere.\n   *\n   * The returning distance can be negative.\n   *\n   * The first returning value will be the distance of the incident point.\n   * If the ray does not intersect with sphere, it will return `null`.\n   *\n   * @param sphere A target sphere\n   */\n  public distanceToSphere(sphere: Sphere3): [number, number] | null {\n    return ray3DistanceToSphere(this.raw, sphere.raw);\n  }\n\n  /**\n   * Convert {@link RawRay3} to class form.\n   * @param ray A {@link RawRay3}\n   */\n  public static fromRaw(ray: RawRay3): Ray3 {\n    return new Ray3(new Vector3(ray[0]), new Vector3(ray[1]));\n  }\n\n  /**\n   * Create a ray out of a line.\n   *\n   * @param line A {@link Line3}\n   */\n  public static fromLine3(line: Line3): Ray3 {\n    return Ray3.fromRaw(ray3FromLine3(line.raw));\n  }\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { vec3ApplyMatrix4 } from '../vec3/vec3ApplyMatrix4';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Apply given matrix4 to given line.\n *\n * @param line A line\n * @param matrix A matrix4 which will be applied to the line\n */\nexport function line3ApplyMatrix4([start, end]: RawLine3, matrix: RawMatrix4): RawLine3 {\n  return [vec3ApplyMatrix4(start, matrix), vec3ApplyMatrix4(end, matrix)];\n}\n", "import { vecAdd } from '../vec/vecAdd';\nimport { vecScale } from '../vec/vecScale';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a vector that represents a certain point of given line.\n * Same as start at t = 0, same as end at t = 1.\n *\n * @param line A line\n * @param t A parameter t\n */\nexport function line3At(line: RawLine3, t: number): RawVector3 {\n  return vecAdd(vecScale(line[0], 1.0 - t), vecScale(line[1], t));\n}\n", "import { saturate } from '../saturate';\nimport { vecDot } from '../vec/vecDot';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { line3At } from './line3At';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a point that is on the given line which is closest to the given point.\n *\n * If `segment` is true, it will treat the line as a segment which has start and end.\n * Otherwise it will treat the line is infinite.\n *\n * @param line A line\n * @param point A point\n * @param segment Is the line a segment?\n */\nexport function line3ClosestPointToPoint(\n  line: RawLine3,\n  point: RawVector3,\n  segment?: boolean,\n): RawVector3 {\n  const ap = vecSub(point, line[0]);\n  const ab = vecSub(line[1], line[0]);\n\n  let t = vecDot(ap, ab) / vecDot(ab, ab);\n  segment && (t = saturate(t));\n\n  return line3At(line, t);\n}\n", "import { vecLength } from '../vec/vecLength';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { line3ClosestPointToPoint } from './line3ClosestPointToPoint';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * Return a distance from the given line to the given point.\n *\n * If `segment` is true, it will treat the line as a segment which has start and end.\n * Otherwise it will treat the line is infinite.\n *\n * @param line A line\n * @param point A point\n * @param segment Is the line a segment?\n */\nexport function line3DistanceToPoint(line: RawLine3, point: RawVector3, segment?: boolean): number {\n  return vecLength(vecSub(line3ClosestPointToPoint(line, point, segment), point));\n}\n", "import type { Matrix4 } from '../mat4/Matrix4';\nimport { Ray3 } from '../ray3/Ray3';\nimport { Vector3 } from '../vec3/Vector3';\nimport { line3ApplyMatrix4 } from './line3ApplyMatrix4';\nimport { line3At } from './line3At';\nimport { line3ClosestPointToPoint } from './line3ClosestPointToPoint';\nimport { line3Delta } from './line3Delta';\nimport { line3DistanceToPoint } from './line3DistanceToPoint';\nimport type { RawLine3 } from './RawLine3';\n\n/**\n * A 3D line.\n */\nexport class Line3 {\n  public start: Vector3;\n  public end: Vector3;\n\n  public constructor(start: Vector3 = Vector3.zero, end: Vector3 = Vector3.zero) {\n    this.start = start;\n    this.end = end;\n  }\n\n  /**\n   * Itself but {@link RawLine3} form.\n   */\n  public get raw(): RawLine3 {\n    return [this.start.elements, this.end.elements];\n  }\n\n  /**\n   * Itself but a ray.\n   */\n  public get ray(): Ray3 {\n    return Ray3.fromLine3(this);\n  }\n\n  /**\n   * A vector that represents delta of the line.\n   */\n  public delta(): Vector3 {\n    return new Vector3(line3Delta(this.raw));\n  }\n\n  /**\n   * Its length.\n   */\n  public length(): number {\n    return this.delta.length;\n  }\n\n  /**\n   * Return a vector that represents a certain point of the line.\n   * Same as start at t = 0, same as end at t = 1.\n   *\n   * @param t A parameter t\n   */\n  public at(t: number): Vector3 {\n    return new Vector3(line3At(this.raw, t));\n  }\n\n  /**\n   * Apply given matrix4 to the line.\n   *\n   * @param matrix A matrix4 which will be applied to the line\n   */\n  public applyMatrix4(matrix: Matrix4): Line3 {\n    return Line3.fromRaw(line3ApplyMatrix4(this.raw, matrix.elements));\n  }\n\n  /**\n   * Return a point that is on the line which is closest to the given point.\n   *\n   * If `segment` is true, it will treat the line as a segment which has start and end.\n   * Otherwise it will treat the line is infinite.\n   *\n   * @param point A point\n   * @param segment Is the line a segment?\n   */\n  public closestPointToPoint(point: Vector3, segment: boolean): Vector3 {\n    return new Vector3(line3ClosestPointToPoint(this.raw, point.elements, segment));\n  }\n\n  /**\n   * Return a distance from the line to the given point.\n   *\n   * If `segment` is true, it will treat the line as a segment which has start and end.\n   * Otherwise it will treat the line is infinite.\n   *\n   * @param point A point\n   * @param segment Is the line a segment?\n   */\n  public distanceToPoint(point: Vector3, segment: boolean): number {\n    return line3DistanceToPoint(this.raw, point.elements, segment);\n  }\n\n  /**\n   * Convert {@link RawLine3} to class form.\n   * @param line A {@link RawLine3}\n   */\n  public static fromRaw(line: RawLine3): Line3 {\n    return new Line3(new Vector3(line[0]), new Vector3(line[1]));\n  }\n}\n", "import { saturate } from './saturate';\n\n/**\n * `smoothstep` but not smooth\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function linearstep(edge0: number, edge1: number, x: number): number {\n  return saturate((x - edge0) / (edge1 - edge0));\n}\n", "import type { RawMatrix2 } from './RawMatrix2';\n\nexport function mat2Determinant(m: RawMatrix2): number {\n  return m[0] * m[3] - m[2] * m[1];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport type { RawMatrix2 } from './RawMatrix2';\n\n/**\n * Return an inverse of given matrix.\n */\nexport function mat2Inverse(m: RawMatrix2): RawMatrix2 {\n  const n11 = m[0],\n    n21 = m[1],\n    n12 = m[2],\n    n22 = m[3],\n    det = n11 * n22 - n12 * n21;\n\n  if (det === 0.0) {\n    return vecScale(m, 0.0);\n  }\n\n  return vecScale([n22, -n21, -n12, n11], 1.0 / det);\n}\n", "import type { RawMatrix2 } from './RawMatrix2';\n\n/**\n * Return a multiplication result of matrices.\n */\nexport function mat2Multiply(...mats: RawMatrix2[]): RawMatrix2 {\n  if (mats.length < 2) {\n    return mats[0];\n  }\n\n  const a = mats.shift()!;\n  const b = mat2Multiply(...mats);\n  const a00 = a[0],\n    a01 = a[1],\n    a10 = a[2],\n    a11 = a[3],\n    b00 = b[0],\n    b01 = b[1],\n    b10 = b[2],\n    b11 = b[3];\n\n  return [\n    a00 * b00 + a10 * b01,\n    a01 * b00 + a11 * b01,\n\n    a00 * b10 + a10 * b11,\n    a01 * b10 + a11 * b11,\n  ];\n}\n", "import type { RawMatrix2 } from './RawMatrix2';\n\n/**\n * Transpose a mat2.\n */\nexport function mat2Transpose(source: RawMatrix2): RawMatrix2 {\n  return [source[0], source[2], source[1], source[3]];\n}\n", "import { vecScale } from '../vec/vecScale';\nimport { mat2Determinant } from './mat2Determinant';\nimport { mat2Inverse } from './mat2Inverse';\nimport { mat2Multiply } from './mat2Multiply';\nimport { mat2Transpose } from './mat2Transpose';\nimport type { RawMatrix2 } from './RawMatrix2';\n\nconst rawIdentityMatrix2: RawMatrix2 = [1.0, 0.0, 0.0, 1.0];\n\n/**\n * A Matrix2.\n */\nexport class Matrix2 {\n  public elements: RawMatrix2;\n\n  public constructor(v: RawMatrix2 = rawIdentityMatrix2) {\n    this.elements = v;\n  }\n\n  /**\n   * Itself but transposed.\n   */\n  public get transpose(): Matrix2 {\n    return new Matrix2(mat2Transpose(this.elements));\n  }\n\n  /**\n   * Its determinant.\n   */\n  public get determinant(): number {\n    return mat2Determinant(this.elements);\n  }\n\n  /**\n   * Itself but inverted.\n   */\n  public get inverse(): Matrix2 {\n    return new Matrix2(mat2Inverse(this.elements));\n  }\n\n  public toString(): string {\n    const m = this.elements.map((v) => v.toFixed(3));\n    return `Matrix2( ${m[0]}, ${m[2]}; ${m[1]}, ${m[3]} )`;\n  }\n\n  /**\n   * Clone this.\n   */\n  public clone(): Matrix2 {\n    return new Matrix2(this.elements.concat() as RawMatrix2);\n  }\n\n  /**\n   * Multiply this Matrix2 by one or more Matrix2s.\n   */\n  public multiply(...matrices: Matrix2[]): Matrix2 {\n    return Matrix2.multiply(this, ...matrices);\n  }\n\n  /**\n   * Multiply this Matrix3 by a scalar.\n   */\n  public scaleScalar(scalar: number): Matrix2 {\n    return new Matrix2(vecScale(this.elements, scalar));\n  }\n\n  /**\n   * An identity Matrix4.\n   */\n  public static get identity(): Matrix2 {\n    return new Matrix2(rawIdentityMatrix2);\n  }\n\n  /**\n   * Multiply two or more matrices.\n   * @param matrices Matrices\n   */\n  public static multiply(...matrices: Matrix2[]): Matrix2 {\n    if (matrices.length === 0) {\n      return Matrix2.identity;\n    } else {\n      return new Matrix2(mat2Multiply(...matrices.map((m) => m.elements)));\n    }\n  }\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { vecDot } from '../vec/vecDot';\nimport { vecNormalize } from '../vec/vecNormalize';\nimport { vecScale } from '../vec/vecScale';\nimport { vec3ApplyMatrix3 } from '../vec3/vec3ApplyMatrix3';\nimport { vec3ApplyMatrix4 } from '../vec3/vec3ApplyMatrix4';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Apply given matrix4 to given plane.\n *\n * @param plane A plane\n * @param matrix A matrix4 which will be applied to the plane\n * @param normalMatrix A normalMatrix made out of {@link matrix}\n */\nexport function plane3ApplyMatrix4(\n  [normal, distance]: RawPlane3,\n  matrix: RawMatrix4,\n  normalMatrix: RawMatrix3,\n): RawPlane3 {\n  // normal\u306A\u3093\u3060\u304B\u3089normalMatrix\u5F53\u3066\u308C\u3070\u30E8\u30B7\uFF01\n  const newNormal = vecNormalize(vec3ApplyMatrix3(normal, normalMatrix));\n\n  // \u3068\u308A\u3042\u3048\u305A\u4E00\u70B9\u89B3\u6E2C\u3057\u3066\u3042\u3068\u3067dot\u53D6\u308A\u76F4\u3057\u3061\u3083\u304A\u3046\u305C\uFF01\n  const coplanar = vecScale(normal, -distance);\n  const refPoint = vec3ApplyMatrix4(coplanar, matrix);\n  const newDistance = -vecDot(refPoint, normal);\n\n  return [newNormal, newDistance];\n}\n", "import { vecDot } from '../vec/vecDot';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Return a signed distance from given plane to the given point.\n * Make sure the `normal` is normalized.\n */\nexport function plane3DistanceToPoint([normal, distance]: RawPlane3, point: RawVector3): number {\n  return vecDot(normal, point) + distance;\n}\n", "import { vecLength } from '../vec/vecLength';\nimport { vecScale } from '../vec/vecScale';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Normalize a given plane?\n * This normalizes the normal and also divide distance by its original normal length.\n *\n * I don't come up with any use cases other than {@link planesFromProjectionMatrix}.\n *\n * @param plane The plane you want to normalize\n */\nexport function plane3Normalize([normal, distance]: RawPlane3): RawPlane3 {\n  const invL = 1.0 / vecLength(normal);\n  return [vecScale(normal, invL), distance * invL];\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Vector3 } from '../vec3/Vector3';\nimport { plane3ApplyMatrix4 } from './plane3ApplyMatrix4';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport { plane3Normalize } from './plane3Normalize';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * A 3D plane.\n */\nexport class Plane3 {\n  public normal: Vector3;\n  public distance: number;\n\n  /**\n   * Itself but {@link RawPlane3} form.\n   */\n  public get raw(): RawPlane3 {\n    return [this.normal.elements, this.distance];\n  }\n\n  /**\n   * Normalized plane?\n   * This normalizes the normal and also divide distance by its original normal length.\n   */\n  public get normalized(): Plane3 {\n    return Plane3.fromRaw(plane3Normalize(this.raw));\n  }\n\n  public constructor(normal: Vector3 = Vector3.pz, distance = 0.0) {\n    this.normal = normal;\n    this.distance = distance;\n  }\n\n  /**\n   * Apply given matrix4 to the plane.\n   *\n   * @param matrix A matrix4 which will be applied to the plane\n   * @param normalMatrix A normalMatrix made out of {@link matrix}. Optional\n   */\n  public applyMatrix4(matrix: Matrix4, normalMatrix?: Matrix3): Plane3 {\n    return Plane3.fromRaw(\n      plane3ApplyMatrix4(\n        this.raw,\n        matrix.elements,\n        normalMatrix?.elements ?? matrix.normalMatrix.elements,\n      ),\n    );\n  }\n\n  /**\n   * Return a signed distance from given plane to the given point.\n   *\n   * @param point A point\n   */\n  public distanceToPoint(point: Vector3): number {\n    return plane3DistanceToPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Convert {@link RawPlane3} to class form.\n   * @param plane A {@link RawPlane3}\n   */\n  public static fromRaw(plane: RawPlane3): Plane3 {\n    return new Plane3(new Vector3(plane[0]), plane[1]);\n  }\n}\n", "import type { RawVector3 } from '../vec3/RawVector3';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Test if given point is contained in given planes or not.\n *\n * @param planes A list of planes\n * @param point A point\n */\nexport function planes3ContainPoint(planes: RawPlane3[], point: RawVector3): boolean {\n  return planes.every((plane) => plane3DistanceToPoint(plane, point) >= 0.0);\n}\n", "import type { RawBox3 } from '../box3/RawBox3';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Generate a set of plane3 out of a {@link RawBox3}.\n *\n * @param box A box\n */\nexport function planes3FromBox3(box: RawBox3): RawPlane3[] {\n  return [\n    [[1.0, 0.0, 0.0], -box[0][0]], // xn\n    [[-1.0, 0.0, 0.0], box[1][0]], // xp\n    [[0.0, 1.0, 0.0], -box[0][1]], // yn\n    [[0.0, -1.0, 0.0], box[1][1]], // yp\n    [[0.0, 0.0, 1.0], -box[0][2]], // yn\n    [[0.0, 0.0, -1.0], box[1][2]], // yp\n  ];\n}\n", "import type { RawMatrix4 } from '../mat4/RawMatrix4';\nimport { plane3Normalize } from './plane3Normalize';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Create frustum planes out of given projection matrix.\n *\n * @param m A projection matrix\n */\nexport function planes3FromProjectionMatrix(m: RawMatrix4): RawPlane3[] {\n  const m11 = m[0],\n    m12 = m[4],\n    m13 = m[8],\n    m14 = m[12],\n    m21 = m[1],\n    m22 = m[5],\n    m23 = m[9],\n    m24 = m[13],\n    m31 = m[2],\n    m32 = m[6],\n    m33 = m[10],\n    m34 = m[14],\n    m41 = m[3],\n    m42 = m[7],\n    m43 = m[11],\n    m44 = m[15];\n\n  return [\n    plane3Normalize([[m41 - m11, m42 - m12, m43 - m13], m44 - m14]), // xp\n    plane3Normalize([[m41 + m11, m42 + m12, m43 + m13], m44 + m14]), // xn\n    plane3Normalize([[m41 - m21, m42 - m22, m43 - m23], m44 - m24]), // yp\n    plane3Normalize([[m41 + m21, m42 + m22, m43 + m23], m44 + m24]), // yn\n    plane3Normalize([[m41 - m31, m42 - m32, m43 - m33], m44 - m34]), // zn\n    plane3Normalize([[m41 + m31, m42 + m32, m43 + m33], m44 + m34]), // zp\n  ];\n}\n", "import type { RawBox3 } from '../box3/RawBox3';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Test if given box intersects with planes or not.\n *\n * @param planes A list of planes\n * @param box A box3\n */\nexport function planes3IntersectBox3(planes: RawPlane3[], box: RawBox3): boolean {\n  return planes.every((plane) => {\n    const v = plane[0].map((nc, i) => box[nc > 0.0 ? 1 : 0][i]) as RawVector3;\n    return plane3DistanceToPoint(plane, v) >= 0.0;\n  });\n}\n", "import type { RawSphere3 } from '../sphere3/RawSphere3';\nimport { plane3DistanceToPoint } from './plane3DistanceToPoint';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * Test if given sphere intersects with planes or not.\n *\n * It does not do strict intersection test but still should work well with frustum cull use cases.\n * See the test case for more details.\n *\n * @param planes A list of planes\n * @param sphere A sphere3\n */\nexport function planes3IntersectSphere3(planes: RawPlane3[], sphere: RawSphere3): boolean {\n  return planes.every((plane) => plane3DistanceToPoint(plane, sphere[0]) >= -sphere[1]);\n}\n", "import type { Box3 } from '../box3/Box3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport type { Sphere3 } from '../sphere3/Sphere3';\nimport type { Vector3 } from '../vec3/Vector3';\nimport { Plane3 } from './Plane3';\nimport { planes3ContainPoint } from './planes3ContainPoint';\nimport { planes3FromBox3 } from './planes3FromBox3';\nimport { planes3FromProjectionMatrix } from './planes3FromProjectionMatrix';\nimport { planes3IntersectBox3 } from './planes3IntersectBox3';\nimport { planes3IntersectSphere3 } from './planes3IntersectSphere3';\nimport type { RawPlane3 } from './RawPlane3';\n\n/**\n * A set of {@link Plane3}.\n */\nexport class Planes3 {\n  public planes: Plane3[];\n\n  /**\n   * Itself but {@link RawPlane3}[] form.\n   */\n  public get raw(): RawPlane3[] {\n    return this.planes.map((plane) => plane.raw);\n  }\n\n  public constructor(planes: Plane3[]) {\n    this.planes = planes;\n  }\n\n  /**\n   * Test if given point is contained in the planes or not.\n   *\n   * @param point A point\n   */\n  public containPoint(point: Vector3): boolean {\n    return planes3ContainPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Test if given box intersects with the planes or not.\n   *\n   * @param box A box3\n   */\n  public intersectBox3(box: Box3): boolean {\n    return planes3IntersectBox3(this.raw, box.raw);\n  }\n\n  /**\n   * Test if given sphere intersects with the planes or not.\n   *\n   * It does not do strict intersection test but still should work well with frustum cull use cases.\n   * See the test case for more details.\n   *\n   * @param sphere A sphere3\n   */\n  public intersectSphere3(sphere: Sphere3): boolean {\n    return planes3IntersectSphere3(this.raw, sphere.raw);\n  }\n\n  /**\n   * Convert {@link RawPlane3}[] to class form.\n   *\n   * @param planes A {@link RawPlane3}[]\n   */\n  public static fromRaw(planes: RawPlane3[]): Planes3 {\n    return new Planes3(planes.map((plane) => Plane3.fromRaw(plane)));\n  }\n\n  /**\n   * Generate a set of plane3 out of a {@link RawBox3}.\n   *\n   * @param box A box\n   */\n  public static fromBox3(box: Box3): Planes3 {\n    return Planes3.fromRaw(planes3FromBox3(box.raw));\n  }\n\n  /**\n   * Create frustum planes out of given projection matrix.\n   *\n   * @param matrix A projection matrix\n   */\n  public static fromProjectionMatrix(matrix: Matrix4): Planes3 {\n    return Planes3.fromRaw(planes3FromProjectionMatrix(matrix.elements));\n  }\n}\n", "/**\n * Transform a value from input range to output range.\n *\n * This function does NOT clamp the output value.\n *\n * This function is inspired by the Processing's `map()` function.\n *\n * @param x - value to transform\n * @param x0 - lower edge of the input range\n * @param x1 - upper edge of the input range\n * @param y0 - lower edge of the output range\n * @param y1 - upper edge of the output range\n */\nexport function range(x: number, x0: number, x1: number, y0: number, y1: number): number {\n  return ((x - x0) * (y1 - y0)) / (x1 - x0) + y0;\n}\n", "import { linearstep } from './linearstep';\n\n/**\n * `smoothstep` but more smooth\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function smootherstep(edge0: number, edge1: number, x: number): number {\n  const t = linearstep(edge0, edge1, x);\n  return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\n}\n", "import { linearstep } from './linearstep';\n\n/**\n * `smoothstep` but WAY more smooth\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function smootheststep(edge0: number, edge1: number, x: number): number {\n  const t = linearstep(edge0, edge1, x);\n  return t * t * t * t * (t * (t * (-20.0 * t + 70.0) - 84.0) + 35.0);\n}\n", "import { linearstep } from './linearstep';\n\n/**\n * world famous `smoothstep` function\n *\n * @param edge0 - lower edge of the transition\n * @param edge1 - upper edge of the transition\n * @param x - value to interpolate\n */\nexport function smoothstep(edge0: number, edge1: number, x: number): number {\n  const t = linearstep(edge0, edge1, x);\n  return t * t * (3.0 - 2.0 * t);\n}\n", "import { vecLengthSq } from '../vec/vecLengthSq';\nimport { vecSub } from '../vec/vecSub';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport type { RawSphere3 } from './RawSphere3';\n\n/**\n * Test if given point is contained in given sphere or not.\n * @param sphere A sphere\n * @param point A point\n */\nexport function sphere3ContainsPoint(sphere: RawSphere3, point: RawVector3): boolean {\n  return vecLengthSq(vecSub(sphere[0], point)) <= sphere[1] * sphere[1];\n}\n", "import { Vector3 } from '../vec3/Vector3';\nimport type { RawSphere3 } from './RawSphere3';\nimport { sphere3ContainsPoint } from './sphere3ContainsPoint';\n\n/**\n * A 3D sphere.\n */\nexport class Sphere3 {\n  public origin: Vector3;\n  public radius: number;\n\n  public constructor(origin: Vector3 = Vector3.zero, radius: number = 0.0) {\n    this.origin = origin;\n    this.radius = radius;\n  }\n\n  /**\n   * Itself but {@link RawSphere3} form.\n   */\n  public get raw(): RawSphere3 {\n    return [this.origin.elements, this.radius];\n  }\n\n  /**\n   * Test if given point is contained in the sphere or not.\n   *\n   * @param point A point\n   */\n  public containsPoint(point: Vector3): boolean {\n    return sphere3ContainsPoint(this.raw, point.elements);\n  }\n\n  /**\n   * Convert {@link RawSphere3} to class form.\n   * @param sphere A {@link RawSphere3}\n   */\n  public static fromRaw(sphere: RawSphere3): Sphere3 {\n    return new Sphere3(new Vector3(sphere[0]), sphere[1]);\n  }\n}\n", "/**\n * GLSL style heaviside step function.\n *\n * `edge <= x ? 1.0 : 0.0`\n *\n * @param edge - threshold value\n * @param x - value to test\n */\nexport function step(edge: number, x: number): number {\n  return edge <= x ? 1.0 : 0.0;\n}\n", "import type { RawMatrix3 } from '../mat3/RawMatrix3';\nimport type { RawVector3 } from '../vec3/RawVector3';\nimport { vec3ApplyMatrix3 } from '../vec3/vec3ApplyMatrix3';\nimport type { RawVector4 } from './RawVector4';\n\n/**\n * Apply a vec4 a mat3 (with an implicit 1 on m44).\n */\nexport function vec4ApplyMatrix3(v: RawVector4, m: RawMatrix3): RawVector4 {\n  const v3: RawVector3 = [v[0], v[1], v[2]];\n  const xyz = vec3ApplyMatrix3(v3, m);\n  const w = v[3];\n  return [xyz[0], xyz[1], xyz[2], w];\n}\n", "import type { Matrix3 } from '../mat3/Matrix3';\nimport type { Matrix4 } from '../mat4/Matrix4';\nimport { Vector } from '../vec/Vector';\nimport type { RawVector4 } from './RawVector4';\nimport { vec4ApplyMatrix3 } from './vec4ApplyMatrix3';\nimport { vec4ApplyMatrix4 } from './vec4ApplyMatrix4';\n\n/**\n * A Vector3.\n */\nexport class Vector4 extends Vector<Vector4> {\n  public elements: RawVector4;\n\n  public constructor(v: RawVector4 = [0.0, 0.0, 0.0, 0.0]) {\n    super();\n    this.elements = v;\n  }\n\n  /**\n   * An x component of this.\n   */\n  public get x(): number {\n    return this.elements[0];\n  }\n\n  public set x(x: number) {\n    this.elements[0] = x;\n  }\n\n  /**\n   * A y component of this.\n   */\n  public get y(): number {\n    return this.elements[1];\n  }\n\n  public set y(y: number) {\n    this.elements[1] = y;\n  }\n\n  /**\n   * A z component of this.\n   */\n  public get z(): number {\n    return this.elements[2];\n  }\n\n  public set z(z: number) {\n    this.elements[2] = z;\n  }\n\n  /**\n   * A w component of this.\n   */\n  public get w(): number {\n    return this.elements[3];\n  }\n\n  public set w(z: number) {\n    this.elements[3] = z;\n  }\n\n  public toString(): string {\n    return `Vector4( ${this.x.toFixed(3)}, ${this.y.toFixed(3)}, ${this.z.toFixed(3)}, ${this.w.toFixed(3)} )`;\n  }\n\n  /**\n   * Apply this vector a mat3 (with an implicit 1 on m44).\n   */\n  public applyMatrix3(matrix: Matrix3): Vector4 {\n    return new Vector4(vec4ApplyMatrix3(this.elements, matrix.elements));\n  }\n\n  /**\n   * Multiply this vector by a mat4.\n   */\n  public applyMatrix4(matrix: Matrix4): Vector4 {\n    return new Vector4(vec4ApplyMatrix4(this.elements, matrix.elements));\n  }\n\n  protected __new(v: RawVector4): Vector4 {\n    return new Vector4(v);\n  }\n\n  /**\n   * Vector4( 0.0, 0.0, 0.0, 0.0 )\n   */\n  public static get zero(): Vector4 {\n    return new Vector4([0.0, 0.0, 0.0, 0.0]);\n  }\n\n  /**\n   * Vector4( 1.0, 1.0, 1.0, 1.0 )\n   */\n  public static get one(): Vector4 {\n    return new Vector4([1.0, 1.0, 1.0, 1.0]);\n  }\n}\n", "import { arraySerial } from '../array/arraySerial';\nimport type {\n  MidiParseResult,\n  MidiParseResultHeader,\n  MidiParseResultTrack,\n} from './MidiParseResult';\n\nfunction readU8(array: Uint8Array, headBox: [number]): number {\n  return array[headBox[0]++];\n}\n\n/**\n * Big endian\n */\nfunction readU16(array: Uint8Array, headBox: [number]): number {\n  return readU8(array, headBox) * 256 + readU8(array, headBox);\n}\n\n/**\n * Big endian\n */\nfunction readU32(array: Uint8Array, headBox: [number]): number {\n  return readU16(array, headBox) * 65536 + readU16(array, headBox);\n}\n\nfunction readUVar(array: Uint8Array, headBox: [number]): number {\n  let v = 0;\n  for (;;) {\n    const vv = readU8(array, headBox);\n    v = v * 128 + (vv & 127);\n\n    if (vv < 128) {\n      return v;\n    }\n  }\n}\n\nfunction parseHeader(array: Uint8Array, headBox: [number]): MidiParseResultHeader {\n  // skip type and length (4+4)\n  // length has to be 6, there's no need to parse\n  headBox[0] += 8;\n\n  // biome-ignore format: readability\n  return [\n    readU16(array, headBox),\n    readU16(array, headBox),\n    readU16(array, headBox),\n  ];\n}\n\nfunction parseTrack(array: Uint8Array, headBox: [number]): MidiParseResultTrack {\n  // skip type (4)\n  headBox[0] += 4;\n\n  const endOfTrack = headBox[0] + readU32(array, headBox) + 4;\n\n  const track: MidiParseResultTrack = [];\n  let type = 0;\n\n  while (headBox[0] < endOfTrack) {\n    const delta = readUVar(array, headBox);\n    const status = readU8(array, headBox);\n    type = status < 128 ? type : status;\n    const data0 = status < 128 ? status : readU8(array, headBox);\n\n    if (type < 0xc0) {\n      // note on (9x), note off (8x), polyphonic key pressure (Ax), control change (Bx)\n\n      track.push([\n        delta,\n        type,\n        data0, // note or cc number\n        readU8(array, headBox), // velocity, pressure, or data\n      ]);\n    } else if (type === 0xff) {\n      // meta events\n\n      const eventLength = readU8(array, headBox);\n\n      // biome-ignore format: readability\n      track.push([\n        delta,\n        type,\n        data0,\n        arraySerial(eventLength).map(() => readU8(array, headBox)),\n      ]);\n\n      if (data0 === 0x2f) {\n        // end of track\n        break;\n      }\n    } else {\n      throw new Error(`${type}`);\n    }\n  }\n\n  return track;\n}\n\nexport function midiParse(buffer: ArrayBuffer): MidiParseResult {\n  const array = new Uint8Array(buffer);\n  const headBox: [number] = [0];\n\n  const header = parseHeader(array, headBox);\n  const tracks: MidiParseResultTrack[] = [];\n\n  while (headBox[0] < array.length) {\n    tracks.push(parseTrack(array, headBox));\n  }\n\n  return [header, tracks];\n}\n", "/**\n * An utility type definition to use along with {@link notifyObservers}.\n */\nexport type Observer<TEvent = void> = (event: TEvent) => void;\n\n/**\n * A bare function to notify observers.\n * The incredibly cheap implementation of the observer pattern.\n *\n * Use along with the utility type definition {@link Observer}.\n *\n * @example\n * ```ts\n * const observers = new Set<Observer<string>>();\n *\n * observers.add( ( text ) => console.log( text ) );\n * observers.add( ( text ) => alert( text ) );\n *\n * notifyObservers( observers, 'wenis' );\n * ```\n *\n * @param observers The iterator of observers\n * @param param The param you want to give to observers\n */\nexport function notifyObservers(observers: Iterable<Observer<void>>): void;\nexport function notifyObservers<T>(observers: Iterable<Observer<T>>, param: T): void;\nexport function notifyObservers<T>(observers: Iterable<Observer<T>>, param?: T): void {\n  for (const observer of observers) {\n    observer(param as T);\n  }\n}\n", "import type { PokerRank } from './PokerRank';\n\nexport const pokerRanksByStrength: PokerRank[] = [\n  '2',\n  '3',\n  '4',\n  '5',\n  '6',\n  '7',\n  '8',\n  '9',\n  'T',\n  'J',\n  'Q',\n  'K',\n  'A',\n];\n", "import type { PokerSuit } from './PokerSuit';\n\nexport const pokerSuitsByIndex: PokerSuit[] = ['c', 'd', 'h', 's'];\n", "import type { PokerCard } from './PokerCard';\nimport { pokerRanksByStrength } from './pokerRanksByStrength';\nimport { pokerSuitsByIndex } from './pokerSuitsByIndex';\n\n/**\n * Create a 52-card deck.\n * You might want to use {@link shuffleArray} to shuffle the deck.\n */\nexport function createPokerDeck(): PokerCard[] {\n  const array: PokerCard[] = [];\n\n  pokerSuitsByIndex.map((suit) =>\n    pokerRanksByStrength.map((rank) => array.push((rank + suit) as PokerCard)),\n  );\n\n  return array;\n}\n", "import type { PokerHand } from './PokerHand';\n\nexport const pokerHandStrengthMap: { [hand in PokerHand]: number } = {\n  HighCard: 0,\n  OnePair: 1,\n  TwoPair: 2,\n  ThreeOfAKind: 3,\n  Straight: 4,\n  Flush: 5,\n  FullHouse: 6,\n  FourOfAKind: 7,\n  StraightFlush: 8,\n};\n", "import type { PokerRank } from './PokerRank';\n\nexport const pokerRankStrengthMap: { [rank in PokerRank]: number } = {\n  '2': 0,\n  '3': 1,\n  '4': 2,\n  '5': 3,\n  '6': 4,\n  '7': 5,\n  '8': 6,\n  '9': 7,\n  T: 8,\n  J: 9,\n  Q: 10,\n  K: 11,\n  A: 12,\n};\n", "import type { PokerSuit } from './PokerSuit';\n\nexport const pokerSuitIndexMap: { [suit in PokerSuit]: number } = {\n  c: 0,\n  d: 1,\n  h: 2,\n  s: 3,\n};\n", "import type { PokerCard } from './PokerCard';\nimport type { PokerRank } from './PokerRank';\nimport type { PokerSuit } from './PokerSuit';\nimport { pokerRankStrengthMap } from './pokerRankStrengthMap';\nimport { pokerSuitIndexMap } from './pokerSuitIndexMap';\n\n/**\n * Sort given array of cards in place by rank (and suit).\n */\nexport function sortPokerCardsByRank(cards: PokerCard[]): PokerCard[] {\n  return cards\n    .sort((a, b) => pokerSuitIndexMap[a[1] as PokerSuit] - pokerSuitIndexMap[b[1] as PokerSuit])\n    .sort(\n      (a, b) => pokerRankStrengthMap[a[0] as PokerRank] - pokerRankStrengthMap[b[0] as PokerRank],\n    );\n}\n", "import { MapOfSet } from '../MapOfSet/MapOfSet';\nimport type { PokerCard } from './PokerCard';\nimport type { PokerHand } from './PokerHand';\nimport type { PokerRank } from './PokerRank';\nimport type { PokerSuit } from './PokerSuit';\nimport { pokerHandStrengthMap } from './pokerHandStrengthMap';\nimport { pokerRankStrengthMap } from './pokerRankStrengthMap';\nimport { pokerRanksByStrength } from './pokerRanksByStrength';\nimport { sortPokerCardsByRank } from './sortPokerCardsByRank';\n\nexport interface EvaluatePokerHandResult {\n  hand: PokerHand;\n  strength: number[];\n  cards: [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard];\n}\n\nexport function evaluatePokerHand(cards: PokerCard[]): EvaluatePokerHandResult {\n  // cards mutable edition\n  const cards_ = cards.concat();\n\n  const cardsByRank = new MapOfSet<PokerRank, PokerCard>();\n  const cardsBySuit = new MapOfSet<PokerSuit, PokerCard>();\n\n  cards_.map((card) => {\n    const rank = card[0] as PokerRank;\n    const suit = card[1] as PokerSuit;\n    cardsByRank.add(rank, card);\n    cardsBySuit.add(suit, card);\n  });\n\n  // pairs\n  const fours: PokerRank[] = [];\n  const threes: PokerRank[] = [];\n  const twos: PokerRank[] = [];\n\n  pokerRanksByStrength.map((rank) => {\n    const cards = cardsByRank.get(rank);\n    if (cards.size > 3) {\n      fours.push(rank);\n    } else if (cards.size > 2) {\n      threes.push(rank);\n    } else if (cards.size > 1) {\n      twos.push(rank);\n    }\n  });\n\n  // straight\n  let straightCards: PokerCard[] | undefined;\n  {\n    let current: PokerCard[] = [];\n\n    // handle steel wheel\n    const a = Array.from(cardsByRank.get('A'))[0];\n    if (a) {\n      current.push(a);\n    }\n\n    pokerRanksByStrength.map((rank) => {\n      const card = Array.from(cardsByRank.get(rank))[0];\n      if (card) {\n        current.push(card);\n\n        if (current.length > 4) {\n          straightCards = current;\n        }\n      } else {\n        current = [];\n      }\n    });\n  }\n\n  // straight flush\n  if (straightCards) {\n    for (const [suit, cardsSet] of cardsBySuit.map) {\n      if (cardsSet.size > 0) {\n        let straightFlushCards: PokerCard[] | undefined;\n        let current: PokerCard[] = [];\n\n        // handle steel wheel\n        const target = ('A' + suit) as PokerCard;\n        const a = cardsSet.has(target);\n        if (a) {\n          current.push(target);\n        }\n\n        pokerRanksByStrength.map((rank) => {\n          const target = (rank + suit) as PokerCard;\n          if (cardsSet.has(target)) {\n            current.push(target);\n\n            if (current.length > 4) {\n              straightFlushCards = current;\n            }\n          } else {\n            current = [];\n          }\n        });\n\n        if (straightFlushCards) {\n          straightFlushCards.splice(0, straightFlushCards.length - 5);\n\n          const hand = 'StraightFlush';\n          const strength = [\n            pokerHandStrengthMap[hand],\n            pokerRankStrengthMap[straightFlushCards[4][0] as PokerRank],\n          ];\n\n          return {\n            hand,\n            cards: straightFlushCards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n            strength,\n          };\n        }\n      }\n    }\n  }\n\n  // four of a kind\n  if (fours.length > 0) {\n    fours.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    fours.splice(0, fours.length - 1);\n\n    // 5s, 5c, Kd, 6d, 9c, 5d, 5h\n\n    const sameCards = Array.from(cardsByRank.get(fours[0]));\n    sameCards.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // Kd, 6d, 9c\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 1);\n    // Kd\n\n    const hand = 'FourOfAKind';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[fours[0]],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...sameCards);\n    sortPokerCardsByRank(cards_);\n    // 5c, 5d, 5h, 5s, Kd\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // full house\n  if (threes.length > 0 && threes.length + twos.length > 1) {\n    threes.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n\n    // tricky part: it is possible to have two or more threes at once\n    // just transfer threes which is not highest\n    // and wish we'll do this right in the rest of the code\n    twos.push(...threes.splice(0, threes.length - 1));\n\n    twos.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    twos.splice(0, twos.length - 1);\n\n    // 7d, 7s, Tc, Td, 7h, 9d, Th\n\n    const sameCards = Array.from(cardsByRank.get(threes[0]));\n    sameCards.push(...Array.from(cardsByRank.get(twos[0])));\n    // sameCards: Tc, Td, Th, 7d, 7s, 7h\n\n    sortPokerCardsByRank(sameCards).splice(0, sameCards.length - 5);\n    // sameCards: 7h, 7s, Tc, Td, Th\n\n    const hand = 'FullHouse';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[threes[0]],\n      pokerRankStrengthMap[twos[0]],\n    ];\n\n    return {\n      hand,\n      cards: sameCards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // flush\n  for (const [_suit, cardsSet] of cardsBySuit.map) {\n    if (cardsSet.size > 4) {\n      const cards = sortPokerCardsByRank(Array.from(cardsSet));\n      cards.splice(0, cards.length - 5);\n\n      const hand = 'Flush';\n      const strength = [\n        pokerHandStrengthMap[hand],\n        ...cards\n          .concat()\n          .reverse()\n          .map((card) => pokerRankStrengthMap[card[0] as PokerRank]),\n      ];\n\n      return {\n        hand,\n        cards: cards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n        strength,\n      };\n    }\n  }\n\n  // straight\n  if (straightCards) {\n    straightCards.splice(0, straightCards.length - 5);\n\n    const hand = 'Straight';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[straightCards[4][0] as PokerRank],\n    ];\n\n    return {\n      hand,\n      cards: straightCards as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // three of a kind\n  if (threes.length > 0) {\n    threes.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    threes.splice(0, threes.length - 1);\n\n    // Ah, Ad, Kc, 7s, 4s, Qc, As\n\n    const sameCards = Array.from(cardsByRank.get(threes[0]));\n    sameCards.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // Kc, 7s, 4s, Qc\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 2);\n    // Qc, Kc\n\n    const hand = 'ThreeOfAKind';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[threes[0]],\n      pokerRankStrengthMap[cards_[1][0] as PokerRank],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...sameCards);\n    sortPokerCardsByRank(cards_);\n    // Qc, Kc, Ad, Ah, As\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // two pair\n  if (twos.length > 1) {\n    twos.sort((a, b) => pokerRankStrengthMap[a] - pokerRankStrengthMap[b]);\n    twos.splice(0, twos.length - 2);\n\n    // 4c, 8d, 7h, 4h, 8h, Jc, 2s\n\n    const pairs = Array.from(cardsByRank.get(twos[0]));\n    pairs.push(...Array.from(cardsByRank.get(twos[1])));\n    pairs.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // 7h, Jc, 2s\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 1);\n    // Jc\n\n    const hand = 'TwoPair';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[twos[1]],\n      pokerRankStrengthMap[twos[0]],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...pairs);\n    sortPokerCardsByRank(cards_);\n    // 4c, 4h, 8d, 8h, Jc\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // one pair\n  if (twos.length > 0) {\n    // 3c, 5d, 8c, 8s, Ac, Qd, 7h\n\n    const pair = Array.from(cardsByRank.get(twos[0]));\n    pair.map((card) => cards_.splice(cards_.indexOf(card), 1));\n    // 3c, 5d, Ac, Qd, 7h\n\n    sortPokerCardsByRank(cards_).splice(0, cards_.length - 3);\n    // 7h, Qd, Ac\n\n    const hand = 'OnePair';\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[twos[0]],\n      pokerRankStrengthMap[cards_[2][0] as PokerRank],\n      pokerRankStrengthMap[cards_[1][0] as PokerRank],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    cards_.push(...pair);\n    sortPokerCardsByRank(cards_);\n    // 7h, 8c, 8s, Qd, Ac\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n\n  // high card\n  {\n    const hand = 'HighCard';\n\n    // 2h, 5c, 6c, 7s, Td, Ad, Kd\n\n    sortPokerCardsByRank(cards_);\n    // 2h, 5c, 6c, 7s, Td, Kd, Ad\n\n    cards_.splice(0, cards_.length - 5);\n    // 6c, 7s, Td, Kd, Ad\n\n    const strength = [\n      pokerHandStrengthMap[hand],\n      pokerRankStrengthMap[cards_[4][0] as PokerRank],\n      pokerRankStrengthMap[cards_[3][0] as PokerRank],\n      pokerRankStrengthMap[cards_[2][0] as PokerRank],\n      pokerRankStrengthMap[cards_[1][0] as PokerRank],\n      pokerRankStrengthMap[cards_[0][0] as PokerRank],\n    ];\n\n    return {\n      hand,\n      cards: cards_ as [PokerCard, PokerCard, PokerCard, PokerCard, PokerCard],\n      strength,\n    };\n  }\n}\n", "import type { PokerCard } from './PokerCard';\nimport type { PokerRank } from './PokerRank';\nimport type { PokerSuit } from './PokerSuit';\n\nconst rankMap: Record<PokerRank, number> = {\n  A: 1,\n  '2': 2,\n  '3': 3,\n  '4': 4,\n  '5': 5,\n  '6': 6,\n  '7': 7,\n  '8': 8,\n  '9': 9,\n  T: 10,\n  J: 11,\n  Q: 13,\n  K: 14,\n};\n\nconst suitMap: Record<PokerSuit, number> = {\n  s: 0,\n  h: 16,\n  d: 32,\n  c: 48,\n};\n\nexport function pokerCardToUnicode(card: PokerCard): string {\n  const rank = card[0] as PokerRank;\n  const suit = card[1] as PokerSuit;\n\n  return String.fromCodePoint(0x1f0a0 + rankMap[rank] + suitMap[suit]);\n}\n", "import type { PokerHand } from './PokerHand';\n\nexport const pokerHandsByStrength: PokerHand[] = [\n  'HighCard',\n  'OnePair',\n  'TwoPair',\n  'ThreeOfAKind',\n  'Straight',\n  'Flush',\n  'FullHouse',\n  'FourOfAKind',\n  'StraightFlush',\n];\n", "/**\n * Retry given function for n times.\n *\n * See also: {@link retry}\n */\nexport async function asyncRetry<T>(func: () => Promise<T>, n: number): Promise<T> {\n  return await func().catch((error) => {\n    if (n <= 1) {\n      throw error;\n    }\n\n    return asyncRetry(func, n - 1);\n  });\n}\n", "/**\n * Retry given function for n times.\n *\n * See also: {@link asyncRetry}\n */\nexport function retry<T>(func: () => T, n: number): T {\n  try {\n    return func();\n  } catch (error) {\n    if (n <= 1) {\n      throw error;\n    }\n\n    return retry(func, n - 1);\n  }\n}\n", "/**\n * The naive implementation of so-called SmoothDamp.\n * Pretty much the same as {@link CDS}, but it has a way easier parameter to tweak, {@link smoothTime}.\n *\n * Ref: Game Programming Gems 4, Chapter 1.10\n *\n * See: https://github.com/Unity-Technologies/UnityCsReference/blob/a2bdfe9b3c4cd4476f44bf52f848063bfaf7b6b9/Runtime/Export/Math/Mathf.cs#L308\n */\nexport class SmoothDamp {\n  public smoothTime = 1.0;\n  public velocity = 0.0;\n  public value = 0.0;\n  public target = 0.0;\n\n  public update(deltaTime: number): number {\n    const omega = 2.0 / this.smoothTime;\n    const x = omega * deltaTime;\n    const exp = 1.0 / (1.0 + x + 0.48 * x * x + 0.235 * x * x * x);\n    const delta = this.value - this.target;\n    const temp = (this.velocity + omega * delta) * deltaTime;\n    this.velocity = (this.velocity - omega * temp) * exp;\n    this.value = this.target + (delta + temp) * exp;\n    return this.value;\n  }\n}\n", "/**\n * Useful for swap buffer\n */\nexport class Swap<T> {\n  public i: T;\n  public o: T;\n\n  public constructor(a: T, b: T) {\n    this.i = a;\n    this.o = b;\n  }\n\n  public swap(): void {\n    const i = this.i;\n    this.i = this.o;\n    this.o = i;\n  }\n}\n", "import type { STNICCCFrame } from './STNICCCFrame';\n\n/**\n * Ref: http://arsantica-online.com/st-niccc-competition/\n *\n * @param buffer The input ST-NICCC data\n */\nexport function parseSTNICCC(buffer: ArrayBuffer): STNICCCFrame[] {\n  const frames: STNICCCFrame[] = [];\n\n  const array = new Uint8Array(buffer);\n\n  const palette = new Uint16Array(16);\n\n  let head = 0;\n\n  // when poly-descriptor says 0xfe\n  let shouldSkip = false;\n\n  // when poly-descriptor says 0xfd\n  let shouldEnd = false;\n\n  // > Every frame stores the following data:\n  for (;;) {\n    // > 1 byte Flags Bit 0: Frame needs to clear the screen.\n    // > Bit 1: Frame contains palette data.\n    // > Bit 2: Frame is stored in indexed mode.\n    const flags = array[head++];\n    const needsClear = (flags & 1) === 1;\n    const hasPalette = ((flags >> 1) & 1) === 1;\n    const indexedMode = ((flags >> 2) & 1) === 1;\n\n    // > If frame contains palette data\n    if (hasPalette) {\n      // > 1 word Bitmask\n      const bitmask = (array[head++] << 8) | array[head++];\n\n      // > For every set bit in the Bitmask (0-15)\n      for (let i = 0; i < 16; i++) {\n        if ((bitmask >> (15 - i)) & 1) {\n          // > 1 word Color The color has to be copied into the palette at the reverse index of the actual bit,\n          // > because the bitmask is stored in reverse order.\n          // > In other words: If bit 15 of mask is set -> update color 0 of palette,\n          // > \u2026\n          // > if bit 0 of mask is set -> update color 15 of palette.\n\n          palette[i] = (array[head++] << 8) | array[head++];\n        }\n      }\n    }\n\n    // > If frame is stored in indexed mode\n    if (indexedMode) {\n      // > 1 byte Number of vertices (0-255)\n      const nVertices = array[head++];\n\n      // > For every Vertex\n      // > {\n      // > 1 byte X-position\n      // > 1 byte Y-position\n      // > }\n      const vertices = array.subarray(head, head + 2 * nVertices);\n      head += 2 * nVertices;\n\n      const polygons: { colorIndex: number; indices: number[] }[] = [];\n\n      // > While (\u2026)\n      for (;;) {\n        // > 1 byte Poly-descriptor Contains: hi-nibble - 4 bits color-index\n        // > lo-nibble - 4 bits number of polygon vertices\n        // >\n        // > Some special cases are encoded in the descriptor byte:\n        // > $ff = End of frame\n        // > $fe = End of frame and the stream skips to the next 64KB block\n        // > $fd = End of stream (we are done \\o/)\n        const descriptor = array[head++];\n\n        if (descriptor === 0xff) {\n          // end of frame\n          break;\n        } else if (descriptor === 0xfe) {\n          // end of frame + skip to the next 64KB\n          shouldSkip = true;\n          break;\n        } else if (descriptor === 0xfd) {\n          // end of stream\n          shouldEnd = true;\n          break;\n        }\n\n        const colorIndex = (descriptor >> 4) & 15;\n        const nIndices = descriptor & 15;\n\n        // > For every vertex of the polygon\n        // > {\n        // > 1 byte Vertex-id (0-255)\n        // > }\n        const indices = array.subarray(head, head + nIndices);\n        head += nIndices;\n\n        polygons.push({\n          colorIndex,\n          indices: Array.from(indices),\n        });\n      }\n\n      frames.push({\n        needsClear,\n        indexedMode,\n        palette: Array.from(palette),\n        vertices: Array.from(vertices),\n        polygons,\n      });\n\n      // > Else if frame is stored in non-indexed mode\n    } else {\n      const polygons: { colorIndex: number; vertices: number[] }[] = [];\n\n      // > While (\u2026)\n      for (;;) {\n        // > 1 byte Poly-descriptor (See indexed mode)\n        const descriptor = array[head++];\n\n        if (descriptor === 0xff) {\n          // end of frame\n          break;\n        } else if (descriptor === 0xfe) {\n          // end of frame + skip to the next 64KB\n          shouldSkip = true;\n          break;\n        } else if (descriptor === 0xfd) {\n          // end of stream\n          shouldEnd = true;\n          break;\n        }\n\n        const colorIndex = (descriptor >> 4) & 15;\n        const nVertices = descriptor & 15;\n\n        // > For every vertex of the polygon\n        // > {\n        // > 1 byte Vertex-id (0-255)\n        // > }\n        const vertices = array.subarray(head, head + 2 * nVertices);\n        head += 2 * nVertices;\n\n        polygons.push({\n          colorIndex,\n          vertices: Array.from(vertices),\n        });\n      }\n\n      frames.push({\n        needsClear,\n        indexedMode,\n        palette: Array.from(palette),\n        polygons,\n      });\n    }\n\n    if (shouldSkip) {\n      head = (Math.floor(head / 0x10000) + 1) * 0x10000;\n      shouldSkip = false;\n    }\n\n    if (shouldEnd) {\n      break;\n    }\n  }\n\n  return frames;\n}\n", "import { colorFromAtariST } from '../color/colorFromAtariST';\nimport { colorToHex } from '../color/colorToHex';\nimport type { STNICCCFrame } from './STNICCCFrame';\n\nexport function stnicccToSVG(\n  frames: STNICCCFrame[],\n  options: {\n    fps?: number;\n  } = {},\n): string {\n  const delta = 1.0 / (options?.fps ?? 30.0);\n\n  let svg =\n    '<svg width=\"256\" height=\"200\" viewBox=\"0 0 256 200\" xmlns=\"http://www.w3.org/2000/svg\">';\n\n  let style = `g{visibility:hidden;animation-duration:${(delta * frames.length).toFixed(3)}s;animation-iteration-count:infinite;animation-name:frame}@keyframes frame{0%{visibility:visible}${200.0 / frames.length}%{visibility:hidden}}`;\n\n  frames.map((frame, iFrame) => {\n    const { indexedMode, palette, polygons } = frame;\n\n    style += `#f${iFrame}{animation-delay:${(delta * iFrame).toFixed(3)}s}`;\n\n    const paletteInHex = palette.map((stColor) => {\n      const color = colorFromAtariST(stColor);\n      return colorToHex(color);\n    });\n\n    let childrenStr = '<rect width=\"256\" height=\"200\" fill=\"#000\" />';\n\n    let currentColorIndex = -1;\n    let d = '';\n\n    if (indexedMode) {\n      const { vertices } = frame;\n\n      polygons.map(({ colorIndex, indices }) => {\n        if (currentColorIndex !== colorIndex) {\n          if (currentColorIndex !== -1) {\n            const colorHex = paletteInHex[currentColorIndex];\n            childrenStr += `<path d=\"${d}\" fill=\"${colorHex}\" />`;\n          }\n\n          currentColorIndex = colorIndex;\n          d = '';\n        }\n\n        for (let i = 0; i < indices.length; i++) {\n          const index = indices[i];\n          const x = vertices[2 * index];\n          const y = vertices[2 * index + 1];\n\n          d += i === 0 ? `M${x},${y}` : `L${x},${y}`;\n        }\n      });\n    } else {\n      polygons.map(({ colorIndex, vertices }) => {\n        if (currentColorIndex !== colorIndex) {\n          if (currentColorIndex !== -1) {\n            const colorHex = paletteInHex[currentColorIndex];\n            childrenStr += `<path d=\"${d}\" fill=\"${colorHex}\" />`;\n          }\n\n          currentColorIndex = colorIndex;\n          d = '';\n        }\n\n        for (let i = 0; i < vertices.length; i += 2) {\n          const x = vertices[i];\n          const y = vertices[i + 1];\n\n          d += i === 0 ? `M${x},${y}` : `L${x},${y}`;\n        }\n      });\n    }\n\n    const colorHex = paletteInHex[currentColorIndex];\n    childrenStr += `<path d=\"${d}\" fill=\"${colorHex}\" />`;\n\n    svg += `<g id=\"f${iFrame}\">${childrenStr}</g>`;\n  });\n\n  svg += `<style>${style}</style></svg>`;\n\n  return svg;\n}\n", "import { HistoryMeanCalculator } from '../HistoryMeanCalculator/HistoryMeanCalculator';\n\nexport class TapTempo {\n  private __bpm = 0.0;\n  private __lastTap = 0.0;\n  private __lastBeat = 0.0;\n  private __lastTime = 0.0;\n  private __calc: HistoryMeanCalculator = new HistoryMeanCalculator(16);\n\n  public get beatDuration(): number {\n    return 60.0 / this.__bpm;\n  }\n\n  public get bpm(): number {\n    return this.__bpm;\n  }\n\n  public set bpm(bpm: number) {\n    this.__lastBeat = this.beat;\n    this.__lastTime = performance.now();\n    this.__bpm = bpm;\n  }\n\n  public get beat(): number {\n    return this.__lastBeat + ((performance.now() - this.__lastTime) * 0.001) / this.beatDuration;\n  }\n\n  public reset(): void {\n    this.__calc.reset();\n  }\n\n  public nudge(amount: number): void {\n    this.__lastBeat = this.beat + amount;\n    this.__lastTime = performance.now();\n  }\n\n  public tap(): void {\n    const now = performance.now();\n    const delta = (now - this.__lastTap) * 0.001;\n\n    if (2.0 < delta) {\n      this.reset();\n    } else {\n      this.__calc.push(delta);\n      this.__bpm = 60.0 / this.__calc.mean;\n    }\n\n    this.__lastTap = now;\n    this.__lastTime = now;\n    this.__lastBeat = 0.0;\n  }\n}\n", "/**\n * Make the given function a throttled one.\n *\n * @example\n * ```ts\n * const func = throttle( 100, () => {\n *   // some expensive procedure\n * } );\n *\n * func();\n * func();\n * func();\n * ```\n */\nexport function throttle(func: () => void, rateMs: number): () => void {\n  /** Timeout ID for the queued function call */\n  let queueId: ReturnType<typeof setTimeout> | null | undefined;\n\n  /** Timestamp of the last execution */\n  let lastTime = -Infinity;\n\n  return () => {\n    const now = Date.now();\n    const untilNextExec = lastTime + rateMs - now;\n\n    // clear any previously queued calls\n    if (queueId) {\n      clearTimeout(queueId);\n    }\n\n    if (untilNextExec <= 0) {\n      // if enough time has passed, execute immediately\n      lastTime = now;\n      func();\n    } else {\n      // if not, queue for execution after the next good time\n      queueId = setTimeout(() => {\n        lastTime = Date.now();\n        func();\n      }, untilNextExec);\n    }\n  };\n}\n", "import { arraySerial } from '../array';\n\n/**\n * Parse a polyphonic tinyseq buffer.\n *\n * Returns [ time, offTime, note, reserved, time, offTime, note, reserved, ... ]\n */\nexport function createTinyseqPolyReader(\n  buffer: Uint8Array,\n  options: {\n    poly?: number;\n    blockSize?: number;\n    sampleRate?: number;\n    stepsPerSecond?: number;\n  } = {},\n): () => Float32Array[] {\n  const poly = options.poly ?? 8;\n  const blockSize = options.blockSize ?? 128;\n  const sampleRate = options.sampleRate ?? 48000;\n  const stepsPerSecond = options.stepsPerSecond ?? 1.0;\n\n  let samples = 0;\n  let pos = 0;\n  let note: number;\n  const notes = arraySerial(poly).fill(-1);\n  const notesTime = arraySerial(poly).fill(-Infinity);\n  const notesOffTime = arraySerial(poly).fill(-Infinity);\n  let nextStep = 0;\n\n  return () => {\n    const ret = arraySerial(poly).map(() => new Float32Array(4 * blockSize));\n\n    arraySerial(blockSize).map((iSample) => {\n      const t = samples / sampleRate;\n      const s = t * stepsPerSecond;\n\n      if (s >= nextStep) {\n        const eventNote = buffer[pos];\n        const eventDeltaStep = buffer[pos + 1];\n\n        note = ((pos === 0 ? 60 : note) + eventNote) & 127;\n\n        // find same note\n        let iPoly = notes.indexOf(note);\n\n        // find earliest note off\n        let tEarliest = Infinity;\n\n        if (iPoly === -1) {\n          notesTime.map((tOn, jPoly) => {\n            const tOff = notesOffTime[jPoly];\n            if (tOn <= tOff) {\n              if (tOff < tEarliest) {\n                iPoly = jPoly;\n                tEarliest = tOff;\n              }\n            }\n          });\n        }\n\n        // find earliest note on\n        if (iPoly === -1) {\n          notesTime.map((tOn, jPoly) => {\n            if (tOn < tEarliest) {\n              iPoly = jPoly;\n              tEarliest = tOn;\n            }\n          });\n        }\n\n        notes[iPoly] = note;\n\n        if (eventNote & 128) {\n          if (notesOffTime[iPoly] < notesTime[iPoly]) {\n            notesOffTime[iPoly] = t;\n          }\n        } else {\n          if (notesOffTime[iPoly] >= notesTime[iPoly]) {\n            notesTime[iPoly] = t;\n          }\n        }\n\n        nextStep += eventDeltaStep;\n\n        pos = (pos + 2) % buffer.length;\n      }\n\n      samples++;\n\n      arraySerial(poly).map((iPoly) => {\n        const noteTime = notesTime[iPoly];\n        const noteOffTime = notesOffTime[iPoly];\n\n        ret[iPoly][4 * iSample + 0] = t - noteTime; // time\n        ret[iPoly][4 * iSample + 1] = noteOffTime < noteTime ? 0.0 : t - noteOffTime; // offTime\n        ret[iPoly][4 * iSample + 2] = notes[iPoly]; // note\n        ret[iPoly][4 * iSample + 3] = 0.0; // reserved\n      });\n    });\n\n    return ret;\n  };\n}\n", "import { arraySerial } from '../array';\n\n/**\n * Parse a tinyseq buffer.\n *\n * Returns [ time, offTime, note, reserved, time, offTime, note, reserved, ... ]\n */\nexport function createTinyseqReader(\n  buffer: Uint8Array,\n  options: {\n    blockSize?: number;\n    sampleRate?: number;\n    stepsPerSecond?: number;\n  } = {},\n): () => Float32Array {\n  const blockSize = options.blockSize ?? 128;\n  const sampleRate = options.sampleRate ?? 48000;\n  const stepsPerSecond = options.stepsPerSecond ?? 960.0;\n\n  let samples = 0;\n  let pos = 0;\n  let note: number;\n  let noteTime = -Infinity;\n  let noteOffTime = -Infinity;\n  let nextStep = 0;\n\n  return () => {\n    return new Float32Array(\n      arraySerial(blockSize).flatMap(() => {\n        const t = samples / sampleRate;\n        const s = t * stepsPerSecond;\n\n        if (s >= nextStep) {\n          const eventNote = buffer[pos];\n          const eventDeltaStep = buffer[pos + 1];\n\n          note = ((pos === 0 ? 60 : note) + eventNote) & 127;\n          if (eventNote & 128) {\n            if (noteOffTime < noteTime) {\n              noteOffTime = t;\n            }\n          } else {\n            if (noteOffTime >= noteTime) {\n              noteTime = t;\n            }\n          }\n\n          nextStep += eventDeltaStep;\n\n          pos = (pos + 2) % buffer.length;\n        }\n\n        samples++;\n\n        return [\n          t - noteTime, // time\n          noteOffTime < noteTime ? 0.0 : t - noteOffTime, // offTime\n          note, // note\n          0.0, // reserved\n        ];\n      }),\n    );\n  };\n}\n", "import { arraySerial } from '../array';\nimport type { MidiParseResult } from '../midi';\n\n/**\n * Convert the parsed midi result to a tinyseq binary.\n *\n * See: {@link midiParse}\n *\n * @param midi The parsed midi result\n * @param track The index of the midi track you want to convert\n * @param tickMultiplier Multiply this value to tick\n * @returns A tinyseq binary\n */\nexport function tinyseqFromMidiParseResult(\n  midi: MidiParseResult,\n  {\n    track,\n    tickMultiplier,\n  }: {\n    track?: number;\n    tickMultiplier?: number;\n  } = {},\n): Uint8Array {\n  const data: number[] = [];\n  let lastNote = 60;\n  let delta = 0;\n\n  const trackEvents = midi[1][track ?? 0.0];\n\n  // [ delta, midi event, note, vel ][] -> [ onoff (0 or 128) + deltaNote, delta, ... ]\n  // [ [ 4, 144, 60, 100 ], [ 4, 128, 60, 100 ] ] -> [ 128, 4, 0, 4, 128, 0 ]\n\n  arraySerial(trackEvents.length + 1).map((i) => {\n    delta += (trackEvents[i]?.[0] ?? 0) * (tickMultiplier ?? 1.0);\n\n    if (delta === 0 && i === 0) {\n      return;\n    } // ignore if it's the first event and delta is 0\n\n    const evMsg = trackEvents[i - 1]?.[1] ?? 128;\n    const evNote = trackEvents[i - 1]?.[2] ?? 60;\n\n    if (evMsg >= 160) {\n      return;\n    } // ignore if the msg is not a note event\n\n    const noteDelta = (evNote - lastNote + 128) & 127;\n    lastNote = evNote;\n    const onoff = evMsg < 144 ? 128 : 0; // 0 if on (144 - 159), 128 if off (128 - 143)\n\n    // probably 240 is more efficient than 256 since the division in most of midi files are 480 or 960\n    let deltaConsume = Math.floor(Math.min(delta, 240));\n    data.push(noteDelta + onoff, deltaConsume);\n    delta -= deltaConsume;\n\n    while (delta >= 1) {\n      deltaConsume = Math.floor(Math.min(delta, 240));\n      data.push(onoff, deltaConsume);\n      delta -= deltaConsume;\n    }\n  });\n\n  return new Uint8Array(data);\n}\n", "export class Xorshift {\n  public seed: number;\n\n  public constructor(seed?: number) {\n    this.seed = seed || 1;\n  }\n\n  public gen(seed?: number): number {\n    if (seed) {\n      this.seed = seed;\n    }\n\n    this.seed = this.seed ^ (this.seed << 13);\n    this.seed = this.seed ^ (this.seed >>> 17);\n    this.seed = this.seed ^ (this.seed << 5);\n    return this.seed / 2 ** 32 + 0.5;\n  }\n\n  public set(seed?: number): void {\n    this.seed = seed || this.seed || 1;\n  }\n}\n\nexport default Xorshift;\n", "import { linearstep } from '../math/linearstep';\n\n/**\n * https://twitter.com/yugop\n *\n * @param text The input text\n * @param phase The value between 0.0 and 1.0\n * @param randomRatio The nerd value\n */\nexport function getYugopText(text: string, phase: number, randomRatio = 0.5): string {\n  if (phase >= 1.0) {\n    return text;\n  }\n  if (phase < 0.0) {\n    return '';\n  }\n\n  /*\n   * ------=====\n   * .------====\n   * ..------===\n   * ...------==\n   * ....------=\n   * ^     ^   ^\n   * |     |   |\n   * |     |   phase is 1.0\n   * |     phase is randomRatio\n   * phase is 0.0\n   */\n\n  const displayTween = linearstep(0.0, 1.0 - randomRatio, phase);\n  const fixTween = linearstep(randomRatio, 1.0, phase);\n\n  const displayLength = 1.0 + Math.floor(displayTween * (text.length - 1));\n  const fixLength = phase < randomRatio ? 0 : 1.0 + Math.floor(fixTween * (text.length - 1));\n  const randomLength = displayLength - fixLength;\n\n  const randomStr = [...Array(randomLength)]\n    .map(() => String.fromCharCode(33 + Math.floor(93 * Math.random())))\n    .join('');\n\n  return text.substring(0, fixLength) + randomStr;\n}\n"],
  "mappings": "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",
  "names": ["index_exports", "__export", "BPF", "BinaryHeap", "BiquadFilter", "Box3", "CDS", "Clock", "ClockFrame", "ClockRealtime", "Euler", "ExpSmooth", "GPUTimer", "HPF", "HistoryMeanCalculator", "HistoryMedianCalculator", "HistoryPercentileCalculator", "LPF", "Line3", "MapOfSet", "Matrix2", "Matrix3", "Matrix4", "Phasor", "Plane3", "Planes3", "Pool", "Quaternion", "Ray3", "SawtoothOscillator", "SineOscillator", "SmoothDamp", "Sphere3", "SquareOscillator", "Swap", "TRIANGLE_STRIP_QUAD", "TRIANGLE_STRIP_QUAD_3D", "TRIANGLE_STRIP_QUAD_NORMAL", "TRIANGLE_STRIP_QUAD_UV", "TapTempo", "TriangleOscillator", "Vector", "Vector3", "Vector4", "Xorshift", "arrayRange", "arraySerial", "arraySetAdd", "arraySetDelete", "arraySetDiff", "arraySetHas", "arraySetUnion", "asyncRetry", "binarySearch", "box3ContainsPoint", "clamp", "colorFromAtariST", "colorFromHex", "colorHSV2RGB", "colorToHex", "colorTurbo", "createPokerDeck", "createTinyseqPolyReader", "createTinyseqReader", "dagEdgesAncestors", "dagEdgesChildren", "dagEdgesDescendants", "dagEdgesParent", "dagEdgesParents", "dagEdgesResolve", "debounce", "edt1d", "edt2d", "eotfRec709", "eulerFromMat3", "eulerFromMat4", "eulerFromQuaternion", "evaluatePokerHand", "float32ArrayToWav", "fmix32", "getYugopText", "int16ArrayToWav", "lerp", "line3ApplyMatrix4", "line3At", "line3ClosestPointToPoint", "line3Delta", "line3DistanceToPoint", "linearstep", "mat2Determinant", "mat2Inverse", "mat2Multiply", "mat2Transpose", "mat3CreateNormalMatrix", "mat3Determinant", "mat3FromMat4", "mat3FromMat4Transpose", "mat3FromQuaternion", "mat3Inverse", "mat3Multiply", "mat3Transpose", "mat4Compose", "mat4Decompose", "mat4Determinant", "mat4FromMat3", "mat4FromQuaternion", "mat4Inverse", "mat4LookAt", "mat4LookAtInverse", "mat4Multiply", "mat4Perspective", "mat4RotationX", "mat4RotationY", "mat4RotationZ", "mat4Scale", "mat4ScaleScalar", "mat4Translate", "mat4Transpose", "matrix2d", "matrix3d", "midiParse", "mod", "notifyObservers", "oetfRec709", "parseSTNICCC", "plane3ApplyMatrix4", "plane3DistanceToPoint", "plane3Normalize", "planes3ContainPoint", "planes3FromBox3", "planes3FromProjectionMatrix", "planes3IntersectBox3", "planes3IntersectSphere3", "pokerCardToUnicode", "pokerHandStrengthMap", "pokerHandsByStrength", "pokerRankStrengthMap", "pokerRanksByStrength", "pokerSuitIndexMap", "pokerSuitsByIndex", "quatExp", "quatFromAxisAngle", "quatFromEuler", "quatFromMatrix3", "quatFromMatrix4", "quatInverse", "quatLog", "quatLogVec3", "quatLookRotation", "quatMultiply", "quatNlerp", "quatNormalize", "quatRotationX", "quatRotationY", "quatRotationZ", "quatSlerp", "range", "ray3DistanceToSphere", "ray3FromLine3", "retry", "sanitizeAngle", "saturate", "shuffleArray", "smootherstep", "smootheststep", "smoothstep", "sortPokerCardsByRank", "sphere3ContainsPoint", "step", "stnicccToSVG", "throttle", "tinyseqFromMidiParseResult", "traverse", "triIndexToLineIndex", "vec3ApplyMatrix3", "vec3ApplyMatrix4", "vec3ApplyQuaternion", "vec3Cross", "vec3OrthoNormalize", "vec3QuatExp", "vec4ApplyMatrix3", "vec4ApplyMatrix4", "vecAbs", "vecAdd", "vecDivide", "vecDot", "vecLength", "vecLengthSq", "vecLerp", "vecManhattanLength", "vecMultiply", "vecNeg", "vecNormalize", "vecScale", "vecSub", "__toCommonJS", "binarySearch", "array", "elementOrCompare", "element", "compare", "start", "end", "center", "centerElement", "traverse", "root", "traverser", "nodesNeedProcess", "nodesSeen", "currentNode", "children", "nodesFound", "node", "arrayRange", "start", "end", "step", "current", "ret", "arraySerial", "count", "_", "i", "arraySetDelete", "array", "value", "index", "arraySetHas", "arraySetAdd", "arraySetUnion", "a", "b", "out", "v", "arraySetDiff", "from", "diff", "TRIANGLE_STRIP_QUAD", "TRIANGLE_STRIP_QUAD_3D", "TRIANGLE_STRIP_QUAD_NORMAL", "TRIANGLE_STRIP_QUAD_UV", "shuffleArray", "array", "dice", "f", "i", "ir", "temp", "triIndexToLineIndex", "ret", "head", "matrix2d", "w", "h", "arr", "iy", "ix", "matrix3d", "d", "iz", "BinaryHeap", "_BinaryHeap", "a", "b", "aStr", "bStr", "init", "comparator", "el", "elements", "i", "rep", "ic", "ip", "p", "ic1", "ic2", "c1", "c2", "pickLeft", "c", "CDS", "deltaTime", "Clock", "time", "prevTime", "ClockFrame", "Clock", "fps", "time", "ClockRealtime", "Clock", "now", "prevTime", "deltaDate", "time", "colorFromAtariST", "stColor", "colorFromHex", "hex", "r", "g", "b", "lerp", "a", "b", "t", "colorHSV2RGB", "h", "s", "v", "ht", "p", "colH", "colS", "lerp", "clamp", "x", "minVal", "maxVal", "saturate", "x", "clamp", "colorToHex", "color", "v", "saturate", "vecDot", "vecA", "vecB", "sum", "v", "i", "colorTurbo", "x", "kr", "kg", "kb", "xt", "saturate", "xv", "vecDot", "eotfRec709", "value", "v", "__pow", "oetfRec709", "luminance", "l", "__pow", "dagEdgesParents", "edges", "destination", "edge", "dagEdgesAncestors", "edges", "destination", "ancestors", "traverse", "node", "parents", "dagEdgesParents", "parent", "dagEdgesChildren", "edges", "source", "edge", "dagEdgesDescendants", "edges", "source", "descendants", "traverse", "node", "children", "dagEdgesChildren", "child", "dagEdgesParent", "edges", "destination", "_a", "_b", "edge", "dagEdgesResolve", "edges", "nodes", "order", "nodeSet", "tempEdges", "node", "dagEdgesParent", "src", "debounce", "func", "timeoutMs", "queueId", "BiquadFilter", "x0", "y0", "BPF", "BiquadFilter", "f0Norm", "Q", "omega0", "cosOmega0", "alpha", "a0", "HPF", "BiquadFilter", "f0Norm", "Q", "omega0", "cosOmega0", "alpha", "a0", "LPF", "BiquadFilter", "f0Norm", "Q", "omega0", "cosOmega0", "alpha", "a0", "Phasor", "freqNorm", "out", "SawtoothOscillator", "Phasor", "SineOscillator", "Phasor", "phase", "SquareOscillator", "Phasor", "TriangleOscillator", "Phasor", "phase", "ExpSmooth", "deltaTime", "lerp", "edt1d", "data", "offset", "stride", "length", "k", "v", "z", "f", "q", "s", "qSubVK", "edt2d", "width", "height", "x", "y", "float32ArrayToWav", "src", "sampleRate", "channels", "samples", "byteLength", "array", "view", "head", "riffChunkSize", "avgBytesPerSec", "dataChunkSize", "iSample", "iCh", "fmix32", "h", "Pool", "array", "GPUTimer", "gl", "queries", "Pool", "ext", "update", "task", "func", "__async", "promiseFinishingPrev", "promiseAccum", "promiseThis", "query", "resolve", "HistoryMeanCalculator", "length", "i", "count", "value", "delta", "prev", "sum", "v", "HistoryPercentileCalculator", "length", "percentile", "value", "prev", "prevIndex", "binarySearch", "index", "HistoryMedianCalculator", "HistoryPercentileCalculator", "length", "int16ArrayToWav", "src", "sampleRate", "channels", "samples", "byteLength", "array", "head", "riffChunkSize", "avgBytesPerSec", "dataChunkSize", "iSample", "iCh", "data", "MapOfSet", "key", "_a", "value", "set", "vecScale", "vec", "scalar", "v", "mat3FromMat4Transpose", "source", "mat3Inverse", "m", "n11", "n21", "n31", "n12", "n22", "n32", "n13", "n23", "n33", "t11", "t12", "t13", "det", "vecScale", "mat3CreateNormalMatrix", "m", "mat3Inverse", "mat3FromMat4Transpose", "mat3Determinant", "m", "n11", "n21", "n31", "n12", "n22", "n32", "n13", "n23", "n33", "t11", "t12", "t13", "mat3FromMat4", "source", "mat3FromQuaternion", "quat", "x", "y", "z", "w", "mat3Multiply", "mats", "a", "b", "a00", "a01", "a02", "a10", "a11", "a12", "a20", "a21", "a22", "b00", "b01", "b02", "b10", "b11", "b12", "b20", "b21", "b22", "mat3Transpose", "source", "rawIdentityMatrix3", "Matrix3", "_Matrix3", "v", "mat3Transpose", "mat3Determinant", "mat3Inverse", "Matrix4", "m", "matrices", "scalar", "vecScale", "mat3Multiply", "matrix4", "mat3CreateNormalMatrix", "mat3FromMat4", "quaternion", "mat3FromQuaternion", "mat4FromQuaternion", "quat", "x", "y", "z", "w", "mat4Compose", "position", "rotation", "scale", "matRot", "mat4FromQuaternion", "sx", "sy", "sz", "quatFromMatrix3", "m", "m11", "m12", "m13", "m21", "m22", "m23", "m31", "m32", "m33", "trace", "s", "quatFromMatrix4", "m", "quatFromMatrix3", "mat3FromMat4", "vecLength", "vec", "sum", "v", "mat4Determinant", "m", "a00", "a01", "a02", "a03", "a10", "a11", "a12", "a13", "a20", "a21", "a22", "a23", "a30", "a31", "a32", "a33", "b00", "b01", "b02", "b03", "b04", "b05", "b06", "b07", "b08", "b09", "b10", "b11", "mat4Decompose", "m", "sx", "vecLength", "sy", "sz", "mat4Determinant", "invSx", "invSy", "invSz", "rotationMatrix", "quatFromMatrix4", "mat4FromMat3", "source", "mat4Inverse", "m", "a00", "a01", "a02", "a03", "a10", "a11", "a12", "a13", "a20", "a21", "a22", "a23", "a30", "a31", "a32", "a33", "b00", "b01", "b02", "b03", "b04", "b05", "b06", "b07", "b08", "b09", "b10", "b11", "det", "vecScale", "vecAdd", "vecs", "a", "b", "v", "i", "vecNormalize", "vec", "len", "vecLength", "invLen", "vecScale", "vecSub", "vecA", "vecB", "v", "i", "vec3Cross", "vecA", "vecB", "mat4LookAt", "position", "target", "up", "roll", "dir", "vecNormalize", "vecSub", "sid", "vec3Cross", "vecAdd", "vecScale", "top", "mat4LookAtInverse", "position", "target", "up", "roll", "dir", "vecNormalize", "vecSub", "sid", "vec3Cross", "vecAdd", "vecScale", "top", "vecDot", "mat4Multiply", "mats", "a", "b", "a00", "a01", "a02", "a03", "a10", "a11", "a12", "a13", "a20", "a21", "a22", "a23", "a30", "a31", "a32", "a33", "b00", "b01", "b02", "b03", "b10", "b11", "b12", "b13", "b20", "b21", "b22", "b23", "b30", "b31", "b32", "b33", "mat4Perspective", "fov", "near", "far", "aspect", "p", "d", "mat4RotationX", "theta", "c", "s", "mat4RotationY", "theta", "c", "s", "mat4RotationZ", "theta", "c", "s", "mat4Scale", "vec", "mat4ScaleScalar", "scalar", "mat4Translate", "vec", "mat4Transpose", "m", "rawIdentityMatrix4", "Matrix4", "_Matrix4", "v", "mat4Transpose", "mat4Determinant", "mat4Inverse", "Matrix3", "m", "matrices", "scalar", "vecScale", "position", "scale", "rotation", "mat4Decompose", "Vector3", "Quaternion", "mat4Multiply", "quaternion", "mat4FromQuaternion", "matrix3", "mat4FromMat3", "vector", "mat4Translate", "mat4Scale", "mat4ScaleScalar", "theta", "mat4RotationX", "mat4RotationY", "mat4RotationZ", "target", "up", "roll", "mat4LookAt", "mat4LookAtInverse", "fov", "near", "far", "mat4Perspective", "mat4Compose", "vecLengthSq", "vec", "sum", "v", "vecAbs", "vec", "v", "vecDivide", "vecA", "vecB", "v", "i", "vecLerp", "vecA", "vecB", "t", "v", "i", "vecManhattanLength", "vec", "sum", "v", "vecMultiply", "vecs", "a", "b", "v", "i", "vecNeg", "vec", "v", "Vector", "vecLength", "vecLengthSq", "vecManhattanLength", "vecNormalize", "vecNeg", "vecAbs", "vectors", "vecAdd", "v", "vector", "vecSub", "vecMultiply", "vecDivide", "scalar", "vecScale", "t", "vecLerp", "vecDot", "EPSILON", "quatExp", "quat", "x", "y", "z", "w", "v", "vl", "vecLength", "vecScale", "quatFromAxisAngle", "axis", "angle", "halfAngle", "sinHalfAngle", "quatInverse", "quat", "EPSILON", "quatLog", "quat", "x", "y", "z", "w", "v", "ql", "vecLength", "vl", "vecScale", "EPSILON", "quatLogVec3", "quat", "x", "y", "z", "w", "v", "vl", "vecLength", "vecScale", "vec3OrthoNormalize", "normal", "tangent", "binormal", "n", "vecNormalize", "t", "dotNT", "vecDot", "vecSub", "vecScale", "b", "vec3Cross", "vecNeg", "quatLookRotation", "look", "up", "normal", "tangent", "binormal", "vec3OrthoNormalize", "w", "invW4", "quatMultiply", "quats", "a", "b", "quatNlerp", "a", "b", "t", "bt", "vecDot", "vecNeg", "vecNormalize", "vecLerp", "quatNormalize", "vec", "len", "vecLength", "vecScale", "quatRotationX", "theta", "quatRotationY", "theta", "quatRotationZ", "theta", "quatSlerp", "a", "b", "t", "cosHalfTheta", "vecDot", "vecNeg", "sqrSinHalfTheta", "s", "vecNormalize", "sinHalfTheta", "halfTheta", "ratioA", "ratioB", "rawIdentityQuaternion", "Quaternion", "_Quaternion", "elements", "Matrix4", "mat4FromQuaternion", "quatInverse", "vecLength", "vecLengthSq", "quatNormalize", "quatExp", "quatLog", "Vector3", "quatLogVec3", "quaternions", "b", "t", "quatMultiply", "q", "a", "quatNlerp", "quatSlerp", "theta", "quatRotationX", "quatRotationY", "quatRotationZ", "look", "up", "quatLookRotation", "axis", "angle", "quatFromAxisAngle", "matrix", "quatFromMatrix4", "vec3ApplyMatrix3", "v", "m", "vec4ApplyMatrix4", "v", "m", "vec3ApplyMatrix4", "v", "m", "vec4", "vec4ApplyMatrix4", "xyz", "w", "vecScale", "vec3ApplyQuaternion", "vec", "quat", "p", "r", "quatInverse", "res", "quatMultiply", "EPSILON", "vec3QuatExp", "v", "vl", "vecLength", "vecScale", "Vector3", "_Vector3", "Vector", "v", "x", "y", "z", "vector", "vec3Cross", "quaternion", "vec3ApplyQuaternion", "matrix", "vec3ApplyMatrix3", "vec3ApplyMatrix4", "Quaternion", "vec3QuatExp", "normal", "tangent", "binormal", "result", "vec3OrthoNormalize", "box3ContainsPoint", "box", "point", "Box3", "_Box3", "min", "Vector3", "max", "point", "box3ContainsPoint", "box", "quatFromEuler", "euler", "order", "i", "j", "k", "sign", "ti", "tj", "tk", "ci", "cj", "ck", "si", "sj", "sk", "result", "mod", "value", "divisor", "sanitizeAngle", "angle", "mod", "eulerFromMat3", "m", "order", "i", "j", "k", "sign", "result", "c", "clamp", "vecManhattanLength", "sanitizeAngle", "eulerFromMat4", "m", "order", "eulerFromMat3", "mat3FromMat4", "eulerFromQuaternion", "m", "order", "eulerFromMat3", "mat3FromQuaternion", "Euler", "_Euler", "elements", "order", "Quaternion", "quatFromEuler", "matrix", "eulerFromMat3", "eulerFromMat4", "quaternion", "eulerFromQuaternion", "ray3DistanceToSphere", "ro", "rd", "sphere", "v", "vecSub", "b", "vecDot", "c", "d", "sqrtD", "line3Delta", "line", "vecSub", "ray3FromLine3", "line", "vecNormalize", "line3Delta", "Ray3", "_Ray3", "start", "Vector3", "end", "sphere", "ray3DistanceToSphere", "ray", "line", "ray3FromLine3", "line3ApplyMatrix4", "start", "end", "matrix", "vec3ApplyMatrix4", "line3At", "line", "vecAdd", "vecScale", "line3ClosestPointToPoint", "line", "point", "segment", "ap", "vecSub", "ab", "t", "vecDot", "saturate", "line3At", "line3DistanceToPoint", "line", "point", "segment", "vecLength", "vecSub", "line3ClosestPointToPoint", "Line3", "_Line3", "start", "Vector3", "end", "Ray3", "line3Delta", "line3At", "matrix", "line3ApplyMatrix4", "point", "segment", "line3ClosestPointToPoint", "line3DistanceToPoint", "line", "linearstep", "edge0", "edge1", "x", "saturate", "mat2Determinant", "m", "mat2Inverse", "m", "n11", "n21", "n12", "n22", "det", "vecScale", "mat2Multiply", "mats", "a", "b", "a00", "a01", "a10", "a11", "b00", "b01", "b10", "b11", "mat2Transpose", "source", "rawIdentityMatrix2", "Matrix2", "_Matrix2", "v", "mat2Transpose", "mat2Determinant", "mat2Inverse", "m", "matrices", "scalar", "vecScale", "mat2Multiply", "plane3ApplyMatrix4", "normal", "distance", "matrix", "normalMatrix", "newNormal", "vecNormalize", "vec3ApplyMatrix3", "coplanar", "vecScale", "refPoint", "vec3ApplyMatrix4", "newDistance", "vecDot", "plane3DistanceToPoint", "normal", "distance", "point", "vecDot", "plane3Normalize", "normal", "distance", "invL", "vecLength", "vecScale", "Plane3", "_Plane3", "plane3Normalize", "normal", "Vector3", "distance", "matrix", "normalMatrix", "_a", "plane3ApplyMatrix4", "point", "plane3DistanceToPoint", "plane", "planes3ContainPoint", "planes", "point", "plane", "plane3DistanceToPoint", "planes3FromBox3", "box", "planes3FromProjectionMatrix", "m", "m11", "m12", "m13", "m14", "m21", "m22", "m23", "m24", "m31", "m32", "m33", "m34", "m41", "m42", "m43", "m44", "plane3Normalize", "planes3IntersectBox3", "planes", "box", "plane", "v", "nc", "plane3DistanceToPoint", "planes3IntersectSphere3", "planes", "sphere", "plane", "plane3DistanceToPoint", "Planes3", "_Planes3", "plane", "planes", "point", "planes3ContainPoint", "box", "planes3IntersectBox3", "sphere", "planes3IntersectSphere3", "Plane3", "planes3FromBox3", "matrix", "planes3FromProjectionMatrix", "range", "x", "x0", "x1", "y0", "y1", "smootherstep", "edge0", "edge1", "x", "t", "linearstep", "smootheststep", "edge0", "edge1", "x", "t", "linearstep", "smoothstep", "edge0", "edge1", "x", "t", "linearstep", "sphere3ContainsPoint", "sphere", "point", "vecLengthSq", "vecSub", "Sphere3", "_Sphere3", "origin", "Vector3", "radius", "point", "sphere3ContainsPoint", "sphere", "step", "edge", "x", "vec4ApplyMatrix3", "v", "m", "v3", "xyz", "vec3ApplyMatrix3", "w", "Vector4", "_Vector4", "Vector", "v", "x", "y", "z", "matrix", "vec4ApplyMatrix3", "vec4ApplyMatrix4", "readU8", "array", "headBox", "readU16", "readU32", "readUVar", "v", "vv", "parseHeader", "parseTrack", "endOfTrack", "track", "type", "delta", "status", "data0", "eventLength", "arraySerial", "midiParse", "buffer", "header", "tracks", "notifyObservers", "observers", "param", "observer", "pokerRanksByStrength", "pokerSuitsByIndex", "createPokerDeck", "array", "pokerSuitsByIndex", "suit", "pokerRanksByStrength", "rank", "pokerHandStrengthMap", "pokerRankStrengthMap", "pokerSuitIndexMap", "sortPokerCardsByRank", "cards", "a", "b", "pokerSuitIndexMap", "pokerRankStrengthMap", "evaluatePokerHand", "cards", "cards_", "cardsByRank", "MapOfSet", "cardsBySuit", "card", "rank", "suit", "fours", "threes", "twos", "pokerRanksByStrength", "straightCards", "current", "a", "cardsSet", "straightFlushCards", "target", "hand", "strength", "pokerHandStrengthMap", "pokerRankStrengthMap", "b", "sameCards", "sortPokerCardsByRank", "_suit", "pairs", "pair", "rankMap", "suitMap", "pokerCardToUnicode", "card", "rank", "suit", "pokerHandsByStrength", "asyncRetry", "func", "n", "__async", "error", "retry", "func", "n", "error", "SmoothDamp", "deltaTime", "omega", "x", "exp", "delta", "temp", "Swap", "a", "b", "i", "parseSTNICCC", "buffer", "frames", "array", "palette", "head", "shouldSkip", "shouldEnd", "flags", "needsClear", "hasPalette", "indexedMode", "bitmask", "i", "nVertices", "vertices", "polygons", "descriptor", "colorIndex", "nIndices", "indices", "stnicccToSVG", "frames", "options", "_a", "delta", "svg", "style", "frame", "iFrame", "indexedMode", "palette", "polygons", "paletteInHex", "stColor", "color", "colorFromAtariST", "colorToHex", "childrenStr", "currentColorIndex", "d", "vertices", "colorIndex", "indices", "colorHex", "i", "index", "x", "y", "TapTempo", "HistoryMeanCalculator", "bpm", "amount", "now", "delta", "throttle", "func", "rateMs", "queueId", "lastTime", "now", "untilNextExec", "createTinyseqPolyReader", "buffer", "options", "_a", "_b", "_c", "_d", "poly", "blockSize", "sampleRate", "stepsPerSecond", "samples", "pos", "note", "notes", "arraySerial", "notesTime", "notesOffTime", "nextStep", "ret", "iSample", "t", "eventNote", "eventDeltaStep", "iPoly", "tEarliest", "tOn", "jPoly", "tOff", "noteTime", "noteOffTime", "createTinyseqReader", "buffer", "options", "_a", "_b", "_c", "blockSize", "sampleRate", "stepsPerSecond", "samples", "pos", "note", "noteTime", "noteOffTime", "nextStep", "arraySerial", "t", "eventNote", "eventDeltaStep", "tinyseqFromMidiParseResult", "midi", "track", "tickMultiplier", "data", "lastNote", "delta", "trackEvents", "arraySerial", "i", "_a", "_b", "_c", "_d", "_e", "_f", "evMsg", "evNote", "noteDelta", "onoff", "deltaConsume", "Xorshift", "seed", "__pow", "getYugopText", "text", "phase", "randomRatio", "displayTween", "linearstep", "fixTween", "displayLength", "fixLength", "randomLength", "randomStr"]
}
